Просмотр исходного кода

Merge pull request #2522 from openNAMU/dev

하이퍼콘으로 변경
잉여개발기 1 год назад
Родитель
Сommit
d8288d41aa
8 измененных файлов с 91 добавлено и 59 удалено
  1. 12 7
      app.py
  2. 1 1
      lang/en-US.json
  3. 2 1
      lang/ko-KR.json
  4. 1 1
      requirements.txt
  5. 18 18
      route/main_sys_restart.py
  6. 5 3
      route/main_sys_update.py
  7. 51 27
      route/tool/func.py
  8. 1 1
      version.json

+ 12 - 7
app.py

@@ -7,6 +7,11 @@ import logging
 from route.tool.func import *
 from route import *
 
+from hypercorn.asyncio import serve
+from hypercorn.config import Config
+
+from werkzeug.middleware.proxy_fix import ProxyFix
+
 args = sys.argv
 run_mode = ''
 if len(args) > 1:
@@ -181,7 +186,7 @@ with get_db_connect(init_mode = True) as conn:
         app.config['DEBUG'] = True
         app.config['ENV'] = 'development'
 
-    log = logging.getLogger('waitress')
+    log = logging.getLogger('hypercorn')
     log.setLevel(logging.ERROR)
 
     app.jinja_env.filters['md5_replace'] = md5_replace
@@ -961,10 +966,10 @@ signal.signal(signal.SIGINT, signal_handler)
 
 atexit.register(terminate_golang)
 
+app.wsgi_app = ProxyFix(app.wsgi_app, x_for = 1, x_proto = 1)
+
 if __name__ == "__main__":
-    waitress.serve(
-        app,
-        host = server_set['host'],
-        port = int(server_set['port']),
-        clear_untrusted_proxy_headers = True
-    )
+    config = Config()
+    config.bind = [server_set['host'] + ":" + server_set['port']]
+
+    asyncio.run(serve(app, config))

+ 1 - 1
lang/en-US.json

@@ -61,7 +61,7 @@
     "move_bottom_text" : "Move textarea bottom notice",
     "delete_bottom_text" : "Delete textarea bottom notice",
     "revert_bottom_text" : "Revert textarea bottom notice",
-
+    "warning_restart" : "Restarting... Press Refresh (F5)",
 
     "_comment_": "Common",
     "data": "Data",

+ 2 - 1
lang/ko-KR.json

@@ -708,5 +708,6 @@
     "edit_only_bottom_text" : "편집 전용 하단 문구",
     "move_bottom_text" : "이동 하단 문구",
     "delete_bottom_text" : "삭제 하단 문구",
-    "revert_bottom_text" : "되돌리기 하단 문구"
+    "revert_bottom_text" : "되돌리기 하단 문구",
+    "warning_restart" : "재시작 중... 새로고침(F5)를 눌러주세요"
 }

+ 1 - 1
requirements.txt

@@ -2,7 +2,7 @@ pip
 
 flask
 flask[async]
-waitress
+hypercorn
 
 aiohttp
 asyncio

+ 18 - 18
route/main_sys_restart.py

@@ -1,29 +1,29 @@
 from .tool.func import *
 
-async def main_sys_restart_do():
+def main_sys_restart_do():
     print('Restart')
 
+    time.sleep(3)
+
     python_ver = ''
     python_ver = str(sys.version_info.major) + '.' + str(sys.version_info.minor)
 
-    run_list = [sys.executable, 'python' + python_ver, 'python3', 'python', 'py -' + python_ver]
-    for exe_name in run_list:
-        try:
-            os.execl(exe_name, sys.executable, *sys.argv)
-        except:
-            pass
-
-        try:
-            os.execl(exe_name, '"' + sys.executable + '"', *sys.argv)
-        except:
-            pass
+    run_list = [
+        sys.executable,
+        'python' + python_ver,
+        'python3',
+        'python',
+        'py -' + python_ver
+    ]
 
+    for exe_name in run_list:
         try:
-            os.execl(exe_name, os.path.abspath(__file__), *sys.argv)
+            subprocess.Popen([exe_name] + sys.argv)
+            break
         except:
-            pass
-    else:
-        return 0
+            continue
+    
+    os._exit(0)
 
 async def main_sys_restart(golang_process):
     with get_db_connect() as conn:
@@ -40,8 +40,8 @@ async def main_sys_restart(golang_process):
                 except subprocess.TimeoutExpired:
                     golang_process.kill()
 
-            if await main_sys_restart_do() == 0:
-                return await re_error(conn, 33)
+            threading.Thread(target = main_sys_restart_do).start()
+            return flask.Response(get_lang(conn, "warning_restart"), status = 200)
         else:
             return easy_minify(conn, flask.render_template(skin_check(conn),
                 imp = [get_lang(conn, 'wiki_restart'), wiki_set(conn), await wiki_custom(conn), wiki_css([0, 0])],

+ 5 - 3
route/main_sys_update.py

@@ -40,7 +40,8 @@ async def main_sys_update(golang_process):
                 else:
                     linux_exe_chmod()
 
-                    await main_sys_restart_do()
+                    threading.Thread(target = main_sys_restart_do).start()
+                    return flask.Response(get_lang(conn, "warning_restart"), status = 200)
                 
                 print('Error : update failed')
             elif platform.system() == 'Windows':
@@ -54,8 +55,9 @@ async def main_sys_update(golang_process):
                 if ok == 0:
                     os.system('rd /s /q opennamu-' + up_data)
                     os.system('del update.zip')
-
-                    await main_sys_restart_do()
+                    
+                    threading.Thread(target = main_sys_restart_do).start()
+                    return flask.Response(get_lang(conn, "warning_restart"), status = 200)
             
             print('Error : update failed')
 

+ 51 - 27
route/tool/func.py

@@ -30,6 +30,43 @@ if os.path.exists(os.path.join('data', 'version.json')):
     if data_load_ver == version_list['r_ver']:
         data_up_date = 0
 
+if data_up_date == 1:
+    with open(os.path.join('data', 'version.json'), 'w', encoding = 'utf8') as f:
+        f.write(version_list['r_ver'])
+    
+    if platform.system() in ('Linux', 'Darwin', 'Windows'):
+        python_ver = ''
+        python_ver = str(sys.version_info.major) + '.' + str(sys.version_info.minor)
+
+        run_list = [
+            sys.executable,
+            'python' + python_ver,
+            'python3',
+            'python',
+            'py -' + python_ver
+        ]
+        
+        for exe_name in run_list:
+            try:
+                subprocess.check_call([exe_name, "-m", "pip", "install", "--upgrade", "--user", "-r", "requirements-optional.txt"])
+            except:
+                pass
+
+            try:
+                subprocess.check_call([exe_name, "-m", "pip", "install", "--upgrade", "--user", "-r", "requirements.txt"])
+                subprocess.Popen([exe_name] + sys.argv)
+                os._exit(0)
+            except:
+                pass
+        else:
+            print('Error : automatic installation is not supported.')
+            print('Help : try "python3 -m pip install -r requirements.txt"')
+    else:
+        print('Error : automatic installation is not supported.')
+        print('Help : try "python3 -m pip install -r requirements.txt"')
+else:
+    print('PIP check pass')
+
 # Init-Load
 from .func_tool import *
 from .func_render import class_do_render
@@ -42,7 +79,6 @@ import werkzeug.debug
 import flask
 import asyncio
 import aiohttp
-import waitress
 
 import requests
 from PIL import Image
@@ -1789,36 +1825,24 @@ async def captcha_post(conn, re_data):
         curs.execute(db_change('select data from other where name = "recaptcha_ver"'))
         rec_ver = curs.fetchall()
         if await captcha_get(conn) != '':
+            url = ''
             if not rec_ver or rec_ver[0][0] in ('', 'v3'):
-                data = requests.post(
-                    'https://www.google.com/recaptcha/api/siteverify',
-                    data = {
-                        "secret" : sec_re[0][0],
-                        "response" : re_data
-                    }
-                )
+                url = 'https://www.google.com/recaptcha/api/siteverify'
             elif rec_ver[0][0] == 'cf':
-                data = requests.post(
-                    'https://challenges.cloudflare.com/turnstile/v0/siteverify',
-                    data = {
-                        "secret" : sec_re[0][0],
-                        "response" : re_data
-                    }
-                )
+                url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'
             else:
                 # rec_ver[0][0] == 'h'
-                data = requests.post(
-                    'https://hcaptcha.com/siteverify',
-                    data = {
-                        "secret" : sec_re[0][0],
-                        "response" : re_data
-                    }
-                )
-                
-            if data.status_code == 200:
-                json_data = orjson.loads(data.text)
-                if json_data['success'] != True:
-                    return 1
+                url = 'https://hcaptcha.com/siteverify'
+
+            async with aiohttp.ClientSession() as session:
+                async with session.post(url, data = {
+                    "secret": sec_re[0][0],
+                    "response": re_data
+                }) as res:
+                    if res.status == 200:
+                        json_data = await res.json()
+                        if json_data['success'] != True:
+                            return 1
 
     if 'recapcha_pass' in flask.session:
         if flask.session['recapcha_pass'] > 0:

+ 1 - 1
version.json

@@ -1,5 +1,5 @@
 {
-    "r_ver" : "v3.6.0-v10",
+    "r_ver" : "v3.6.0-v13",
     "c_ver" : "20250323",
     "s_ver" : "20240426",
     "bin_link" : "https://github.com/openNAMU/GopenNAMU/releases/download/v2025-03-21-v2/"