Example #1
0
def _configure_syslog(
        logger_name: str,
        use_json_formatter: bool = True,
        formatter: 'Optional[Formatter]' = None) -> 'List[Handler]':
    try:
        syslog_handler = SysLogHandler(
            address=(options.syslog_host, options.syslog_port),
            facility=SysLogHandler.facility_names[options.syslog_facility],
            socktype=socket.SOCK_DGRAM)
        log_extension = '.slog' if use_json_formatter else '.log'
        syslog_handler.ident = f'{logger_name}{log_extension}: '
        if formatter is not None:
            syslog_handler.setFormatter(formatter)
        elif use_json_formatter:
            syslog_handler.setFormatter(_JSON_FORMATTER)
        else:
            syslog_handler.setFormatter(get_text_formatter())
            syslog_handler.addFilter(_CONTEXT_FILTER)

        return [syslog_handler]

    except socket.error:
        logging.getLogger('frontik.logging').exception(
            'cannot initialize syslog')
        return []
Example #2
0
def bootstrap_logger(logger_info, logger_level, use_json_formatter=True, formatter=None):
    if isinstance(logger_info, tuple):
        logger, logger_name = logger_info
    else:
        logger, logger_name = logging.getLogger(logger_info), logger_info

    handlers = []

    if options.log_dir:
        file_handler = logging.handlers.WatchedFileHandler(os.path.join(options.log_dir, f'{logger_name}.log'))
        if use_json_formatter:
            file_handler.setFormatter(_JSON_FORMATTER)
        elif formatter is not None:
            file_handler.setFormatter(formatter)
        else:
            file_handler.setFormatter(get_text_formatter())
            file_handler.addFilter(_CONTEXT_FILTER)

        handlers.append(file_handler)

    if options.stderr_log:
        stderr_handler = logging.StreamHandler()
        if formatter is not None:
            stderr_handler.setFormatter(formatter)
        else:
            stderr_handler.setFormatter(get_stderr_formatter())
            stderr_handler.addFilter(_CONTEXT_FILTER)

        handlers.append(stderr_handler)

    if options.syslog:
        try:
            syslog_handler = SysLogHandler(
                address=(options.syslog_host, options.syslog_port),
                facility=SysLogHandler.facility_names[options.syslog_facility],
                socktype=socket.SOCK_DGRAM
            )
            syslog_handler.ident = f'{logger_name}: '
            if use_json_formatter:
                syslog_handler.setFormatter(_JSON_FORMATTER)
            elif formatter is not None:
                syslog_handler.setFormatter(formatter)
            else:
                syslog_handler.setFormatter(get_text_formatter())
                syslog_handler.addFilter(_CONTEXT_FILTER)

            handlers.append(syslog_handler)

        except socket.error:
            logging.getLogger('frontik.logging').exception('cannot initialize syslog')

    for handler in handlers:
        handler.setLevel(logger_level)
        logger.addHandler(handler)

    logger.addHandler(GlobalLogHandler())
    logger.propagate = False

    return logger
def setup():
    """Configure logging, process command-line arguments."""
    syslog = SysLogHandler(address="/var/run/log", facility=SysLogHandler.LOG_LOCAL3)
    pid = os.getpid()
    syslog.ident = f"statusline-i3[{pid}]: "
    logging.basicConfig(
        level="INFO", format="%(levelname)s: %(message)s", handlers=(syslog,)
    )
    setproctitle(b"statusline-i3")
    opts = argparse.ArgumentParser(prog="open", description=__doc__)
    opts.add_argument("-v", "--version", action="version", version=__version__)
    opts.add_argument(
        "-m",
        "--mailbox",
        type=str,
        default=os.environ["MAIL"],
        help="Location of the mailboxes. One or more mailbox names separated by ‘:’",
    )
    return opts.parse_args(sys.argv[1:])
Example #4
0
def setup():
    """Configure logging, process command-line arguments."""
    syslog = SysLogHandler(address='/var/run/log',
                           facility=SysLogHandler.LOG_LOCAL3)
    pid = os.getpid()
    syslog.ident = f'statusline-i3[{pid}]: '
    logging.basicConfig(level='INFO',
                        format='%(levelname)s: %(message)s',
                        handlers=(syslog, ))
    setproctitle(b'statusline-i3')
    opts = argparse.ArgumentParser(prog='open', description=__doc__)
    opts.add_argument('-v', '--version', action='version', version=__version__)
    opts.add_argument(
        '-m',
        '--mailbox',
        type=str,
        default=os.environ['MAIL'],
        help=
        "Location of the mailboxes. One or more mailbox names separated by ‘:’"
    )
    return opts.parse_args(sys.argv[1:])
