summaryrefslogtreecommitdiff
path: root/portato
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xportato.py90
-rw-r--r--portato/__init__.py110
2 files changed, 102 insertions, 98 deletions
diff --git a/portato.py b/portato.py
index bdf3ddb..0f0a61b 100755
--- a/portato.py
+++ b/portato.py
@@ -14,93 +14,7 @@
from __future__ import with_statement, absolute_import
-import sys, os
-import subprocess, threading
-import atexit
-from optparse import OptionParser, SUPPRESS_HELP
-
-from portato import get_listener, log, start
-from portato.su import detect_su_command
-from portato.helper import debug, info, error
-from portato.constants import VERSION
-
-def main ():
- start() # the first thing to do :)
-
- # build the parser
- desc = "Portato - A Portage GUI."
- usage = "%prog [options] [frontend]"
- vers = "%%prog v. %s" % VERSION
-
- parser = OptionParser(version = vers, prog = "Portato", description = desc, usage = usage)
-
- parser.add_option("--shm", action = "store", nargs = 3, type="long", dest = "shm",
- help = SUPPRESS_HELP)
-
- parser.add_option("-F", "--no-fork", "-L", action = "store_true", dest = "nofork", default = False,
- help = _("do not fork off as root") + (" (%s)" % _("-L is deprecated")))
-
- # run parser
- (options, args) = parser.parse_args()
-
- # close listener at exit
- atexit.register(get_listener().close)
-
- if options.nofork or os.getuid() == 0: # start GUI
- log.start(file = True) # start logging to file
-
- from portato.gui import run
- info("%s v. %s", _("Starting Portato"), VERSION)
-
- if options.shm:
- get_listener().set_send(*options.shm)
- else:
- get_listener().set_send()
-
- try:
- run()
- except KeyboardInterrupt:
- debug("Got KeyboardInterrupt.")
-
- else: # start us again in root modus and launch listener
-
- import shm_wrapper as shm
-
- mem = shm.create_memory(1024, permissions=0600)
- sig = shm.create_semaphore(InitialValue = 0, permissions = 0600)
- rw = shm.create_semaphore(InitialValue = 1, permissions = 0600)
-
- # start listener
- lt = threading.Thread(target=get_listener().set_recv, args = (mem, sig, rw))
- lt.setDaemon(False)
- lt.start()
-
- try:
- # set DBUS_SESSION_BUS_ADDRESS to "" to make dbus work as root ;)
- env = os.environ.copy()
- env.update(DBUS_SESSION_BUS_ADDRESS="")
-
- su = detect_su_command()
- if su:
- debug("Using '%s' as su command.", su.bin)
- cmd = su.cmd("%s --no-fork --shm %ld %ld %ld" % (sys.argv[0], mem.key, sig.key, rw.key))
-
- sp = subprocess.Popen(cmd, env = env)
-
- # wait for process to finish
- try:
- sp.wait()
- debug("Subprocess finished")
- except KeyboardInterrupt:
- debug("Got KeyboardInterrupt.")
-
- else:
- error(_("No valid su command detected. Aborting."))
-
- finally:
- if lt.isAlive():
- debug("Listener is still running. Close it.")
- get_listener().close()
+from portato import start
if __name__ == "__main__":
- main()
+ start()
diff --git a/portato/__init__.py b/portato/__init__.py
index f5d7f65..e54354a 100644
--- a/portato/__init__.py
+++ b/portato/__init__.py
@@ -12,17 +12,16 @@
from __future__ import absolute_import
-def start():
- from . import log
- import gettext, locale
- from portato.constants import LOCALE_DIR, APP
-
- # set gettext stuff
- locale.setlocale(locale.LC_ALL, '')
- gettext.install(APP, LOCALE_DIR, unicode = True)
+import gettext, locale
+import sys, os
+import subprocess, threading
+import atexit
+from optparse import OptionParser, SUPPRESS_HELP
- # start logging
- log.start(file=False)
+from . import log
+from .constants import LOCALE_DIR, APP, VERSION
+from .su import detect_su_command
+from .helper import debug, info, error
# listener-handling
__listener = None
@@ -34,3 +33,94 @@ def get_listener():
__listener = Listener()
return __listener
+
+def get_parser (use_ = False):
+ # use_ defaults to False, if it is called from outside
+ # where gettext is not yet initialized
+
+ if not use_: _ = lambda s : s
+
+ desc = "Portato - A Portage GUI."
+ usage = "%prog [options] [frontend]"
+ vers = "%%prog v. %s" % VERSION
+
+ parser = OptionParser(version = vers, prog = "Portato", description = desc, usage = usage)
+
+ parser.add_option("--shm", action = "store", nargs = 3, type="long", dest = "shm",
+ help = SUPPRESS_HELP)
+
+ parser.add_option("-F", "--no-fork", "-L", action = "store_true", dest = "nofork", default = False,
+ help = _("do not fork off as root") + (" (%s)" % _("-L is deprecated")))
+
+ return parser
+
+def start():
+
+ # set gettext stuff
+ locale.setlocale(locale.LC_ALL, '')
+ gettext.install(APP, LOCALE_DIR, unicode = True)
+
+ # start logging
+ log.start(file=False)
+
+ # run parser
+ (options, args) = get_parser().parse_args()
+
+ # close listener at exit
+ atexit.register(get_listener().close)
+
+ if options.nofork or os.getuid() == 0: # start GUI
+ log.start(file = True) # start logging to file
+
+ from .gui import run
+ info("%s v. %s", _("Starting Portato"), VERSION)
+
+ if options.shm:
+ get_listener().set_send(*options.shm)
+ else:
+ get_listener().set_send()
+
+ try:
+ run()
+ except KeyboardInterrupt:
+ debug("Got KeyboardInterrupt.")
+
+ else: # start us again in root modus and launch listener
+
+ import shm_wrapper as shm
+
+ mem = shm.create_memory(1024, permissions=0600)
+ sig = shm.create_semaphore(InitialValue = 0, permissions = 0600)
+ rw = shm.create_semaphore(InitialValue = 1, permissions = 0600)
+
+ # start listener
+ lt = threading.Thread(target=get_listener().set_recv, args = (mem, sig, rw))
+ lt.setDaemon(False)
+ lt.start()
+
+ try:
+ # set DBUS_SESSION_BUS_ADDRESS to "" to make dbus work as root ;)
+ env = os.environ.copy()
+ env.update(DBUS_SESSION_BUS_ADDRESS="")
+
+ su = detect_su_command()
+ if su:
+ debug("Using '%s' as su command.", su.bin)
+ cmd = su.cmd("%s --no-fork --shm %ld %ld %ld" % (sys.argv[0], mem.key, sig.key, rw.key))
+
+ sp = subprocess.Popen(cmd, env = env)
+
+ # wait for process to finish
+ try:
+ sp.wait()
+ debug("Subprocess finished")
+ except KeyboardInterrupt:
+ debug("Got KeyboardInterrupt.")
+
+ else:
+ error(_("No valid su command detected. Aborting."))
+
+ finally:
+ if lt.isAlive():
+ debug("Listener is still running. Close it.")
+ get_listener().close()