#!/usr/bin/python
# -*- coding: utf-8 -*-

# Filename: ik-l2d-2.py

__module_name__= "ActiveDirectory To Zimbra"
__module_version__= "1.3"
__module_description__= "Active Directoryko Irakasleak Zimbrara Sartzeko Aplikazioa"
__module_author__= "Alfredo Barrainkua Zallo"



################################################################################################################

#				ActiveDirectory To Zimbra

################################################################################################################
#
# 1.3 - 2008-12-09
#	sac lerroan, COSaren atzean, "\n"
#	DOMEINUA atalean, "COS" izena kendu. Ez du funtzionatzen.
# 1.2 - 2008-11-28
#	COS-a esleitu
# 1.1 - 2008-11-27
#	Sinadura aldatu, hizkuntza aldatu
# 1.0 - 2008-11-23
#	Hasierako bertsioa
#
###############################################################################################################

import sys, string, readline, commands, grp
from datetime import date
from time import time, localtime, strftime
import ldap


# Skriptaren izena
PRGNAME = "ad2z"


# Fitxategien izena...
gaur_d = date.today()
LOGFILE = PRGNAME + "-" + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime()) + ".log"
PROVFILE = PRGNAME + "-" + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime()) + ".prov"
ZUSERSFILE = PRGNAME + "-" + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime()) + ".zusers"

# Domeinu eta azpidomeinuen izenak
DOMEINUA = "iurreta-institutua.net"
AZPIDOMEINUA = "kaioa3.iurreta-institutua.net"
ESKOLA_SINADURA = "\\nIurreta GLHB Institutua\\nOlaburu 19\\n48215 IURRETA\\n"

#### ZERB_MOTA = "AZPIDOMEINUA" / "DOMEINUA"
ZERB_MOTA = "AZPIDOMEINUA"

# Konexiorako datuak
Server = "ldap://10.22.x.y:389"
BindName = "*********@iurreta-institutua.net"
Password = "*********"
BaseDN = "ou=irakasleak,dc=iurreta-institutua,dc=net"
# Bilaketa datuak
searchScope = ldap.SCOPE_SUBTREE
retrieveAttributes = None
searchFilter = "displayName=" + "*"
# Aginteak
ZMPROV = "/opt/zimbra/bin/zmprov"
CAT = "/bin/cat"
# Erabiliko diren COSak ( Irakasleak / Ikasleak)
COSIzena = "Irakasleak"

# Zimbrako erabiltzaileak hartu
if ZERB_MOTA == "DOMEINUA" :
    zerab = commands.getstatusoutput(ZMPROV + " gaa " + DOMEINUA + " > " + ZUSERSFILE)
else :
    zerab = commands.getstatusoutput(ZMPROV + " gaa " + AZPIDOMEINUA + " > " + ZUSERSFILE)

# Erregistro fitxategiak ireki
logfile = open(LOGFILE, "w")
provfile = open(PROVFILE, "w")

logfile.write("####################################################################################################\n")
logfile.write("#                          Active Directory To Zimbra                          #\n")
logfile.write("####################################################################################################\n")
logfile.write("Data eta ordua: " + gaur_d.strftime("%Y-%m-%d") + "   " + strftime("%H:%M", localtime()) + "\n")


# ADra konektatu
try:
    l = ldap.initialize(Server)
except:
    print "Errorea konektatzean"
    logfile.write("Errorea konektatzean\n")

l.protocol_version = ldap.VERSION3

try:
    l.simple_bind(BindName, Password)
except:
    print "Errorea direktorioarekin batzean"
    logfile.write("Errorea direktorioarekin batzean\n")

res = l.search_s(BaseDN, searchScope, searchFilter, retrieveAttributes)

l.unbind_s()

logfile.write("----------------------------------------\n")

for r in res :
    print r[0]
    if (r[0]) :
	DATUAK = r[1]
#	print DATUAK
	# Erabiltzaile kontua ez badago desgaituta
	if (DATUAK['userAccountControl'][0] != "66050") :
	    logfile.write(r[0] + "\n")

	    # Badago Zimbran
	    badago = commands.getstatusoutput(CAT + " " + ZUSERSFILE + " | grep " + DATUAK['sAMAccountName'][0] + "@")
#	    print badago[0]
#	    print badago[1]
	    if badago[0] == 0 :
		print "Erabiltzaile ZAHARRA. Badago Zimbran jada."
		logfile.write("Erabiltzaile ZAHARRA.\n")
	    else :
		print "Erabiltzaile BERRIA. Ez dago Zimbran."
		logfile.write("Erabiltzaile BERRIA.\n")
		logfile.write("---\n")
    	        logfile.write("sAMAccountName:: " + DATUAK['sAMAccountName'][0] + "\n")
		logfile.write("cn:: " + DATUAK['cn'][0] + "\n")
    		logfile.write("name:: " + DATUAK['name'][0] + "\n")
    		logfile.write("givenName:: " + DATUAK['givenName'][0] + "\n")
    	        logfile.write("sn:: " +  DATUAK['sn'][0] + "\n")
    	        logfile.write("displayName:: " +  DATUAK['displayName'][0] + "\n")
	        logfile.write("mail:: " + DATUAK['mail'][0] + "\n")
    	        logfile.write("physicalDeliveryOfficeName:: " + DATUAK['physicalDeliveryOfficeName'][0] + "\n")
