[pkg-fso-commits] [SCM] FSO frameworkd Debian packaging branch, master, updated. milestone4-368-g700ab82

Michael 'Mickey' Lauer mickey at vanille-media.de
Mon Feb 2 18:51:50 UTC 2009


The following commit has been merged in the master branch:
commit ebb4ade5e6f41ee5da3fa64401a7b9c654fd3bc4
Author: Michael 'Mickey' Lauer <mickey at vanille-media.de>
Date:   Sat Jan 3 15:46:13 2009 +0100

    odeviced: kernel26: Use common KObjectDispatcher

diff --git a/ChangeLog b/ChangeLog
index eb779e1..8bfd719 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@
 	  This will be used to substitute route some polling in pdp and other modules.
 	  NOTE: To assist netlink parsing, we include the cxutil and cxnet packages
 	  from python-connexion in the framework. For more details, see http://www.radlinux.org/connexion/wiki
+	* odeviced: Substituted own kobject notification with generic KobjectDispatcher.
 
 2009-01-02	Michael Lauer	<mlauer at vanille-media.de>
 
diff --git a/framework/__init__.py b/framework/__init__.py
index dd42882..fefbf9b 100644
--- a/framework/__init__.py
+++ b/framework/__init__.py
@@ -1,4 +1,3 @@
-
-
-from resource import Resource
-from controller import Controller
+# cxnet / cxutil
+import sys, os
+sys.path.append( os.path.abspath( os.path.dirname( __file__ ) ) )
diff --git a/framework/patterns/kobject.py b/framework/patterns/kobject.py
index 4b0ead7..d809b88 100644
--- a/framework/patterns/kobject.py
+++ b/framework/patterns/kobject.py
@@ -10,17 +10,14 @@ Package: framework
 Module: services
 """
 
-__version__ = "0.1.0"
+__version__ = "0.2.0"
 MODULE_NAME = "frameworkd.kobject"
 
 SYS_CLASS_NET = "/sys/class/net"
 
-try:
-    from cxnet.netlink.rtnl import rtnl_msg as RtNetlinkMessage
-    from cxnet.netlink.rtnl import rtnl_msg_parser as RtNetlinkParser
-    from cxnet.netlink.rtnl import RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV4_ROUTE
-except ImportError:
-    raise ImportError( "cxnet not found. Please install python-connexion >= 0.4.6" )
+from cxnet.netlink.rtnl import rtnl_msg as RtNetlinkMessage
+from cxnet.netlink.rtnl import rtnl_msg_parser as RtNetlinkParser
+from cxnet.netlink.rtnl import RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV4_ROUTE
 
 import gobject
 
@@ -58,6 +55,8 @@ class KObjectDispatcher( object ):
     _instance = None
     _matches = {}
 
+    ACTIONS = "add change remove addaddress deladdress addlink dellink addroute delroute".split()
+
     def __init__( self ):
         self._socketU = None
         self._socketR = None
@@ -107,11 +106,13 @@ class KObjectDispatcher( object ):
         logger.info( "Unlinked from all netlink objects. No further notifications." )
 
     def _addMatch( self, action, path, callback ):
+        logger.debug( "_addMatch %s, %s, %s" % ( action, path, callback ) )
         #print "action='%s', path='%s'" % ( action, path )
         if action == '*':
             self._addMatch( "add", path, callback )
+            self._addMatch( "change", path, callback )
             self._addMatch( "remove", path, callback )
-        elif action in "add remove addaddress deladdress addlink dellink addroute delroute".split():
+        elif action in self.__class__.ACTIONS:
             path = path.replace( '*', '' )
             if path == '' or path.startswith( '/' ):
                 match = "%s@%s" % ( action, path )
@@ -121,9 +122,10 @@ class KObjectDispatcher( object ):
             else:
                 raise ValueError( "Path needs to start with / or be '*'" )
         else:
-            raise ValueError( "Action needs to be 'add' or 'remove'" )
+            raise ValueError( "Action needs to be one of %s" % self.__class__.ACTIONS )
 
     def _removeMatch( self, action, path, callback ):
+        logger.debug( "_removeMatch %s, %s, %s" % ( action, path, callback ) )
         if action == '*':
             self._removeMatch( "add", path, callback )
             self._removeMatch( "remove", path, callback )
@@ -193,6 +195,9 @@ if __name__ == "__main__":
 #----------------------------------------------------------------------------#
     logging.basicConfig()
 
+    def change_class_callback( *args, **kwargs ):
+        print "change @ class callback", args, kwargs
+
     def class_callback( *args, **kwargs ):
         print "class callback", args, kwargs
 
@@ -214,6 +219,7 @@ if __name__ == "__main__":
     def del_route_callback( *args, **kwargs ):
         print "del route callback", args, kwargs
 
+    KObjectDispatcher.addMatch( "change", "/class/", change_class_callback )
     KObjectDispatcher.addMatch( "add", "/class/", class_callback )
     KObjectDispatcher.addMatch( "add", "/devices/", devices_callback )
     KObjectDispatcher.addMatch( "*", "*", all_callback )
diff --git a/framework/subsystems/odeviced/kernel26.py b/framework/subsystems/odeviced/kernel26.py
index 5089c34..400fbb9 100644
--- a/framework/subsystems/odeviced/kernel26.py
+++ b/framework/subsystems/odeviced/kernel26.py
@@ -8,17 +8,17 @@ GPLv2 or later
 """
 
 MODULE_NAME = "odeviced.kernel26"
