Source code for blackhole.application

# -*- coding: utf-8 -*-

# (The MIT License)
#
# Copyright (c) 2013-2021 Kura
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the 'Software'), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

"""Provides functionality to run the server."""


import logging
import os
import sys

from .config import Config, config_test, parse_cmd_args, warn_options
from .control import pid_permissions, setgid, setuid
from .daemon import Daemon
from .exceptions import (
    BlackholeRuntimeException,
    ConfigException,
    DaemonException,
)
from .logs import configure_logs
from .supervisor import Supervisor
from .utils import blackhole_config_help


__all__ = ("blackhole_config", "run")
"""Tuple all the things."""


[docs]def blackhole_config(): """ Print the config help to the console with man-style formatting. :raises SystemExit: Exit code :py:obj:`os.EX_OK`. """ logging.basicConfig(format="%(message)s", level=logging.INFO) logging.info(blackhole_config_help) raise SystemExit(os.EX_OK)
[docs]def run(): """ Create the asyncio loop and start the server. :raises SystemExit: Exit code :py:obj:`os.EX_USAGE` when a configuration error occurs, :py:obj:`os.EX_NOPERM` when a permission error occurs or :py:obj:`os.EX_OK` when the program exits cleanly. """ args = parse_cmd_args(sys.argv[1:]) configure_logs(args) logger = logging.getLogger("blackhole") if args.test: config_test(args) try: config = Config(args.config_file).load().test() config.args = args warn_options(config) daemon = Daemon(config.pidfile) supervisor = Supervisor() pid_permissions() setgid() setuid() except (ConfigException, DaemonException) as err: logger.critical(err) raise SystemExit(os.EX_USAGE) except BlackholeRuntimeException as err: logger.critical(err) raise SystemExit(os.EX_NOPERM) if args.background: try: daemon.daemonize() except DaemonException as err: supervisor.close_socks() logger.critical(err) raise SystemExit(os.EX_NOPERM) try: supervisor.run() except KeyboardInterrupt: pass raise SystemExit(os.EX_OK)