[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