Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Stone <michael@laptop.org>2010-10-07 03:51:26 (GMT)
committer Michael Stone <michael@laptop.org>2010-12-19 00:43:53 (GMT)
commit92180b6cae21f5dbca37bcac80d7c2eaa8bdaf9c (patch)
tree7ba1df148d972a702cfd9c159cfc98438dee2526
parent47fdd82ab05a6d087ab26b489579f493288c43b9 (diff)
Replace shell scripts with python scripts.
String manipulation in bash is simply too hard to make safe.
-rwxr-xr-xbin/rainbow-easy87
-rwxr-xr-xbin/rainbow-resume76
-rw-r--r--rainbow/util.py24
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)