Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s
196 lines
5.2 KiB
Python
Executable File
196 lines
5.2 KiB
Python
Executable File
#!/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)
|