etc/exports000064400000000000147207245760006752 0ustar00__init__.py000064400000001766147576767730006724 0ustar00from . import interfaces from . import controller from . import dbus_exporter as dbus def export(*args, **kwargs): """Decorator, use to mark exportable methods.""" def wrapper(method): method.export_params = [ args, kwargs ] return method return wrapper def signal(*args, **kwargs): """Decorator, use to mark exportable signals.""" def wrapper(method): method.signal_params = [ args, kwargs ] return method return wrapper def register_exporter(instance): if not isinstance(instance, interfaces.ExporterInterface): raise Exception() ctl = controller.ExportsController.get_instance() return ctl.register_exporter(instance) def register_object(instance): if not isinstance(instance, interfaces.ExportableInterface): raise Exception() ctl = controller.ExportsController.get_instance() return ctl.register_object(instance) def start(): ctl = controller.ExportsController.get_instance() return ctl.start() def stop(): ctl = controller.ExportsController.get_instance() return ctl.stop() dbus_exporter.pyc000064400000015643147576767730010214 0ustar00 \c@sddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl j Z ddlmZddlmZe jjZdejfdYZdS(i(t interfacesiN(tpolkit(tGLibt DBusExportercBseZdZdZedZedZedZdZdZ dZ dZ d Z d Z d Zd ZRS( s+ Export method calls through DBus Interface. We take a method to be exported and create a simple wrapper function to call it. This is required as we need the original function to be bound to the original object instance. While the wrapper will be bound to an object we dynamically construct. cCstjjjdtd|_d|_i|_t |_ ||_ ||_ ||_ d|_d|_t|_tjtj}tj|_tjtj|dS(Ntset_as_default(tdbustmainlooptglibt DBusGMainLooptTruetNonet_dbus_object_clst _dbus_objectt _dbus_methodstsett_signalst _bus_namet_interface_namet _object_namet_threadt _bus_objectRt_polkittsignalt getsignaltSIGINTRtMainLoopt _main_loop(tselftbus_nametinterface_namet object_nametsignal_handler((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt__init__s          cCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR/scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR3scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR7scCs |jdk S(N(RR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pytrunning;scstjstdnj}|jkrEtdnfd}tj|j}tjj j ||dd|}|j|s 'cstjstdnj}||jkrEtdnfd}tj|j}tjj |j ||}||j|<|j j |dS(Ns#Only bound methods can be exported.s*Method with this name is already exported.cs ||S(N((R-R.R/R0(R4(s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR5gs( R7R8R9R&R R:R;RR<RRRtadd(RR4R>R?R5((R4s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR_s  cOst}||jks$|jdkr-t}nyt|j|}Wntk r\t}nX|rvtd|n |||dS(NsSignal '%s' doesn't exist.(tFalseRRR R tgetattrtAttributeErrorR9(RRR/R0terrR4((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt send_signalps   cCsY|jdk rtdndt|}t|tjjf|j}||_dS(Ns%The exporter class was already build.sDBusExporter_%d( R R R9tidttypeRR<tObjectR (Rt unique_nametcls((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt_construct_dbus_object_class}s cCs|jrdS|jdkr,|jn|jtj}tjj|j |}|j||j ||_ t j d|j|_|jjdS(Nttarget(R!R R RLtstopRt SystemBusR<tBusNameRRRt threadingtThreadt _thread_codeRtstart(RtbusR((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRTs    cCsH|jdk rD|jjrD|jj|jjd|_ndS(N(RR tis_aliveRtquittjoin(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRNs  cCs |jj|`d|_dS(N(RtrunRR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRSs (R&t __module__t__doc__R tpropertyRRRR!R@RRFRLRTRNRS(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRs   !  (R#RR:t dbus.serviceRtdbus.mainloop.glibtdbus.exceptionsR7RQRt tuned.logsttunedt tuned.constsR$ttuned.utils.polkitRt gi.repositoryRtlogstgetR'tExporterInterfaceR(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyts        __init__.pyc000064400000004237147576767730007063 0ustar00 \c@sjddlmZddlmZddlmZdZdZdZdZdZ d Z d S( i(t interfaces(t controller(t dbus_exportercsfd}|S(s*Decorator, use to mark exportable methods.csg|_|S(N(t export_params(tmethod(targstkwargs(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytwrappers((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytexportscsfd}|S(s*Decorator, use to mark exportable signals.csg|_|S(N(t signal_params(R(RR(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytsignal scCs:t|tjstntjj}|j|S(N(t isinstanceRtExporterInterfacet ExceptionRtExportsControllert get_instancetregister_exporter(tinstancetctl((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCs:t|tjstntjj}|j|S(N(R RtExportableInterfaceR RRRtregister_object(RR((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCstjj}|jS(N(RRRtstart(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRscCstjj}|jS(N(RRRtstop(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyR#sN( tRRRtdbusRR RRRR(((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyts     controller.pyc000064400000006736147576767730007515 0ustar00 \c@sHddlmZddlZddlZdejjfdYZdS(i(t interfacesiNtExportsControllercBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s4 Controls and manages object interface exporting. cCs2tt|jg|_g|_t|_dS(N(tsuperRt__init__t _exporterst_objectstFalset_exports_initialized(tself((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR s  cCs|jj|dS(sRegister objects exporter.N(Rtappend(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_exporterscCs|jj|dS(sRegister object to be exported.N(RR (RR ((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_objectscCstj|ot|dS(s8Check if method was marked with @exports.export wrapper.t export_params(tinspecttismethodthasattr(Rtmethod((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_methodscCstj|ot|dS(s8Check if method was marked with @exports.signal wrapper.t signal_params(RRR(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_signalscCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register method to all exporters.iiN(RR texport(RRtexportertargstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_method s  cCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register signal to all exporters.iiN(RRtsignal(RRRRR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_signal's  cCs|jr dSxw|jD]l}x0tj||jD]\}}|j|q3Wx0tj||jD]\}}|j|qfWqWt|_dS(N( RRRt getmembersRRRRtTrue(RR tnameR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_initialize_exports.s ""cCs,|jx|jD]}|jqWdS(sStart the exports.N(RRtstart(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR :s cCs"x|jD]}|jq WdS(sStop the exports.N(Rtstop(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR!@s( t__name__t __module__t__doc__RR R RRRRRR R!(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyRs        (tRRttuned.patternsttunedtpatternst SingletonR(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyts  dbus_exporter.pyo000064400000015643147576767730010230 0ustar00 \c@sddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl j Z ddlmZddlmZe jjZdejfdYZdS(i(t interfacesiN(tpolkit(tGLibt DBusExportercBseZdZdZedZedZedZdZdZ dZ dZ d Z d Z d Zd ZRS( s+ Export method calls through DBus Interface. We take a method to be exported and create a simple wrapper function to call it. This is required as we need the original function to be bound to the original object instance. While the wrapper will be bound to an object we dynamically construct. cCstjjjdtd|_d|_i|_t |_ ||_ ||_ ||_ d|_d|_t|_tjtj}tj|_tjtj|dS(Ntset_as_default(tdbustmainlooptglibt DBusGMainLooptTruetNonet_dbus_object_clst _dbus_objectt _dbus_methodstsett_signalst _bus_namet_interface_namet _object_namet_threadt _bus_objectRt_polkittsignalt getsignaltSIGINTRtMainLoopt _main_loop(tselftbus_nametinterface_namet object_nametsignal_handler((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt__init__s          cCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR/scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR3scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR7scCs |jdk S(N(RR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pytrunning;scstjstdnj}|jkrEtdnfd}tj|j}tjj j ||dd|}|j|s 'cstjstdnj}||jkrEtdnfd}tj|j}tjj |j ||}||j|<|j j |dS(Ns#Only bound methods can be exported.s*Method with this name is already exported.cs ||S(N((R-R.R/R0(R4(s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR5gs( R7R8R9R&R R:R;RR<RRRtadd(RR4R>R?R5((R4s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR_s  cOst}||jks$|jdkr-t}nyt|j|}Wntk r\t}nX|rvtd|n |||dS(NsSignal '%s' doesn't exist.(tFalseRRR R tgetattrtAttributeErrorR9(RRR/R0terrR4((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt send_signalps   cCsY|jdk rtdndt|}t|tjjf|j}||_dS(Ns%The exporter class was already build.sDBusExporter_%d( R R R9tidttypeRR<tObjectR (Rt unique_nametcls((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt_construct_dbus_object_class}s cCs|jrdS|jdkr,|jn|jtj}tjj|j |}|j||j ||_ t j d|j|_|jjdS(Nttarget(R!R R RLtstopRt SystemBusR<tBusNameRRRt threadingtThreadt _thread_codeRtstart(RtbusR((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRTs    cCsH|jdk rD|jjrD|jj|jjd|_ndS(N(RR tis_aliveRtquittjoin(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRNs  cCs |jj|`d|_dS(N(RtrunRR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRSs (R&t __module__t__doc__R tpropertyRRRR!R@RRFRLRTRNRS(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRs   !  (R#RR:t dbus.serviceRtdbus.mainloop.glibtdbus.exceptionsR7RQRt tuned.logsttunedt tuned.constsR$ttuned.utils.polkitRt gi.repositoryRtlogstgetR'tExporterInterfaceR(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyts        dbus_exporter.py000064400000011661147576767730010045 0ustar00from . import interfaces import decorator import dbus.service import dbus.mainloop.glib import dbus.exceptions import inspect import threading import signal import tuned.logs import tuned.consts as consts from tuned.utils.polkit import polkit from gi.repository import GLib log = tuned.logs.get() class DBusExporter(interfaces.ExporterInterface): """ Export method calls through DBus Interface. We take a method to be exported and create a simple wrapper function to call it. This is required as we need the original function to be bound to the original object instance. While the wrapper will be bound to an object we dynamically construct. """ def __init__(self, bus_name, interface_name, object_name): dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) self._dbus_object_cls = None self._dbus_object = None self._dbus_methods = {} self._signals = set() self._bus_name = bus_name self._interface_name = interface_name self._object_name = object_name self._thread = None self._bus_object = None self._polkit = polkit() # dirty hack that fixes KeyboardInterrupt handling # the hack is needed because PyGObject / GTK+-3 developers are morons signal_handler = signal.getsignal(signal.SIGINT) self._main_loop = GLib.MainLoop() signal.signal(signal.SIGINT, signal_handler) @property def bus_name(self): return self._bus_name @property def interface_name(self): return self._interface_name @property def object_name(self): return self._object_name def running(self): return self._thread is not None def export(self, method, in_signature, out_signature): if not inspect.ismethod(method): raise Exception("Only bound methods can be exported.") method_name = method.__name__ if method_name in self._dbus_methods: raise Exception("Method with this name is already exported.") def wrapper(wrapped, owner, *args, **kwargs): action_id = consts.NAMESPACE + "." + method.__name__ caller = args[-1] log.debug("checking authorization for for action '%s' requested by caller '%s'" % (action_id, caller)) ret = self._polkit.check_authorization(caller, action_id) if ret == 1: log.debug("action '%s' requested by caller '%s' was successfully authorized by polkit" % (action_id, caller)) elif ret == 2: log.warn("polkit error, but action '%s' requested by caller '%s' was successfully authorized by fallback method" % (action_id, caller)) elif ret == 0: log.info("action '%s' requested by caller '%s' wasn't authorized, ignoring the request" % (action_id, caller)) args[-1] = "" elif ret == -1: log.warn("polkit error and action '%s' requested by caller '%s' wasn't authorized by fallback method, ignoring the request" % (action_id, caller)) args[-1] = "" else: log.error("polkit error and unable to use fallback method to authorize action '%s' requested by caller '%s', ignoring the request" % (action_id, caller)) args[-1] = "" return method(*args, **kwargs) wrapper = decorator.decorator(wrapper, method.__func__) wrapper = dbus.service.method(self._interface_name, in_signature, out_signature, sender_keyword = "caller")(wrapper) self._dbus_methods[method_name] = wrapper def signal(self, method, out_signature): if not inspect.ismethod(method): raise Exception("Only bound methods can be exported.") method_name = method.__name__ if method_name in self._dbus_methods: raise Exception("Method with this name is already exported.") def wrapper(wrapped, owner, *args, **kwargs): return method(*args, **kwargs) wrapper = decorator.decorator(wrapper, method.__func__) wrapper = dbus.service.signal(self._interface_name, out_signature)(wrapper) self._dbus_methods[method_name] = wrapper self._signals.add(method_name) def send_signal(self, signal, *args, **kwargs): err = False if not signal in self._signals or self._bus_object is None: err = True try: method = getattr(self._bus_object, signal) except AttributeError: err = True if err: raise Exception("Signal '%s' doesn't exist." % signal) else: method(*args, **kwargs) def _construct_dbus_object_class(self): if self._dbus_object_cls is not None: raise Exception("The exporter class was already build.") unique_name = "DBusExporter_%d" % id(self) cls = type(unique_name, (dbus.service.Object,), self._dbus_methods) self._dbus_object_cls = cls def start(self): if self.running(): return if self._dbus_object_cls is None: self._construct_dbus_object_class() self.stop() bus = dbus.SystemBus() bus_name = dbus.service.BusName(self._bus_name, bus) self._bus_object = self._dbus_object_cls(bus, self._object_name, bus_name) self._thread = threading.Thread(target=self._thread_code) self._thread.start() def stop(self): if self._thread is not None and self._thread.is_alive(): self._main_loop.quit() self._thread.join() self._thread = None def _thread_code(self): self._main_loop.run() del self._bus_object self._bus_object = None interfaces.pyc000064400000003010147576767730007433 0ustar00 \c@s0defdYZdefdYZdS(tExportableInterfacecBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRstExporterInterfacecBs5eZdZdZdZdZdZRS(cCs tdS(N(tNotImplementedError(tselftmethodt in_signaturet out_signature((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytexportscCs tdS(N(R(RRR((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytsignal scOs tdS(N(R(RR targstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyt send_signal scCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstartscCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstops(RRR R R RR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRs     N(tobjectRR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytscontroller.py000064400000003642147576767730007343 0ustar00from . import interfaces import inspect import tuned.patterns class ExportsController(tuned.patterns.Singleton): """ Controls and manages object interface exporting. """ def __init__(self): super(ExportsController, self).__init__() self._exporters = [] self._objects = [] self._exports_initialized = False def register_exporter(self, instance): """Register objects exporter.""" self._exporters.append(instance) def register_object(self, instance): """Register object to be exported.""" self._objects.append(instance) def _is_exportable_method(self, method): """Check if method was marked with @exports.export wrapper.""" return inspect.ismethod(method) and hasattr(method, "export_params") def _is_exportable_signal(self, method): """Check if method was marked with @exports.signal wrapper.""" return inspect.ismethod(method) and hasattr(method, "signal_params") def _export_method(self, method): """Register method to all exporters.""" for exporter in self._exporters: args = method.export_params[0] kwargs = method.export_params[1] exporter.export(method, *args, **kwargs) def _export_signal(self, method): """Register signal to all exporters.""" for exporter in self._exporters: args = method.signal_params[0] kwargs = method.signal_params[1] exporter.signal(method, *args, **kwargs) def _initialize_exports(self): if self._exports_initialized: return for instance in self._objects: for name, method in inspect.getmembers(instance, self._is_exportable_method): self._export_method(method) for name, method in inspect.getmembers(instance, self._is_exportable_signal): self._export_signal(method) self._exports_initialized = True def start(self): """Start the exports.""" self._initialize_exports() for exporter in self._exporters: exporter.start() def stop(self): """Stop the exports.""" for exporter in self._exporters: exporter.stop() __init__.pyo000064400000004237147576767730007077 0ustar00 \c@sjddlmZddlmZddlmZdZdZdZdZdZ d Z d S( i(t interfaces(t controller(t dbus_exportercsfd}|S(s*Decorator, use to mark exportable methods.csg|_|S(N(t export_params(tmethod(targstkwargs(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytwrappers((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytexportscsfd}|S(s*Decorator, use to mark exportable signals.csg|_|S(N(t signal_params(R(RR(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytsignal scCs:t|tjstntjj}|j|S(N(t isinstanceRtExporterInterfacet ExceptionRtExportsControllert get_instancetregister_exporter(tinstancetctl((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCs:t|tjstntjj}|j|S(N(R RtExportableInterfaceR RRRtregister_object(RR((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCstjj}|jS(N(RRRtstart(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRscCstjj}|jS(N(RRRtstop(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyR#sN( tRRRtdbusRR RRRR(((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyts     interfaces.py000064400000001053147576767730007275 0ustar00class ExportableInterface(object): pass class ExporterInterface(object): def export(self, method, in_signature, out_signature): # to be overridden by concrete implementation raise NotImplementedError() def signal(self, method, out_signature): # to be overridden by concrete implementation raise NotImplementedError() def send_signal(self, signal, *args, **kwargs): # to be overridden by concrete implementation raise NotImplementedError() def start(self): raise NotImplementedError() def stop(self): raise NotImplementedError() interfaces.pyo000064400000003010147576767730007447 0ustar00 \c@s0defdYZdefdYZdS(tExportableInterfacecBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRstExporterInterfacecBs5eZdZdZdZdZdZRS(cCs tdS(N(tNotImplementedError(tselftmethodt in_signaturet out_signature((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytexportscCs tdS(N(R(RRR((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytsignal scOs tdS(N(R(RR targstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyt send_signal scCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstartscCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstops(RRR R R RR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRs     N(tobjectRR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytscontroller.pyo000064400000006736147576767730007531 0ustar00 \c@sHddlmZddlZddlZdejjfdYZdS(i(t interfacesiNtExportsControllercBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s4 Controls and manages object interface exporting. cCs2tt|jg|_g|_t|_dS(N(tsuperRt__init__t _exporterst_objectstFalset_exports_initialized(tself((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR s  cCs|jj|dS(sRegister objects exporter.N(Rtappend(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_exporterscCs|jj|dS(sRegister object to be exported.N(RR (RR ((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_objectscCstj|ot|dS(s8Check if method was marked with @exports.export wrapper.t export_params(tinspecttismethodthasattr(Rtmethod((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_methodscCstj|ot|dS(s8Check if method was marked with @exports.signal wrapper.t signal_params(RRR(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_signalscCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register method to all exporters.iiN(RR texport(RRtexportertargstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_method s  cCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register signal to all exporters.iiN(RRtsignal(RRRRR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_signal's  cCs|jr dSxw|jD]l}x0tj||jD]\}}|j|q3Wx0tj||jD]\}}|j|qfWqWt|_dS(N( RRRt getmembersRRRRtTrue(RR tnameR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_initialize_exports.s ""cCs,|jx|jD]}|jqWdS(sStart the exports.N(RRtstart(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR :s cCs"x|jD]}|jq WdS(sStop the exports.N(Rtstop(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR!@s( t__name__t __module__t__doc__RR R RRRRRR R!(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyRs        (tRRttuned.patternsttunedtpatternst SingletonR(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyts