mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-27 21:19:31 +01:00
b3387f2d41
This allows conf methods to access to global logger by via an optional 'logger' argument. However, the caveat is that the logging facilities are still unavailable on first start, because log can only be imported *after* the configuration is loaded.
86 lines
3.5 KiB
Python
Executable File
86 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
PyLink IRC Services launcher.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
try:
|
|
from pylinkirc import world
|
|
except ImportError:
|
|
sys.stderr.write("ERROR: Failed to import PyLink main module (pylinkirc.world).\n\nIf you are "
|
|
"running PyLink from source, please install PyLink first using 'python3 "
|
|
"setup.py install' (global install) or 'python3 setup.py install --user'"
|
|
" (local install)\n")
|
|
sys.exit(1)
|
|
from pylinkirc import conf, __version__, real_version
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description='Starts an instance of PyLink IRC Services.')
|
|
parser.add_argument('config', help='specifies the path to the config file (defaults to pylink.yml)', nargs='?', default='pylink.yml')
|
|
parser.add_argument("-v", "--version", help="displays the program version and exits", action='store_true')
|
|
parser.add_argument("-c", "--no-check-pid", help="disables PID file checking", action='store_true')
|
|
parser.add_argument("-n", "--no-pid", help="skips generating PID files", action='store_true')
|
|
args = parser.parse_args()
|
|
|
|
if args.version: # Display version and exit
|
|
print('PyLink %s (in VCS: %s)' % (__version__, real_version))
|
|
sys.exit()
|
|
|
|
# FIXME: we can't pass logging on to conf until we set up the config...
|
|
conf.loadConf(args.config)
|
|
|
|
from pylinkirc.log import log
|
|
from pylinkirc import classes, utils, coremods
|
|
log.info('PyLink %s starting...', __version__)
|
|
|
|
# Check for a pid file, unless told not to,
|
|
# this stops instance overlap, which wrecks clientbots
|
|
if not args.no_check_pid:
|
|
config = conf.confname
|
|
if os.path.exists("%s.pid" % config):
|
|
log.error("PID file exists; aborting! If PyLink didn't shut down cleanly last time it "
|
|
"was run, or you're upgrading from PyLink < 1.1-dev, delete %s.pid and try "
|
|
"again." % config)
|
|
sys.exit(1)
|
|
|
|
# Write a PID file unless specifically told not to.
|
|
if not args.no_pid:
|
|
with open('%s.pid' % conf.confname, 'w') as f:
|
|
f.write(str(os.getpid()))
|
|
|
|
# Import plugins first globally, because they can listen for events
|
|
# that happen before the connection phase.
|
|
to_load = conf.conf['plugins']
|
|
# Here, we override the module lookup and import the plugins
|
|
# dynamically depending on which were configured.
|
|
for plugin in to_load:
|
|
try:
|
|
world.plugins[plugin] = pl = utils.loadPlugin(plugin)
|
|
except (OSError, ImportError) as e:
|
|
log.exception('Failed to load plugin %r: %s: %s', plugin, type(e).__name__, str(e))
|
|
else:
|
|
if hasattr(pl, 'main'):
|
|
log.debug('Calling main() function of plugin %r', pl)
|
|
pl.main()
|
|
|
|
# Initialize all the networks one by one
|
|
for network, sdata in conf.conf['servers'].items():
|
|
|
|
try:
|
|
protoname = sdata['protocol']
|
|
except (KeyError, TypeError):
|
|
log.error("(%s) Configuration error: No protocol module specified, aborting.", network)
|
|
else:
|
|
# Fetch the correct protocol module
|
|
proto = utils.getProtocolModule(protoname)
|
|
world.networkobjects[network] = irc = classes.Irc(network, proto, conf.conf)
|
|
|
|
world.started.set()
|
|
log.info("Loaded plugins: %s", ', '.join(sorted(world.plugins.keys())))
|
|
|
|
from pylinkirc import coremods
|
|
coremods.permissions.resetPermissions()
|