Michael, all
On 09/01/2010 10:15 PM, Michael Wood wrote:
2010/9/1 Daniel Müller<[email protected]>:
On Wed, 1 Sep 2010 12:00:29 +0200, Michael Wood<[email protected]>
wrote:
Hi

2010/9/1 Juan Asensio Sánchez<[email protected]>:
El 1 de septiembre de 2010 09:54, Daniel Müller
<[email protected]>escribió:
[...]
Why do not just use the samba 4 internal ldap-server?? And just net
rpc
vampire the users and groups from

I doubt "net rpc vampire" will do anything except give you an error
message :)  I believe the "rpc" vs. "ads" etc. options are considered
to have been a mistake, so are not supported by Samba4's net command.
Also, there is no support currently for vampiring from Samba3 to
Samba4.  Someone is working on a migration script, though.  Check the

How about: 2 Samba4-DCs with OpenLDAP 2.4.8 in Multi-Master-Replication
at: http://lists.samba.org/archive/samba-technical/2008-April/058567.html

I think perhaps Samba4 worked better with OpenLDAP in the past and it
should also be fixed to work with it again in future, but at the
moment it won't work:

http://lists.samba.org/archive/samba-technical/2010-July/072445.html
"For various reasons, the OpenLDAP backend for Samba4 is not functional
at this time."

Here's the message where Lukasz Zalewski says he's working on the
Samba 3 to Samba 4 migration script:
http://lists.samba.org/archive/samba-technical/2010-August/072683.html
Since web-based archives scrub the attachments i have attached the relevant scripts to this message: myldap-pub.py.org - Metze's original import script (attached for completeness) myldap-pub-2.dif - patch which extends functionality of the above by allowing use of ldap uri's and other customisations (custom filters, attribute values substitutions). Please note the script is not complete yet, but you should be able to import users, computers and groups (trusts are still TODO)

HTH

Luk

samba-technical archives.


--- myldap-pub.py.org   2010-08-10 12:29:40.563592748 +0100
+++ myldap-pub.py       2010-08-24 17:34:04.810586364 +0100
@@ -1,3 +1,5 @@
+#!/usr/bin/env python
+#
 import sys
 from ldif import LDIFParser, LDIFWriter
 import ldap
@@ -5,6 +7,8 @@
 import binascii
 import base64
 import re
+from optparse import OptionParser, OptionGroup
+from getpass import getpass
 
 class MyLDIFParser(LDIFParser):
        def __init__(self, input):
@@ -379,6 +383,15 @@
 SID_NAME_UNKNOWN  = 8 #oops.
 SID_NAME_COMPUTER = 9 #machine
 
+IMPORT_TYPE_USERS     = 1 
+IMPORT_TYPE_COMPUTERS = 2
+IMPORT_TYPE_TRUSTS    = 4
+IMPORT_TYPE_GROUPS    = 8
+IMPORT_TYPE_ALL       = 15
+
+import_types    = dict({"Users": IMPORT_TYPE_USERS, "Computers": 
IMPORT_TYPE_COMPUTERS, "Trusts": IMPORT_TYPE_TRUSTS, "Groups": 
IMPORT_TYPE_GROUPS, "All": IMPORT_TYPE_ALL})
+env_var_mapping = dict({"%USERNAME%": "sAMAccountName"})
+
 class ImportSamba3SearchState:
        def __init__(self, basedn, scope, filterstr, importdn):
                self.basedn = basedn
@@ -395,7 +408,11 @@
                        trusts_search,
                        computers_search,
                        users_search,
-                       groups_search):
+                       groups_search,
+                        output_ignore_sids=False,
+                        remove_attributes=[],
+                        import_type=IMPORT_TYPE_ALL,
+                        user_replace_attrs={}):
 
                self.domain = domain_search
                self.trusts = trusts_search
@@ -418,7 +435,10 @@
                # TODO
                self.new_next_rid = 140000
 
-               self.convertObjects()
+               self.convertObjects(remove_attributes=remove_attributes,
+                                    output_ignore_sids=output_ignore_sids,
+                                    import_type=import_type,
+                                    user_replace_attrs=user_replace_attrs)
 
        def parse_sambaAcctFlags(self, str):
                #print "sambaAcctFlags '%s'\n" % str
