This file is indexed.

/usr/lib/python2.7/dist-packages/framework/controller.py is in fso-frameworkd 0.10.1-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#!/usr/bin/env python
"""
freesmartphone.org Framework Daemon

(C) 2008-2010 Michael 'Mickey' Lauer <mlauer@vanille-media.de>
(C) 2008-2009 Openmoko, Inc.
GPLv2 or later

Package: framework
Module: controller
"""

MODULE_NAME = "frameworkd.controller"
__version__ = "0.9.9"

from framework.config import DBUS_BUS_NAME_PREFIX, debug, config, loggingmap
from framework.patterns import daemon
import subsystem

import dbus, dbus.service, dbus.mainloop.glib
import gobject
import os, sys, types, time

import logging
logger = logging.getLogger( MODULE_NAME )

try: # not present in older glib versions
    from gobject import timeout_add_seconds
except ImportError:
    logger.error( "python-gobject >= 2.14.0 required" )
    sys.exit( -1 )

#----------------------------------------------------------------------------#
class Controller( daemon.Daemon ):
#----------------------------------------------------------------------------#
    """
    Loading and registering plugins.
    """
    # We store all DBus objects in a class attribute
    objects = {}

    @classmethod
    def object( cls, name ):
        """
        Return a DBus object -not proxy- from the list of registered objects.
        """
        return cls.objects[name]

    def __init__( self, path, options ):
        sys.path.append( path ) # to enable 'from <subsystemname> import ...' and 'import <subsystemname>'
        self.launchTime = time.time()
        self.options = options
        daemon.Daemon.__init__( self, "/tmp/frameworkd.pid" )

        # dbus & glib mainloop
        dbus.mainloop.glib.DBusGMainLoop( set_as_default=True )
        self.mainloop = gobject.MainLoop()
        self.bus = dbus.SystemBus()

        # check if there's already something owning our bus name org.freesmartphone.frameworkd
        if ( not self.options.values.noframework ) and ( "%s.frameworkd" % DBUS_BUS_NAME_PREFIX in self.bus.list_names() ):
            logger.error( "dbus bus name org.freesmartphone.frameworkd already claimed. Exiting." )
            sys.exit( -1 )

        self._subsystems = {}
        self.busnames = []
        # FIXME remove hardcoded controller knowledge from objects
        self.config = config

        # gather subsystem plugins scantype
        scantype = config.getValue( "frameworkd", "scantype", "auto" )

        # call me when idle and in mainloop
        gobject.idle_add( self.idle )

        self._configureLoggers()
        self._handleOverrides()

        # launch special framework subsystem
        if ( not self.options.values.noframework ):
            self._subsystems["frameworkd"] = subsystem.Framework( self.bus, path, scantype, self )
            Controller.objects.update( self._subsystems["frameworkd"].objects() )

        systemstolaunch = self.options.values.subsystems.split( ',' )

        # add internal subsystems
        subsystems = [ entry for entry in os.listdir( path )
                       if os.path.isdir( "%s/%s" % ( path, entry ) ) ]

        # add external subsystems
        for section in config.sections():
            external = config.getValue( section, "external", "" )
            if external and ( external not in subsystems ):
                subsystems.append( section )

        # walk and launch subsystems
        for s in subsystems:
            disable = config.getBool( s, "disable", False )
            external = config.getValue( s, "external", "" )
            if disable:
                logger.info( "skipping subsystem %s as requested via config file." % s )
                continue
            if systemstolaunch != [""]:
                if s not in systemstolaunch:
                    logger.info( "skipping subsystem %s as requested via command line" % s )
                    continue
            if external:
                logger.info( "launching external subsystem %s" % s )
                self._subsystems[s] = subsystem.External( s, external, scantype, self )
            else:
                logger.info( "launching internal subsystem %s" % s )
                self._subsystems[s] = subsystem.Subsystem( s, self.bus, path, scantype, self )
            Controller.objects.update( self._subsystems[s].objects() )

        # do we have any subsystems left?
        if len( self._subsystems ) <= 1: # no additional subsystems could be loaded
	    if len( self._subsystems ) == 0 or 'frameworkd' in self._subsystems:
                logger.error( "can't launch without at least one subsystem. Exiting." )
                sys.exit( -1 )

    def launch( self ):
        if self.options.values.daemonize:
            self.start() # daemonize, then run self.run()
        else:
            self.run()

    def subsystems( self ):
        return self._subsystems

    def idle( self ):
        logger.info( "================== mainloop   entered ===================" )
        logger.info( "startup time was %.2f seconds" % ( time.time() - self.launchTime ) )
        gobject.timeout_add_seconds( 1*60, self.timeout )
        return False # mainloop: don't call me again

    def timeout( self ):
        """
        Regular timeout.
        """
        # FIXME add self-monitoring and self-healing ;)
        logger.debug( "alive and kicking" )
        return True # mainloop: call me again

    def run( self ):
        """
        Run the mainloop.

        Called after daemonizing, or (in debug mode), from Controller.launch()
        """
        self.mainloop.run()

    def shutdown( self ):
        """
        Quit the mainloop.
        """
        logger.info( "shutting down..." )
        for subsystem in self._subsystems.values():
            subsystem.shutdown()
        self.mainloop.quit()

    #
    # private API
    #
    def _configureLoggers( self ):
        # configure all loggers, default being INFO
        for section in config.sections():
            loglevel = loggingmap.get( config.getValue( section, "log_level", debug ) )
            logger.debug( "setting logger for %s to %s" % ( section, loglevel ) )
            logging.getLogger( section ).setLevel( loglevel )

    def _handleOverrides( self ):
        for override in self.options.values.overrides:
            try:
                left, value = override.split( '=', 1 )
                section, key = left.split( '.', 1 )
            except ValueError:
                self.options.error( "Wrong format for override values" )
            if not config.has_section( section ):
                config.add_section( section )
            config.set( section, key, value )

#----------------------------------------------------------------------------#
if __name__ == "__main__":
    import dbus
    bus = dbus.SystemBus()