This commit is contained in:
195
manage.py
Executable file
195
manage.py
Executable file
@@ -0,0 +1,195 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user