Example #5
0
def start_torrents():
    """Uploads torrent files to the server."""
    signal.signal(signal.SIGINT, ctrl_c_handler)

    cache_dir = realpath(expanduser('~/.cache/xirvik'))

    if not isdir(cache_dir):
        makedirs(cache_dir)

    log = logging.getLogger('xirvik-start-torrents')
    parser = argparse.ArgumentParser()

    parser.add_argument('-d', '--debug', action='store_true')
    parser.add_argument('-v', '--verbose', action='store_true')
    parser.add_argument('-c', '--netrc-path', default=expanduser('~/.netrc'))
    # parser.add_argument('-C', '--client', default='rutorrent3')
    parser.add_argument('-H', '--host', nargs=1, required=True)
    parser.add_argument('-p', '--port', nargs=1, default=[443])
    parser.add_argument('--start-stopped', action='store_true')
    parser.add_argument('-s', '--syslog', action='store_true')
    parser.add_argument('directory',
                        metavar='DIRECTORY',
                        action=ReadableDirectoryListAction,
                        nargs='*')

    args = parser.parse_args()
    verbose = args.debug or args.verbose
    log.setLevel(logging.INFO)

    if verbose:
        channel = logging.StreamHandler(sys.stdout if args.verbose
                                        else sys.stderr)

        channel.setFormatter(logging.Formatter('%(asctime)s - %(message)s'))
        channel.setLevel(logging.INFO if args.verbose else logging.DEBUG)
        log.addHandler(channel)

        if args.debug:
            log.setLevel(logging.DEBUG)

    if args.syslog:
        try:
            syslogh = SysLogHandler(address='/dev/log')
        except (OSError, socket.error):
            syslogh = SysLogHandler(address='/var/run/syslog',
                                    facility='local1')
            syslogh.ident = 'xirvik-start-torrents'
            logging.INFO = logging.WARNING

        syslogh.setFormatter(
            logging.Formatter('%(name)s[%(process)d]: %(message)s'))
        syslogh.setLevel(logging.DEBUG if args.debug else logging.INFO)
        log.addHandler(syslogh)

    try:
        user, _, password = netrc(args.netrc_path).authenticators(args.host[0])
    except TypeError:
        print('Cannot find host {} in netrc. Specify user name and '
              'password'.format(args.host[0]), file=sys.stderr)
        sys.exit(1)

    post_url = ('https://{host:s}:{port:d}/rtorrent/php/'
                'addtorrent.php?'.format(host=args.host[0], port=args.port[0]))
    form_data = {}
    exceptions_caught = []

    # rtorrent2/3 params
    # dir_edit - ?
    # tadd_label - Label for the torrents, more param: label=
    # torrent_file - Torrent file blob data

    if args.start_stopped:
        form_data['torrents_start_stopped'] = 'on'

    for d in args.directory:
        for item in listdir(d):
            if not item.lower().endswith('.torrent'):
                continue

            item = path_join(d, item)

            # Workaround for surrogates not allowed error, rename the file
            prefix = '{n:s}-'.format(n=splitext(basename(item))[0])
            fd, name = mkstemp(dir=cache_dir, prefix=prefix, suffix='.torrent')
            close_fd(fd)
            with open(name, 'wb') as w:
                with open(item, 'rb') as r:
                    w.write(r.read())
            old = item
            item = name

            with open(item, 'rb') as f:
                # Because the server does not understand filename*=UTF8 syntax
                # https://github.com/kennethreitz/requests/issues/2117
                # This is not a huge concern, as the API's "Get .torrent" does
                # not return the file with its original name either
                try:
                    filename = unidecode(f.name.decode('utf8'))
                except AttributeError:  # decode
                    filename = unidecode(f.name)

                files = dict(torrent_file=(filename, f,))
                try:
                    log.info('Uploading torrent {} (actual name: "{}")'.format(
                        basename(item), basename(filename)))
                except OSError:
                    pass
                r = requests.post(post_url, data=form_data, files=files)

                try:
                    r.raise_for_status()
                except Exception as e:
                    log.error('Caught exception: {}'.format(e))

                # Delete original only after successful upload
                log.debug('Deleting {}'.format(old))
                rm(old)

    if exceptions_caught:
        log.error('Exceptions caught, exiting with failure status')
        cleanup_and_exit(1)
