-#!/usr/bin/python
+#!/usr/bin/python3
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Configuration
schsh = "/usr/local/bin/schsh"
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# DO NOT TOUCH ANYTHING BELOW THIS LINE
-import os, sys, subprocess, pwd, grp
+import os, sys, subprocess, pwd, grp, shutil
if os.getuid() != 0:
- print "Run this a root, please."
+ print("Run this a root, please.")
sys.exit(1)
if os.path.exists(chroot):
raise Exception(chroot+" already exists, please remove it first")
userpw = pwd.getpwnam(name)
+ data = "/home/{0}/data".format(name)
# schroot configuration
- with open("/etc/schroot/chroot.d/user-"+name, "w") as f:
- print >>f, """[user-{0}]
+ with open("/etc/schroot/chroot.d/schsh-"+name, "w") as f:
+ print("""[schsh-{0}]
type=directory
directory={1}
users={0}
-profile=user
-setup.fstab=user/user-{0}.fstab
-""".format(name, chroot)
- with open("/etc/schroot/user/user-"+name+".fstab", "w") as f:
- print >>f, """# <file system> <mount point> <type> <options> <dump> <pass>
-/bin \t/bin \tnone \trw,bind \t0 \t0
-/lib \t/lib \tnone \trw,bind \t0 \t0
-/usr/bin \t/usr/bin \tnone \trw,bind \t0 \t0
-/usr/lib \t/usr/lib \tnone \trw,bind \t0 \t0
-/home/{0}/data\t/data \tnone \trw,bind \t0 \t0
-""".replace(' ', '').format(name) # need to remove spaces so schroot does not complain
+profile=schsh
+setup.fstab=schsh/{0}.fstab
+""".format(name, chroot), file=f)
+ with open("/etc/schroot/schsh/"+name+".fstab", "w") as f:
+ # no spaces, schroot does not like them
+ print("# <file system> <mount point> <type> <options> <dump> <pass>", file=f)
+ # system folders
+ for folder in ("/lib", "/lib64", "/usr/bin", "/usr/lib", "/usr/lib64", "/usr/share/", "/usr/local/bin"):
+ if os.path.exists(folder):
+ print("{0}\t{0}\tnone\trw,bind\t0\t0".format(folder), file=f)
+ # user folder
+ print("{0}\t/data\tnone\trw,bind\t0\t0".format(data), file=f)
# setup the schroot directory
os.mkdir(chroot)
- for folder in ["etc", "dev", "bin", "usr", "data"]:
+ for folder in ["etc", "dev", "data"]:
os.mkdir(os.path.join(chroot, folder))
# setup /etc/passwd and /etc/group
with open(os.path.join(chroot, "etc", "passwd"), "w") as f:
- print >>f, "root:x:0:0:root:/root:/bin/bash"
- print >>f, "{0}:x:{1}:{2}:,,,:/data:/bin/false".format(name, userpw.pw_uid, userpw.pw_gid)
+ print("root:x:0:0:root:/root:/bin/bash", file=f)
+ print("{0}:x:{1}:{2}:,,,:/data:/bin/false".format(name, userpw.pw_uid, userpw.pw_gid), file=f)
with open(os.path.join(chroot, "etc", "group"), "w") as f:
- print >>f, "root:x:0:"
+ print("root:x:0:", file=f)
usergrp = grp.getgrgid(userpw.pw_gid)
- print >>f, "{0}:x:{1}:".format(usergrp.gr_name, usergrp.gr_gid)
+ print("{0}:x:{1}:".format(usergrp.gr_name, usergrp.gr_gid), file=f)
if group:
groupgrp = grp.getgrnam(group)
assert usergrp.gr_gid != groupgrp.gr_gid
- print >>f, "{0}:x:{1}:{2}".format(groupgrp.gr_name, groupgrp.gr_gid, name)
-
+ print("{0}:x:{1}:{2}".format(groupgrp.gr_name, groupgrp.gr_gid, name), file=f)
+
+ # Make sure ~/data (part of the fstab above) exists.
+ if not os.path.exists(data):
+ os.mkdir(data)
+ shutil.chown(data, user, user)
+ os.chmod(data, 0o640)
+
# user configuration
if userpw.pw_shell != schsh:
subprocess.check_output(["usermod", "--shell", schsh, name])
# done!
if len(sys.argv) <= 1:
- print "Usage: %s <usernames>" % sys.argv[0]
+ print("Usage: %s <usernames>" % sys.argv[0])
else:
for name in sys.argv[1:]:
- print "Setting up",name
+ print("Setting up",name)
setup(name)