@@ -1145,16 +1165,22 @@
                return dn, entry
 
        def convert_sambaSamAccount(self, old, basedn, objectClass="user",
-                                   keep_sid=True, is_computer=False):
-
-               name = old['uid'][0]
-               try:
-                       ou = old['ou'][0]
-               except:
-                       ou = 'DefaultOU'
-                       pass
+                                   keep_sid=True, is_computer=False,
+                                    remove_attributes=[],
+                                    output_ignore_sids=False,
+                                    output_display=True,
+                                    user_replace_attrs={},
+                                    disable_if_no_unicodePwd=False):
+               
+                name = old['uid'][0]
+               #try:
+               #       ou = old['ou'][0]
+               #except:
+               #       ou = 'DefaultOU'
+               #       pass
 
-               ou_dn = "OU=%s,%s" % (ou, basedn)
+               #ou_dn = "OU=%s,%s" % (ou, basedn)
+                ou_dn = basedn
                if self.lookup_DN(ou_dn) is None:
                        self.insert_organizationalUnit(ou_dn)
 
@@ -1319,6 +1345,11 @@
                        except KeyError:
                                pass
 
+                        #lets check our remove list and override/set the 
course of action
+                        if attr in remove_attributes:
+                            remove = True
+                            keep   = False
+
                        assert keep != remove, 'keep[%s] remove[%s] error 
attr[%s] in: %s\n' % (str(keep), str(remove), attr, str(old))
 
                        if not keep:
@@ -1332,6 +1363,14 @@
 
                #print 'old:\n%s\nnew:\n%s' % (str(old), str(new))
 
+                #Add/replace requested attributes
+                for key, value in user_replace_attrs.items():
+                    if key in new:
+                        for var, val in env_var_mapping.items():
+                            if var in value:
+                               value = value.replace(var, new[val][0])         
               
+                    new[key] = [value]
+
                entry = {}
                for attr, val in new.items():
                        assert attr not in entry, \
@@ -1343,24 +1382,38 @@
 
                        entry[attr] = val
 
+                #disable the account if no unicodePwd present
+                if disable_if_no_unicodePwd == True and 'unicodePwd' not in 
entry:
+                    if 'userAccountControl' in entry:
+                        uac = int(entry['userAccountControl'][0]) | 
UF_ACCOUNTDISABLE
+                        entry['userAccountControl'] = ["%d" % uac]
+                        
                self.insert_sAMAccountName(sAMAccountName, dn)
                self.insert_objectSid(objectSid, dn, domain=True)
                self.insert_DN(dn, entry)
-               self.insert_Operation('add', dn, entry)
+                #remove ObjectSid entry if needed
+                if output_ignore_sids == True:
+                    del entry['objectSid']
+                if output_display == True:
+                   self.insert_Operation('add', dn, entry)
 
                #print 'old:\n%s\nnew:\n%s\nentry:\n%s' % (old, new, entry)
                return dn, entry, name, objectSid
 
-       def convert_sambaGroupMapping(self, old, basedn):
+       def convert_sambaGroupMapping(self, old, basedn,
+                                      remove_attributes=[],
+                                      output_ignore_sids=False,
+                                      output_display=True):
 
                name = old['cn'][0]
-               try:
-                       ou = old['ou'][0]
-               except:
-                       ou = 'DefaultOU'
-                       pass
+               #try:
+               #       ou = old['ou'][0]
+               #except:
+               #       ou = 'DefaultOU'
+               #       pass
 
-               ou_dn = "OU=%s,%s" % (ou, basedn)
+               #ou_dn = "OU=%s,%s" % (ou, basedn)
+                ou_dn = basedn
                if self.lookup_DN(ou_dn) is None:
                        self.insert_organizationalUnit(ou_dn)
 
@@ -1399,6 +1452,10 @@
                        except KeyError:
                                pass
 
+                        #lets check our remove list and override/set the 
course of action
+                        if attr in remove_attributes:
+                            remove = True
+
                        assert keep != remove, 'keep[%s] remove[%s] error 