#    	    	logfile.write("userAccountControl:: " + DATUAK['userAccountControl'][0] + "\n")

		# Zerbitzaria, domeinukoa da (user@nire-eskola.net)
		if ZERB_MOTA == "DOMEINUA" :
		    # Erabiltzailearen datuak
		    provfile.write("ca " + DATUAK['mail'][0] + " '' " + \
			" givenName '" + DATUAK['givenName'][0] + \
		        "' sn '" + DATUAK['sn'][0] + \
			"' displayName '" + DATUAK['displayName'][0] + \
#			"' uid '" + DATUAK['sAMAccountName'][0] + \
#			"' zimbraMailCanonicalAddress '" + DATUAK['mail'][0] + \
			"' zimbraPrefLocale eu" + \
			" zimbraPrefForwardIncludeOriginalText includeBodyWithPrefix" + \
			" zimbraPrefForwardReplyInOriginalFormat FALSE" + \
			" zimbraPrefForwardReplyPrefixChar >" + \
			" zimbraPrefReplyToAddress " + DATUAK['mail'][0] + \
			" zimbraPrefReplyToDisplay '" + DATUAK['displayName'][0] + "'" + \
			" zimbraPrefReplyToEnabled TRUE" + \
#			" zimbraPrefFromAddress " + DATUAK['mail'][0] + \
			" zimbraPrefCalendarFirstDayOfWeek 1"+ \
			" zimbraPrefGroupMailBy conversation"+ \
			" zimbraPrefIMAutologin TRUE"+ \
			" zimbraPrefMailSignature '"+ DATUAK['displayName'][0] + "\\n" + DATUAK['mail'][0] + "\\n" + ESKOLA_SINADURA + "'" + \
			" zimbraPrefMailSignatureStyle internet"+ \
			" zimbraFeatureSignaturesEnabled TRUE"+ \
			" zimbraFeaturePop3DataSourceEnabled TRUE"+ \
			" zimbraSignatureName " + DATUAK['sAMAccountName'][0] + \
			"\n")
		    # Gehitu posta zerrendara
		    provfile.write("adlm " + DATUAK['physicalDeliveryOfficeName'][0].lower() + "@" + DOMEINUA + " " + DATUAK['mail'][0] + "\n")
		    # COS-era esleitu
		    provfile.write("sac " + DATUAK['mail'] + " " + COSIzena + "\n")

		# Zerbitzaria, "kaioa3" azpidomeinukoa da (user@kaioa3.nire-eskola.net)
		else :
		    provfile.write("ca " + DATUAK['sAMAccountName'][0] + "@" + AZPIDOMEINUA + " '' " + \
			" givenName '" + DATUAK['givenName'][0] + \
		        "' sn '" + DATUAK['sn'][0] + \
			"' displayName '" + DATUAK['displayName'][0] + \
			"' zimbraMailCanonicalAddress '" + DATUAK['mail'][0] + \
			"' zimbraPrefLocale eu" + \
			" zimbraPrefForwardIncludeOriginalText includeBodyWithPrefix" + \
			" zimbraPrefForwardReplyInOriginalFormat FALSE" + \
			" zimbraPrefForwardReplyPrefixChar >" + \
			" zimbraPrefReplyToAddress " + DATUAK['mail'][0] + \
			" zimbraPrefReplyToDisplay '" + DATUAK['displayName'][0] + "'" + \
			" zimbraPrefReplyToEnabled TRUE" + \
			" zimbraPrefFromAddress " + DATUAK['mail'][0] + \
			" zimbraPrefCalendarFirstDayOfWeek 1"+ \
			" zimbraPrefGroupMailBy conversation"+ \
			" zimbraPrefIMAutologin TRUE"+ \
			" zimbraPrefMailSignature '"+ DATUAK['displayName'][0] + "\\n" + DATUAK['mail'][0] + "\\n" + ESKOLA_SINADURA + "'" + \
			" zimbraPrefMailSignatureStyle internet"+ \
			" zimbraFeatureSignaturesEnabled TRUE"+ \
			" zimbraFeaturePop3DataSourceEnabled TRUE"+ \
			" zimbraSignatureName " + DATUAK['sAMAccountName'][0] + \
			"\n")
		    # Gehitu posta zerrendara
		    provfile.write("adlm " + DATUAK['physicalDeliveryOfficeName'][0].lower() + "@" + AZPIDOMEINUA + " " + DATUAK['mail'][0] + "\n")
		    # COS-era esleitu
		    provfile.write("sac " + DATUAK['sAMAccountName'][0] + "@" + AZPIDOMEINUA + " " + COSIzena + "\n")

	    logfile.write("\n")


logfile.close()
provfile.close()

sys.exit(0)
