Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/bin/rainbow-xify
diff options
context:
space:
mode:
Diffstat (limited to 'bin/rainbow-xify')
-rwxr-xr-xbin/rainbow-xify76
1 files changed, 76 insertions, 0 deletions
diff --git a/bin/rainbow-xify b/bin/rainbow-xify
new file mode 100755
index 0000000..c51c00c
--- /dev/null
+++ b/bin/rainbow-xify
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import sys
+import pwd
+
+from os import getuid, getgid, environ, chmod, chown
+from os.path import join, isdir, dirname, exists
+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, 'X-ifying isolated uid %s.', opts.user)
+ return opts.user
+
+ def check_envdir(report, envdir):
+ report(1, 'X-ifying 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
+
+ # XXX: Is it _always_ right to set these defaults? <MS>
+ environ.setdefault('XAUTHORITY', join(h_o, '.Xauthority'))
+ environ.setdefault('ICEAUTHORITY', join(h_o, '.ICEauthority'))
+
+ for cookie in ['XAUTHORITY', 'ICEAUTHORITY']:
+ if exists(environ[cookie]):
+ cookie_path = join(h_i, cookie)
+ make_dirs(dirname(cookie_path), getuid(), getgid(), 0777)
+ copyfile(environ[cookie], cookie_path)
+ chmod(cookie_path, 0666)
+ chown(cookie_path, o.pw_uid, i.pw_gid)
+ write_envvar(cookie, cookie_path)
+ else:
+ report(1, "Cookie %s -> %s which doesn't exist.", cookie, environ[cookie])
+
+ write_envvar('USER', i.pw_name)
+ write_envvar('HOME', h_i)
+ #write_envvar('TMPDIR', join(h_i, 'tmp'))
+ if 'DISPLAY' in environ:
+ write_envvar('DISPLAY', environ['DISPLAY'])
+
+if __name__ == '__main__':
+ main()
+
+# vim : et sw=4 ts=4 sts=4 :