r9827: Convert 'passdb backend' rather then 'passdb backends'
[kai/samba.git] / source4 / scripting / libjs / upgrade.js
index 682721e9315e95528e10165ebe316a7637bc9580..0b5a71e50c935682b2be6af9fab4895912d3c107 100644 (file)
@@ -34,8 +34,7 @@ function upgrade_registry(regdb,prefix)
 {
        assert(regdb != undefined);
        var prefix_up = strupper(prefix);
-
-       var ldif = "";
+       var ldif = new Array();
 
        for (var i in regdb.keys) {
                var rk = regdb.keys[i];
@@ -51,7 +50,7 @@ function upgrade_registry(regdb,prefix)
                var pts = split("/", rk.name);
 
                /* Convert key name to dn */
-               ldif = ldif + sprintf("
+               ldif[rk.name] = sprintf("
 dn: %s
 name: %s
 
@@ -60,7 +59,7 @@ name: %s
                for (var j in rk.values) {
                        var rv = rk.values[j];
 
-                       ldif = ldif + sprintf("
+                       ldif[rk.name + " (" + rv.name + ")"] = sprintf("
 dn: %s,value=%s
 value: %s
 type: %d
@@ -101,6 +100,7 @@ samba3RefuseMachinePwdChange: %d
 
 function upgrade_sam_account(acc,domaindn)
 {
+       var ldb = ldb_init();
        var ldif = sprintf(
 "dn: cn=%s,%s
 objectClass: top
@@ -128,14 +128,15 @@ samba3PassLastSetTime: %d
 samba3PassCanChangeTime: %d
 samba3PassMustChangeTime: %d
 samba3Rid: %d
+ntPwdHash:: %s
+lmPwdHash:: %s
 
 ", acc.fullname, domaindn, acc.logon_time, acc.logoff_time, acc.username, acc.nt_username, 
 acc.fullname, acc.acct_desc, acc.group_rid, acc.bad_password_count, acc.logon_count,
 acc.domain, acc.dir_drive, acc.munged_dial, acc.homedir, acc.logon_script, 
 acc.profile_path, acc.workstations, acc.kickoff_time, acc.bad_password_time, 
-acc.pass_last_set_time, acc.pass_can_change_time, acc.pass_must_change_time, acc.user_rid); 
-
-               /* FIXME: Passwords */
+acc.pass_last_set_time, acc.pass_can_change_time, acc.pass_must_change_time, acc.user_rid,
+       ldb.encode(acc.lm_pw), ldb.encode(acc.nt_pw)); 
 
        return ldif;
 }
@@ -209,8 +210,8 @@ function upgrade_provision(samba3)
        var lp = loadparm_init();
        var rdn_list;
 
-       var domainname = samba3.get_param("global", "workgroup");
-
+       var domainname = samba3.configuration.get("workgroup");
+       
        if (domainname == undefined) {
                domainname = samba3.secrets.domains[0].name;
                println("No domain specified in smb.conf file, assuming '" + domainname + "'");
@@ -218,7 +219,7 @@ function upgrade_provision(samba3)
        
        var domsec = samba3.find_domainsecrets(domainname);
        var hostsec = samba3.find_domainsecrets(hostname());
-       var realm = samba3.get_param("global", "realm");
+       var realm = samba3.configuration.get("realm");
 
        if (realm == undefined) {
                realm = domainname;
@@ -273,7 +274,7 @@ function upgrade_provision(samba3)
        return subobj;
 }
 
-var keep = new Array(
+smbconf_keep = new Array(
        "dos charset", 
        "unix charset",
        "display charset",
@@ -295,9 +296,6 @@ var keep = new Array(
        "obey pam restrictions",
        "password server",
        "smb passwd file",
-       "sam database",
-       "spoolss database",
-       "wins database",
        "private dir",
        "passwd chat",
        "password level",
@@ -313,17 +311,6 @@ var keep = new Array(
        "debuglevel",
        "log file",
        "smb ports",
-       "nbt port",
-       "dgram port",
-       "cldap port",
-       "krb5 port",
-       "web port",
-       "tls enabled",
-       "tls keyfile",
-       "tls certfile",
-       "tls cafile",
-       "tls crlfile",
-       "swat directory",
        "large readwrite",
        "max protocol",
        "min protocol",
@@ -344,12 +331,10 @@ var keep = new Array(
        "use spnego",
        "server signing",
        "client signing",
-       "rpc big endian",
        "max connections",
        "paranoid server security",
        "socket options",
        "strict sync",
-       "case insensitive filesystem",
        "max print jobs",
        "printable",
        "print ok",
@@ -375,10 +360,7 @@ var keep = new Array(
        "lock dir",
        "lock directory",
        "pid directory",
-       "js include",
-       "setup directory",
        "socket address",
-       "-valid",
        "copy",
        "include",
        "available",
@@ -389,60 +371,136 @@ var keep = new Array(
        "host msdfs",
        "winbind separator");
 
-function upgrade_smbconf(samba3)
+/*
+   Remove configuration variables not present in Samba4
+       oldconf: Old configuration structure
+       mark: Whether removed configuration variables should be 
+               kept in the new configuration as "samba3:<name>"
+ */
+function upgrade_smbconf(oldconf,mark)
 {
-       //FIXME
+       var data = oldconf.data();
+       var newconf = param_init();
+
+       for (var s in data) {
+               for (var p in data[s]) {
+                       var keep = false;
+                       for (var k in smbconf_keep) { 
+                               if (smbconf_keep[k] == p) {
+                                       keep = true;
+                                       break;
+                               }
+                       }
+
+                       if (keep) {
+                               newconf.set(s, p, oldconf.get(s, p));
+                       } else if (mark) {
+                               newconf.set(s, "samba3:"+p, oldconf.get(s,p));
+                       }
+               }
+       }
+
+       return newconf;
 }
 
-function upgrade(subobj, samba3, message)
+function upgrade(subobj, samba3, message, paths)
 {
+       var ret = 0;
+       var lp = loadparm_init();
        var samdb = ldb_init();
-       var ok = samdb.connect("sam.ldb");
+       var ok = samdb.connect(paths.samdb);
        assert(ok);
 
+       message("Writing configuration\n");
+       var newconf = upgrade_smbconf(samba3.configuration,true);
+       newconf.save(paths.smbconf);
+
        message("Importing account policies\n");
        var ldif = upgrade_sam_policy(samba3,subobj.BASEDN);
        ok = samdb.modify(ldif);
        assert(ok);
 
-       // FIXME: Enable samba3sam module if original passdb backend was ldap
+       // figure out ldapurl, if applicable
+       var ldapurl = undefined;
+       var pdb = samba3.configuration.get_list("passdb backend");
+       if (pdb != undefined) {
+               for (var b in pdb) {
+                       if (substr(pdb[b], 0, 7) == "ldapsam") {
+                               ldapurl = substr(pdb[b], 8);
+                       }
+               }
+       }
+
+       // URL was not specified in passdb backend but ldap /is/ used
+       if (ldapurl == "") {
+               ldapurl = "ldap://" + samba3.configuration.get("ldap server");
+       }
+
+       // Enable samba3sam module if original passdb backend was ldap
+       if (ldapurl != undefined) {
+               message("Enabling Samba3 LDAP mappings for SAM database\n");
+               var ldif = sprintf("
+dn: @MAP=samba3sam
+@MAP_URL: %s", ldapurl);
+               samdb.add(ldif);
+
+               samdb.modify("dn: @MODULES
+@LIST: samldb,timestamps,objectguid,rdn_name,samba3sam");
+       }
 
        message("Importing users\n");
        for (var i in samba3.samaccounts) {
-               message("... " + samba3.samaccounts[i].username + "\n");
+               message("... " + samba3.samaccounts[i].username);
                var ldif = upgrade_sam_account(samba3.samaccounts[i],subobj.BASEDN);
                ok = samdb.add(ldif);
-               assert(ok);
+               if (!ok) { 
+                       message("... error: " + samdb.errstring()); 
+                       ret = ret + 1; 
+               }
+               message("\n");
        }
 
        message("Importing groups\n");
        for (var i in samba3.groupmappings) {
-               message("... " + samba3.groupmappings[i].nt_name + "\n");
+               message("... " + samba3.groupmappings[i].nt_name);
                var ldif = upgrade_sam_group(samba3.groupmappings[i],subobj.BASEDN);
                ok = samdb.add(ldif);
-               assert(ok);
+               if (!ok) { 
+                       message("... error: " + samdb.errstring()); 
+                       ret = ret + 1; 
+               }
+               message("\n");
        }
 
        message("Importing registry data\n");
        var hives = new Array("hkcr","hkcu","hklm","hkpd","hku","hkpt"); 
        for (var i in hives) {
-               message("... " + hives[i] + "\n");
+               var hn = hives[i];
+               message("... " + hn + "\n");
                var regdb = ldb_init();
-               ok = regdb.connect(hives[i] + ".ldb");
-               assert(ok);
-               var ldif = upgrade_registry(samba3.registry, hives[i]);
-               ok = regdb.add(ldif);
+               ok = regdb.connect(paths[hn]);
                assert(ok);
+               var ldif = upgrade_registry(samba3.registry, hn);
+               for (var j in ldif) {
+                       message("... ... " + j);
+                       ok = regdb.add(ldif[j]);
+                       if (!ok) { 
+                               message("... error: " + regdb.errstring()); 
+                               ret = ret + 1; 
+                       }
+                       message("\n");
+               }
        }
 
        message("Importing WINS data\n");
        var winsdb = ldb_init();
-       ok = winsdb.connect("wins.ldb");
+       ok = winsdb.connect(paths.winsdb);
        assert(ok);
+       ldb_erase(winsdb);
 
        var ldif = upgrade_wins(samba3);
        ok = winsdb.add(ldif);
        assert(ok);
 
-       return ok;
+       return ret;
 }