diff options
author | Michael Stone <michael@laptop.org> | 2010-10-07 03:51:26 (GMT) |
---|---|---|
committer | Michael Stone <michael@laptop.org> | 2010-12-19 00:43:53 (GMT) |
commit | 92180b6cae21f5dbca37bcac80d7c2eaa8bdaf9c (patch) | |
tree | 7ba1df148d972a702cfd9c159cfc98438dee2526 | |
parent | 47fdd82ab05a6d087ab26b489579f493288c43b9 (diff) |
Replace shell scripts with python scripts.
String manipulation in bash is simply too hard to make safe.
-rwxr-xr-x | bin/rainbow-easy | 87 | ||||
-rwxr-xr-x | bin/rainbow-resume | 76 | ||||
-rw-r--r-- | rainbow/util.py | 24 |
3 files changed, 112 insertions, 75 deletions
diff --git a/bin/rainbow-easy b/bin/rainbow-easy index cdcef8d..85733c5 100755 --- a/bin/rainbow-easy +++ b/bin/rainbow-easy @@ -1,45 +1,48 @@ -#!/bin/bash +#!/usr/bin/python -function usage() { - echo "sudo $0 ID /path/to/program" - echo "ex: sudo $0 banking /bin/bash" - exit 1 -} - -if [ -z "$1" ] || [ -z "$SUDO_USER" ]; then usage || exit 1; fi - -ID="$1"; shift - -read_parent_envvar () { -python <<EOF import os -from os.path import join +import sys -ppid = os.getppid() -env = open(join('/proc', str(ppid),'environ')).read().split('\0') -for kv in env: - if kv.startswith("$1="): - print kv[len("$1="):] -EOF -} - -PARENT_PATH=`read_parent_envvar PATH` - -if [ -z "$DISPLAY" ]; then - DISPLAY=`read_parent_envvar DISPLAY` -fi - -exec /usr/sbin/rainbow-run \ - -q \ - -s /var/spool/rainbow/2 \ - -u "$SUDO_USER" -c "`pwd`" \ - -f 0 -f 1 -f 2 \ - -i "${SUDO_USER}_${ID}" \ - -E "DISPLAY=$DISPLAY" \ - -E "XAUTHORITY=${XAUTHORITY:-${HOME}/.Xauthority}" \ - -E "PATH=${PARENT_PATH}" \ - -a /usr/bin/rainbow-xify \ - -o audio \ - -o network \ - -- \ - "$@" +from os.path import join +from optparse import OptionParser + +from rainbow.util import make_reporter, trace, EnvMerge + +sys.excepthook = trace + +usage = "usage: sudo %prog [options] ACTIVITY /path/to/program" + +def main(): + parser = OptionParser(usage=usage, version='0.1') + opts, args = parser.parse_args() + if len(args) < 2 or "SUDO_USER" not in os.environ: + parser.print_help() + exit(1) + + activity = args[0] + launch_argv = args[1:] + + env = EnvMerge() + path = env.parent_envvar("PATH") or "" + display = env.prefer_our_envvar("DISPLAY") or "" + xauthority = env.prefer_our_envvar("XAUTHORITY") or "" + + rainbow_argv = [ + "/usr/sbin/rainbow-run", + "-s", "/var/spool/rainbow/2", + "-u", os.environ["SUDO_USER"], + "-c", os.getcwd(), + "-f", "0", "-f", "1", "-f", "2", + "-E", "DISPLAY="+display, + "-E", "XAUTHORITY="+xauthority, + "-E", "PATH="+path, + "-a", "/usr/bin/rainbow-xify", + "-o", "audio", + "-o", "network", + "-i", "%s_%s" % (os.environ["SUDO_USER"], activity), + "--"] + launch_argv + + return os.execv(rainbow_argv[0], rainbow_argv) + +if __name__ == "__main__": + main() diff --git a/bin/rainbow-resume b/bin/rainbow-resume index 8a4c5aa..75b2f22 100755 --- a/bin/rainbow-resume +++ b/bin/rainbow-resume @@ -1,38 +1,48 @@ -#!/bin/bash +#!/usr/bin/python -function usage() { - echo "sudo $0 RESUME_UID /path/to/program" - echo "ex: sudo $0 banking /bin/bash" - exit 1 -} +import os +import sys -if [ -z "$1" ] || [ -z "$SUDO_USER" ]; then usage || exit 1; fi +from os.path import join +from optparse import OptionParser -RESUME_UID="$1"; shift +from rainbow.util import make_reporter, trace, EnvMerge -if [ -z "$DISPLAY" ]; then - DISPLAY=`python <<EOF -import os -from os.path import join +sys.excepthook = trace + +usage = "usage: sudo %prog [options] RESUME_UID /path/to/program" + +def main(): + parser = OptionParser(usage=usage, version='0.1') + opts, args = parser.parse_args() + if len(args) < 2 or "SUDO_USER" not in os.environ: + parser.print_help() + exit(1) + + resume_uid = args[0] + launch_argv = args[1:] + + env = EnvMerge() + path = env.parent_envvar("PATH") or "" + display = env.prefer_our_envvar("DISPLAY") or "" + xauthority = env.prefer_our_envvar("XAUTHORITY") or "" + + rainbow_argv = [ + "/usr/sbin/rainbow-run", + "-s", "/var/spool/rainbow/2", + "-u", os.environ["SUDO_USER"], + "-c", os.getcwd(), + "-f", "0", "-f", "1", "-f", "2", + "-E", "DISPLAY="+display, + "-E", "XAUTHORITY="+xauthority, + "-E", "PATH="+path, + "-a", "/usr/bin/rainbow-xify", + "-o", "audio", + "-o", "network", + "-r", resume_uid, + "--"] + launch_argv + + return os.execv(rainbow_argv[0], rainbow_argv) -ppid = os.getppid() -env = open(join('/proc', str(ppid),'environ')).read().split('\0') -for kv in env: - if kv.startswith("DISPLAY="): - print kv[len("DISPLAY="):] -EOF` -fi - -exec /usr/sbin/rainbow-run \ - -s /var/spool/rainbow/2 \ - -u "$SUDO_USER" \ - -c "`pwd`" \ - -f 0 -f 1 -f 2 \ - -E "DISPLAY=$DISPLAY" \ - -E "XAUTHORITY=$XAUTHORITY" \ - -a /usr/bin/rainbow-xify \ - -o audio \ - -o network \ - -r "$RESUME_UID" \ - -- \ - "$@" +if __name__ == "__main__": + main() diff --git a/rainbow/util.py b/rainbow/util.py index 3679c20..d0a56e8 100644 --- a/rainbow/util.py +++ b/rainbow/util.py @@ -1,3 +1,5 @@ +from __future__ import with_statement + import os from stat import ST_MODE, ST_UID, ST_GID, S_ISREG @@ -503,3 +505,25 @@ def read_envdir(envdir, overrides=None): k, v = binding.split('=',1) env[k] = v return env + +class EnvMerge(object): + def __init__(self): + self.parent_env = None + + def read_parent_envfile(self): + ppid = str(os.getppid()) + with open(join('/proc', ppid,'environ')) as f: + self.parent_env = f.read().split('\0') + + def parent_envvar(self, key): + if self.parent_env is None: + self.read_parent_envfile() + for kv in self.parent_env: + if kv.startswith(key + "="): + return kv[len(key +"="):] + return None + + def prefer_our_envvar(self, key): + if key in os.environ: + return os.environ[key] + return self.parent_envvar(key) |