-__version__ = "0.9.9.4"
+__version__ = "0.9.9.5"
 
 from helpers import DBUS_INTERFACE_PREFIX, DBUS_PATH_PREFIX, readFromFile, writeToFile, cleanObjectName
 from framework.config import config
+from framework.patterns.kobject import KObjectDispatcher
 
 import dbus.service
 
 import gobject
 
-import os, time, sys, socket, fcntl
-socket.NETLINK_KOBJECT_UEVENT = 15 # not present in earlier versions
+import os, time, sys
 
 import logging
 logger = logging.getLogger( MODULE_NAME )
@@ -213,24 +213,20 @@ class PowerSupply( dbus.service.Object ):
         logger.info( "%s %s initialized. Serving %s at %s" % ( self.__class__.__name__, __version__, self.interface, self.path ) )
         self.node = node
 
-        self.ueventsock = s = socket.socket( socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_KOBJECT_UEVENT )
-        # this only works as root
-        try:
-            s.bind( ( os.getpid(), 1 ) )
-        except socket.error, e:
-            logger.warning( "Could not bind to netlink object. Power supply reporting might not work." )
-        else:
-            logger.info( "Successfully bound to netlink object." )
-            self.ueventsockWatch = gobject.io_add_watch( s.fileno(), gobject.IO_IN, self.onUeventActivity )
         capacityCheckTimeout = config.getInt( MODULE_NAME, "capacity_check_timeout", 60*5 )
         self.capacityWatch = gobject.timeout_add_seconds( capacityCheckTimeout, self.onCapacityCheck )
-        # FIXME should this rather be handled globally (controller issuing a coldstart on every subsystem?)
+        # FIXME should this rather be handled globally (controller issuing a coldstart on every subsystem)? Yes!
         gobject.idle_add( self.onColdstart )
 
         self.powerStatus = "unknown"
         self.online = False
         self.capacity = -1
-        self.isBattery = ( readFromFile( "%s/type" ) == "Battery" )
+        self.type_ = readFromFile( "%s/type" % self.node ).lower()
+        self.isBattery = ( self.type_ == "battery" )
+
+        # get polling-free battery notifications via kobject/uevent
+        if self.isBattery:
+            KObjectDispatcher.addMatch( "change", "/class/power_supply/%s" % node.split('/')[-1], self.handlePropertyChange )
 
     def isPresent( self ):
         present = readFromFile( "%s/present" % self.node )
@@ -243,22 +239,12 @@ class PowerSupply( dbus.service.Object ):
     def theType( self ):
         return readFromFile( "%s/type" % self.node )
 
-    def onUeventActivity( self, source, condition ):
-        data = self.ueventsock.recv( 1024 )
-        logger.debug( "got data from uevent socket: %s" % repr(data) )
-        # split up and check whether this is really for us
-        parts = data.split( '\x00' )
-        name = parts[0]
-        myname = "power_supply/%s" % self.node.split("/")[-1]
-        if name.endswith( myname ):
-            gobject.idle_add( self.handlePropertyChange, dict( [ x.split('=') for x in parts if '=' in x ] ) )
-        return True # call me again
-
     def onColdstart( self ):
         data = readFromFile( "%s/uevent" % self.node )
         parts = data.split( '\n' )
-        gobject.idle_add( self.handlePropertyChange, dict( [ x.split('=') for x in parts if '=' in x ] ) )
-        return False # don't call me again
+        d = dict( [ x.split('=') for x in parts if '=' in x ] )
+        self.handlePropertyChange( **d )
+        return False # mainloop: don't call me again
 
     def readCapacity( self ):
         if not self.isBattery:
@@ -293,7 +279,7 @@ class PowerSupply( dbus.service.Object ):
                 self.sendPowerStatusIfChanged( "critical" )
         return True # call me again
 
-    def handlePropertyChange( self, properties ):
+    def handlePropertyChange( self, **properties ):
         if not self.isPresent():
             return False # don't call me again
         logger.debug( "got property change from uevent socket: %s" % properties )

-- 
FSO frameworkd Debian packaging



More information about the pkg-fso-commits mailing list