changelog format fix
[dbuscron] / dbuscron / util.py
1 import os, sys
2
3 def daemonize(logfile=None, errfile=None, pidfile=None):
4     devnull = os.devnull if hasattr(os, 'devnull') else '/dev/null'
5
6     initwd = os.getcwd()
7
8     def absolutize(path):
9         if path.startswith('/'):
10             return path
11         return os.path.join(initwd, path)
12
13     try:
14         if os.fork() == 0:
15             os.setsid()
16             if os.fork() == 0:
17                 os.chdir('/')
18                 os.umask(0)
19             else:
20                 os._exit(0)
21         else:
22             os._exit(0)
23     except OSError, e:
24         raise SystemError('Failed daemonization: %s' % str(e))
25
26     for i in range(0, 3):
27         os.close(i)
28
29     os.open(devnull, os.O_RDWR)
30
31     def open_trunc(fname):
32         f = os.open(fname, os.O_WRONLY | os.O_CREAT)
33         os.ftruncate(f, 0)
34         return f
35
36     def open_or_dup(fname, fd=None):
37         if fname:
38             return open_trunc(absolutize(fname))
39         elif fd:
40             os.dup2(*fd)
41
42     open_or_dup(logfile, (0, 1))
43     open_or_dup(errfile, (1, 2))
44
45     pid = os.getpid()
46     if pidfile:
47         pidfile = absolutize(pidfile)
48         fd = open_trunc(pidfile)
49         os.write(fd, str(pid))
50         os.close(fd)
51
52         def remove_pidfile():
53             os.unlink(pidfile)
54         sys.exitfunc = remove_pidfile
55
56     return pid
57
58 def set_user_and_group(user, group=None):
59     if os.getuid() != 0:
60         raise SystemError('I\'m not a root to pretend somebody else.')
61
62     if user:
63         import pwd
64         try:
65             userid = int(user)
66         except ValueError:
67             userid = pwd.getpwnam(user)[2]
68
69     else:
70         userid = None
71
72     if group:
73         try:
74             groupid = int(group)
75         except ValueError:
76             import grp
77             groupid = grp.getgrnam(group)[2]
78
79     elif userid:
80         groupid = pwd.getpwuid(userid)[3]
81
82     else:
83         groupid = None
84
85     if groupid:
86         os.setgid(groupid)
87     if userid:
88         os.setuid(userid)
89