def start_schedulers(apps='w2p_tvseries'): try: from multiprocessing import Process except: sys.stderr.write('Sorry, -K only supported for python 2.6-2.7\n') return processes = [] apps = [app.strip() for app in apps.split(',')] code = "from gluon import current; current._scheduler.max_empty_runs=10; current._scheduler.loop()" logging.getLogger().setLevel(logging.INFO) if len(apps) == 1: print 'starting single-scheduler for "%s"...' % apps[0] run(apps[0], True, True, None, False, code) return for app in apps: print 'starting scheduler for "%s"...' % app args = (app, True, True, None, False, code) p = Process(target=run, args=args) processes.append(p) print "Currently running %s scheduler processes" % (len(processes)) p.start() print "Processes started" for p in processes: try: p.join() except (KeyboardInterrupt, SystemExit): print "Processes stopped" except: p.terminate() p.join()
def start_schedulers(options): try: from multiprocessing import Process except: sys.stderr.write('Sorry, -K only supported for python 2.6-2.7\n') return processes = [] apps = [(app.strip(), None) for app in options.scheduler.split(',')] if options.scheduler_groups: apps = options.scheduler_groups code = "from gluon.globals import current;current._scheduler.loop()" logging.getLogger().setLevel(options.debuglevel) if options.folder: os.chdir(options.folder) if len(apps) == 1 and not options.with_scheduler: app_, code = get_code_for_scheduler(apps[0], options) if not app_: return print('starting single-scheduler for "%s"...' % app_) run(app_, True, True, None, False, code) return # Work around OS X problem: http://bugs.python.org/issue9405 if PY2: import urllib else: import urllib.request as urllib urllib.getproxies() for app in apps: app_, code = get_code_for_scheduler(app, options) if not app_: continue print('starting scheduler for "%s"...' % app_) args = (app_, True, True, None, False, code) p = Process(target=run, args=args) processes.append(p) print("Currently running %s scheduler processes" % (len(processes))) p.start() ##to avoid bashing the db at the same time time.sleep(0.7) print("Processes started") for p in processes: try: p.join() except (KeyboardInterrupt, SystemExit): print("Processes stopped") except: p.terminate() p.join()
def start_schedulers(options): try: from multiprocessing import Process except: sys.stderr.write('Sorry, -K only supported for Python 2.6+\n') return logging.getLogger().setLevel(options.log_level) apps = [ag.split(':') for ag in options.schedulers] if not options.with_scheduler and len(apps) == 1: app, code = get_code_for_scheduler(apps[0], options) if not app: return print('starting single-scheduler for "%s"...' % app) run(app, True, True, None, False, code, False, True) return # Work around OS X problem: http://bugs.python.org/issue9405 if PY2: import urllib else: import urllib.request as urllib urllib.getproxies() processes = [] for app_groups in apps: app, code = get_code_for_scheduler(app_groups, options) if not app: continue print('starting scheduler for "%s"...' % app) args = (app, True, True, None, False, code, False, True) p = Process(target=run, args=args) processes.append(p) print("Currently running %s scheduler processes" % (len(processes))) p.start() ##to avoid bashing the db at the same time time.sleep(0.7) print("Processes started") for p in processes: try: p.join() except (KeyboardInterrupt, SystemExit): print("Processes stopped") except: p.terminate() p.join()
def start_schedulers(options): try: from multiprocessing import Process except: sys.stderr.write('Sorry, -K only supported for python 2.6-2.7\n') return processes = [] apps = [(app.strip(), None) for app in options.scheduler.split(',')] if options.scheduler_groups: apps = options.scheduler_groups code = "from gluon import current;current._scheduler.loop()" logging.getLogger().setLevel(options.debuglevel) if len(apps) == 1 and not options.with_scheduler: app_, code = get_code_for_scheduler(apps[0], options) if not app_: return print 'starting single-scheduler for "%s"...' % app_ run(app_, True, True, None, False, code) return for app in apps: app_, code = get_code_for_scheduler(app, options) if not app_: continue print 'starting scheduler for "%s"...' % app_ args = (app_, True, True, None, False, code) p = Process(target=run, args=args) processes.append(p) print "Currently running %s scheduler processes" % (len(processes)) p.start() ##to avoid bashing the db at the same time time.sleep(0.7) print "Processes started" for p in processes: try: p.join() except (KeyboardInterrupt, SystemExit): print "Processes stopped" except: p.terminate() p.join()
def start(cron=True): """ Start server """ # ## get command line arguments (options, args) = console() if not options.nobanner: print ProgramName print ProgramAuthor print ProgramVersion from dal import DRIVERS if not options.nobanner: print 'Database drivers available: %s' % ', '.join(DRIVERS) # ## if -L load options from options.config file if options.config: try: options2 = __import__(options.config, {}, {}, '') except Exception: try: # Jython doesn't like the extra stuff options2 = __import__(options.config) except Exception: print 'Cannot import config file [%s]' % options.config sys.exit(1) for key in dir(options2): if hasattr(options, key): setattr(options, key, getattr(options2, key)) logfile0 = os.path.join('extras','examples','logging.example.conf') if not os.path.exists('logging.conf') and os.path.exists(logfile0): import shutil sys.stdout.write("Copying logging.conf.example to logging.conf ... ") shutil.copyfile('logging.example.conf', logfile0) sys.stdout.write("OK\n") # ## if -T run doctests (no cron) if hasattr(options, 'test') and options.test: test(options.test, verbose=options.verbose) return # ## if -S start interactive shell (also no cron) if options.shell: if not options.args is None: sys.argv[:] = options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cronjob=options.cronjob) return # ## if -C start cron run (extcron) and exit # ## -K specifies optional apps list (overloading scheduler) if options.extcron: logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' if options.scheduler: # -K apps = [app.strip() for app in options.scheduler.split( ',') if check_existent_app(options, app.strip())] else: apps = None extcron = newcron.extcron(options.folder, apps=apps) extcron.start() extcron.join() return # ## if -K if options.scheduler and not options.with_scheduler: try: start_schedulers(options) except KeyboardInterrupt: pass return # ## if -W install/start/stop web2py as service if options.winservice: if os.name == 'nt': try: from winservice import register_service_handler, Web2pyService register_service_handler( argv=['', options.winservice], opt_file=options.config, cls=Web2pyService) except ImportError: print 'Error: Missing python module winservice' sys.exit(1) else: print 'Error: Windows services not supported on this platform' sys.exit(1) return # ## if -H cron is enabled in this *process* # ## if --softcron use softcron # ## use hardcron in all other cases if cron and options.runcron and options.softcron: print 'Using softcron (but this is not very efficient)' global_settings.web2py_crontype = 'soft' elif cron and options.runcron: logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder).start() # ## if no password provided and havetk start Tk interface # ## or start interface if we want to put in taskbar (system tray) try: options.taskbar except: options.taskbar = False if options.taskbar and os.name != 'nt': print 'Error: taskbar not supported on this platform' sys.exit(1) root = None if not options.nogui: try: import Tkinter havetk = True except ImportError: logger.warn( 'GUI not available because Tk library is not installed') havetk = False options.nogui = True if options.password == '<ask>' and havetk or options.taskbar and havetk: try: root = Tkinter.Tk() except: pass if root: root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) if not options.quiet: presentation(root) master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() # ## if no tk and no password, ask for a password if not root and options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, no admin interface' # ##-X (if no tk, the widget takes care of it himself) if not root and options.scheduler and options.with_scheduler: t = threading.Thread(target=start_schedulers, args=(options,)) t.start() # ## start server # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: (ip, port) = (options.ip, int(options.port)) else: first_if = options.interfaces[0] (ip, port) = first_if[0], first_if[1] # Check for non default value for ssl inputs if (len(options.ssl_certificate) > 0) or (len(options.ssl_private_key) > 0): proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.nobanner: print 'please visit:' print '\t', url print 'use "kill -SIGTERM %i" to shutdown the web2py server' % os.getpid() # enhance linecache.getline (used by debugger) to look at the source file # if the line was not found (under py2exe & when file was modified) import linecache py2exe_getline = linecache.getline def getline(filename, lineno, *args, **kwargs): line = py2exe_getline(filename, lineno, *args, **kwargs) if not line: f = open(filename, "r") try: for i, line in enumerate(f): if lineno == i + 1: break else: line = None finally: f.close() return line linecache.getline = getline server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.ssl_certificate, ssl_private_key=options.ssl_private_key, ssl_ca_certificate=options.ssl_ca_certificate, min_threads=options.minthreads, max_threads=options.maxthreads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() try: t.join() except: pass logging.shutdown()
def start(cron=True): """ Starts server """ # ## get command line arguments (options, args) = console() if not options.nobanner: print(ProgramName) print(ProgramAuthor) print(ProgramVersion) from pydal.drivers import DRIVERS if not options.nobanner: print('Database drivers available: %s' % ', '.join(DRIVERS)) # ## if -L load options from options.config file if options.config: try: options2 = __import__(options.config, {}, {}, '') except Exception: try: # Jython doesn't like the extra stuff options2 = __import__(options.config) except Exception: print('Cannot import config file [%s]' % options.config) sys.exit(1) for key in dir(options2): if hasattr(options, key): setattr(options, key, getattr(options2, key)) # ## if -T run doctests (no cron) if hasattr(options, 'test') and options.test: test(options.test, verbose=options.verbose) return # ## if -S start interactive shell (also no cron) if options.shell: if options.folder: os.chdir(options.folder) if not options.args is None: sys.argv[:] = options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cronjob=options.cronjob) return # ## if -C start cron run (extcron) and exit # ## -K specifies optional apps list (overloading scheduler) if options.extcron: logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' if options.scheduler: # -K apps = [ app.strip() for app in options.scheduler.split(',') if check_existent_app(options, app.strip()) ] else: apps = None extcron = newcron.extcron(options.folder, apps=apps) extcron.start() extcron.join() return # ## if -K if options.scheduler and not options.with_scheduler: try: start_schedulers(options) except KeyboardInterrupt: pass return # ## if -H cron is enabled in this *process* # ## if --softcron use softcron # ## use hardcron in all other cases if cron and options.runcron and options.softcron: print('Using softcron (but this is not very efficient)') global_settings.web2py_crontype = 'soft' elif cron and options.runcron: logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder).start() # ## if no password provided and havetk start Tk interface # ## or start interface if we want to put in taskbar (system tray) try: options.taskbar except: options.taskbar = False if options.taskbar and os.name != 'nt': print('Error: taskbar not supported on this platform') sys.exit(1) root = None if not options.nogui and options.password == '<ask>': try: if PY2: import Tkinter as tkinter else: import tkinter havetk = True try: root = tkinter.Tk() except: pass except (ImportError, OSError): logger.warn( 'GUI not available because Tk library is not installed') havetk = False options.nogui = True if root: root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() # ## if no tk and no password, ask for a password if not root and options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, no admin interface') # ##-X (if no tk, the widget takes care of it himself) if not root and options.scheduler and options.with_scheduler: t = threading.Thread(target=start_schedulers, args=(options, )) t.start() # ## start server # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: (ip, port) = (options.ip, int(options.port)) else: first_if = options.interfaces[0] (ip, port) = first_if[0], first_if[1] # Check for non default value for ssl inputs if (len(options.ssl_certificate) > 0) or (len(options.ssl_private_key) > 0): proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.nobanner: message = '\nplease visit:\n\t%s\n' % url if sys.platform.startswith('win'): message += 'use "taskkill /f /pid %i" to shutdown the web2py server\n\n' % os.getpid( ) else: message += 'use "kill -SIGTERM %i" to shutdown the web2py server\n\n' % os.getpid( ) print(message) # enhance linecache.getline (used by debugger) to look at the source file # if the line was not found (under py2exe & when file was modified) import linecache py2exe_getline = linecache.getline def getline(filename, lineno, *args, **kwargs): line = py2exe_getline(filename, lineno, *args, **kwargs) if not line: try: f = open(filename, "r") try: for i, line in enumerate(f): if lineno == i + 1: break else: line = None finally: f.close() except (IOError, OSError): line = None return line linecache.getline = getline server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.ssl_certificate, ssl_private_key=options.ssl_private_key, ssl_ca_certificate=options.ssl_ca_certificate, min_threads=options.minthreads, max_threads=options.maxthreads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() try: t.join() except: pass logging.shutdown()
shutil.copy(new_scheduler, old_scheduler) print ' INFO: new scheduler in place' if raw_input("Q: Let's create/migrate our database.... ([Y]/n)?").lower() in ['y', 'yes']: remove_compiled_application(os.path.join(w2p_folder, 'applications', 'w2p_tvseries')) model_file = os.path.join(w2p_folder, 'applications', 'w2p_tvseries', 'models', 'db.py') print ' INFO: setting migrate to True, just to be sure' with open(model_file) as g: content = g.read() content = content.replace("MIGRATE = False", "MIGRATE = True") content = content.replace("LAZY_TABLES = True", "LAZY_TABLES = False") with open(model_file, 'w') as g: g.write(content) run('w2p_tvseries/manage/stop_operations') print ' INFO: migration occurred, setting migrate to False' with open(model_file) as g: content = g.read().replace("MIGRATE = True", "MIGRATE = False") content = content.replace("LAZY_TABLES = False", "LAZY_TABLES = True") with open(model_file, 'w') as g: g.write(content) print ' INFO: migrate set to False' """ if raw_input("(re)compile application (y,n) ?").lower() in ['y','yes']: request = Storage(folder=os.path.abspath(os.path.join(w2p_folder, 'applications', 'w2p_tvseries'))) remove_compiled_application(os.path.join(w2p_folder, 'applications', 'w2p_tvseries')) app_compile('w2p_tvseries', request) """
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys if '__file__' in globals(): path = os.path.dirname(os.path.abspath(__file__)) os.chdir(path) else: path = os.getcwd() # Seems necessary for py2exe sys.path = [path]+[p for p in sys.path if not p==path] # import gluon.import_all ##### This should be uncommented for py2exe.py import gluon.widget from gluon.shell import run # Start Web2py Scheduler -- Note the app name is hardcoded! if __name__ == '__main__': run('eden',True,True,None,False,"from gluon import current; current._scheduler.loop()")
- 'maintenance' - 'update' - 'down_sebanners' - 'scoop_season' - 'check_season' - 'ep_metadata' - 'down_epbanners' - 'check_subs' - 'down_subs' - 'queue_torrents' - 'down_torrents' e.g. Set this to maintenance,update to skip maintenance and update jobs """ sys.exit(0) run('w2p_tvseries/organize/queue_ops', True) disabled_operations = [] if '-s' in args: available_ops = [ 'maintenance', 'update', 'down_sebanners', 'scoop_season', 'check_season', 'ep_metadata', 'down_epbanners', 'check_subs', 'down_subs', 'queue_torrents', 'down_torrents' ] disabled_operations = args[2].split(',') code = '' for a in disabled_operations: if a in available_ops: print 'Skipping %s tasks' % a code += "db2(db2.scheduler_task.function_name == '%s').delete();" % a code += "db2.commit();" run('w2p_tvseries/organize', True, True, None, False, code)
def start(cron=True): """ Starts server and other services """ # get command line arguments (options, args) = console() # FIXME: this should be anticipated in console() if options.config: # import options from options.config file try: options2 = __import__(options.config) except: sys.stderr.write("Cannot import config file %s\n" % options.config) sys.exit(1) for key in dir(options2): # FIXME: better import condition, not all options attributes # should be sourced from config file if hasattr(options, key): setattr(options, key, getattr(options2, key)) if not options.nobanner: # banner print(ProgramName) print(ProgramAuthor) print(ProgramVersion) from pydal.drivers import DRIVERS print('Database drivers available: %s' % ', '.join(DRIVERS)) if options.test: # run doctests and exit test(options.test, verbose=options.verbose) return if options.shell: # run interactive shell and exit if options.folder: os.chdir(options.folder) sys.argv = [options.run] + options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cronjob=options.cronjob) return if options.extcron: # run cron (extcron) and exit logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' if options.scheduler: # run cron for applications listed with --scheduler (-K) apps = [app.strip() for app in options.scheduler.split( ',') if check_existent_app(options, app.strip())] else: apps = None extcron = newcron.extcron(options.folder, apps=apps) extcron.start() extcron.join() return if options.scheduler and not options.with_scheduler: # run schedulers and exit try: start_schedulers(options) except KeyboardInterrupt: pass return if cron and options.runcron: if options.softcron: print('Using softcron (but this is not very efficient)') global_settings.web2py_crontype = 'soft' else: # start hardcron thread logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder).start() # if no password provided and have Tk library start GUI (when not # explicitly disabled), we also need a GUI to put in taskbar (system tray) # when requested # FIXME: this check should be done first if options.taskbar and os.name != 'nt': sys.stderr.write('Error: taskbar not supported on this platform\n') sys.exit(1) root = None if (not options.nogui and options.password == '<ask>') or options.taskbar: try: if PY2: import Tkinter as tkinter else: import tkinter root = tkinter.Tk() except (ImportError, OSError): logger.warn( 'GUI not available because Tk library is not installed') options.nogui = True except: logger.exception('cannot get Tk root window, GUI disabled') options.nogui = True if root: # run GUI and exit root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) # web2pyDialog takes care of schedulers master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() if options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, disable admin interface') spt = None if options.scheduler and options.with_scheduler: # start schedulers in a separate thread spt = threading.Thread(target=start_schedulers, args=(options,)) spt.start() # start server # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: ip = options.ip port = int(options.port) else: first_if = options.interfaces[0] ip = first_if[0] port = first_if[1] if options.ssl_certificate or options.ssl_private_key: proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.nobanner: message = '\nplease visit:\n\t%s\n' if sys.platform.startswith('win'): message += 'use "taskkill /f /pid %i" to shutdown the web2py server\n\n' else: message += 'use "kill -SIGTERM %i" to shutdown the web2py server\n\n' print(message % (url, os.getpid())) # enhance linecache.getline (used by debugger) to look at the source file # if the line was not found (under py2exe & when file was modified) import linecache py2exe_getline = linecache.getline def getline(filename, lineno, *args, **kwargs): line = py2exe_getline(filename, lineno, *args, **kwargs) if not line: try: with open(filename, "rb") as f: for i, line in enumerate(f): line = line.decode('utf-8') if lineno == i + 1: break else: line = '' except (IOError, OSError): line = '' return line linecache.getline = getline server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.ssl_certificate, ssl_private_key=options.ssl_private_key, ssl_ca_certificate=options.ssl_ca_certificate, min_threads=options.minthreads, max_threads=options.maxthreads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() if spt is not None: try: spt.join() except: logger.exception('error terminating schedulers') pass logging.shutdown()
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys # Note the app name is hardcoded! APPLICATION = 'runestone' if '__file__' in globals(): path = os.path.dirname(os.path.abspath(__file__)) os.chdir(path) else: path = os.getcwd() # Seems necessary for py2exe sys.path = [path]+[p for p in sys.path if not p==path] import gluon.widget from gluon.shell import run # Start Web2py Scheduler if __name__ == '__main__': run(APPLICATION,True,True,None,False,"from gluon import current; current._scheduler.loop()")
def start(): """ Starts server and other services """ # get command line arguments options = console(version=ProgramVersion) if options.gae: # write app.yaml, gaehandler.py, and exit if not os.path.exists('app.yaml'): name = options.gae # for backward compatibility if name == 'configure': if PY2: input = raw_input name = input("Your GAE app name: ") content = open(os.path.join('examples', 'app.example.yaml'), 'rb').read() open('app.yaml', 'wb').write(content.replace("yourappname", name)) else: print("app.yaml alreday exists in the web2py folder") if not os.path.exists('gaehandler.py'): content = open(os.path.join('handlers', 'gaehandler.py'), 'rb').read() open('gaehandler.py', 'wb').write(content) else: print("gaehandler.py alreday exists in the web2py folder") return logger = logging.getLogger("web2py") logger.setLevel(options.log_level) # on new installation build the scaffolding app create_welcome_w2p() if options.run_system_tests: # run system test and exit run_system_tests(options) if options.quiet: # to prevent writes on stdout set a null stream class NullFile(object): def write(self, x): pass sys.stdout = NullFile() # but still has to mute existing loggers, to do that iterate # over all existing loggers (root logger included) and remove # all attached logging.StreamHandler instances currently # streaming on sys.stdout or sys.stderr loggers = [logging.getLogger()] loggers.extend(logging.Logger.manager.loggerDict.values()) for l in loggers: if isinstance(l, logging.PlaceHolder): continue for h in l.handlers[:]: if isinstance(h, logging.StreamHandler) and \ h.stream in (sys.stdout, sys.stderr): l.removeHandler(h) # NOTE: stderr.write() is still working if not options.no_banner: # banner print(ProgramName) print(ProgramAuthor) print(ProgramVersion) from pydal.drivers import DRIVERS print('Database drivers available: %s' % ', '.join(DRIVERS)) if options.run_doctests: # run doctests and exit test(options.run_doctests, verbose=options.verbose) return if options.shell: # run interactive shell and exit sys.argv = [options.run or ''] + options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cron_job=options.cron_job) return if options.cron_run: # run cron (extcron) and exit logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' extcron = newcron.extcron(options.folder, apps=options.crontabs) extcron.start() extcron.join() return if not options.with_scheduler and options.schedulers: # run schedulers and exit try: start_schedulers(options) except KeyboardInterrupt: pass return if options.with_cron: if options.soft_cron: print('Using cron software emulation (but this is not very efficient)') global_settings.web2py_crontype = 'soft' else: # start hardcron thread logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder, apps=options.crontabs).start() # if no password provided and have Tk library start GUI (when not # explicitly disabled), we also need a GUI to put in taskbar (system tray) # when requested root = None if (not options.no_gui and options.password == '<ask>') or options.taskbar: try: if PY2: import Tkinter as tkinter else: import tkinter root = tkinter.Tk() except (ImportError, OSError): logger.warn( 'GUI not available because Tk library is not installed') options.no_gui = True except: logger.exception('cannot get Tk root window, GUI disabled') options.no_gui = True if root: # run GUI and exit root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) # web2pyDialog takes care of schedulers master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() spt = None if options.with_scheduler and options.schedulers: # start schedulers in a separate thread spt = threading.Thread(target=start_schedulers, args=(options,)) spt.start() # start server if options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, disable admin interface') # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: ip = options.ip port = options.port else: first_if = options.interfaces[0] ip = first_if[0] port = first_if[1] if options.server_key and options.server_cert: proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.no_banner: message = '\nplease visit:\n\t%s\n' if sys.platform.startswith('win'): message += 'use "taskkill /f /pid %i" to shutdown the web2py server\n\n' else: message += 'use "kill -SIGTERM %i" to shutdown the web2py server\n\n' print(message % (url, os.getpid())) # enhance linecache.getline (used by debugger) to look at the source file # if the line was not found (under py2exe & when file was modified) import linecache py2exe_getline = linecache.getline def getline(filename, lineno, *args, **kwargs): line = py2exe_getline(filename, lineno, *args, **kwargs) if not line: try: with open(filename, "rb") as f: for i, line in enumerate(f): line = line.decode('utf-8') if lineno == i + 1: break else: line = '' except (IOError, OSError): line = '' return line linecache.getline = getline server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.server_cert, ssl_private_key=options.server_key, ssl_ca_certificate=options.ca_cert, min_threads=options.min_threads, max_threads=options.max_threads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() if spt is not None: try: spt.join() except: logger.exception('error terminating schedulers') pass logging.shutdown()
print """Use this to enqueue and process tasks with a cron job -s to disable operations. Available operations are - 'maintenance' - 'update' - 'down_sebanners' - 'scoop_season' - 'check_season' - 'ep_metadata' - 'down_epbanners' - 'check_subs' - 'down_subs' - 'queue_torrents' - 'down_torrents' e.g. Set this to maintenance,update to skip maintenance and update jobs """ sys.exit(0) run('w2p_tvseries/organize/queue_ops', True) disabled_operations = [] if '-s' in args: available_ops = ['maintenance', 'update', 'down_sebanners', 'scoop_season', 'check_season', 'ep_metadata', 'down_epbanners', 'check_subs', 'down_subs', 'queue_torrents', 'down_torrents'] disabled_operations = args[2].split(',') code = '' for a in disabled_operations: if a in available_ops: print 'Skipping %s tasks' % a code += "db2(db2.scheduler_task.function_name == '%s').delete();" % a code += "db2.commit();" run('w2p_tvseries/organize', True, True, None, False, code) start_schedulers()
def start(): """ Start server """ # ## get command line arguments (options, args) = console() print ProgramName print ProgramAuthor print ProgramVersion from gluon.sql import drivers print 'Database drivers available: %s' % ', '.join(drivers) # ## if -W install/start/stop web2py as service if options.winservice: if os.name == 'nt': web2py_windows_service_handler(['', options.winservice], options.config) else: print 'Error: windows services not supported on this platform' sys.exit(1) return # ## if -T run doctests if options.test: test(options.test, verbose=options.verbose) return # ## if -S start interactive shell if options.shell: run(options.shell, plain=options.plain, import_models=options.import_models, startfile=options.run) return # ## if -L load options from options.config file if options.config: try: options = __import__(options.config, [], [], '') except Exception: print 'Cannot import config file [%s]' % options.config sys.exit(1) # ## if -C start cron run # ## if -N disable cron in this *process* - note, startup tasks WILL be run regardless ! if options.extcron or options.nocron: gluon.contrib.cron.crontype = 'External' if options.extcron: cron = gluon.contrib.cron.extcron() cron.start() cron.join() return # ## if no password provided and havetk start Tk interface # ## or start interface if we want to put in taskbar (system tray) try: options.taskbar except: options.taskbar = False if options.taskbar and os.name != 'nt': print 'Error: taskbar not supported on this platform' sys.exit(1) root = None if options.password == '<ask>' and havetk or options.taskbar and havetk: try: root = Tkinter.Tk() except: pass if root: root.focus_force() presentation(root) master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() # ## if no tk and no password, ask for a password if not root and options.password == '<ask>': options.password = raw_input('choose a password:'******'no password, no admin interface' # ## start server (ip, port) = (options.ip, int(options.port)) print 'please visit:' print '\thttp://%s:%s' % (ip, port) print 'use "kill -SIGTERM %i" to shutdown the web2py server' % os.getpid() server = HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_filename=options.profiler_filename, ssl_certificate=options.ssl_certificate, ssl_private_key=options.ssl_private_key, numthreads=options.numthreads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder) try: server.start() except KeyboardInterrupt: server.stop()
def start(cron=True): """ Starts server and other services """ # get command line arguments (options, args) = console() # FIXME: this should be anticipated in console() if options.config: # import options from options.config file try: options2 = __import__(options.config) except: sys.stderr.write("Cannot import config file %s\n" % options.config) sys.exit(1) for key in dir(options2): # FIXME: better import condition, not all options attributes # should be sourced from config file if hasattr(options, key): setattr(options, key, getattr(options2, key)) if not options.nobanner: # banner print(ProgramName) print(ProgramAuthor) print(ProgramVersion) from pydal.drivers import DRIVERS print('Database drivers available: %s' % ', '.join(DRIVERS)) if options.test: # run doctests and exit test(options.test, verbose=options.verbose) return if options.shell: # run interactive shell and exit if options.folder: os.chdir(options.folder) sys.argv = [options.run] + options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cronjob=options.cronjob) return if options.extcron: # run cron (extcron) and exit logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' if options.scheduler: # run cron for applications listed with --scheduler (-K) apps = [ app.strip() for app in options.scheduler.split(',') if check_existent_app(options, app.strip()) ] else: apps = None extcron = newcron.extcron(options.folder, apps=apps) extcron.start() extcron.join() return if options.scheduler and not options.with_scheduler: # run schedulers and exit try: start_schedulers(options) except KeyboardInterrupt: pass return if cron and options.runcron: if options.softcron: print('Using softcron (but this is not very efficient)') global_settings.web2py_crontype = 'soft' else: # start hardcron thread logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder).start() # if no password provided and have Tk library start GUI (when not # explicitly disabled), we also need a GUI to put in taskbar (system tray) # when requested # FIXME: this check should be done first if options.taskbar and os.name != 'nt': sys.stderr.write('Error: taskbar not supported on this platform\n') sys.exit(1) root = None if (not options.nogui and options.password == '<ask>') or options.taskbar: try: if PY2: import Tkinter as tkinter else: import tkinter root = tkinter.Tk() except (ImportError, OSError): logger.warn( 'GUI not available because Tk library is not installed') options.nogui = True except: logger.exception('cannot get Tk root window, GUI disabled') options.nogui = True if root: # run GUI and exit root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) # web2pyDialog takes care of schedulers master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() if options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, disable admin interface') spt = None if options.scheduler and options.with_scheduler: # start schedulers in a separate thread spt = threading.Thread(target=start_schedulers, args=(options, )) spt.start() # start server # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: ip = options.ip port = int(options.port) else: first_if = options.interfaces[0] ip = first_if[0] port = first_if[1] if options.ssl_certificate or options.ssl_private_key: proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.nobanner: message = '\nplease visit:\n\t%s\n' if sys.platform.startswith('win'): message += 'use "taskkill /f /pid %i" to shutdown the web2py server\n\n' else: message += 'use "kill -SIGTERM %i" to shutdown the web2py server\n\n' print(message % (url, os.getpid())) # enhance linecache.getline (used by debugger) to look at the source file # if the line was not found (under py2exe & when file was modified) import linecache py2exe_getline = linecache.getline def getline(filename, lineno, *args, **kwargs): line = py2exe_getline(filename, lineno, *args, **kwargs) if not line: try: with open(filename, "rb") as f: for i, line in enumerate(f): line = line.decode('utf-8') if lineno == i + 1: break else: line = '' except (IOError, OSError): line = '' return line linecache.getline = getline server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.ssl_certificate, ssl_private_key=options.ssl_private_key, ssl_ca_certificate=options.ssl_ca_certificate, min_threads=options.minthreads, max_threads=options.maxthreads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() if spt is not None: try: spt.join() except: logger.exception('error terminating schedulers') pass logging.shutdown()
def start(cron=True): """ Start server """ # ## get command line arguments (options, args) = console() if not options.nobanner: print ProgramName print ProgramAuthor print ProgramVersion from dal import DRIVERS if not options.nobanner: print 'Database drivers available: %s' % ', '.join(DRIVERS) # ## if -L load options from options.config file if options.config: try: options2 = __import__(options.config, {}, {}, '') except Exception: try: # Jython doesn't like the extra stuff options2 = __import__(options.config) except Exception: print 'Cannot import config file [%s]' % options.config sys.exit(1) for key in dir(options2): if hasattr(options, key): setattr(options, key, getattr(options2, key)) logfile0 = os.path.join('extras','examples','logging.example.conf') if not os.path.exists('logging.conf') and os.path.exists(logfile0): import shutil sys.stdout.write("Copying logging.conf.example to logging.conf ... ") shutil.copyfile('logging.example.conf', logfile0) sys.stdout.write("OK\n") # ## if -T run doctests (no cron) if hasattr(options, 'test') and options.test: test(options.test, verbose=options.verbose) return # ## if -S start interactive shell (also no cron) if options.shell: if not options.args is None: sys.argv[:] = options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cronjob=options.cronjob) return # ## if -C start cron run (extcron) and exit # ## -K specifies optional apps list (overloading scheduler) if options.extcron: logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' if options.scheduler: # -K apps = [app.strip() for app in options.scheduler.split( ',') if check_existent_app(options, app.strip())] else: apps = None extcron = newcron.extcron(options.folder, apps=apps) extcron.start() extcron.join() return # ## if -K if options.scheduler and not options.with_scheduler: try: start_schedulers(options) except KeyboardInterrupt: pass return # ## if -W install/start/stop web2py as service if options.winservice: if os.name == 'nt': try: from winservice import register_service_handler, Web2pyService register_service_handler( argv=['', options.winservice], opt_file=options.config, cls=Web2pyService) except ImportError: print 'Error: Missing python module winservice' sys.exit(1) else: print 'Error: Windows services not supported on this platform' sys.exit(1) return # ## if -H cron is enabled in this *process* # ## if --softcron use softcron # ## use hardcron in all other cases if cron and options.runcron and options.softcron: print 'Using softcron (but this is not very efficient)' global_settings.web2py_crontype = 'soft' elif cron and options.runcron: logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder).start() # ## if no password provided and havetk start Tk interface # ## or start interface if we want to put in taskbar (system tray) try: options.taskbar except: options.taskbar = False if options.taskbar and os.name != 'nt': print 'Error: taskbar not supported on this platform' sys.exit(1) root = None if not options.nogui: try: import Tkinter havetk = True except ImportError: logger.warn( 'GUI not available because Tk library is not installed') havetk = False options.nogui = True if options.password == '<ask>' and havetk or options.taskbar and havetk: try: root = Tkinter.Tk() except: pass if root: root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) if not options.quiet: presentation(root) master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() # ## if no tk and no password, ask for a password if not root and options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, no admin interface' # ##-X (if no tk, the widget takes care of it himself) if not root and options.scheduler and options.with_scheduler: t = threading.Thread(target=start_schedulers, args=(options,)) t.start() # ## start server # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: (ip, port) = (options.ip, int(options.port)) else: first_if = options.interfaces[0] (ip, port) = first_if[0], first_if[1] # Check for non default value for ssl inputs if (len(options.ssl_certificate) > 0) or (len(options.ssl_private_key) > 0): proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.nobanner: print 'please visit:' print '\t', url print 'use "kill -SIGTERM %i" to shutdown the web2py server' % os.getpid() server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.ssl_certificate, ssl_private_key=options.ssl_private_key, ssl_ca_certificate=options.ssl_ca_certificate, min_threads=options.minthreads, max_threads=options.maxthreads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() try: t.join() except: pass logging.shutdown()
def start(): """ Starts server and other services """ # get command line arguments options = console(version=ProgramVersion) if options.gae: # write app.yaml, gaehandler.py, and exit if not os.path.exists('app.yaml'): name = options.gae # for backward compatibility if name == 'configure': if PY2: input = raw_input name = input("Your GAE app name: ") content = open(os.path.join('examples', 'app.example.yaml'), 'rb').read() open('app.yaml', 'wb').write(content.replace("yourappname", name)) else: print("app.yaml alreday exists in the web2py folder") if not os.path.exists('gaehandler.py'): content = open(os.path.join('handlers', 'gaehandler.py'), 'rb').read() open('gaehandler.py', 'wb').write(content) else: print("gaehandler.py alreday exists in the web2py folder") return logger = logging.getLogger("web2py") logger.setLevel(options.log_level) # on new installation build the scaffolding app create_welcome_w2p() if options.run_system_tests: # run system test and exit run_system_tests(options) if options.quiet: # to prevent writes on stdout set a null stream class NullFile(object): def write(self, x): pass sys.stdout = NullFile() # but still has to mute existing loggers, to do that iterate # over all existing loggers (root logger included) and remove # all attached logging.StreamHandler instances currently # streaming on sys.stdout or sys.stderr loggers = [logging.getLogger()] loggers.extend(logging.Logger.manager.loggerDict.values()) for l in loggers: if isinstance(l, logging.PlaceHolder): continue for h in l.handlers[:]: if isinstance(h, logging.StreamHandler) and \ h.stream in (sys.stdout, sys.stderr): l.removeHandler(h) # NOTE: stderr.write() is still working if not options.no_banner: # banner print(ProgramName) print(ProgramAuthor) print(ProgramVersion) from pydal.drivers import DRIVERS print('Database drivers available: %s' % ', '.join(DRIVERS)) if options.run_doctests: # run doctests and exit test(options.run_doctests, verbose=options.verbose) return if options.shell: # run interactive shell and exit sys.argv = [options.run or ''] + options.args run(options.shell, plain=options.plain, bpython=options.bpython, import_models=options.import_models, startfile=options.run, cron_job=options.cron_job) return if options.cron_run: # run cron (extcron) and exit logger.debug('Starting extcron...') global_settings.web2py_crontype = 'external' extcron = newcron.extcron(options.folder, apps=options.crontabs) extcron.start() extcron.join() return if not options.with_scheduler and options.schedulers: # run schedulers and exit try: start_schedulers(options) except KeyboardInterrupt: pass return if options.with_cron: if options.soft_cron: print( 'Using cron software emulation (but this is not very efficient)' ) global_settings.web2py_crontype = 'soft' else: # start hardcron thread logger.debug('Starting hardcron...') global_settings.web2py_crontype = 'hard' newcron.hardcron(options.folder, apps=options.crontabs).start() # if no password provided and have Tk library start GUI (when not # explicitly disabled), we also need a GUI to put in taskbar (system tray) # when requested root = None if (not options.no_gui and options.password == '<ask>') or options.taskbar: try: if PY2: import Tkinter as tkinter else: import tkinter root = tkinter.Tk() except (ImportError, OSError): logger.warn( 'GUI not available because Tk library is not installed') options.no_gui = True except: logger.exception('cannot get Tk root window, GUI disabled') options.no_gui = True if root: # run GUI and exit root.focus_force() # Mac OS X - make the GUI window rise to the top if os.path.exists("/usr/bin/osascript"): applescript = """ tell application "System Events" set proc to first process whose unix id is %d set frontmost of proc to true end tell """ % (os.getpid()) os.system("/usr/bin/osascript -e '%s'" % applescript) # web2pyDialog takes care of schedulers master = web2pyDialog(root, options) signal.signal(signal.SIGTERM, lambda a, b: master.quit()) try: root.mainloop() except: master.quit() sys.exit() spt = None if options.with_scheduler and options.schedulers: # start schedulers in a separate thread spt = threading.Thread(target=start_schedulers, args=(options, )) spt.start() # start server if options.password == '<ask>': options.password = getpass.getpass('choose a password:'******'no password, disable admin interface') # Use first interface IP and port if interfaces specified, since the # interfaces option overrides the IP (and related) options. if not options.interfaces: ip = options.ip port = options.port else: first_if = options.interfaces[0] ip = first_if[0] port = first_if[1] if options.server_key and options.server_cert: proto = 'https' else: proto = 'http' url = get_url(ip, proto=proto, port=port) if not options.no_banner: message = '\nplease visit:\n\t%s\n' if sys.platform.startswith('win'): message += 'use "taskkill /f /pid %i" to shutdown the web2py server\n\n' else: message += 'use "kill -SIGTERM %i" to shutdown the web2py server\n\n' print(message % (url, os.getpid())) # enhance linecache.getline (used by debugger) to look at the source file # if the line was not found (under py2exe & when file was modified) import linecache py2exe_getline = linecache.getline def getline(filename, lineno, *args, **kwargs): line = py2exe_getline(filename, lineno, *args, **kwargs) if not line: try: with open(filename, "rb") as f: for i, line in enumerate(f): line = line.decode('utf-8') if lineno == i + 1: break else: line = '' except (IOError, OSError): line = '' return line linecache.getline = getline server = main.HttpServer(ip=ip, port=port, password=options.password, pid_filename=options.pid_filename, log_filename=options.log_filename, profiler_dir=options.profiler_dir, ssl_certificate=options.server_cert, ssl_private_key=options.server_key, ssl_ca_certificate=options.ca_cert, min_threads=options.min_threads, max_threads=options.max_threads, server_name=options.server_name, request_queue_size=options.request_queue_size, timeout=options.timeout, socket_timeout=options.socket_timeout, shutdown_timeout=options.shutdown_timeout, path=options.folder, interfaces=options.interfaces) try: server.start() except KeyboardInterrupt: server.stop() if spt is not None: try: spt.join() except: logger.exception('error terminating schedulers') pass logging.shutdown()
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys # Note the app name is hardcoded! APPLICATION = 'runestone' if '__file__' in globals(): path = os.path.dirname(os.path.abspath(__file__)) os.chdir(path) else: path = os.getcwd() # Seems necessary for py2exe sys.path = [path] + [p for p in sys.path if not p == path] import gluon.widget from gluon.shell import run # Start Web2py Scheduler if __name__ == '__main__': run(APPLICATION, True, True, None, False, "from gluon import current; current._scheduler.loop()")