def command_restart(opts): """Restart a running Sopel instance""" # Get Configuration try: settings = utils.load_settings(opts) except ConfigurationNotFound as error: tools.stderr('Configuration "%s" not found' % error.filename) return ERR_CODE if settings.core.not_configured: tools.stderr('Sopel is not configured, can\'t stop') return ERR_CODE # Redirect Outputs utils.redirect_outputs(settings, opts.quiet) # Get Sopel's PID filename = get_pid_filename(opts, settings.core.pid_dir) pid = get_running_pid(filename) if pid is None or not tools.check_pid(pid): tools.stderr('Sopel is not running!') return ERR_CODE tools.stderr('Asking Sopel to restart') if hasattr(signal, 'SIGUSR2'): os.kill(pid, signal.SIGUSR2) else: # Windows will not generate SIGILL itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(pid, signal.SIGILL)
def command_restart(opts): """Restart a running Sopel instance. :param opts: parsed arguments :type opts: :class:`argparse.Namespace` """ # Get Configuration try: settings = utils.load_settings(opts) except config.ConfigurationNotFound as error: tools.stderr('Configuration "%s" not found' % error.filename) return ERR_CODE if settings.core.not_configured: tools.stderr('Sopel is not configured, can\'t stop') return ERR_CODE # Configure logging logger.setup_logging(settings) # Get Sopel's PID filename = get_pid_filename(settings, settings.core.pid_dir) pid = get_running_pid(filename) if pid is None or not tools.check_pid(pid): tools.stderr('Sopel is not running!') return ERR_CODE tools.stderr('Asking Sopel to restart') if hasattr(signal, 'SIGUSR2'): os.kill(pid, signal.SIGUSR2) else: # Windows will not generate SIGILL itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(pid, signal.SIGILL)
def command_restart(opts): """Restart a running Sopel instance""" # Get Configuration try: settings = utils.load_settings(opts) except config.ConfigurationNotFound as error: tools.stderr('Configuration "%s" not found' % error.filename) return ERR_CODE if settings.core.not_configured: tools.stderr('Sopel is not configured, can\'t stop') return ERR_CODE # Redirect Outputs utils.redirect_outputs(settings, opts.quiet) # Get Sopel's PID filename = get_pid_filename(opts, settings.core.pid_dir) pid = get_running_pid(filename) if pid is None or not tools.check_pid(pid): tools.stderr('Sopel is not running!') return ERR_CODE tools.stderr('Asking Sopel to restart') if hasattr(signal, 'SIGUSR2'): os.kill(pid, signal.SIGUSR2) else: # Windows will not generate SIGILL itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(pid, signal.SIGILL)
def command_start(opts): """Start a Sopel instance. :param opts: parsed arguments :type opts: :class:`argparse.Namespace` """ # Step One: Get the configuration file and prepare to run try: settings = get_configuration(opts) except config.ConfigurationError as e: tools.stderr(e) return ERR_CODE_NO_RESTART if settings.core.not_configured: tools.stderr('Bot is not configured, can\'t start') return ERR_CODE_NO_RESTART # Step Two: Handle process-lifecycle options and manage the PID file pid_dir = settings.core.pid_dir pid_file_path = get_pid_filename(settings, pid_dir) pid = get_running_pid(pid_file_path) if pid is not None and tools.check_pid(pid): tools.stderr('There\'s already a Sopel instance running ' 'with this config file.') tools.stderr('Try using either the `sopel stop` ' 'or the `sopel restart` command.') return ERR_CODE if opts.daemonize: child_pid = os.fork() if child_pid != 0: return with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) try: # Step Three: Run Sopel ret = run(settings, pid_file_path) finally: # Step Four: Shutdown Clean-Up os.unlink(pid_file_path) if ret == -1: # Restart os.execv(sys.executable, ['python'] + sys.argv) else: # Quit return ret
def command_start(opts): """Start a Sopel instance""" # Step One: Get the configuration file and prepare to run try: config_module = get_configuration(opts) except ConfigurationError as e: tools.stderr(e) return ERR_CODE_NO_RESTART if config_module.core.not_configured: tools.stderr('Bot is not configured, can\'t start') return ERR_CODE_NO_RESTART # Step Two: Manage logfile, stdout and stderr utils.redirect_outputs(config_module, opts.quiet) # Step Three: Handle process-lifecycle options and manage the PID file pid_dir = config_module.core.pid_dir pid_file_path = get_pid_filename(opts, pid_dir) pid = get_running_pid(pid_file_path) if pid is not None and tools.check_pid(pid): tools.stderr('There\'s already a Sopel instance running ' 'with this config file.') tools.stderr('Try using either the `sopel stop` ' 'or the `sopel restart` command.') return ERR_CODE if opts.daemonize: child_pid = os.fork() if child_pid is not 0: return with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) # Step Four: Run Sopel ret = run(config_module, pid_file_path) # Step Five: Shutdown Clean-Up os.unlink(pid_file_path) if ret == -1: # Restart os.execv(sys.executable, ['python'] + sys.argv) else: # Quit return ret
def command_start(opts): """Start a Sopel instance""" # Step One: Get the configuration file and prepare to run try: config_module = get_configuration(opts) except config.ConfigurationError as e: tools.stderr(e) return ERR_CODE_NO_RESTART if config_module.core.not_configured: tools.stderr('Bot is not configured, can\'t start') return ERR_CODE_NO_RESTART # Step Two: Manage logfile, stdout and stderr utils.redirect_outputs(config_module, opts.quiet) # Step Three: Handle process-lifecycle options and manage the PID file pid_dir = config_module.core.pid_dir pid_file_path = get_pid_filename(opts, pid_dir) pid = get_running_pid(pid_file_path) if pid is not None and tools.check_pid(pid): tools.stderr('There\'s already a Sopel instance running ' 'with this config file.') tools.stderr('Try using either the `sopel stop` ' 'or the `sopel restart` command.') return ERR_CODE if opts.daemonize: child_pid = os.fork() if child_pid is not 0: return with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) # Step Four: Run Sopel ret = run(config_module, pid_file_path) # Step Five: Shutdown Clean-Up os.unlink(pid_file_path) if ret == -1: # Restart os.execv(sys.executable, ['python'] + sys.argv) else: # Quit return ret
def command_stop(opts): """Stop a running Sopel instance""" # Get Configuration try: settings = utils.load_settings(opts) except config.ConfigurationNotFound as error: tools.stderr('Configuration "%s" not found' % error.filename) return ERR_CODE if settings.core.not_configured: tools.stderr('Sopel is not configured, can\'t stop') return ERR_CODE # Configure logging logger.setup_logging(settings) # Get Sopel's PID filename = get_pid_filename(opts, settings.core.pid_dir) pid = get_running_pid(filename) if pid is None or not tools.check_pid(pid): tools.stderr('Sopel is not running!') return ERR_CODE # Stop Sopel if opts.kill: tools.stderr('Killing the Sopel') os.kill(pid, signal.SIGKILL) return tools.stderr('Signaling Sopel to stop gracefully') if hasattr(signal, 'SIGUSR1'): os.kill(pid, signal.SIGUSR1) else: # Windows will not generate SIGTERM itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(pid, signal.SIGTERM)
def main(argv=None): global homedir # Step One: Parse The Command Line try: parser = argparse.ArgumentParser(description='Sopel IRC Bot', usage='%(prog)s [options]') parser.add_argument('-c', '--config', metavar='filename', help='use a specific configuration file') parser.add_argument("-d", '--fork', action="store_true", dest="daemonize", help="Daemonize sopel") parser.add_argument("-q", '--quit', action="store_true", dest="quit", help="Gracefully quit Sopel") parser.add_argument("-k", '--kill', action="store_true", dest="kill", help="Kill Sopel") parser.add_argument("-l", '--list', action="store_true", dest="list_configs", help="List all config files found") parser.add_argument("-m", '--migrate', action="store_true", dest="migrate_configs", help="Migrate config files to the new format") parser.add_argument('--quiet', action="store_true", dest="quiet", help="Supress all output") parser.add_argument('-w', '--configure-all', action='store_true', dest='wizard', help='Run the configuration wizard.') parser.add_argument('--configure-modules', action='store_true', dest='mod_wizard', help=( 'Run the configuration wizard, but only for the ' 'module configuration options.')) parser.add_argument('-v', '--version', action="store_true", dest="version", help="Show version number and exit") opts = parser.parse_args() # Step Two: "Do not run as root" checks. try: # Linux/Mac if os.getuid() == 0 or os.geteuid() == 0: stderr('Error: Do not run Sopel with root privileges.') sys.exit(1) except AttributeError: # Windows if os.environ.get("USERNAME") == "Administrator": stderr('Error: Do not run Sopel as Administrator.') sys.exit(1) if opts.version: py_ver = '%s.%s.%s' % (sys.version_info.major, sys.version_info.minor, sys.version_info.micro) print('Sopel %s (running on python %s)' % (__version__, py_ver)) print('http://sopel.chat/') return elif opts.wizard: _wizard('all', opts.config) return elif opts.mod_wizard: _wizard('mod', opts.config) return if opts.list_configs: configs = enumerate_configs() print('Config files in ~/.sopel:') if len(configs) is 0: print('\tNone found') else: for config in configs: print('\t%s' % config) print('-------------------------') return config_name = opts.config or 'default' configpath = find_config(config_name) if not os.path.isfile(configpath): print("Welcome to Sopel!\nI can't seem to find the configuration file, so let's generate it!\n") if not configpath.endswith('.cfg'): configpath = configpath + '.cfg' _create_config(configpath) configpath = find_config(config_name) try: config_module = Config(configpath) except ConfigurationError as e: stderr(e) sys.exit(2) if config_module.core.not_configured: stderr('Bot is not configured, can\'t start') # exit with code 2 to prevent auto restart on fail by systemd sys.exit(2) logfile = os.path.os.path.join(config_module.core.logdir, 'stdio.log') config_module._is_daemonized = opts.daemonize sys.stderr = tools.OutputRedirect(logfile, True, opts.quiet) sys.stdout = tools.OutputRedirect(logfile, False, opts.quiet) # Handle --quit, --kill and saving the PID to file pid_dir = config_module.core.pid_dir if opts.config is None: pid_file_path = os.path.join(pid_dir, 'sopel.pid') else: basename = os.path.basename(opts.config) if basename.endswith('.cfg'): basename = basename[:-4] pid_file_path = os.path.join(pid_dir, 'sopel-%s.pid' % basename) if os.path.isfile(pid_file_path): with open(pid_file_path, 'r') as pid_file: try: old_pid = int(pid_file.read()) except ValueError: old_pid = None if old_pid is not None and tools.check_pid(old_pid): if not opts.quit and not opts.kill: stderr('There\'s already a Sopel instance running with this config file') stderr('Try using the --quit or the --kill options') sys.exit(1) elif opts.kill: stderr('Killing the sopel') os.kill(old_pid, signal.SIGKILL) sys.exit(0) elif opts.quit: stderr('Signaling Sopel to stop gracefully') if hasattr(signal, 'SIGUSR1'): os.kill(old_pid, signal.SIGUSR1) else: os.kill(old_pid, signal.SIGTERM) sys.exit(0) elif old_pid is None or (not tools.check_pid(old_pid) and (opts.kill or opts.quit)): stderr('Sopel is not running!') sys.exit(1) elif opts.quit or opts.kill: stderr('Sopel is not running!') sys.exit(1) if opts.daemonize: child_pid = os.fork() if child_pid is not 0: sys.exit() with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) # Step Five: Initialise And Run sopel run(config_module, pid_file_path) except KeyboardInterrupt: print("\n\nInterrupted") os._exit(1)
def command_legacy(opts): """Legacy Sopel run script The ``legacy`` command manages the old-style ``sopel`` command line tool. Most of its features are replaced by the following commands: * ``sopel start`` replaces the default behavior (run the bot) * ``sopel stop`` replaces the ``--quit/--kill`` options * ``sopel restart`` replaces the ``--restart`` option * ``sopel configure`` replaces the ``-w/--configure-all/--configure-modules`` options The ``-v`` option for "version" is deprecated, ``-V/--version`` should be used instead. .. seealso:: The github issue `#1471`__ tracks various changes requested for future versions of Sopel, some of them related to this legacy command. .. __: https://github.com/sopel-irc/sopel/issues/1471 """ # Step One: Handle "No config needed" options if opts.version: print_version() return elif opts.version_legacy: tools.stderr('WARNING: option -v is deprecated; ' 'use `sopel -V/--version` instead') print_version() return if opts.wizard: tools.stderr('WARNING: option -w/--configure-all is deprecated; ' 'use `sopel configure` instead') _wizard('all', opts.config) return if opts.mod_wizard: tools.stderr('WARNING: option --configure-modules is deprecated; ' 'use `sopel configure --modules` instead') _wizard('mod', opts.config) return if opts.list_configs: print_config() return # Step Two: Get the configuration file and prepare to run try: config_module = get_configuration(opts) except ConfigurationError as e: tools.stderr(e) return ERR_CODE_NO_RESTART if config_module.core.not_configured: tools.stderr('Bot is not configured, can\'t start') return ERR_CODE_NO_RESTART # Step Three: Manage logfile, stdout and stderr utils.redirect_outputs(config_module, opts.quiet) # Step Four: Handle process-lifecycle options and manage the PID file pid_dir = config_module.core.pid_dir pid_file_path = get_pid_filename(opts, pid_dir) old_pid = get_running_pid(pid_file_path) if old_pid is not None and tools.check_pid(old_pid): if not opts.quit and not opts.kill and not opts.restart: tools.stderr( 'There\'s already a Sopel instance running with this config file' ) tools.stderr( 'Try using either the `sopel stop` command or the `sopel restart` command' ) return ERR_CODE elif opts.kill: tools.stderr('WARNING: option -k/--kill is deprecated; ' 'use `sopel stop --kill` instead') tools.stderr('Killing the Sopel') os.kill(old_pid, signal.SIGKILL) return elif opts.quit: tools.stderr('WARNING: options -q/--quit is deprecated; ' 'use `sopel stop` instead') tools.stderr('Signaling Sopel to stop gracefully') if hasattr(signal, 'SIGUSR1'): os.kill(old_pid, signal.SIGUSR1) else: # Windows will not generate SIGTERM itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(old_pid, signal.SIGTERM) return elif opts.restart: tools.stderr('WARNING: options --restart is deprecated; ' 'use `sopel restart` instead') tools.stderr('Asking Sopel to restart') if hasattr(signal, 'SIGUSR2'): os.kill(old_pid, signal.SIGUSR2) else: # Windows will not generate SIGILL itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(old_pid, signal.SIGILL) return elif opts.kill or opts.quit or opts.restart: tools.stderr('Sopel is not running!') return ERR_CODE if opts.daemonize: child_pid = os.fork() if child_pid is not 0: return with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) # Step Five: Initialize and run Sopel ret = run(config_module, pid_file_path) os.unlink(pid_file_path) if ret == -1: os.execv(sys.executable, ['python'] + sys.argv) else: return ret
def main(argv=None): try: # Step One: Parse The Command Line parser = build_parser() opts = parser.parse_args(argv or None) # Step Two: "Do not run as root" checks try: check_not_root() except RuntimeError as err: stderr('%s' % err) return ERR_CODE # Step Three: Handle "No config needed" options if opts.version: print_version() return if opts.wizard: _wizard('all', opts.config) return if opts.mod_wizard: _wizard('mod', opts.config) return if opts.list_configs: print_config() return # Step Four: Get the configuration file and prepare to run try: config_module = get_configuration(opts) except ConfigurationError as e: stderr(e) return ERR_CODE_NO_RESTART if config_module.core.not_configured: stderr('Bot is not configured, can\'t start') return ERR_CODE_NO_RESTART # Step Five: Manage logfile, stdout and stderr logfile = os.path.os.path.join(config_module.core.logdir, 'stdio.log') sys.stderr = tools.OutputRedirect(logfile, True, opts.quiet) sys.stdout = tools.OutputRedirect(logfile, False, opts.quiet) # Step Six: Handle process-lifecycle options and manage the PID file pid_dir = config_module.core.pid_dir pid_file_path = get_pid_filename(opts, pid_dir) old_pid = get_running_pid(pid_file_path) if old_pid is not None and tools.check_pid(old_pid): if not opts.quit and not opts.kill and not opts.restart: stderr( 'There\'s already a Sopel instance running with this config file' ) stderr( 'Try using either the --quit, --restart, or --kill option') return ERR_CODE elif opts.kill: stderr('Killing the Sopel') os.kill(old_pid, signal.SIGKILL) return elif opts.quit: stderr('Signaling Sopel to stop gracefully') if hasattr(signal, 'SIGUSR1'): os.kill(old_pid, signal.SIGUSR1) else: # Windows will not generate SIGTERM itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(old_pid, signal.SIGTERM) return elif opts.restart: stderr('Asking Sopel to restart') if hasattr(signal, 'SIGUSR2'): os.kill(old_pid, signal.SIGUSR2) else: # Windows will not generate SIGILL itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(old_pid, signal.SIGILL) return elif opts.kill or opts.quit or opts.restart: stderr('Sopel is not running!') return ERR_CODE if opts.daemonize: child_pid = os.fork() if child_pid is not 0: return with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) # Step Seven: Initialize and run Sopel ret = run(config_module, pid_file_path) os.unlink(pid_file_path) if ret == -1: os.execv(sys.executable, ['python'] + sys.argv) else: return ret except KeyboardInterrupt: print("\n\nInterrupted") return ERR_CODE
def command_legacy(opts): """Legacy Sopel run script The ``legacy`` command manages the old-style ``sopel`` command line tool. Most of its features are replaced by the following commands: * ``sopel start`` replaces the default behavior (run the bot) * ``sopel stop`` replaces the ``--quit/--kill`` options * ``sopel restart`` replaces the ``--restart`` option * ``sopel configure`` replaces the ``-w/--configure-all/--configure-modules`` options The ``-v`` option for "version" is deprecated, ``-V/--version`` should be used instead. .. seealso:: The github issue `#1471`__ tracks various changes requested for future versions of Sopel, some of them related to this legacy command. .. __: https://github.com/sopel-irc/sopel/issues/1471 """ # Step One: Handle "No config needed" options if opts.version: print_version() return elif opts.version_legacy: tools.stderr( 'WARNING: option -v is deprecated; ' 'use `sopel -V/--version` instead') print_version() return # TODO: allow to use a different homedir configpath = utils.find_config( config.DEFAULT_HOMEDIR, opts.config or 'default') if opts.wizard: tools.stderr( 'WARNING: option -w/--configure-all is deprecated; ' 'use `sopel configure` instead') utils.wizard(configpath) return if opts.mod_wizard: tools.stderr( 'WARNING: option --configure-modules is deprecated; ' 'use `sopel configure --modules` instead') utils.plugins_wizard(configpath) return if opts.list_configs: print_config() return # Step Two: Get the configuration file and prepare to run try: config_module = get_configuration(opts) except config.ConfigurationError as e: tools.stderr(e) return ERR_CODE_NO_RESTART if config_module.core.not_configured: tools.stderr('Bot is not configured, can\'t start') return ERR_CODE_NO_RESTART # Step Three: Manage logfile, stdout and stderr utils.redirect_outputs(config_module, opts.quiet) # Step Four: Handle process-lifecycle options and manage the PID file pid_dir = config_module.core.pid_dir pid_file_path = get_pid_filename(opts, pid_dir) old_pid = get_running_pid(pid_file_path) if old_pid is not None and tools.check_pid(old_pid): if not opts.quit and not opts.kill and not opts.restart: tools.stderr( 'There\'s already a Sopel instance running with this config file') tools.stderr( 'Try using either the `sopel stop` command or the `sopel restart` command') return ERR_CODE elif opts.kill: tools.stderr( 'WARNING: option -k/--kill is deprecated; ' 'use `sopel stop --kill` instead') tools.stderr('Killing the Sopel') os.kill(old_pid, signal.SIGKILL) return elif opts.quit: tools.stderr( 'WARNING: options -q/--quit is deprecated; ' 'use `sopel stop` instead') tools.stderr('Signaling Sopel to stop gracefully') if hasattr(signal, 'SIGUSR1'): os.kill(old_pid, signal.SIGUSR1) else: # Windows will not generate SIGTERM itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(old_pid, signal.SIGTERM) return elif opts.restart: tools.stderr( 'WARNING: options --restart is deprecated; ' 'use `sopel restart` instead') tools.stderr('Asking Sopel to restart') if hasattr(signal, 'SIGUSR2'): os.kill(old_pid, signal.SIGUSR2) else: # Windows will not generate SIGILL itself # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal os.kill(old_pid, signal.SIGILL) return elif opts.kill or opts.quit or opts.restart: tools.stderr('Sopel is not running!') return ERR_CODE if opts.daemonize: child_pid = os.fork() if child_pid is not 0: return with open(pid_file_path, 'w') as pid_file: pid_file.write(str(os.getpid())) # Step Five: Initialize and run Sopel ret = run(config_module, pid_file_path) os.unlink(pid_file_path) if ret == -1: os.execv(sys.executable, ['python'] + sys.argv) else: return ret
def main(argv=None): global homedir # Step One: Parse The Command Line try: parser = optparse.OptionParser('%prog [options]') parser.add_option('-c', '--config', metavar='filename', help='use a specific configuration file') parser.add_option("-d", '--fork', action="store_true", dest="deamonize", help="Deamonize sopel") parser.add_option("-q", '--quit', action="store_true", dest="quit", help="Gracefully quit Sopel") parser.add_option("-k", '--kill', action="store_true", dest="kill", help="Kill Sopel") parser.add_option( '--exit-on-error', action="store_true", dest="exit_on_error", help="Exit immediately on every error instead of trying to recover" ) parser.add_option("-l", '--list', action="store_true", dest="list_configs", help="List all config files found") parser.add_option("-m", '--migrate', action="store_true", dest="migrate_configs", help="Migrate config files to the new format") parser.add_option('--quiet', action="store_true", dest="quiet", help="Supress all output") parser.add_option('-w', '--configure-all', action='store_true', dest='wizard', help='Run the configuration wizard.') parser.add_option( '--configure-modules', action='store_true', dest='mod_wizard', help= 'Run the configuration wizard, but only for the module configuration options.' ) parser.add_option( '--configure-database', action='store_true', dest='db_wizard', help= 'Run the configuration wizard, but only for the database configuration options.' ) opts, args = parser.parse_args(argv) if opts.wizard: wizard('all', opts.config) return elif opts.mod_wizard: wizard('mod', opts.config) return elif opts.db_wizard: wizard('db', opts.config) return check_python_version() if opts.list_configs is not None: configs = enumerate_configs() print 'Archives de configuation:' if len(configs[0]) is 0: print u'\tJe n\'ai trouvé pas rien' else: for config in configs: print '\t%s' % config print '-------------------------' return config_name = opts.config or 'default' configpath = find_config(config_name) if not os.path.isfile(configpath): print u"Welcome to JoikervgBot configuration wizard! -- ¡Bienvenido al asistente de configuración de JoikervgBot! -- Bienvenue à l'assistant de configuration de JoikervgBot!\n" if not configpath.endswith('.cfg'): configpath = configpath + '.cfg' create_config(configpath) configpath = find_config(config_name) try: config_module = Config(configpath) except ConfigurationError as e: stderr(e) sys.exit(2) if config_module.core.not_configured: stderr( u'The bot is not configured. -- El bot no está configurado. -- Le bot n\'est pas configuré.' ) # exit with code 2 to prevent auto restart on fail by systemd sys.exit(2) if not config_module.has_option('core', 'homedir'): config_module.dotdir = homedir config_module.homedir = homedir else: homedir = config_module.core.homedir config_module.dotdir = config_module.core.homedir if not config_module.core.logdir: config_module.core.logdir = os.path.join(homedir, 'logs') logfile = os.path.os.path.join(config_module.logdir, 'stdio.log') if not os.path.isdir(config_module.logdir): os.mkdir(config_module.logdir) if opts.exit_on_error: config_module.exit_on_error = True else: config_module.exit_on_error = False if opts.quiet is None: opts.quiet = False sys.stderr = tools.OutputRedirect(logfile, True, opts.quiet) sys.stdout = tools.OutputRedirect(logfile, False, opts.quiet) #Handle --quit, --kill and saving the PID to file pid_dir = config_module.core.pid_dir or homedir if opts.config is None: pid_file_path = os.path.join(pid_dir, 'sopel.pid') else: basename = os.path.basename(opts.config) if basename.endswith('.cfg'): basename = basename[:-4] pid_file_path = os.path.join(pid_dir, 'sopel-%s.pid' % basename) if os.path.isfile(pid_file_path): pid_file = open(pid_file_path, 'r') old_pid = int(pid_file.read()) pid_file.close() if tools.check_pid(old_pid): if opts.quit is None and opts.kill is None: stderr( u'There is already a JoikervgBot running. -- Ya hay un bot ejecutándose. -- Il y a déjà un bot en fonctionnement.' ) stderr(u'Try -- Intenta: --quit o --kill') sys.exit(1) elif opts.kill: stderr( u'Killing JoikervgBot. -- Matando a JoikervgBot. -- Tuent JoikervgBot.' ) os.kill(old_pid, signal.SIGKILL) sys.exit(0) elif opts.quit: stderr( u'Quitting JoikervgBot. -- Desconectando a JoikervgBot. -- Déconnectant JoikervgBot.' ) if hasattr(signal, 'SIGUSR1'): os.kill(old_pid, signal.SIGUSR1) else: os.kill(old_pid, signal.SIGTERM) sys.exit(0) elif not tools.check_pid(old_pid) and (opts.kill or opts.quit): stderr( u'The bot is not running. -- El bot no se está ejecutando. -- Le bot n\'est pas en fonctionnement.' ) sys.exit(1) elif opts.quit is not None or opts.kill is not None: stderr( u'The bot is not running. -- El bot no se está ejecutando. -- Le bot n\'est pas en fonctionnement.' ) sys.exit(1) if opts.deamonize is not None: child_pid = os.fork() if child_pid is not 0: sys.exit() pid_file = open(pid_file_path, 'w') pid_file.write(str(os.getpid())) pid_file.close() config_module.pid_file_path = pid_file_path # Step Five: Initialise And Run sopel run(config_module) except KeyboardInterrupt: print "\n\nKeyboard Interrupt" os._exit(1)