[pkg-fso-commits] [SCM] Various useful tools for an FSO installation branch, master, updated. debian/0.git20080812.2-32-gb5a13bb

Jan Luebbe jluebbe at debian.org
Sun Sep 27 16:11:44 UTC 2009


The following commit has been merged in the master branch:
commit 63e1435165e0e52226975f85c444fa4a92d834f5
Author: Jan Luebbe <jluebbe at debian.org>
Date:   Fri Feb 20 14:38:48 2009 +0100

    pycd: add a python preloaded

diff --git a/pycd/TODO b/pycd/TODO
new file mode 100644
index 0000000..b7af7b9
--- /dev/null
+++ b/pycd/TODO
@@ -0,0 +1,8 @@
+- choose a better name/dbus-api
+  * allow to preload generic modules
+- be able to start:
+  * module with function
+  * script
+- add a unix socket
+- add simple C launcher/wrapper
+
diff --git a/pycd/pycd.conf b/pycd/pycd.conf
new file mode 100644
index 0000000..6d15796
--- /dev/null
+++ b/pycd/pycd.conf
@@ -0,0 +1,12 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+  <policy user="root">
+    <allow own="org.freesmartphone.CloneFactory"/>
+    <allow send_destination="org.freesmartphone.CloneFactory"/>
+  </policy>
+
+  <policy context="default">
+    <allow send_destination="org.freesmartphone.CloneFactory"/>
+  </policy>
+</busconfig>
diff --git a/pycd/pycd.py b/pycd/pycd.py
new file mode 100755
index 0000000..709fdab
--- /dev/null
+++ b/pycd/pycd.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python
+"""
+The Open Device Daemon - Python Implementation
+
+(C) 2008 Michael 'Mickey' Lauer <mlauer at vanille-media.de>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+"""
+
+import os, sys
+
+import dbus
+import dbus.service
+from dbus.mainloop.glib import DBusGMainLoop
+import gobject
+
+import runpy
+
+import logging
+# create logger
+logger = logging.getLogger( "pycd" )
+logger.setLevel(logging.DEBUG)
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
+handler.setFormatter( formatter )
+logger.addHandler( handler )
+
+#============================================================================#
+class Prototype( object ):
+#============================================================================#
+    def __init__( self ):
+        logger.info( "starting prototype" )
+        self.down = os.pipe()
+        self.up = os.pipe()
+        pid = os.fork()
+        if pid:
+            self.inParent( pid )
+        else:
+            self.inChild()
+            os._exit(0)
+
+    def inChild( self ):
+        logger.info( "in prototype" )
+        sys.argv[0] = "pycd - prototype"
+        os.close( self.down[1] )
+        os.close( self.up[0] )
+        self.down = os.fdopen( self.down[0], 'r', 0 ) # read side
+        self.up = os.fdopen( self.up[1], 'w', 0 ) # write side
+        while True:
+            sender, argv = self.down.readline().strip().split(' ', 1)
+            sender = int( sender )
+            argv = eval( argv )
+            logger.info( "got command: %s", repr(( sender, argv )) )
+            self.doClone( sender, argv )
+
+    def inParent( self, child_pid ):
+        logger.info( "started prototype (child PID %s)", child_pid )
+        os.close( self.down[0] )
+        os.close( self.up[1] )
+        self.down = os.fdopen( self.down[1], 'w', 0) # write side
+        self.up = os.fdopen( self.up[0], 'r', 0) # read side
+
+    def requestClone( self, sender, argv ):
+        self.down.write( "%i %s\n" % ( sender, repr( argv ) ) )
+        reply = int( self.up.readline().strip() )
+        logger.info( "got reply: %s", repr(reply) )
+        return int( reply )
+
+    def doClone( self, sender, argv ):
+        pid = os.fork()
+        if pid:
+            os.waitpid( pid, 0 )
+            return
+
+        os.chdir( "/proc/%i/cwd" % sender )
+        os.setsid()
+        os.umask(0)
+
+        for line in file( "/proc/%i/status" % sender, 'r' ):
+            line = line.strip().lower().split()
+            if line[0] == "uid:":
+                uid = int( line[1] )
+            elif line[0] == "gid:":
+                gid = int( line[1] )
+            elif line[0] == "groups:":
+                groups = map( int , line[1:])
+
+        environ = file( "/proc/%i/environ" % sender, 'r' ).read()
+        for key in os.environ.keys():
+            del os.environ[key]
+        for line in environ.split( '\x00'):
+            if not line:
+                continue
+            key, value = line.split( '=', 1 )
+            os.environ[key] = value
+
+        os.setgid( gid )
+        os.setgroups( groups )
+        os.setuid( uid )
+
+        pid = os.fork()
+        if pid:
+            os._exit(0)
+
+        logger.info( "in child" )
+        self.down.close()
+        MAXFD = os.sysconf( 'SC_OPEN_MAX' )
+        for fd in xrange( 3, MAXFD ):
+            if fd == self.up.fileno():
+                continue # will be closed later
+            try:
+                os.close( fd )
+            except OSError:
+                pass
+        sys.stdout.flush()
+        sys.stderr.flush()
+        stdin = file( "/proc/%i/fd/0" % sender, 'r')
+        stdout = file( "/proc/%i/fd/1" % sender, 'a+')
+        stderr = file( "/proc/%i/fd/2" % sender, 'a+', 0)
+        os.dup2( stdin.fileno(), sys.stdin.fileno() )
+        os.dup2( stdout.fileno(), sys.stdout.fileno() )
+        os.dup2( stderr.fileno(), sys.stderr.fileno() )
+
+        self.up.write( "%s\n" % os.getpid() )
+        self.up.close()
+        self.runClone( argv )
+        sys.exit(0)
+
+    def runClone( self, argv ):
+        sys.argv = argv
+        runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True)
+
+#============================================================================#
+class CloneFactory( dbus.service.Object ):
+#============================================================================#
+    DBUS_PATH = "/"
+    DBUS_INTERFACE = "org.freesmartphone.CloneFactory"
+    def __init__( self, bus ):
+        dbus.service.Object.__init__( self, bus, self.DBUS_PATH )
+        self.bus = bus
+        self.dbus_proxy = self.bus.get_object( "org.freedesktop.DBus", "/" )
+        self.dbus_iface = dbus.Interface( self.dbus_proxy, "org.freedesktop.DBus" )
+
+    @dbus.service.method( DBUS_INTERFACE, 'a(s)', 'i', sender_keyword='sender' )
+    def AdoptClone( self, argv, sender ):
+        logger.info( "AdoptClone" )
+        sender_pid = int( self.dbus_iface.GetConnectionUnixProcessID( sender ) )
+        logger.info( "Sender: %s", repr( sender) )
+        logger.info( "PID: %s", repr( sender_pid ) )
+        argv = map( str, argv )
+        return prototype.requestClone( sender_pid, argv )
+
+#=========================================================================#
+class Controller( object ):
+#=========================================================================#
+    def __init__( self ):
+        logger.info( "starting controller" )
+        DBusGMainLoop( set_as_default=True )
+        self.mainloop = gobject.MainLoop()
+        gobject.idle_add( self.idle )
+        gobject.timeout_add_seconds( 10, self.timeout )
+        self.bus = dbus.SystemBus()
+        self.busname = dbus.service.BusName( "org.freesmartphone.CloneFactory", self.bus )
+        self.objects = []
+        self.objects.append( CloneFactory( self.bus ) )
+
+    def idle( self ):
+        logger.info( "in mainloop" )
+        return False
+
+    def timeout( self ):
+        logger.info( "alive and kicking" )
+        return True
+
+    def run( self ):
+        self.mainloop.run()
+
+if __name__ == "__main__":
+    prototype = Prototype()
+    controller = Controller()
+    controller.run()
+

-- 
Various useful tools for an FSO installation



More information about the pkg-fso-commits mailing list