Example #6
0
    args = parser.parse_args()

    if not args.verbose:
        args.verbose = 0

    # 日志初始化
    log_format = u'%(asctime)s %(levelname)s %(message)s'

    if args.quiet:
        logging.basicConfig(level=logging.WARNING, format=log_format)
    elif args.verbose >= VERBOSE_HTTP:
        logging.basicConfig(level=logging.DEBUG, format=log_format)
    else:
        logging.basicConfig(level=logging.INFO, format=log_format)

    if hasattr(args, 'log_file') and args.log_file:
        if args.log_file == 'SYSLOG':
            syslog = SysLogHandler(address='/dev/log')
            syslog.ident = '{}: '.format(PROG_NAME)
            syslog.setLevel(logging.INFO)
            syslog.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
            syslog.addFilter(SyslogFilter())

            logger.addHandler(syslog)
        else:
            logfile = RotatingFileHandler(args.log_file, LOG_FILE_SIZE, LOG_FILE_BACKUP_COUNT, encoding='utf-8')
            logger.addHandler(logfile)

    main(**vars(args))
Example #7
0
def get_logger(conf, name=None, verbose=False, fmt=None):
    if not conf:
        conf = {}

    if name is None:
        name = 'log'

    if fmt is None:
        fmt = conf.get(
            'log_format',
            "%(process)d %(thread)X %(name)s %(levelname)s %(message)s")
        fmt = fmt.encode("utf-8").decode("unicode-escape")

    logger = logging.getLogger(name)
    logger.propagate = False

    formatter = logging.Formatter(fmt='%(asctime)s.%(msecs)03d ' + fmt,
                                  datefmt='%Y-%m-%d %H:%M:%S')

    syslog_formatter = logging.Formatter(fmt=fmt)

    if not hasattr(get_logger, 'handler4logger'):
        get_logger.handler4logger = {}
    if logger in get_logger.handler4logger:
        logger.removeHandler(get_logger.handler4logger[logger])

    facility = getattr(SysLogHandler, conf.get('log_facility', 'LOG_LOCAL0'),
                       SysLogHandler.LOG_LOCAL0)

    udp_host = conf.get('log_udp_host')
    if udp_host:
        udp_port = int(
            conf.get('log_udp_port', logging.handlers.SYSLOG_UDP_PORT))
        handler = SysLogHandler(address=(udp_host, udp_port),
                                facility=facility)
    else:
        log_address = conf.get('log_address', '/dev/log')
        if os.path.exists(log_address):
            try:
                handler = SysLogHandler(address=log_address, facility=facility)
            except socket.error as exc:
                if exc.errno not in [errno.ENOTSOCK, errno.ENOENT]:
                    raise exc
                handler = SysLogHandler(facility=facility)
        else:
            handler = SysLogHandler(facility=facility)

    syslog_prefix = conf.get('syslog_prefix', '')
    if syslog_prefix:
        handler.ident = "%s: " % syslog_prefix

    handler.setFormatter(syslog_formatter)
    logger.addHandler(handler)
    get_logger.handler4logger[logger] = handler

    logging_level = getattr(logging,
                            conf.get('log_level', 'INFO').upper(),
                            logging.INFO)
    if (verbose or conf.get('is_cli')
            or hasattr(get_logger, 'console_handler4logger')
            or logging_level < logging.INFO):
        if not hasattr(get_logger, 'console_handler4logger'):
            get_logger.console_handler4logger = {}
        if logger in get_logger.console_handler4logger:
            logger.removeHandler(get_logger.console_handler4logger[logger])

        console_handler = logging.StreamHandler(sys.__stderr__)
        console_handler.setFormatter(formatter)
        logger.addHandler(console_handler)
        get_logger.console_handler4logger[logger] = console_handler

    logger.setLevel(logging_level)

    return logger