| #!/usr/bin/env python | 
 |  | 
 | """ | 
 | This script launches a dbus session, sets the DBUS_SESSION_BUS_ADDRESS | 
 | and DBUS_STARTER_BUS_TYPE Eenvironment variables and puts the generated files | 
 | in the dbus dir location passed as a paramter. It then runs the unit test | 
 | script, and then cleans up the generated dbus files. | 
 | """ | 
 |  | 
 | from subprocess import check_call, check_output | 
 | import os | 
 | import sys | 
 | import argparse | 
 | import re | 
 | import tempfile | 
 |  | 
 | def launch_session_dbus(dbus_dir, dbus_config_file): | 
 |     """ | 
 |     Launches a session debus using a modified config file and | 
 |     sets the DBUS_SESSION_BUS_ADDRESS environment variable | 
 |  | 
 |     Parameter descriptions: | 
 |     dbus_dir            Directory location for generated files | 
 |     dbus_config_file    File location of dbus sys config file | 
 |     """ | 
 |     dbus_pid = os.path.join(dbus_dir,'pid') | 
 |     dbus_socket = os.path.join(dbus_dir,'system_bus_socket') | 
 |     dbus_local_conf = os.path.join(dbus_dir,'system-local.conf') | 
 |     if os.path.isfile(dbus_pid): | 
 |         os.remove(dbus_pid) | 
 |     with open(dbus_config_file) as infile, \ | 
 |          open(dbus_local_conf, 'w') as outfile: | 
 |         for line in infile: | 
 |             line = re.sub('<type>.*</type>','<type>session</type>', \ | 
 |                           line, flags=re.DOTALL) | 
 |             line = re.sub('<pidfile>.*</pidfile>', \ | 
 |                           '<pidfile>%s</pidfile>' % dbus_pid, \ | 
 |                           line, flags=re.DOTALL) | 
 |             line = re.sub('<listen>.*</listen>', \ | 
 |                           '<listen>unix:path=%s</listen>' % dbus_socket, \ | 
 |                           line, flags=re.DOTALL) | 
 |             line = re.sub('<deny','<allow', line) | 
 |             outfile.write(line) | 
 |     infile.close() | 
 |     outfile.close() | 
 |     command = ['dbus-daemon', '--config-file=%s' % dbus_local_conf, \ | 
 |                '--print-address'] | 
 |     out = check_output(command).splitlines() | 
 |     os.environ['DBUS_SESSION_BUS_ADDRESS'] = out[0] | 
 |     os.environ['DBUS_STARTER_BUS_TYPE'] = 'session' | 
 |  | 
 | def dbus_cleanup(dbus_dir): | 
 |     """ | 
 |     Kills the dbus session started by launch_session_dbus | 
 |     and removes the generated files. | 
 |  | 
 |     Parameter descriptions: | 
 |     dbus_dir            Directory location of generated files | 
 |     """ | 
 |  | 
 |     dbus_pid = os.path.join(dbus_dir,'pid') | 
 |     dbus_socket = os.path.join(dbus_dir,'system_bus_socket') | 
 |     dbus_local_conf = os.path.join(dbus_dir,'system-local.conf') | 
 |     if os.path.isfile(dbus_pid): | 
 |         dbus_pid = open(dbus_pid,'r').read().replace('\n','') | 
 |         check_call(['kill', dbus_pid]) | 
 |     if os.path.isfile(dbus_local_conf): | 
 |         os.remove(dbus_local_conf) | 
 |     if os.path.exists(dbus_socket): | 
 |         os.remove(dbus_socket) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |  | 
 |     # Set command line arguments | 
 |     parser = argparse.ArgumentParser() | 
 |  | 
 |     parser.add_argument("-f", "--dbussysconfigfile", | 
 |                         dest="DBUS_SYS_CONFIG_FILE", | 
 |                         required=True, help="Dbus sys config file location") | 
 |     parser.add_argument("-u", "--unittestandparams", | 
 |                         dest="UNIT_TEST", | 
 |                         required=True, help="Unit test script and params \ | 
 |                         as comma delimited string") | 
 |     args = parser.parse_args(sys.argv[1:]) | 
 |     DBUS_DIR = tempfile.mkdtemp() | 
 |     DBUS_SYS_CONFIG_FILE = args.DBUS_SYS_CONFIG_FILE | 
 |     UNIT_TEST = args.UNIT_TEST | 
 |  | 
 |     launch_session_dbus(DBUS_DIR, DBUS_SYS_CONFIG_FILE) | 
 |     check_call(UNIT_TEST.split(','), env=os.environ) | 
 |     dbus_cleanup(DBUS_DIR) |