attr[%s] in: %s\n' % (str(keep), str(remove), attr, str(old))
 
                        if not keep:
@@ -1440,7 +1497,11 @@
                        self.insert_sAMAccountName(sAMAccountName, dn)
                        self.insert_objectSid(objectSid, dn)
                        self.insert_DN(dn, entry)
-                       self.insert_Operation('add', dn, entry)
+                        #remove ObjectSid entry if needed
+                        if output_ignore_sids == True:
+                            del entry['objectSid']
+                        if output_display == True:
+                            self.insert_Operation('add', dn, entry)
 
                #print 'old:\n%s\nnew:\n%s\nentry:\n%s' % (old, new, entry)
                return dn, entry, name, objectSid
@@ -1498,7 +1559,11 @@
                #print 'old:\n%s\nnew:\n%s\nentry:\n%s' % (old, new, entry)
                return modlist
 
-       def convertObjects(self):
+       def convertObjects(self,
+                           remove_attributes=[],
+                           output_ignore_sids=False,
+                           import_type=IMPORT_TYPE_ALL,
+                           user_replace_attrs={}):
                #- import domain policies
                #- import trusted domains
                #- import builtin groups
@@ -1525,64 +1590,82 @@
                # a few posixGroups are not sambaGroupMappings
                # and there're builtin groups
                #
