Esempio n. 1
0
def main():
    args = parser.parse_args()

    clear_environ(lambda i: i.startswith(ENV_VAR_PREFIX))

    # Чтобы логи не блокировали основной поток (и event loop) во время операций
    # записи в stderr или файл - логи можно буфферизовать и обрабатывать в
    # отдельном потоке (aiomisc.basic_config настроит буфферизацию
    # автоматически).
    basic_config(args.log_level, args.log_format, buffered=True)

    # Аллоцируем сокет из под привиллегированного пользователя отдельным шагом,
    # чтобы была возможность перед запуском приложения сменить пользователя ОС.
    sock = bind_socket(
        address=args.api_address,
        port=args.api_port,
        proto_name='http',
    )

    # После того как приложение аллоцировало сокет и ему больше не нужны
    # привиллегии - хорошим решением будет сменить пользователя (например,
    # на nobody, у которого нет никаких специальных привиллегий) - это также
    # усложнит жизнь злоумышленникам.
    if args.user is not None:
        logging.info('Changing user to %r', args.user.pw_name)
        os.setgid(args.user.pw_gid)
        os.setuid(args.user.pw_uid)

    # В списке процессов намного удобнее видеть название текущего приложения
    setproctitle(os.path.basename(argv[0]))

    app = create_app(args)
    run_app(app, sock=sock)
Esempio n. 2
0
async def api_client(aiohttp_client, arguments):
    app = create_app(arguments)
    client = await aiohttp_client(app,
                                  server_kwargs={'port': arguments.api_port})

    try:
        yield client
    finally:
        await client.close()
Esempio n. 3
0
async def api_client(aiohttp_client: Callable,
                     arguments: Namespace) -> AsyncGenerator[TestClient, None]:
    """Создает и запускает приложение и возвращает клиента для выполнения запросов."""
    app = create_app(arguments)
    client = await aiohttp_client(app,
                                  server_kwargs={"port": arguments.api_port})

    try:
        yield client
    finally:
        await client.close()
Esempio n. 4
0
async def api_client(aiohttp_client, arguments, migrated_postgres):
    """
    Добавляем измененные обработчики в сервис. aiohttp требуется создать заново
    (т.к. изменять набор обработчиков после запуска не разрешено).
    """
    app = create_app(arguments)
    app.router.add_route('*', PatchedCitizenView.URL_PATH, PatchedCitizenView)
    app.router.add_route('*', PatchedCitizenViewWithoutLock.URL_PATH,
                         PatchedCitizenViewWithoutLock)
    client = await aiohttp_client(app,
                                  server_kwargs={'port': arguments.api_port})

    try:
        yield client
    finally:
        await client.close()
Esempio n. 5
0
def main():
    args = parser.parse_args()

    # После получения конфигурации приложения переменные окружения приложения
    # больше не нужны и даже могут представлять опасность - например, они могут
    # случайно "утечь" с отображением информации об ошибке. Злоумышленники
    # в первую очередь будут пытаться получить информацию об окружении, очистка
    # переменных окружения считается хорошим тоном.

    # Python позволяет управлять поведением stdlib модулей с помощью
    # многочисленных переменных окружения, разумно очищать переменные окружения
    # по префиксу приложения, указанного в ConfigArgParser.
    clear_environ(lambda i: i.startswith(ENV_VAR_PREFIX))

    # Чтобы логи не блокировали основной поток (и event loop) во время операций
    # записи в stderr или файл - логи можно буфферизовать и обрабатывать в
    # отдельном потоке (aiomisc.basic_config настроит буфферизацию
    # автоматически).
    basic_config(args.log_level, args.log_format, buffered=True)

    # Аллоцируем сокет из под привиллегированного пользователя отдельным шагом,
    # чтобы была возможность перед запуском приложения сменить пользователя ОС.
    sock = bind_socket(address=args.api_address,
                       port=args.api_port,
                       proto_name='http')

    # После того как приложение аллоцировало сокет и ему больше не нужны
    # привиллегии - хорошим решением будет сменить пользователя (например,
    # на nobody, у которого нет никаких специальных привиллегий) - это также
    # усложнит жизнь злоумышленникам.
    if args.user is not None:
        logging.info('Changing user to %r', args.user.pw_name)
        os.setgid(args.user.pw_gid)
        os.setuid(args.user.pw_uid)

    # В списке процессов намного удобнее видеть название текущего приложения
    setproctitle(os.path.basename(argv[0]))

    app = create_app(args)
    run_app(app, sock=sock)
Esempio n. 6
0
def main():
    args = parser.parse_args()

    # После получения конфигурации приложения переменные окружения приложения
    # больше не нужны и даже могут представлять опасность - например, они могут
    # случайно "утечь" с отображением информации об ошибке. Злоумышленники
    # в первую очередь будут пытаться получить информацию об окружении, очистка
    # переменных окружения считается хорошим тоном.

    # Python позволяет управлять поведением stdlib модулей с помощью
    # многочисленных переменных окружения, разумно очищать переменные окружения
    # по префиксу приложения, указанного в ConfigArgParser.
    clean_environ(rule=lambda var: var.startswith(ENV_VAR_PREFIX))

    # Чтобы логи не блокировали основной поток (и event loop) во время операций
    # записи в stderr или файл - логи можно буфферизовать и обрабатывать в
    # отдельном потоке (aiomisc.basic_config настроит буфферизацию
    # автоматически).
    basic_config(level=args.log_level,
                 log_format=args.log_format,
                 buffered=True)

    app = create_app(args=args)
    web.run_app(app=app, host=args.api_address, port=args.api_port)