#!/usr/bin/env python import sys import pwd from os import getuid, getgid, environ, chmod, chown, symlink from os.path import join, isdir, dirname from optparse import OptionParser from shutil import copyfile from rainbow.util import make_reporter, trace, make_dirs sys.excepthook = trace def main(): parser = OptionParser(version='0.1') parser.add_option('-v', '--verbose', default=0, action='count', help='Verbosity. Repeat for more verbose output.') parser.add_option('-q', '--quiet', default=False, action='store_true', help='Quiet. Disable all output.') parser.add_option('-u', '--user', default=None, help="Isolated user.") parser.add_option('-e', '--envdir', default=None, help="Envdir to be used for launching.") opts, args = parser.parse_args() if not opts.user or not opts.envdir: parser.print_help() exit(1) report = make_reporter(opts.verbose, opts.quiet, sys.stdout) def check_user(report, opts): report(1, 'Sugarizing isolated uid %s.', opts.user) return opts.user def check_envdir(report, envdir): report(1, 'Sugarizing envdir %s.', envdir) assert isdir(envdir) def write_envvar(k, v): report(1, '-E %s=%s', k, v) open(join(envdir, k), 'w').write(v) return write_envvar user = check_user(report, opts) write_envvar = check_envdir(report, opts.envdir) o = pwd.getpwuid(getuid()) i = pwd.getpwnam(user) h_o = o.pw_dir h_i = i.pw_dir # We want to use xauth generate $DISPLAY . untrusted, but we don't have # XSECURITY enabled. environ.setdefault('XAUTHORITY', join(h_o, '.Xauthority')) environ.setdefault('ICEAUTHORITY', join(h_o, '.ICEauthority')) x_cookie_path = join(h_i, '.Xauthority') make_dirs(dirname(x_cookie_path), getuid(), getgid(), 0777) copyfile(environ['XAUTHORITY'], x_cookie_path) chmod(x_cookie_path, 0666) chown(x_cookie_path, o.pw_uid, i.pw_gid) ice_cookie_path = join(h_i, '.ICEauthority') make_dirs(dirname(ice_cookie_path), getuid(), getgid(), 0777) copyfile(environ['ICEAUTHORITY'], ice_cookie_path) chmod(ice_cookie_path, 0666) chown(ice_cookie_path, o.pw_uid, i.pw_gid) for frag in ['owner.key.pub']: path = join('.sugar/default/', frag) make_dirs(dirname(join(h_i, path)), getuid(), getgid(), 0777) copyfile(join(h_o, path), join(h_i, path)) chmod(join(h_i, path), 0666) write_envvar('USER', i.pw_name) write_envvar('HOME', h_i) write_envvar('XAUTHORITY', x_cookie_path) write_envvar('ICEAUTHORITY', ice_cookie_path) write_envvar('SUGAR_ACTIVITY_ROOT', h_i) write_envvar('TMPDIR', join(h_i, 'tmp')) write_envvar('DISPLAY', environ['DISPLAY']) symlink(".", join(h_i, "instance")) symlink(environ["SUGAR_BUNDLE_ID"], join(h_i, "data")) symlink(environ.get("TMPDIR", "/tmp"), join(h_i, "tmp")) if __name__ == '__main__': main() # vim : et sw=4 ts=4 sts=4 :