-               self.groups.results = self.ldap.search(
-                                       self.groups.basedn,
-                                       self.groups.scope,
-                                       self.groups.filterstr)
-               #for i, r in enumerate(self.groups.results):
-               #       print 'groups:%d: %s\n' % (i, str(r))
-               self.insert_organizationalUnit(self.groups.importdn)
-               for k, v in self.groups.results.items():
-               #       print '%s: %s\n' % (str(k), str(v))
-                       dn, entry, name, sid = self.convert_sambaGroupMapping(v,
-                                       self.groups.importdn)
-                       old_group_DNs.append(dn)
-                       old_group_entries[dn] = v
-
-               self.trusts.results = self.ldap.search(
-                                       self.trusts.basedn,
-                                       self.trusts.scope,
-                                       self.trusts.filterstr)
-               #for i, r in enumerate(self.trusts.results):
-               #       print 'trusts:%d: %s\n' % (i, str(r))
-               self.insert_organizationalUnit(self.trusts.importdn)
-               for k, v in self.trusts.results.items():
-               #       print '%s: %s\n' % (str(k), str(v))
-                       dn, entry, name, sid = self.convert_sambaSamAccount(v,
-                               self.trusts.importdn,
-                               objectClass="TODO-TRUSTS",
-                               keep_sid=False)
-
-               self.computers.results = self.ldap.search(
-                                       self.computers.basedn,
-                                       self.computers.scope,
-                                       self.computers.filterstr)
-               #for i, r in enumerate(self.computers.results):
-               #       print 'computers:%d: %s\n' % (i, str(r))
-               self.insert_organizationalUnit(self.computers.importdn)
-               for k, v in self.computers.results.items():
-               #       print '%s: %s\n' % (str(k), str(v))
-                       dn, entry, name, sid = self.convert_sambaSamAccount(v,
-                               self.computers.importdn,
-                               objectClass="computer",
-                               keep_sid=False, is_computer=True)
-
-               self.users.results = self.ldap.search(
-                                       self.users.basedn,
-                                       self.users.scope,
-                                       self.users.filterstr)
-               #for i, r in enumerate(self.users.results):
-               #       print 'users:%d: %s\n' % (i, str(r))
-               self.insert_organizationalUnit(self.users.importdn)
-               for k, v in self.users.results.items():
-               #       print '%s: %s\n' % (str(k), str(v))
-                       dn, entry, name, sid = self.convert_sambaSamAccount(v,
-                                       self.users.importdn)
+                if (import_type & IMPORT_TYPE_GROUPS) == IMPORT_TYPE_GROUPS:
+                    self.groups.results = self.ldap.search(
+                                            self.groups.basedn,
+                                            self.groups.scope,
+                                            self.groups.filterstr)
+                    #for i, r in enumerate(self.groups.results):
+                    #  print 'groups:%d: %s\n' % (i, str(r))
+                    self.insert_organizationalUnit(self.groups.importdn)
+                    for k, v in self.groups.results.items():
+                    #  print '%s: %s\n' % (str(k), str(v))
+                        dn, entry, name, sid = 
self.convert_sambaGroupMapping(v,
+                                            self.groups.importdn,
+                                            
remove_attributes=remove_attributes,
+                                            
output_ignore_sids=output_ignore_sids,
+                                            output_display=bool(import_type & 
IMPORT_TYPE_GROUPS))
+                        old_group_DNs.append(dn)
+                        old_group_entries[dn] = v
+
+                if (import_type & IMPORT_TYPE_TRUSTS) == IMPORT_TYPE_TRUSTS:
+                   self.trusts.results = self.ldap.search(
+                                            self.trusts.basedn,
+                                            self.trusts.scope,
+                                            self.trusts.filterstr)
+                   #for i, r in enumerate(self.trusts.results):
+                   #   print 'trusts:%d: %s\n' % (i, str(r))
+                   self.insert_organizationalUnit(self.trusts.importdn)
+                   for k, v in self.trusts.results.items():
+                   #   print '%s: %s\n' % (str(k), str(v))
+                           dn, entry, name, sid = 
self.convert_sambaSamAccount(v,
+                                   self.trusts.importdn,
+                                   objectClass="TODO-TRUSTS",
+                                   keep_sid=False,
+                                    remove_attributes=remove_attributes,
+                                    output_display=bool(import_type & 
IMPORT_TYPE_TRUSTS))
+
+                if (import_type & IMPORT_TYPE_COMPUTERS) == 
IMPORT_TYPE_COMPUTERS:
+                    self.computers.results = self.ldap.search(
+                                             self.computers.basedn,
+                                             self.computers.scope,
+                                             self.computers.filterstr)
+                    #for i, r in enumerate(self.computers.results):
+                    #  print 'computers:%d: %s\n' % (i, str(r))
+                    self.insert_organizationalUnit(self.computers.importdn)
+                    for k, v in self.computers.results.items():
+                   #   print '%s: %s\n' % (str(k), str(v))
+                        dn, entry, name, sid = self.convert_sambaSamAccount(v,
+                                    self.computers.importdn,
+                                    objectClass="computer",
+                                    keep_sid=False, is_computer=True,
+                                    remove_attributes=remove_attributes,
+                                    output_ignore_sids=output_ignore_sids,
+                                    output_display=bool(import_type & 
IMPORT_TYPE_COMPUTERS))
+
+                if (import_type & IMPORT_TYPE_USERS) == IMPORT_TYPE_USERS or 
(import_type & IMPORT_TYPE_GROUPS) == IMPORT_TYPE_GROUPS:
+                    self.users.results = self.ldap.search(
+                                            self.users.basedn,
+                                            self.users.scope,
+                                            self.users.filterstr)
+                    #for i, r in enumerate(self.users.results):
+                    #  print 'users:%d: %s\n' % (i, str(r))
+                    if (import_type & IMPORT_TYPE_USERS) == IMPORT_TYPE_USERS:
+                        self.insert_organizationalUnit(self.users.importdn)
+                    for k, v in self.users.results.items():
+                    #  print '%s: %s\n' % (str(k), str(v))
+                        dn, entry, name, sid = self.convert_sambaSamAccount(v,
+                                        self.users.importdn, 
remove_attributes=remove_attributes,
+                                        output_ignore_sids=output_ignore_sids,
+                                        output_display=bool(import_type & 
IMPORT_TYPE_USERS),
+                                        user_replace_attrs=user_replace_attrs,
+                                        disable_if_no_unicodePwd=True)
 
                #
                # Groups Memberships
                #
-               for dn in old_group_DNs:
+                if (import_type & IMPORT_TYPE_GROUPS) == IMPORT_TYPE_GROUPS:
+                   for dn in old_group_DNs:
                        v = old_group_entries[dn]
                        modlist = self.convert_sambaGroupMapping_Members(dn, v)
 
@@ -1603,46 +1686,181 @@
 
                return ret
 
