#!/usr/bin/env python3 __author__ = 'RemiZOffAlex' __email__ = 'remizoffalex@mail.ru' import sys import json import asyncio import argparse import traceback from pathlib import Path from logging.config import dictConfig from typing import Any def to_json(request_data: bytes) -> Any: try: return json.loads(request_data) except ValueError as e: # raise ParseError(data={'message': 'Invalid JSON: {0!r}'.format(request_data)}) raise ValueError('message') def cli_api(args): from mycelium.api import jsonrpc if args.json_rpc: json_data = to_json(args.json_rpc) result = json.dumps(jsonrpc(json_data)) print(result) if args.methods: print(jsonrpc.methods.keys()) if args.example: result = jsonrpc.example(args.example) print(json.dumps(result)) def cli_app(args): module_name = 'config.{}'.format(args.config) module = __import__(module_name) config = getattr(module, args.config) print(config) print(config.__dir__()) print(config.LOG_CONFIG) # Логирование dictConfig(config.LOG_CONFIG) from mycelium.factory import create_app asyncio.run( create_app( port=args.port ) ) # application.run( # debug=args.debug, # host='0.0.0.0', # port=args.port # ) # application.config.from_object('config.{}'.format(args.config)) def cli_init(args): config = Path(args.dir_config) if config.exists() and config.is_dir(): print('Директория для конфигураций существует') exit(1) config.mkdir(parents=True) filename = config / '__init__.py' filename.touch() import datetime from jinja2 import Template from mycelium.lib.passwd import pwgen template = """# Config generated {{NOW}} import os import sys DEBUG = False SQLDEBUG = False SESSION_COOKIE_NAME = 'mycelium' SESSION_TYPE = 'filesystem' TITLE = 'mycelium' DIR_BASE = '/'.join(os.path.dirname(os.path.abspath(__file__)).split('/')[:-1]) DIR_DATA = DIR_BASE + '/data' DIR_FILES = DIR_DATA + '/files' DIR_SEARCH_INDEX = DIR_DATA + '/index' SQLALCHEMY_DATABASE_URI = 'sqlite:///' + DIR_DATA + '/db.sqlite3' # pwgen -s 64 SECRET_KEY = '''{{SECRET_KEY}}''' # Логирование LOG_CONFIG = { 'version': 1, 'formatters': { 'default': { 'format': '[%(asctime)s] %(levelname)s [%(name)s.%(module)s.%(funcName)s@%(lineno)d, %(threadName)s]: %(message)s', } }, 'handlers': { 'file': { 'class': 'logging.handlers.RotatingFileHandler', 'maxBytes': 16*1024*1024, # Размер файла лога в МБ 'backupCount': 10, 'filename': DIR_DATA + '/mycelium.log', 'formatter': 'default' } }, 'root': { 'level': 'INFO', 'handlers': ['file'] } } # Количество выводимых элементов на странице ITEMS_ON_PAGE = 50 # Право доступа по умолчанию # Возможные значения: # allow - разрешено всё по умолчанию # deny - запрещено всё по умолчанию DEFAULT_PERMISSION = 'allow' STATIC = 'https://static.specialistoff.net' """ t = Template(template) body = t.render( NOW=datetime.datetime.now(datetime.UTC), SECRET_KEY=pwgen(64) ) filename = config / 'default.py' with open(filename, 'w') as fd: fd.write(body) data = Path(args.dir_data) if data.exists() and data.is_dir(): print('Директория для данных существует') exit(1) data.mkdir(parents=True) def main(): parser = argparse.ArgumentParser( description='API', formatter_class=argparse.ArgumentDefaultsHelpFormatter ) parser._optionals.title = "Необязательные аргументы" parser.add_argument("--debug", default=True, action='store_true', help="Отладочная информация") subparsers = parser.add_subparsers( title='subcommands', description='valid subcommands', help='additional help' ) group_app = subparsers.add_parser('app') group_app.add_argument("--port", default=5000, help="Порт") group_app.add_argument("--config", default="default", help="Файл конфигурации") group_app.set_defaults(func=cli_app) group_api = subparsers.add_parser('api') group_api.add_argument("--json-rpc") group_api.add_argument("--methods", action='store_true') group_api.add_argument("--example") group_api.add_argument("--config", default="default", help="Файл конфигурации") group_api.set_defaults(func=cli_api) group_init = subparsers.add_parser('init') group_init.add_argument("--dir-config", default='/app/config', help="Конфигурация") group_init.add_argument("--dir-data", default='/app/data', help="Данные") group_init.set_defaults(func=cli_init) args = parser.parse_args() args.func(args) if __name__ == "__main__": try: main() except Exception as err: traceback.print_exc(file=sys.stdout) sys.exit(1) sys.exit(0)