#!/usr/bin/python3 # LEDD Project # Copyright (C) 2015 LEDD Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """LedD Daemon Usage: ledd.py [--detach] [-d | --debug] [-v | --verbose] ledd.py -h | --help ledd.py --version Options: -h --help Show this screen. --version Show version. -d --debug Show debug output. (not recommended) -v --verbose Be verbose. --detach Detach after start. """ import logging import sys import os from pkgutil import iter_modules import coloredlogs from docopt import docopt import ledd.daemon import ledd if "smbus" not in (name for loader, name, ispkg in iter_modules()): print("smbus not found, installing replacement") class SMBus: def __init__(self, i2c_address): self.i2c_address = i2c_address self.channels = {} def write_word_data(self, addr, cmd, val): if (cmd - 6) % 4 == 0: self.channels[(cmd - 6) // 4] = val def read_word_data(self, addr, cmd): if (cmd - 8) // 4 not in self.channels: self.channels[(cmd - 8) // 4] = 0 return self.channels[(cmd - 8) // 4] class SMBusModule: SMBus = SMBus sys.modules['smbus'] = SMBusModule sys.modules['smbus'].SMBus = SMBus def pid_exists(processid): if processid < 0: return False try: os.kill(processid, 0) except ProcessLookupError: return False except PermissionError: return True else: return True if __name__ == "__main__": arguments = docopt(__doc__, version='LedD Daemon ' + ledd.VERSION) lvl = logging.WARNING if arguments['--verbose']: lvl = logging.INFO if arguments['--debug']: lvl = logging.DEBUG log = logging.getLogger(__name__) coloredlogs.install(level=lvl) try: with open('ledd.pid', 'r') as f: spid = f.read() if spid: if pid_exists(int(spid)): log.fatal("A instance of the program is already running, exiting...") sys.exit(5) else: log.warning("Found stale pid file, assuming unclean shutdown.") except FileNotFoundError: pass if arguments['--detach']: wdir = os.path.dirname(os.path.realpath(__file__)) try: pid = os.fork() if pid == 0: os.setsid() pid2 = os.fork() if pid2 == 0: os.umask(0) os.chdir(wdir) with open("ledd.pid", 'w') as pidf: pidf.write(str(os.getpid()) + '\n') ledd.daemon.run() else: sys.exit() else: sys.exit() except OSError as e: log.fatal("Start failed: %s", e) else: ledd.daemon.run()