-myldap = MyLDAP(open("input.ldif", 'rb'))
-
-domain_search = ImportSamba3SearchState(
-       'ou=SAMBA,o=Example COM',
-       ldap.SCOPE_SUBTREE,
-       '(&(sambaDomainName=TOP)(objectClass=sambaDomain))',
-       "DC=domain,DC=example,DC=com")
-
-trusts_search = ImportSamba3SearchState(
-       'TODO=TODO,ou=SAMBA,o=Example COM',
-       ldap.SCOPE_SUBTREE,
-       '(&(objectClass=sambaSamAccount)(TODO=TODO))',
-       "OU=Imported Trusts,DC=domain,DC=example,DC=com")
-
-computers_search = ImportSamba3SearchState(
-       'ou=SAMBA,o=Example COM',
-       ldap.SCOPE_SUBTREE,
-       '(&(objectClass=sambaSamAccount)(TODO=TODO))',
-       "OU=Imported Computers,DC=domain,DC=example,DC=com")
-
-users_search = ImportSamba3SearchState(
-       'ou=SAMBA,o=Example COM',
-       ldap.SCOPE_SUBTREE,
-       '(&(objectClass=sambaSamAccount))',
-       "OU=Imported Users,DC=domain,DC=example,DC=com")
-
-groups_search = ImportSamba3SearchState(
-       'ou=SAMBA,o=Example COM',
-       ldap.SCOPE_SUBTREE,
-       '(&(objectClass=posixGroup)(objectClass=sambaGroupMapping))',
-       "OU=Imported Groups,DC=domain,DC=example,DC=com")
-
-s3s4 = ImportSamba3LDIF(
-       myldap,
-       domain_search,
-       trusts_search,
-       computers_search,
-       users_search,
-       groups_search)
+class MyLDAPRemote():
+    """Base clas for remote ldap operations"""
 
