summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Daemon.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/lib/Daemon.py b/src/lib/Daemon.py
new file mode 100644
index 000000000..1886f5569
--- /dev/null
+++ b/src/lib/Daemon.py
@@ -0,0 +1,44 @@
+'''Bcfg2 daemon support'''
+__revision__ = '$Revision'
+
+import os, sys
+
+def daemonize(filename):
+ '''Do the double fork/setsession dance'''
+ # Check if the pid is active
+ try:
+ pidfile = open(filename, "r")
+ oldpid = int(pidfile.readline())
+ # getpgid() will retun an IO error if all fails
+ os.getpgid(oldpid)
+ pidfile.close()
+
+ # If we got this far without exceptions, there is another instance
+ # running. Exit gracefully.
+ print "PID File (%s) exists and listed PID (%d) is active." % \
+ (filename, oldpid)
+ raise SystemExit, 1
+ except OSError:
+ pidfile.close()
+ except IOError:
+ # pid file doesn't
+ pass
+
+ # Fork once
+ if os.fork() != 0:
+ os._exit(0)
+ os.setsid() # Create new session
+ pid = os.fork()
+ if pid != 0:
+ pidfile = open(filename, "w")
+ pidfile.write("%i" % pid)
+ pidfile.close()
+ os._exit(0)
+ os.chdir("/")
+ os.umask(0)
+
+ null = open("/dev/null", "w+")
+
+ os.dup2(null.fileno(), sys.__stdin__.fileno())
+ os.dup2(null.fileno(), sys.__stdout__.fileno())
+ os.dup2(null.fileno(), sys.__stderr__.fileno())