#!/usr/local/bin/python # Published under the BSDL. import sys,os,os.path if len(sys.argv) < 3: print "Expecting arguments: jails_home nr_jails" sys.exit(1) metaroot = sys.argv[1] nrjails = int(sys.argv[2]) def add_dir(root, prefix, dir, type="nullfs", perm="ro"): """Appends to per-jail fstab and creates directories. Example arguments: /jails j666 /bin""" destdir = "%s/%s%s" % (root, prefix, dir) ffstab = file("%s/fstab_%s" % (root, prefix), "a") if type == "nullfs": ffstab.write("%s\t%s\tnullfs\t%s\t0\t0\n" % (dir, destdir, perm)) else: ffstab.write("%s\t%s\t%s\t%s\t0\t0\n" % ("none", destdir, type, perm)) ffstab.close() if not os.path.exists(destdir): os.mkdir(destdir) def add_distribution(root, prefix): """Makes DISTRIBUTION to the prefix""" os.system("cd /usr/src && make distrib-dirs DESTDIR=%s/%s >/dev/null && cd -" % (root, prefix)) os.system("cd /usr/src && make -i distribution DESTDIR=%s/%s >/dev/null && cd -" % (root, prefix)) def write_conf(root, prefix, fname, line): """Writes something to destination config file in /etc of the jail""" frcd = file("%s/%s/etc/%s" % (root, prefix, fname), "a") frcd.write("%s\n" % line) frcd.close() def chpasswd(root, prefix, user, passwd): p = os.popen("/usr/sbin/pw -V %s/%s/etc usermod %s -h 0" % (root, prefix, user), "w") p.write(passwd) p.close() jails = [] cur_ip = [10, 0, 1, 2] for x in xrange(nrjails): prefix = "j%04d" % x root = "%s/%s" % (metaroot, prefix) if not os.path.exists(root): os.mkdir(root) if not os.path.exists("%s/usr" % root): os.mkdir("%s/usr" % root) if os.path.exists("%s/fstab_%s" % (metaroot, prefix)): os.unlink("%s/fstab_%s" % (metaroot, prefix)) if os.path.exists("%s/etc/rc.conf" % root): os.unlink("%s/etc/rc.conf" % root) if os.path.exists("%s/etc/ssh/sshd_config" % root): os.unlink("%s/etc/ssh/sshd_config" % root) add_dir(metaroot, prefix, "/bin") add_dir(metaroot, prefix, "/sbin") add_dir(metaroot, prefix, "/lib") add_dir(metaroot, prefix, "/libexec") add_dir(metaroot, prefix, "/usr/bin") add_dir(metaroot, prefix, "/usr/sbin") add_dir(metaroot, prefix, "/usr/include") add_dir(metaroot, prefix, "/usr/lib") add_dir(metaroot, prefix, "/usr/libexec") add_dir(metaroot, prefix, "/usr/libdata") add_dir(metaroot, prefix, "/usr/share") add_dir(metaroot, prefix, "/usr/src") add_dir(metaroot, prefix, "/usr/ports", "nullfs", "rw") add_distribution(metaroot, prefix) write_conf(metaroot, prefix, "rc.conf", "sshd_enable='YES'") write_conf(metaroot, prefix, "rc.conf", "sendmail_enable='NONE'") write_conf(metaroot, prefix, "ssh/sshd_config", "PermitRootLogin yes") chpasswd(metaroot, prefix, "root", prefix) ip = ".".join([str(x) for x in cur_ip]) jails.append({ "name" : prefix, "ip" : ip}) # assume no more than /16 cur_ip[-1] += 1 if cur_ip[-1] > 254: cur_ip[-2] += 1 cur_ip[-1] = 2 f = file("rc.conf.jails", "w") f.write("jail_enable='YES'\n") f.write("jail_devfs_enable='YES'\n") f.write("jail_list='%s'\n" % " ".join([j["name"] for j in jails])) alias_id = 0 for j in jails: f.write("\n") f.write("jail_%s_rootdir='%s/%s'\n" % (j["name"], metaroot, j["name"])) f.write("jail_%s_mount_enable='YES'\n" % j["name"]) f.write("jail_%s_fstab='%s/fstab_%s'\n" % (j["name"], metaroot, j["name"])) f.write("jail_%s_hostname='%s.cosmos'\n" % (j["name"], j["name"])) f.write("jail_%s_ip='%s/16'\n" % (j["name"], j["ip"])) f.write("jail_%s_interface='%s'\n" % (j["name"], "em0")) alias_id += 1 f.close()