diff --git a/linuxActor/src/uds/actor/daemon.py b/linuxActor/src/uds/actor/daemon.py index 0427fc317..1a4cb051b 100644 --- a/linuxActor/src/uds/actor/daemon.py +++ b/linuxActor/src/uds/actor/daemon.py @@ -3,130 +3,137 @@ @author: : http://www.jejik.com/authors/sander_marechal/ @see: : http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ ''' -import sys, os, time, atexit +import sys +import os +import time +import atexit + + from signal import SIGTERM - + + class Daemon: + """ + A generic daemon class. + + Usage: subclass the Daemon class and override the run() method + """ + def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): + self.stdin = stdin + self.stdout = stdout + self.stderr = stderr + self.pidfile = pidfile + + def daemonize(self): """ - A generic daemon class. - - Usage: subclass the Daemon class and override the run() method + do the UNIX double-fork magic, see Stevens' "Advanced + Programming in the UNIX Environment" for details (ISBN 0201563177) + http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 + """ + try: + pid = os.fork() + if pid > 0: + # exit first parent + sys.exit(0) + except OSError, e: + sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) + sys.exit(1) + + # decouple from parent environment + os.chdir("/") + os.setsid() + os.umask(0) + + # do second fork + try: + pid = os.fork() + if pid > 0: + # exit from second parent + sys.exit(0) + except OSError, e: + sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) + sys.exit(1) + + # redirect standard file descriptors + sys.stdout.flush() + sys.stderr.flush() + si = open(self.stdin, 'r') + so = open(self.stdout, 'a+') + se = open(self.stderr, 'a+', 0) + os.dup2(si.fileno(), sys.stdin.fileno()) + os.dup2(so.fileno(), sys.stdout.fileno()) + os.dup2(se.fileno(), sys.stderr.fileno()) + + # write pidfile + atexit.register(self.delpid) + pid = str(os.getpid()) + with open(self.pidfile, 'w+') as f: + f.write("%s\n" % pid) + + def delpid(self): + os.remove(self.pidfile) + + def start(self): + """ + Start the daemon + """ + # Check for a pidfile to see if the daemon already runs + try: + pf = file(self.pidfile, 'r') + pid = int(pf.read().strip()) + pf.close() + except IOError: + pid = None + + if pid: + message = "pidfile %s already exist. Daemon already running?\n" + sys.stderr.write(message % self.pidfile) + sys.exit(1) + + # Start the daemon + self.daemonize() + self.run() + + def stop(self): + """ + Stop the daemon + """ + # Get the pid from the pidfile + try: + pf = open(self.pidfile, 'r') + pid = int(pf.read().strip()) + pf.close() + except IOError: + pid = None + + if not pid: + message = "pidfile %s does not exist. Daemon not running?\n" + sys.stderr.write(message % self.pidfile) + return # not an error in a restart + + # Try killing the daemon process + try: + while True: + os.kill(pid, SIGTERM) + time.sleep(1) + except OSError, err: + err = str(err) + if err.find("No such process") > 0: + if os.path.exists(self.pidfile): + os.remove(self.pidfile) + else: + print str(err) + sys.exit(1) + + def restart(self): + """ + Restart the daemon + """ + self.stop() + self.start() + + def run(self): + """ + You should override this method when you subclass Daemon. It will be called after the process has been + daemonized by start() or restart(). """ - def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): - self.stdin = stdin - self.stdout = stdout - self.stderr = stderr - self.pidfile = pidfile - - def daemonize(self): - """ - do the UNIX double-fork magic, see Stevens' "Advanced - Programming in the UNIX Environment" for details (ISBN 0201563177) - http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 - """ - try: - pid = os.fork() - if pid > 0: - # exit first parent - sys.exit(0) - except OSError, e: - sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) - sys.exit(1) - - # decouple from parent environment - os.chdir("/") - os.setsid() - os.umask(0) - - # do second fork - try: - pid = os.fork() - if pid > 0: - # exit from second parent - sys.exit(0) - except OSError, e: - sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) - sys.exit(1) - - # redirect standard file descriptors - sys.stdout.flush() - sys.stderr.flush() - si = file(self.stdin, 'r') - so = file(self.stdout, 'a+') - se = file(self.stderr, 'a+', 0) - os.dup2(si.fileno(), sys.stdin.fileno()) - os.dup2(so.fileno(), sys.stdout.fileno()) - os.dup2(se.fileno(), sys.stderr.fileno()) - - # write pidfile - atexit.register(self.delpid) - pid = str(os.getpid()) - file(self.pidfile,'w+').write("%s\n" % pid) - - def delpid(self): - os.remove(self.pidfile) - - def start(self): - """ - Start the daemon - """ - # Check for a pidfile to see if the daemon already runs - try: - pf = file(self.pidfile,'r') - pid = int(pf.read().strip()) - pf.close() - except IOError: - pid = None - - if pid: - message = "pidfile %s already exist. Daemon already running?\n" - sys.stderr.write(message % self.pidfile) - sys.exit(1) - - # Start the daemon - self.daemonize() - self.run() - - def stop(self): - """ - Stop the daemon - """ - # Get the pid from the pidfile - try: - pf = file(self.pidfile,'r') - pid = int(pf.read().strip()) - pf.close() - except IOError: - pid = None - - if not pid: - message = "pidfile %s does not exist. Daemon not running?\n" - sys.stderr.write(message % self.pidfile) - return # not an error in a restart - - # Try killing the daemon process - try: - while 1: - os.kill(pid, SIGTERM) - time.sleep(1) - except OSError, err: - err = str(err) - if err.find("No such process") > 0: - if os.path.exists(self.pidfile): - os.remove(self.pidfile) - else: - print str(err) - sys.exit(1) - - def restart(self): - """ - Restart the daemon - """ - self.stop() - self.start() - - def run(self): - """ - You should override this method when you subclass Daemon. It will be called after the process has been - daemonized by start() or restart(). - """ diff --git a/linuxActor/src/uds/actor/net.py b/linuxActor/src/uds/actor/net.py index 75c14180d..ee1a374fb 100644 --- a/linuxActor/src/uds/actor/net.py +++ b/linuxActor/src/uds/actor/net.py @@ -18,6 +18,7 @@ def getMacAddr(ifname): except Exception: return None + def getIpAddr(ifname): if isinstance(ifname, list): return dict([ (name, getIpAddr(name)) for name in ifname ]) @@ -31,6 +32,7 @@ def getIpAddr(ifname): except Exception: return None + def getInterfaces(): max_possible = 128 # arbitrary. raise if needed. space = max_possible * 16 @@ -51,12 +53,14 @@ def getInterfaces(): namestr = names.tostring() return [namestr[i:i + offset].split('\0', 1)[0] for i in range(0, outbytes, length)] + def getIpAndMac(ifname): ip, mac = getIpAddr(ifname), getMacAddr(ifname) if isinstance(ifname, list): return dict([ (key, { 'ip': ip[key], 'mac': mac[key] }) for key in ip.keys() ]) return (ip, mac) + def getExternalIpAndMacs(): res = getIpAndMac(getInterfaces()) # logger.debug('Res: {0}'.format(res)) diff --git a/linuxActor/src/uds/actor/renamer/__init__.py b/linuxActor/src/uds/actor/renamer/__init__.py index 779188799..acbb5e3bb 100644 --- a/linuxActor/src/uds/actor/renamer/__init__.py +++ b/linuxActor/src/uds/actor/renamer/__init__.py @@ -4,20 +4,25 @@ Created on Nov 17, 2011 @author: dkmaster ''' -import platform, logging, os, sys, pkgutil +import platform +import logging +import os +import sys +import pkgutil logger = logging.getLogger(__name__) renamers = {} + def rename(newName): - distribution = platform.dist()[0].lower() - if renamers.has_key(distribution): + distribution = platform.linux_distribution()[0].lower() + if distribution in renamers: return renamers[distribution](newName) - + logger.error('Renamer for platform "{0}" not found'.format(distribution)) return False pkgpath = os.path.dirname(sys.modules[__name__].__file__) for _, name, _ in pkgutil.iter_modules([pkgpath]): - __import__(name, globals(), locals(), [], -1) + __import__(name, globals(), locals()) diff --git a/linuxActor/src/uds/actor/renamer/debian.py b/linuxActor/src/uds/actor/renamer/debian.py index 61efacdfe..3c8580ee5 100644 --- a/linuxActor/src/uds/actor/renamer/debian.py +++ b/linuxActor/src/uds/actor/renamer/debian.py @@ -10,6 +10,7 @@ import logging, os logger = logging.getLogger(__name__) + def rename(newName): # If new name has "'\t' if '\t' in newName: