X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=ud-userimport;h=aa580fa1e27da166563f7e37984e53c73451e563;hb=1869ceb94928a76f23188d0b9939327c3a8dd7b9;hp=cbb6bac19249394dbeffff748abaff752ed027fc;hpb=836c37b9ee287a5934e9d42b8eee5bfa632c560b;p=mirror%2Fuserdir-ldap.git diff --git a/ud-userimport b/ud-userimport index cbb6bac..aa580fa 100755 --- a/ud-userimport +++ b/ud-userimport @@ -1,5 +1,24 @@ #!/usr/bin/env python # -*- mode: python -*- + +# Copyright (c) 1999 Jason Gunthorpe +# Copyright (c) 2003 James Troup +# Copyright (c) 2004 Joey Schulze +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + # Imports passwd, shadow and group files into the directory. # You should cleanse the files of anything you do not want to add to the # directory. @@ -71,37 +90,43 @@ def DoPasswd(l,Passwd): (Split[4],cn,mn,sn) = ParseGecos(Split[4]); CheckNumber(Split[2]); CheckNumber(Split[3]); - Rec = [(ldap.MOD_REPLACE,"uid",Split[0]), - (ldap.MOD_REPLACE,"uidNumber",Split[2]), - (ldap.MOD_REPLACE,"gidNumber",Split[3]), - (ldap.MOD_REPLACE,"gecos",Split[4]), - (ldap.MOD_REPLACE,"homeDirectory",Split[5]), - (ldap.MOD_REPLACE,"loginShell",Split[6]), - (ldap.MOD_REPLACE,"cn",cn), - (ldap.MOD_REPLACE,"mn",mn), - (ldap.MOD_REPLACE,"sn",sn)]; + Rec = [("uid",Split[0]), + ("uidNumber",Split[2]), + ("gidNumber",Split[3]), + ("gecos",Split[4]), + ("homeDirectory",Split[5]), + ("loginShell",Split[6]), + ("cn",cn), + ("sn",sn)]; + + # Avoid schema check complaints when mn is empty + if (mn): + Rec.append(("mn",mn)) Dn = "uid=" + Split[0] + "," + BaseDn; - print "Importing",Dn, + print "Importing", Dn sys.stdout.flush(); - # Unfortunately add_s does not take the same args as modify :| + DoModify = True + if (DoAdd == 1): try: - l.add_s(Dn,[("uid",Split[0]), - ("objectClass","top"), - ("objectClass","account"), - ("objectClass","posixAccount"), - ("objectClass","shadowAccount"), - ("objectClass","debiandeveloper")]); + AddRec = Rec[:] + AddRec.append(("objectClass", UserObjectClasses)) + l.add_s(Dn,AddRec) + DoModify = False + except ldap.ALREADY_EXISTS: print "exists",; - # Send the modify request - l.modify(Dn,Rec); - Outstanding = Outstanding + 1; - Outstanding = FlushOutstanding(l,Outstanding,1); - print "done"; + if (DoModify): + # Send the modify request + ModRec = [(ldap.MOD_REPLACE, k[0], k[1]) for k in Rec] + l.modify(Dn,ModRec); + Outstanding = Outstanding + 1; + Outstanding = FlushOutstanding(l,Outstanding,1); + print "done"; + FlushOutstanding(l,Outstanding); # Read the shadow file into the database @@ -128,9 +153,15 @@ def DoShadow(l,Shadow): Rec = [(ldap.MOD_REPLACE,"shadowLastChange",Split[2]), (ldap.MOD_REPLACE,"shadowMin",Split[3]), (ldap.MOD_REPLACE,"shadowMax",Split[4]), - (ldap.MOD_REPLACE,"shadowWarning",Split[5]), - (ldap.MOD_REPLACE,"shadowInactive",Split[6]), - (ldap.MOD_REPLACE,"shadowExpire",Split[7])]; + (ldap.MOD_REPLACE,"shadowWarning",Split[5])] + + # Avoid schema violations + if (Split[6]): + Rec.append((ldap.MOD_REPLACE,"shadowInactive",Split[6])) + + if (Split[7]): + Rec.append((ldap.MOD_REPLACE,"shadowExpire",Split[7])) + if (WritePasses == 1): Rec.append((ldap.MOD_REPLACE,"userPassword","{crypt}"+Split[1])); @@ -191,8 +222,7 @@ def DoGroup(l,Group): if (DoAdd == 1): try: l.add_s(Dn,[("gid",Split[0]), - ("objectClass","top"), - ("objectClass","posixGroup")]); + ("objectClass", GroupObjectClasses)]) except ldap.ALREADY_EXISTS: print "exists",; @@ -220,13 +250,9 @@ for (switch, val) in options: AdminUser = val # Main program starts here -print "Accessing LDAP directory as '" + AdminUser + "'"; -Password = getpass(AdminUser + "'s password: "); # Connect to the ldap server -l = ldap.open(LDAPServer); -UserDn = "uid=" + AdminUser + "," + BaseDn; -l.simple_bind_s(UserDn,Password); +l = passwdAccessLDAP(LDAPServer, BaseDn, AdminUser) if (Passwd != ""): DoPasswd(l,Passwd);