Files
mycelium/manage.py
RemiZOffAlex 42d0a1f031
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s
Update
2024-05-17 20:41:12 +03:00

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)