class Loader(object): do_restart = False def __init__(self): # Get options via arg from couchpotato.runner import getOptions self.options = getOptions(base_path, sys.argv[1:]) # Load settings settings = Env.get('settings') settings.setFile(self.options.config_file) # Create data dir if needed self.data_dir = os.path.expanduser(Env.setting('data_dir')) if self.data_dir == '': self.data_dir = getDataDir() if not os.path.isdir(self.data_dir): os.makedirs(self.data_dir) # Create logging dir self.log_dir = os.path.join(self.data_dir, 'logs'); if not os.path.isdir(self.log_dir): os.mkdir(self.log_dir) # Logging from couchpotato.core.logger import CPLog self.log = CPLog(__name__) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%H:%M:%S') hdlr = handlers.RotatingFileHandler(os.path.join(self.log_dir, 'error.log'), 'a', 500000, 10) hdlr.setLevel(logging.CRITICAL) hdlr.setFormatter(formatter) self.log.logger.addHandler(hdlr) def addSignals(self): signal.signal(signal.SIGINT, self.onExit) signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(1)) from couchpotato.core.event import addEvent addEvent('app.after_shutdown', self.afterShutdown) def afterShutdown(self, restart): self.do_restart = restart def onExit(self, signal, frame): from couchpotato.core.event import fireEvent fireEvent('app.crappy_shutdown', single = True) def run(self): self.addSignals() from couchpotato.runner import runCouchPotato runCouchPotato(self.options, base_path, sys.argv[1:], data_dir = self.data_dir, log_dir = self.log_dir, Env = Env) if self.do_restart: self.restart() def restart(self): try: # remove old pidfile first try: if self.runAsDaemon(): try: self.daemon.stop() except: pass except: self.log.critical(traceback.format_exc()) args = [sys.executable] + [os.path.join(base_path, __file__)] + sys.argv[1:] subprocess.Popen(args) except: self.log.critical(traceback.format_exc()) def daemonize(self): if self.runAsDaemon(): try: from daemon import Daemon self.daemon = Daemon(self.options.pid_file) self.daemon.daemonize() except SystemExit: raise except: self.log.critical(traceback.format_exc()) def runAsDaemon(self): return self.options.daemon and self.options.pid_file
class Loader(object): do_restart = False def __init__(self): # Get options via arg from couchpotato.runner import getOptions self.options = getOptions(base_path, sys.argv[1:]) # Load settings settings = Env.get('settings') settings.setFile(self.options.config_file) # Create data dir if needed if self.options.data_dir: self.data_dir = self.options.data_dir else: self.data_dir = os.path.expanduser(Env.setting('data_dir')) if self.data_dir == '': self.data_dir = getDataDir() if not os.path.isdir(self.data_dir): os.makedirs(self.data_dir) # Create logging dir self.log_dir = os.path.join(self.data_dir, 'logs') if not os.path.isdir(self.log_dir): os.mkdir(self.log_dir) # Logging from couchpotato.core.logger import CPLog self.log = CPLog(__name__) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%H:%M:%S') hdlr = handlers.RotatingFileHandler( os.path.join(self.log_dir, 'error.log'), 'a', 500000, 10) hdlr.setLevel(logging.CRITICAL) hdlr.setFormatter(formatter) self.log.logger.addHandler(hdlr) def addSignals(self): signal.signal(signal.SIGINT, self.onExit) signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(1)) from couchpotato.core.event import addEvent addEvent('app.after_shutdown', self.afterShutdown) def afterShutdown(self, restart): self.do_restart = restart def onExit(self, signal, frame): from couchpotato.core.event import fireEvent fireEvent('app.shutdown', single=True) def run(self): self.addSignals() from couchpotato.runner import runCouchPotato runCouchPotato(self.options, base_path, sys.argv[1:], data_dir=self.data_dir, log_dir=self.log_dir, Env=Env) if self.do_restart: self.restart() def restart(self): try: # remove old pidfile first try: if self.runAsDaemon(): try: self.daemon.stop() except: pass except: self.log.critical(traceback.format_exc()) # Release log files and shutdown logger logging.shutdown() time.sleep(3) args = [sys.executable] + [ os.path.join(base_path, os.path.basename(__file__)) ] + sys.argv[1:] subprocess.Popen(args) except: self.log.critical(traceback.format_exc()) def daemonize(self): if self.runAsDaemon(): try: from daemon import Daemon self.daemon = Daemon(self.options.pid_file) self.daemon.daemonize() except SystemExit: raise except: self.log.critical(traceback.format_exc()) def runAsDaemon(self): return self.options.daemon and self.options.pid_file
class Pimmer(object): do_restart = False def __init__(self): #parse args parser = ArgumentParser(prog='pimmer.py') parser.add_argument('--daemon', action='store_true', dest='daemon', help='Daemonize the app') parser.add_argument('--pid_file', dest='pid_file', help='Path to pidfile needed for daemon') parser.add_argument( '-v', '--verbose', action='count', default=0, help='Increases verbosity of logging. See LOGFILE variable.') parser.add_argument('--console', action='store_true', dest='console', help='Log to console') self.options = parser.parse_args() #configure logger self.configureLogging() self.log = PLog(__name__) def configureLogging(self): logfile = config.get("general", "log_file") logging.getLogger().setLevel(self.options.verbose) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%H:%M:%S') hdlr = handlers.RotatingFileHandler(logfile, 'a', 500000, 10) hdlr.setLevel(self.options.verbose) hdlr.setFormatter(formatter) console = self.options.console == True console = True if console and not self.runAsDaemon(): console = logging.StreamHandler() console.setLevel(self.options.verbose) console.setFormatter(formatter) logging.getLogger().addHandler(console) logging.getLogger().addHandler(hdlr) def daemonize(self): try: from daemon import Daemon self.daemon = Daemon(self.options.pid_file) self.daemon.daemonize() print "daemon" except SystemExit: raise except: self.log.critical(traceback.format_exc()) def runAsDaemon(self): return self.options.daemon and self.options.pid_file def exit(self, signal, frame): self.log.info("Shutting down Pimmer") core.shutdown() sys.exit(0) def restart(self): try: if self.runAsDaemon(): try: self.daemon.stop() except: pass except: self.log.critical(traceback.format_exc()) os.chdir(base_path) args = [sys.executable] + [ os.path.join(base_path, os.path.basename(__file__)) ] + sys.argv[1:] self.log.info('Re-spawning %s' % ' '.join(args)) subprocess.Popen(args) def run(self): signal.signal(signal.SIGINT, self.exit) signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(1)) try: core.initialize() core.run() except KeyboardInterrupt: pass except Exception: self.log.error(traceback.format_exc()) if self.do_restart: self.log.info("Going to sleep 2 seconds and restart") time.sleep(2) self.restart()
pass except Exception, e: log.critical(e) return 0 from couchpotato.runner import runCouchPotato def main(): if os.environ.get('cp_main', 'false') == 'true': try: runCouchPotato(options, base_path, sys.argv[1:]) except Exception, e: log.critical(e) else: while 1: restart = start() if not restart: break sys.exit() if __name__ == '__main__': signal(SIGTERM, lambda signum, stack_frame: sys.exit(1)) if options.daemon and options.pid_file and not os.environ.get('cp_main'): from daemon import Daemon daemon = Daemon(options.pid_file) daemon.daemonize() main()
class Pimmer(object): do_restart = False def __init__(self): #parse args parser = ArgumentParser(prog = 'pimmer.py') parser.add_argument('--daemon', action = 'store_true', dest = 'daemon', help = 'Daemonize the app') parser.add_argument('--pid_file', dest = 'pid_file', help = 'Path to pidfile needed for daemon') parser.add_argument('-v', '--verbose', action='count', default=0, help='Increases verbosity of logging. See LOGFILE variable.') parser.add_argument('--console', action = 'store_true', dest = 'console', help = 'Log to console') self.options = parser.parse_args() #configure logger self.configureLogging() self.log = PLog(__name__) def configureLogging(self): logfile = config.get("general","log_file") logging.getLogger().setLevel(self.options.verbose) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%H:%M:%S') hdlr = handlers.RotatingFileHandler(logfile, 'a', 500000, 10) hdlr.setLevel(self.options.verbose) hdlr.setFormatter(formatter) console = self.options.console == True console = True if console and not self.runAsDaemon(): console = logging.StreamHandler() console.setLevel(self.options.verbose) console.setFormatter(formatter) logging.getLogger().addHandler(console) logging.getLogger().addHandler(hdlr) def daemonize(self): try: from daemon import Daemon self.daemon = Daemon(self.options.pid_file) self.daemon.daemonize() print "daemon" except SystemExit: raise except: self.log.critical(traceback.format_exc()) def runAsDaemon(self): return self.options.daemon and self.options.pid_file def exit(self, signal, frame): self.log.info("Shutting down Pimmer") core.shutdown() sys.exit(0) def restart(self): try: if self.runAsDaemon(): try: self.daemon.stop() except: pass except: self.log.critical(traceback.format_exc()) os.chdir(base_path) args = [sys.executable] + [os.path.join(base_path, os.path.basename(__file__))] + sys.argv[1:] self.log.info('Re-spawning %s' % ' '.join(args)) subprocess.Popen(args) def run(self): signal.signal(signal.SIGINT, self.exit) signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(1)) try: core.initialize() core.run() except KeyboardInterrupt: pass except Exception: self.log.error(traceback.format_exc()) if self.do_restart: self.log.info("Going to sleep 2 seconds and restart") time.sleep(2) self.restart()