-print "# %s\n" % (s3s4.getSummary())
-s3s4.getModifyLDIF(sys.stdout)
+    def __init__(self, uri, binddn="", bindpwd="", starttls=False):
+        try:
+            self.ldap = ldap.initialize(uri)
+            if starttls == True:
+                self.ldap.start_tls_s()
+
+            self.ldap.simple_bind_s(binddn, bindpwd)
+        except ldap.LDAPError, e:
+            print e
+            sys.exit()
+
+    def search(self, base, scope, filterstr='(objectClass=*)', attrlist=None, 
attrsonly=0):
+        results = {}
+        try:
+            search_results = self.ldap.search_s(base, scope, filterstr, 
attrlist, attrsonly)
+        except ldap.LDAPError, e:
+            print e
+            sys.exit()
+
+        for search_result in search_results:
+            (dn, attributes) = search_result
+            results[dn] = attributes
+
+        return results
+
+class cmd_import_from_ldap:
+    """Import accounts from ldap/ldif"""
+
+    parser = OptionParser()
+
+    def __init__(self):
+        self.parser.add_option("--input_ldif", dest="input_ldif", help="ldif 
file containing data to import")
+        self.parser.add_option("-b", "--input_basedn", dest="input_basedn", 
help="input data baseDN")
+        self.parser.add_option("--input_domain_name", 
dest="input_domain_name", help="input domain name")
+        self.parser.add_option("--output_basedn", dest="output_basedn", 
help="output data baseDN")
+        self.parser.add_option("--output_ignore_sids", 
dest="output_ignore_sids", action="store_true", default=False, help="do not 
output objectSid's")        
+        self.parser.add_option("--remove_attributes", 
dest="remove_attributes", metavar="attrname1,attrname2,atrname3", 
+                               help="comma separated list of attribute names 
that should be ignored during the conversion")
+        self.parser.add_option("--import_accounts", dest="import_accounts", 
default="All", metavar="All,Users,Computers,Trusts,Groups",
+                               help="comma separated list of account types to 
import [default: %default]")
+
+        group_users = OptionGroup(self.parser, "Users related options", 
"Options used for operations performed on user objects")
+        group_users.add_option("--output_users_ou", dest="output_users_ou", 
default="OU=Imported Users", 
+                               help="users OU of the output data, without base 
DN counterpart ([default: %default])")
+        group_users.add_option("--user_search_filter", 
dest="user_search_filter", help="search filter for users")
+        group_users.add_option("--input_users_ou", dest="input_users_ou", 
default=None, help="users OU of the input data, without base DN counterpart")
+        group_users.add_option("--user_replace_attributes", 
dest="user_replace_attributes", default=None, 
metavar="homeDrive;H:;profilePath;\\\\my.server\\profiles",
+                               help="semicolon separated list of attributes 
and values to replace or add for all processed user accounts")
+        self.parser.add_option_group(group_users)
+
+        group_computers = OptionGroup(self.parser, "Computer related options", 
"Options used for operations performed on computer objects")
+        group_computers.add_option("--output_computers_ou", 
dest="output_computers_ou", default="OU=Imported Computers", 
+                                   help="computers OU of the output data, 
without baseDN counterpart [default: %default])")
+        group_computers.add_option("--computer_search_filter", 
dest="computer_search_filter", help="search filter for computers")
+        group_computers.add_option("--input_computers_ou", 
dest="input_computers_ou", default=None, help="computers OU of the input data, 
without base DN counterpart")
+        self.parser.add_option_group(group_computers)
+
+        group_trusts = OptionGroup(self.parser, "Trusts related options", 
"Options used for operations performed on trust objects")
+        group_trusts.add_option("--output_trusts_ou", dest="output_trusts_ou", 
default="OU=Imported Trusts",
+                                help="trusts OU of the output data, without 
base DN counterpart [default: %default])")
+        group_trusts.add_option("--input_trusts_ou", dest="input_trusts_ou", 
default=None, help="trusts OU of the input data, without base DN counterpart")
+        self.parser.add_option_group(group_trusts)
+
+        group_groups = OptionGroup(self.parser, "Group related options", 
"Options used for operations performed on group objects")
+        group_groups.add_option("--output_groups_ou", dest="output_groups_ou", 
default="OU=Imported Groups",
+                                help="groups OU of the output data, without 
baseDN counterpart [default: %default])")
+        group_groups.add_option("--group_search_filter", 
dest="group_search_filter", help="search filter for groups")
+        group_groups.add_option("--input_groups_ou", dest="input_groups_ou", 
default=None, help="groups OU of the input data, without base DN counterpart")
+        self.parser.add_option_group(group_groups)
+
+        group_openldap = OptionGroup(self.parser, "LDAP Connection Related 
Options", "Options used for LDAP backend operations")
+        group_openldap.add_option("-Z", "--ldap_starttls", 
dest="ldap_starttls", action="store_true", default=False, help="Start TLS")
+        group_openldap.add_option("-D", "--ldap_binddn", dest="ldap_binddn", 
default="", help="bind DN")
+        group_openldap.add_option("-H", "--ldap_uri", dest="ldap_uri", 
help="LDAP Uniform Resource Identifier")
+        group_openldap.add_option("-w", "--ldap_bindpwd", dest="ldap_bindpw", 
metavar="password", default="", help="bind password (for simple 
authentication)")
+        group_openldap.add_option("-W", "--ldap_prompt_bindpwd", 
dest="ldap_prompt_bindpwd", action="store_true", default=False, help="prompt 
for bind password")
+        self.parser.add_option_group(group_openldap)
+
+    def run(self):
+        (options, args) = self.parser.parse_args()
+        remove_attrs = []
+
+        if options.remove_attributes is not None:            
+            remove_attrs = options.remove_attributes.split(',')
+
+        if options.input_ldif is not None:
+            myldap = MyLDAP(open(options.input_ldif, 'rb'))
+        else:
+            if options.ldap_prompt_bindpwd == True:
+                binddn_passwd = getpass("Enter LDAP Password:")
+            else:
+                binddn_passwd = options.ldap_bindpw
+            myldap = MyLDAPRemote(options.ldap_uri, options.ldap_binddn, 
binddn_passwd, options.ldap_starttls)
+
+        #Define the import types
+        import_type = 0
+        for t in options.import_accounts.split(','):
+            import_type |= import_types[t]
+
+        #Processing specific domain
+        domain_filter = '(&(sambaDomainName=%s)(objectClass=sambaDomain))' % 
options.input_domain_name
+        domain_search = ImportSamba3SearchState(options.input_basedn, 
ldap.SCOPE_SUBTREE, domain_filter, options.output_basedn)
+
+        #Processing domain trusts        
+        trust_filter = '(&(objectClass=sambaSamAccount)(TODO=TODO))'
+        trusts_input_dn = options.input_basedn
+        if options.input_trusts_ou is not None:
+            trusts_input_dn = '%s,%s' % (options.input_trusts_ou, 
options.input_basedn)
+
+        trust_output_dn = '%s,%s' % (options.output_trusts_ou, 
options.output_basedn)
+        trusts_search = ImportSamba3SearchState(trusts_input_dn, 
ldap.SCOPE_SUBTREE, trust_filter, trust_output_dn)
+
+        #Processing computer accounts
+        computer_filter = 'objectClass=sambaSamAccount'
+        if options.computer_search_filter is not None:
+            computer_filter = '(&(%s)(%s))' % (computer_filter, 
options.computer_search_filter)
+
+        computers_input_dn = options.input_basedn
+        if options.input_computers_ou is not None:
+            computers_input_dn = '%s,%s' % (options.input_computers_ou, 
options.input_basedn)
+
+        computer_output_dn = '%s,%s' % (options.output_computers_ou, 
options.output_basedn)
+        computers_search = ImportSamba3SearchState(computers_input_dn, 
ldap.SCOPE_SUBTREE, computer_filter, computer_output_dn)
+
+        #Processing user accounts
+        user_replace_attrs = {}
+        if options.user_replace_attributes is not None:
+           replaces = options.user_replace_attributes.split(';')
+          assert len(replaces) % 2 == 0, "user_replace_attributes must contain 
one or more attribute-value pairs"
+           for j in range(0, len(replaces), 2):
+               if len(replaces[j]) > 0 and len(replaces[j+1]) > 0:
+                   user_replace_attrs[replaces[j]] = replaces[j+1]
+ 
+        user_filter = 'objectClass=sambaSamAccount'
+        if options.user_search_filter is not None:
+            user_filter = '(&(%s)(%s))' % (user_filter, 
options.user_search_filter)
+
+        users_input_dn = options.input_basedn
+        if options.input_users_ou is not None:
+            users_input_dn = '%s,%s' % (options.input_users_ou, 
options.input_basedn)
+
+        user_output_dn = '%s,%s' % (options.output_users_ou, 
options.output_basedn)
+        users_search = ImportSamba3SearchState(users_input_dn, 
ldap.SCOPE_SUBTREE, user_filter, user_output_dn)
+
+        #Processing groups
+        group_filter = 
'(&(objectClass=posixGroup)(objectClass=sambaGroupMapping))'
+        if options.group_search_filter is not None:
+            group_filter = '(&%s(%s))' % (group_filter, 
options.group_search_filter)
+
+        groups_input_dn = options.input_basedn
+        if options.input_groups_ou is not None:
+            groups_input_dn = '%s,%s' % (options.input_groups_ou, 
options.input_basedn)
+
+        group_output_dn = '%s,%s' % (options.output_groups_ou, 
options.output_basedn)
+        groups_search = ImportSamba3SearchState(groups_input_dn, 
ldap.SCOPE_SUBTREE, group_filter, group_output_dn)
+        
+        s3s4 = ImportSamba3LDIF(
+              myldap,
+              domain_search,
+              trusts_search,
+              computers_search,
+              users_search,
+              groups_search,
+               output_ignore_sids=options.output_ignore_sids,
+               remove_attributes=remove_attrs,
+               import_type=import_type,
+               user_replace_attrs=user_replace_attrs)
+
+        print "# %s\n" % (s3s4.getSummary())
+        s3s4.getModifyLDIF(sys.stdout)
+
+if __name__ == "__main__":
+    ldap_cmd = cmd_import_from_ldap()
+    ldap_cmd.run()
 
-- 
To unsubscribe from this list go to the following URL and read the
instructions:  https://lists.samba.org/mailman/options/samba

Reply via email to