From c4d3666ac2821518be57ca89d963f77bbddaedf4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 26 Dec 2007 20:55:05 -0600 Subject: r26607: Fix reading of values and subkeys in Samba 3 registry files. (This used to be commit e3d7454ef70d6fe9a1ce34eaf57268bd5b713ccf) --- source4/scripting/bin/samba3dump | 11 +- source4/scripting/python/samba/samba3.py | 28 +++- source4/scripting/python/samba/tests/samba3.py | 8 ++ source4/scripting/python/samba/upgrade.py | 188 +++++++++---------------- 4 files changed, 108 insertions(+), 127 deletions(-) (limited to 'source4/scripting') diff --git a/source4/scripting/bin/samba3dump b/source4/scripting/bin/samba3dump index f8d10cbc71..8f56d423d8 100755 --- a/source4/scripting/bin/samba3dump +++ b/source4/scripting/bin/samba3dump @@ -80,7 +80,7 @@ def print_samba3_secrets(secrets): for domain in secrets.domains(): print "\t--- %s ---" % domain print "\tSID: %s" % secrets.get_sid(domain) - print "\tGUID: %s" % secrets.get_dom_guid(domain) + print "\tGUID: %s" % secrets.get_domain_guid(domain) print "\tPlaintext pwd: %s" % secrets.get_machine_password(domain) if secrets.get_machine_last_change_time(domain): print "\tLast Changed: %lu" % secrets.get_machine_last_change_time(domain) @@ -93,11 +93,12 @@ def print_samba3_secrets(secrets): def print_samba3_regdb(regdb): print_header("Registry") + from registry import str_regtype for k in regdb.keys(): - print "%s" % k - for v in regdb.values(k): - print "\t%s: type %d, length %d" % (v.name, v.type, v.data.length) + print "[%s]" % k + for (value_name, (type, value)) in regdb.values(k).items(): + print "\"%s\"=%s:%s" % (value_name, str_regtype(type), value) def print_samba3_winsdb(winsdb): print_header("WINS Database") @@ -151,7 +152,7 @@ def print_samba3_summary(samba3): libdir = args[0] if len(args) > 1: - smbconf = args[2] + smbconf = args[1] else: smbconf = os.path.join(libdir, "smb.conf") diff --git a/source4/scripting/python/samba/samba3.py b/source4/scripting/python/samba/samba3.py index b4261f7c74..df94f3503c 100644 --- a/source4/scripting/python/samba/samba3.py +++ b/source4/scripting/python/samba/samba3.py @@ -45,16 +45,36 @@ class Registry: data = self.tdb.get("%s\x00" % key) if data is None: return [] - # FIXME: Parse data - return [] + import struct + (num, ) = struct.unpack(" 1: + elif type & 0x80: + if len(ips) > 1: rType = 0x2 else: rType = 0x1 else: - if numIPs > 1: + if len(ips) > 1: rType = 0x3 else: rType = 0x0 - if ttl > now: + if ttl > time.time(): rState = 0x0 # active else: rState = 0x1 # released - nType = ((e.nb_flags & 0x60)>>5) - - ldif += """ -dn: name=%s,type=0x%02X -type: 0x%02X -name: %s -objectClass: winsRecord -recordType: %u -recordState: %u -nodeType: %u -isStatic: 0 -expireTime: %s -versionID: %llu -""" % (e.name, e.type, e.type, e.name, - rType, rState, nType, - ldaptime(ttl), version_id) - - for ip in e.ips: - ldif += "address: %s\n" % ip - - ldif += """ -dn: CN=VERSION -objectClass: winsMaxVersion -maxVersion: %llu -""" % version_id + nType = ((nb_flags & 0x60)>>5) - return ldif + samba4_winsdb.add({"dn": "name=%s,type=0x%s" % name.split("#"), + "type": name.split("#")[1], + "name": name.split("#")[0], + "objectClass": "winsRecord", + "recordType": str(rType), + "recordState": str(rState), + "nodeType": str(nType), + "expireTime": ldb.ldaptime(ttl), + "isStatic": "0", + "versionID": str(version_id), + "address": ips}) + + samba4_winsdb.add({"dn": "CN=VERSION", + "objectClass": "winsMaxVersion", + "maxVersion": str(version_id)}) def upgrade_provision(samba3, setup_dir, message, credentials, session_info, lp, paths): oldconf = samba3.get_conf() @@ -417,6 +360,30 @@ def upgrade_smbconf(oldconf,mark): return newconf +SAMBA3_PREDEF_NAMES = { + 'HKLM': registry.HKEY_LOCAL_MACHINE, +} + +def import_registry(samba4_registry, samba3_regdb): + """Import a Samba 3 registry database into the Samba 4 registry. + + :param samba4_registry: Samba 4 registry handle. + :param samba3_regdb: Samba 3 registry database handle. + """ + def ensure_key_exists(keypath): + (predef_name, keypath) = keypath.split("/", 1) + predef_id = SAMBA3_PREDEF_NAMES[predef_name] + keypath = keypath.replace("/", "\\") + return samba4_registry.create_key(predef_id, keypath) + + for key in samba3_regdb.keys(): + key_handle = ensure_key_exists(key) + for subkey in samba3_regdb.subkeys(key): + ensure_key_exists(subkey) + for (value_name, (value_type, value_data)) in samba3_regdb.values(key).items(): + key_handle.set_value(value_name, value_type, value_data) + + def upgrade(subobj, samba3, message, paths, session_info, credentials): ret = 0 samdb = Ldb(paths.samdb, session_info=session_info, credentials=credentials) @@ -462,21 +429,6 @@ data: %d ret += 1 message(msg) - message("Importing registry data") - for hive in ["hkcr","hkcu","hklm","hkpd","hku","hkpt"]: - message("... " + hive) - regdb = Ldb(paths[hive]) - ldif = upgrade_registry(samba3.registry, hive, regdb) - for j in ldif: - msg = "... ... " + j - try: - regdb.add(ldif[j]) - except LdbError, e: - # FIXME: Ignore 'Record exists' errors - msg += "... error: " + str(e) - ret += 1 - message(msg) - message("Importing WINS data") winsdb = Ldb(paths.winsdb) ldb_erase(winsdb) -- cgit