2 import os, sys, shutil, signal, tempfile, pipes
3 conffile = '/etc/dbuscrontab'
4 pidfile = '/var/run/dbuscron.pid'
6 from dbuscron.parser import CrontabParser, CrontabParserError
8 def create_temp_file(orig_file):
10 temp_file = tempfile.mktemp(prefix=os.path.basename(orig_file))
11 shutil.copy(orig_file, temp_file)
14 raise SystemError('Unable to make copy of dbuscrontab file.')
16 def run_system_editor(filename):
17 editor = pipes.quote(os.environ.get('EDITOR', '/usr/bin/vim'))
18 if os.system(editor + ' ' + pipes.quote(filename)) != 0:
19 raise SystemError('Editor returned non-zero status value.')
21 def get_dbuscron_pid_from_upstart():
22 f = os.popen('initctl status dbuscron', 'r')
25 return int(status.strip().split(' ').pop())
27 def get_dbuscron_pid_from_pidfile():
28 f = open(pidfile, 'r')
33 def get_dbuscron_pid():
35 return get_dbuscron_pid_from_upstart()
38 return get_dbuscron_pid_from_pidfile()
40 raise SystemError('Unable to get PID of dbuscron job.')
42 def check_syntax(filename):
43 parser = CrontabParser(filename)
45 for rule, command in parser:
47 except CrontabParserError, e:
49 raise SystemError("File %s has syntax errors." % (filename))
61 # 1. create temporary config file copy
62 temp_file = create_temp_file(conffile)
63 mod_time = os.path.getmtime(temp_file)
66 # 2. run system editor on this file
67 run_system_editor(temp_file)
69 # 3. check if this file is changed
70 if os.path.getmtime(temp_file) <= mod_time:
71 print 'File was not changed.'
74 # 4. check this file's syntax
75 check_syntax(temp_file)
77 # 5. replace system wide config file with new one
78 shutil.move(temp_file, conffile)
86 # 6. send sighup to dbuscron daemon
87 pid = get_dbuscron_pid()
88 os.kill(pid, signal.SIGHUP)
90 print "Everything's OK, SIGHUP to dbuscron is sent."
93 f = open(conffile, 'r')
99 check_syntax(conffile)
100 print "File %s has no syntax errors." % (conffile)
105 %(myname)s { -e | -l }
107 -e edit %(conffile)s file
108 -l list contents of %(conffile)s file
109 -k check %(conffile)s's syntax
111 """ % dict(myname=os.path.basename(sys.argv[0]), conffile=conffile)
113 except SystemError, e: