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

# Filename: ol2z.py

__module_name__= "OpenLDAP To Zimbra"
__module_version__= "1.2"
__module_description__= "OpenLDAPeko Irakasleak Zimbrara Sartzeko Aplikazioa"
__module_author__= "Alfredo Barrainkua Zallo"



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

#				OpenLDAP To Zimbra

################################################################################################################
#
# 1.2 - 2009-01-23
#	Posta helbiderik ez duten "Besteak" OU-koek kontutan izan
#	"Postakutxak" OU-a erabili
# 1.1 - 2009-01-19
#	Ezgaitu pasahitza aldatzeko gaitasuna, eta gaitu sinadura
# 1.0 - 2008-12-07
#	Hasierako bertsioa
#
###############################################################################################################

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


# Skriptaren izena
PRGNAME = "ol2z"


# 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"
PROVFILE2 = PRGNAME + "-" + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime()) + ".prov.pz"
ZUSERSFILE = PRGNAME + "-" + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime()) + ".zusers"
#ZUSERSFILE2 = PRGNAME + "-" + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime()) + ".zusers.bad"

# Domeinu eta azpidomeinuen izenak
DOMEINUA = "iurreta-institutua.net"
ESKOLA_SINADURA = "\\nIurreta GLHB Institutua\\nOlaburu 19\\n48215 IURRETA\\nTel: 944 66 88 00\\nFax: 946 20 28 28\\n"


# Konexiorako datuak
Server = "ldap://10.22.x.y:389"
BindName = "********@iurreta-institutua.net"
Password = "***********"

# Ikasleak / Irakasleak / Besteak / Postakutxak
NORTZUK = "Ikasleak"

# Erabiliko diren COSak ( Irakasleak / Ikasleak / Besteak)
if NORTZUK == "Ikasleak" :
	BaseDN = "ou=ikasleak,ou=Users,dc=iurreta-institutua,dc=net"
	COSIzena = "Ikasleak"

if NORTZUK == "Irakasleak" :
	BaseDN = "ou=irakasleak,ou=Users,dc=iurreta-institutua,dc=net"
	COSIzena = "Irakasleak"

if NORTZUK == "Besteak" :
	BaseDN = "ou=besteak,ou=Users,dc=iurreta-institutua,dc=net"
	COSIzena = "Ikasleak"

if NORTZUK == "Postakutxak" :
	BaseDN = "ou=postakutxak,ou=Users,dc=iurreta-institutua,dc=net"
	COSIzena = "Irakasleak"

# Bilaketa datuak
searchScope = ldap.SCOPE_SUBTREE
retrieveAttributes = None
searchFilter = "displayName=" + "*"

# Aginteak
ZMPROV = "/opt/zimbra/bin/zmprov"
CAT = "/bin/cat"

# Zimbrako erabiltzaileak hartu
zerab = commands.getstatusoutput(ZMPROV + " gaa " + DOMEINUA + " > " + ZUSERSFILE)

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

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


# OpenLDAPera 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") :


	try :
	    flajak = DATUAK['sambaAcctFlags'][0]
	    if (DATUAK['sambaAcctFlags'][0] != "66050") :
		logfile.write(r[0] + "\n")

	        # Badago Zimbran
		badago = commands.getstatusoutput(CAT + " " + ZUSERSFILE + " | grep " + DATUAK['uid'][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("uid:: " + DATUAK['uid'][0] + "\n")
		    logfile.write("cn:: " + DATUAK['cn'][0] + "\n")
#    			logfile.write("name:: " + DATUAK['givenName'][0] + "\n")
    		    logfile.write("givenName:: " + DATUAK['givenName'][0] + "\n")
    	    	    logfile.write("sn:: " +  DATUAK['sn'][0] + "\n")
    	    	    logfile.write("displayName:: " +  DATUAK['displayName'][0] + "\n")
		    try :
	    		logfile.write("mail:: " + DATUAK['mail'][0] + "\n")
		    except :
			print "Ez du posta helbiderik"
		        logfile.write("Ez du posta helbiderik\n")
		        continue
#    	        logfile.write("physicalDeliveryOfficeName:: " + DATUAK['physicalDeliveryOfficeName'][0] + "\n")
#    	    	logfile.write("userAccountControl:: " + DATUAK['userAccountControl'][0] + "\n")

		# 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 + "'" + \
			" zimbraPrefMailSignatureEnabled TRUE" + \
			" zimbraPrefMailSignatureStyle internet" + \
			" zimbraFeatureChangePasswordEnabled FALSE" + \
			" zimbraFeatureSignaturesEnabled TRUE" + \
			" zimbraFeaturePop3DataSourceEnabled TRUE" + \
			" zimbraSignatureName " + DATUAK['uid'][0] + "\n")
		    # Gehitu posta zerrendara
		    try :
		        provfile.write("adlm " + DATUAK['physicalDeliveryOfficeName'][0].lower() + "@" + DOMEINUA + " " + DATUAK['mail'][0] + "\n")
		    except :
			print ("Ez du talderik")
			logfile.write("Ez du talderik\n")
		    # COS-era esleitu
		    provfile.write("sac " + DATUAK['mail'][0] + " " + COSIzena + "\n")


		logfile.write("\n")
	except :
	    logfile.write(r[0] + "\n")

	    # Badago Zimbran
	    badago = commands.getstatusoutput(CAT + " " + ZUSERSFILE + " | grep " + DATUAK['uid'][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("uid:: " + DATUAK['uid'][0] + "\n")
		logfile.write("cn:: " + DATUAK['cn'][0] + "\n")
#    		logfile.write("name:: " + DATUAK['givenName'][0] + "\n")
    		logfile.write("givenName:: " + DATUAK['givenName'][0] + "\n")
    	    	logfile.write("sn:: " +  DATUAK['sn'][0] + "\n")
    	    	logfile.write("displayName:: " +  DATUAK['displayName'][0] + "\n")
		try :
	    	    logfile.write("mail:: " + DATUAK['mail'][0] + "\n")
		except :
		    print "Ez du posta helbiderik"
		    logfile.write("Ez du posta helbiderik\n")
		    continue
#    	        logfile.write("physicalDeliveryOfficeName:: " + DATUAK['physicalDeliveryOfficeName'][0] + "\n")
#    	    	logfile.write("userAccountControl:: " + DATUAK['userAccountControl'][0] + "\n")

		# 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 + "'" + \
			" zimbraPrefMailSignatureEnabled TRUE" + \
			" zimbraPrefMailSignatureStyle internet" + \
			" zimbraFeatureChangePasswordEnabled FALSE" + \
			" zimbraFeatureSignaturesEnabled TRUE" + \
			" zimbraFeaturePop3DataSourceEnabled TRUE" + \
			" zimbraSignatureName " + DATUAK['uid'][0] + "\n")
		    # Gehitu posta zerrendara
		try :
		    provfile.write("adlm " + DATUAK['physicalDeliveryOfficeName'][0].lower() + "@" + DOMEINUA + " " + DATUAK['mail'][0] + "\n")
		except :
		    print ("Ez du talderik")
		    logfile.write("Ez du talderik\n")
		    # COS-era esleitu
	#	provfile.write("sac " + DATUAK['mail'][0] + " " + COSIzena + "\n")


	    logfile.write("\n")


logfile.close()
provfile.close()

sys.exit(0)

