update
[dumbwifi.git] / procs.py
blob89633298155409cb68f1d96267cbd29cbb735932
1 # Author: Martin Matusiak <numerodix@gmail.com>
2 # Licensed under the GNU Public License, version 3.
4 import popen2
5 import os
6 import signal
7 import string
8 import sys
9 import time
11 from conf import config
12 from output import logger
13 import regex
14 import system
17 # Manage processes
19 def execute(cmd):
20 process = popen2.Popen3(cmd, True)
21 sout = process.fromchild
22 serr = process.childerr
23 code = process.wait()
24 return (code, sout, serr)
26 def run(cmd):
27 #logger.display("+ " + cmd, log=False)
28 logger.log("+ %s" % cmd)
29 (code, sout, serr) = execute(cmd)
30 o = ""
31 if code != 0:
32 e = serr.read().strip()
33 if e: logger.err(e)
34 else:
35 o = sout.read()
36 logger.log(o)
37 return o
39 def kill_by_name(proc):
40 cmd = "%s %s" % (config.pgrep, os.path.basename(proc))
41 out = run(cmd).strip()
42 deadline = time.time()+0.3
43 while out and time.time() < deadline:
44 pids = string.split(out, "\n")
45 for p in pids:
46 pid = -1
47 try: pid = int(p)
48 except ValueError:
49 logger.err("Cast of pid int('%s') for process '%s' failed" % (p, proc))
50 return
51 try:
52 os.kill(pid, signal.SIGINT)
53 os.kill(pid, signal.SIGTERM)
54 os.kill(pid, signal.SIGKILL)
55 except OSError:
56 logger.err("Failed to kill process '%s' pid %d" % (proc, pid))
57 return
58 out = run(cmd).strip()
60 def kill_previous_instances():
61 pids = system.getfile(config.pidfile).strip().split("\n")
62 if not [x for x in pids if x != ""]: return
64 # truncate pidfile
65 try: f = open(config.pidfile, 'w'); f.close()
66 except IOError:
67 logger.err("Could not truncate pidfile %s" % config.pidfile, log=False)
69 for pid in pids:
70 pid = int(pid)
71 out = run("%s %s" % (config.ps, pid))
72 active = regex.find1("(%s)" % config.program_name, out)
73 if out and active:
74 os.kill(pid, signal.SIGINT)
75 os.kill(pid, signal.SIGTERM)
76 os.kill(pid, signal.SIGKILL)
78 def write_pid():
79 try:
80 f = open(config.pidfile, 'a')
81 f.write("%s\n" % os.getpid())
82 f.close()
83 except IOError:
84 logger.err("Could not write to pidfile %s" % config.pidfile, log=False)
86 def daemonize():
87 # do unix double fork
88 try:
89 pid = os.fork()
90 if pid > 0: sys.exit(0)
91 except OSError:
92 logger.err("Failed to daemonize", log=False)
93 sys.exit(1)
95 os.chdir("/")
96 os.setsid()
97 os.umask(0)
98 child_in =open('/dev/null','r')
99 child_out=open('/dev/null','w')
100 os.dup2(child_in.fileno(), sys.stdin.fileno())
101 os.dup2(child_out.fileno(), sys.stdout.fileno())
102 os.dup2(child_out.fileno(), sys.stderr.fileno())
104 try:
105 pid = os.fork()
106 if pid > 0: sys.exit(0)
107 except OSError:
108 logger.err("Failed to daemonize", log=False)
109 sys.exit(1)