TODO (SoC project):
- - test ldb_map backend (testsuite?)
+ - finish ldb_map testsuite
- testsuite for the static upgrade
ret = talloc_zero(ctx, struct samba3);
- if (smbconf) {
+ if (smbconf != NULL) {
ret->configuration = param_init(ret);
- param_read(ret->configuration, smbconf);
+ if (param_read(ret->configuration, smbconf) == -1) {
+ talloc_free(ret);
+ return NT_STATUS_UNSUCCESSFUL;
+ }
}
dbfile = talloc_asprintf(ctx, "%s/account_policy.tdb", libdir);
--- /dev/null
+#!/bin/sh
+PREFIX=$1
+
+if [ -z "$PREFIX" ]
+then
+ print "Usage: test_s3upgrade.sh <prefix"
+ exit 1
+fi
+
+DATADIR=$PREFIX/upgrade
+
+mkdir -p $DATADIR
+rm -f $DATADIR/*
+
+bin/smbscript setup/upgrade --targetdir=$DATADIR ../testdata/samba3 ../testdata/samba3/smb.conf
+
+# FIXME: Do some sanity checks on the output files
assert(ok);
}
+function provision_default_paths(subobj)
+{
+ var lp = loadparm_init();
+ var paths = new Object();
+ paths.smbconf = lp.get("config file");
+ paths.hklm = "hklm.ldb";
+ paths.hkcu = "hkcu.ldb";
+ paths.hkcr = "hkcr.ldb";
+ paths.hku = "hku.ldb";
+ paths.hkpd = "hkpd.ldb";
+ paths.hkpt = "hkpt.ldb";
+ paths.samdb = "sam.ldb";
+ paths.rootdse = "rootdse.ldb";
+ paths.secrets = "secrets.ldb";
+ paths.dns = lp.get("private dir") + "/" + subobj.DNSDOMAIN + ".zone";
+ paths.winsdb = "wins.ldb";
+ return paths;
+}
+
/*
provision samba4 - caution, this wipes all existing data!
*/
-function provision(subobj, message, blank)
+function provision(subobj, message, blank, paths)
{
var data = "";
var lp = loadparm_init();
var sys = sys_init();
- var smbconf = lp.get("config file");
-
+
/*
some options need to be upper/lower case
*/
provision_next_usn = 1;
/* only install a new smb.conf if there isn't one there already */
- var st = sys.stat(smbconf);
+ var st = sys.stat(paths.smbconf);
if (st == undefined) {
message("Setting up smb.conf\n");
- setup_file("provision.smb.conf", smbconf, subobj);
+ setup_file("provision.smb.conf", paths.smbconf, subobj);
lp.reload();
}
message("Setting up hklm.ldb\n");
- setup_ldb("hklm.ldif", "hklm.ldb", subobj);
+ setup_ldb("hklm.ldif", paths.hklm, subobj);
message("Setting up sam.ldb attributes\n");
- setup_ldb("provision_init.ldif", "sam.ldb", subobj);
+ setup_ldb("provision_init.ldif", paths.samdb, subobj);
message("Setting up sam.ldb templates\n");
- setup_ldb("provision_templates.ldif", "sam.ldb", subobj, NULL, false);
+ setup_ldb("provision_templates.ldif", paths.samdb, subobj, NULL, false);
message("Setting up sam.ldb data\n");
- setup_ldb("provision.ldif", "sam.ldb", subobj, NULL, false);
+ setup_ldb("provision.ldif", paths.samdb, subobj, NULL, false);
if (blank == false) {
message("Setting up sam.ldb users and groups\n");
- setup_ldb("provision_users.ldif", "sam.ldb", subobj, data, false);
+ setup_ldb("provision_users.ldif", paths.samdb, subobj, data, false);
}
message("Setting up rootdse.ldb\n");
- setup_ldb("rootdse.ldif", "rootdse.ldb", subobj);
+ setup_ldb("rootdse.ldif", paths.rootdse, subobj);
message("Setting up secrets.ldb\n");
- setup_ldb("secrets.ldif", "secrets.ldb", subobj);
+ setup_ldb("secrets.ldif", paths.secrets, subobj);
message("Setting up DNS zone file\n");
setup_file("provision.zone",
- lp.get("private dir") + "/" + subobj.DNSDOMAIN + ".zone",
+ paths.dns,
subobj);
}
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(lp.get("config file"));
+ newconf.save(paths.smbconf);
message("Importing account policies\n");
var ldif = upgrade_sam_policy(samba3,subobj.BASEDN);
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");
+ ok = regdb.connect(paths[hn]);
assert(ok);
- var ldif = upgrade_registry(samba3.registry, hives[i]);
+ var ldif = upgrade_registry(samba3.registry, hn);
for (var j in ldif) {
message("... ... " + j);
ok = regdb.add(ldif[j]);
message("Importing WINS data\n");
var winsdb = ldb_init();
- ok = winsdb.connect("wins.ldb");
+ ok = winsdb.connect(paths.winsdb);
assert(ok);
ldb_erase(winsdb);
ok = winsdb.add(ldif);
assert(ok);
- message("Reloading smb.conf\n");
- lp.reload();
-
return ret;
}
message("Provisioning for %s in realm %s\n", subobj.DOMAIN, subobj.REALM);
message("Using administrator password: %s\n", subobj.ADMINPASS);
-provision(subobj, message, blank);
+provision(subobj, message, blank, provision_default_paths(subobj));
message("All OK\n");
return 0;
"POPT_AUTOHELP",
"POPT_COMMON_SAMBA",
"POPT_COMMON_VERSION",
- 'ldif',
+ 'targetdir=s',
'quiet', 'blank');
if (options == undefined) {
}
}
-function ldifprint(data)
-{
- if (options.ldif != undefined) {
- print(data);
- }
-}
-
/*
show some help
*/
Samba4 import tool
provision [options] <libdir> <smbconf>
- --ldif Dump LDIF
+ --targetdir=DIR Output to specified directory
--quiet Be quiet
--blank do not add users or groups, just the structure
exit(1);
}
+
+
message("Provisioning\n");
var subobj = upgrade_provision(samba3);
-provision(subobj, message, options.blank);
+var paths;
+if (options.targetdir != undefined) {
+ paths = new Object();
+ paths.smbconf = sprintf("%s/smb.conf", options.targetdir);
+ var ldbs = new Array("hklm","hkcr","hku","hkcu","hkpd","hkpt","samdb","rootdse","secrets","winsdb");
+ for (var i in ldbs) {
+ var n = ldbs[i];
+ paths[n] = sprintf("tdb://%s/%s.ldb", options.targetdir, n);
+ }
+ paths.dns = options.targetdir+"/dns.zone";
+} else {
+ paths = provision_default_paths(subobj);;
+}
+
+provision(subobj, message, options.blank,paths);
-var ret = upgrade(subobj,samba3,message);
+var ret = upgrade(subobj,samba3,message,paths);
if (ret > 0) {
message("Failed to import %d entries\n", ret);
} else {
write("<h3>You must choose an administrator password. Please try again.</h3>");
f.display();
} else {
- provision(subobj, writefln, false);
+ provision(subobj, writefln, false, provision_default_paths(subobj));
}
} else {
f.display();
for (r in form) {
subobj[r] = form[r];
}
- provision(subobj, writefln, true);
- upgrade(subobj, samba3, writefln);
+ var paths = provision_default_paths(subobj);
+
+ provision(subobj, writefln, true, paths);
+ upgrade(subobj, samba3, writefln, paths);
+
+ writefln("Reloading smb.conf\n");
+ var lp = loadparm_init();
+ lp.reload();
} else {
var f = FormObj("Import from Samba3", 0, 2);