Files
youtube-dl/lib/system/___logic.py
soju6jan 29930fdef7 test
2022-10-02 20:18:05 +09:00

276 lines
10 KiB
Python

# -*- coding: utf-8 -*-
#########################################################
# python
import os
import traceback
import logging
from datetime import datetime
import string
import random
import json
# third-party
import requests
from flask import Blueprint, request, Response, send_file, render_template, redirect, jsonify
from flask_login import login_user, logout_user, current_user, login_required
from framework import F, frame, app, db, scheduler, VERSION, path_app_root, logger, Job, User
from framework.util import Util
# 패키지
from .model import ModelSetting
import system
#########################################################
class SystemLogic(object):
point = 0
db_default = {
'db_version' : '1',
'port' : '9999',
'ddns' : 'http://localhost:9999',
#'url_filebrowser' : 'http://localhost:9998',
#'url_celery_monitoring' : 'http://localhost:9997',
'id' : 'admin',
'pw' : '//nCv0/YkVI3U2AAgYwOuJ2hPlQ7cDYIbuaCt4YJupY=',
'system_start_time' : '',
'repeat' : '',
'auto_restart_hour' : '12',
#'unique' : '',
'theme' : 'Cerulean',
'log_level' : '10',
'use_login' : 'False',
'link_json' : '[{"type":"link","title":"위키","url":"https://sjva.me/wiki/public/start"}]',
'plugin_dev_path': '',
'plugin_tving_level2' : 'False',
'web_title' : 'Home',
'my_ip' : '',
'wavve_guid' : '',
#인증
'auth_use_apikey' : 'False',
'auth_apikey' : '',
#'hide_menu' : 'True',
#Selenium
'selenium_remote_url' : '',
'selenium_remote_default_option' : '--no-sandbox\n--disable-gpu',
'selenium_binary_default_option' : '',
# notify
'notify_telegram_use' : 'False',
'notify_telegram_token' : '',
'notify_telegram_chat_id' : '',
'notify_telegram_disable_notification' : 'False',
'notify_discord_use' : 'False',
'notify_discord_webhook' : '',
'notify_advaned_use' : 'False',
'notify_advaned_policy' : u"# 각 플러그인 설정 설명에 명시되어 있는 ID = 형식\n# DEFAULT 부터 주석(#) 제거 후 작성\n\n# DEFAULT = ",
# telegram
'telegram_bot_token' : '',
'telegram_bot_auto_start' : 'False',
'telegram_resend' : 'False',
'telegram_resend_chat_id' : '',
# 홈페이지 연동 2020-06-07
'sjva_me_user_id' : '',
'auth_status' : '',
'sjva_id' : '',
# memo
'memo' : '',
# tool - decrypt
'tool_crypt_use_user_key' : 'False',
'tool_crypt_user_key' : '',
'tool_crypt_encrypt_word' : '',
'tool_crypt_decrypt_word' : '',
'use_beta' : 'False',
}
@staticmethod
def get_info():
info = {}
import platform
info['platform'] = platform.platform()
info['processor'] = platform.processor()
import sys
info['python_version'] = sys.version
info['version'] = VERSION
info['recent_version'] = SystemLogic.recent_version
info['path_app_root'] = path_app_root
info['running_type'] = u'%s. 비동기 작업 : %s' % (frame.config['running_type'], u"사용" if frame.config['use_celery'] else "미사용")
import system
info['auth'] = frame.config['member']['auth_desc']
info['cpu_percent'] = 'not supported'
info['memory'] = 'not supported'
info['disk'] = 'not supported'
if frame.config['running_type'] != 'termux':
try:
import psutil
from framework.util import Util
info['cpu_percent'] = '%s %%' % psutil.cpu_percent()
tmp = psutil.virtual_memory()
#info['memory'] = [Util.sizeof_fmt(tmp[0], suffix='B'), Util.sizeof_fmt(tmp[3]), Util.sizeof_fmt(tmp[1]), tmp[2]]
info['memory'] = u'전체 : %s 사용량 : %s 남은량 : %s (%s%%)' % (Util.sizeof_fmt(tmp[0], suffix='B'), Util.sizeof_fmt(tmp[3], suffix='B'), Util.sizeof_fmt(tmp[1], suffix='B'), tmp[2])
except:
pass
try:
import platform
if platform.system() == 'Windows':
s = os.path.splitdrive(path_app_root)
root = s[0]
else:
root = '/'
tmp = psutil.disk_usage(root)
info['disk'] = u'전체 : %s 사용량 : %s 남은량 : %s (%s%%) - 드라이브 (%s)' % (Util.sizeof_fmt(tmp[0], suffix='B'), Util.sizeof_fmt(tmp[1], suffix='B'), Util.sizeof_fmt(tmp[2], suffix='B'), tmp[3], root)
except Exception as exception:
pass
try:
tmp = SystemLogic.get_setting_value('system_start_time')
#logger.debug('SYSTEM_START_TIME:%s', tmp)
tmp_datetime = datetime.strptime(tmp, '%Y-%m-%d %H:%M:%S')
timedelta = datetime.now() - tmp_datetime
info['time'] = u'시작 : %s 경과 : %s 재시작 : %s' % (tmp, str(timedelta).split('.')[0], frame.config['arg_repeat'])
except Exception as exception:
info['time'] = str(exception)
return info
@staticmethod
def setting_save_system(req):
try:
for key, value in req.form.items():
logger.debug('Key:%s Value:%s', key, value)
entity = db.session.query(ModelSetting).filter_by(key=key).with_for_update().first()
entity.value = value
#if key == 'theme':
# SystemLogic.change_theme(value)
db.session.commit()
lists = ModelSetting.query.all()
SystemLogic.setting_list = Util.db_list_to_dict(lists)
frame.users[db.session.query(ModelSetting).filter_by(key='id').first().value] = User(db.session.query(ModelSetting).filter_by(key='id').first().value, passwd_hash=db.session.query(ModelSetting).filter_by(key='pw').first().value)
SystemLogic.set_restart_scheduler()
frame.set_level(int(db.session.query(ModelSetting).filter_by(key='log_level').first().value))
return True
except Exception as exception:
logger.error('Exception:%s', exception)
logger.error(traceback.format_exc())
return False
@staticmethod
def setting_save_after():
try:
frame.users[ModelSetting.get('id')] = User(ModelSetting.get('id'), passwd_hash=ModelSetting.get('pw'))
SystemLogic.set_restart_scheduler()
frame.set_level(int(db.session.query(ModelSetting).filter_by(key='log_level').first().value))
from .logic_site import SystemLogicSite
SystemLogicSite.get_daum_cookies(force=True)
SystemLogicSite.create_tving_instance()
return True
except Exception as exception:
logger.error('Exception:%s', exception)
logger.error(traceback.format_exc())
return False
@staticmethod
def change_theme(theme):
try:
source = os.path.join(path_app_root, 'static', 'css', 'theme', '%s_bootstrap.min.css' % theme)
target = os.path.join(path_app_root, 'static', 'css', 'bootstrap.min.css')
os.remove(target)
except Exception as exception:
logger.error('Exception:%s', exception)
logger.error(traceback.format_exc())
return False
@staticmethod
def get_setting_value(key):
try:
#logger.debug('get_setting_value:%s', key)
entity = db.session.query(ModelSetting).filter_by(key=key).first()
if entity is None:
return None
else:
return entity.value
except Exception as exception:
logger.error('Exception:%s', exception)
logger.error(traceback.format_exc())
logger.error('error key : %s', key)
return False
@staticmethod
def command_run(command_text):
try:
ret = {}
tmp = command_text.strip().split(' ')
if not tmp:
ret['ret'] = 'success'
ret['log'] = 'Empty..'
return ret
if tmp[0] == 'set':
if len(tmp) == 3:
if tmp[1] == 'token':
tmp[1] = 'unique'
entity = db.session.query(ModelSetting).filter_by(key=tmp[1]).with_for_update().first()
if entity is None:
ret['ret'] = 'fail'
ret['log'] = '%s not exist' % tmp[1]
return ret
entity.value = tmp[2] if tmp[2] != 'EMPTY' else ""
db.session.commit()
ret['ret'] = 'success'
ret['log'] = '%s - %s' % (tmp[1], tmp[2])
return ret
if tmp[0] == 'set2':
if tmp[1] == 'klive':
from klive import ModelSetting as KLiveModelSetting
if KLiveModelSetting.get(tmp[2]) is not None:
KLiveModelSetting.set(tmp[2], tmp[3])
ret['ret'] = 'success'
ret['log'] = f'KLive 설정 값 변경 : {tmp[2]} - {tmp[3]}'
return ret
ret['ret'] = 'fail'
ret['log'] = 'wrong command'
return ret
except Exception as exception:
logger.error('Exception:%s', exception)
logger.error(traceback.format_exc())
ret['ret'] = 'fail'
ret['log'] = str(exception)
return ret
@staticmethod
def link_save(link_data_str):
try:
data = json.loads(link_data_str)
entity = db.session.query(ModelSetting).filter_by(key='link_json').with_for_update().first()
entity.value = link_data_str
db.session.commit()
SystemLogic.apply_menu_link()
return True
except Exception as exception:
logger.error('Exception:%s', exception)
logger.error(traceback.format_exc())
return False