4 from dbuscron.bus import get_dbus_message_type, dbus_to_str
5 from dbuscron.logger import Logger
9 def __init__(self, cmd):
12 self.__file = os.environ.get('SHELL', '/bin/sh')
13 self.__args = [self.__file, '-c', self.__value]
15 self.__args = cmd.split(' ')
16 self.__file = self.__args[0]
17 if len(self.__args) == 1 \
18 and self.__file.startswith('!'):
19 self.__file = self.__file.lstrip('!')
20 self.__auto_args = True
22 self.__auto_args = False
24 def __call__(self, bus, message, environ):
25 args_list = map(dbus_to_str, message.get_args_list())
30 (('DBUS_ARG%d' % i, a) for i, a in enumerate(args_list)),
31 DBUS_ARGN = str(len(args_list)),
32 DBUS_SENDER = str(message.get_sender() or ''),
33 DBUS_DEST = str(message.get_destination() or ''),
34 DBUS_IFACE = str(message.get_interface() or ''),
35 DBUS_PATH = str(message.get_path() or ''),
36 DBUS_MEMBER = str(message.get_member() or ''),
37 DBUS_BUS = bus.__class__.__name__.lower()[0:-3],
38 DBUS_ERROR = str(message.get_error_name() or ''),
39 DBUS_TYPE = get_dbus_message_type(message)
43 log.error('environ exception', e)
47 if dbus_env['DBUS_TYPE'] in ('signal', 'method_call'):
49 dbus_env['DBUS_IFACE'],
50 dbus_env['DBUS_MEMBER']]
51 elif dbus_env['DBUS_TYPE'] == 'error':
52 args_list.insert(0, dbus_env['DBUS_ERROR'])
56 dbus_env['DBUS_SENDER'],
57 dbus_env['DBUS_DEST']]
59 args_list = self.__args
61 result = os.spawnvpe(os.P_WAIT, self.__file, args_list, env)
63 log.warn('command returned non-zero status', self.__file, args_list, dbus_env, result)
67 def is_shell_cmd(self):
76 class Commands(object):
81 for m, c in self.__commands.iteritems():
84 def _get_environ(self):
87 def _set_environ(self, value):
88 self.__environ = dict()
89 self.__environ.update(os.environ)
90 self.__environ.update(value)
92 environ = property(_get_environ, _set_environ)
94 def handler(self, bus, message):
95 for rule, command in self.__commands.iteritems():
96 if rule.match(bus, message):
97 log('rule matched', rule, command)
98 command(bus, message, self.__environ)
101 def add(self, matcher, command):
102 self.__commands[matcher] = command