This commit is contained in:
jock
2025-07-03 14:22:38 +08:00
parent 6e2df3e7f2
commit 9ae3e2925d
12 changed files with 60 additions and 58 deletions
+1 -1
View File
@@ -19,7 +19,7 @@
## 打包命令(pyinstaller)
```shell
pyinstaller -y --clean -D -c -n wxdown-service --add-data=resources/credential.py:resources --add-data=resources/logo.txt:resources main.py
pyinstaller -y --clean -D -c -n wxdown-service --add-data=resources/credential.py:resources main.py
```
### 参数说明
+12 -9
View File
@@ -2,7 +2,7 @@ import logging
import logging.handlers
import os
from pathlib import Path
import version as __version
SRC_PATH = Path.absolute(Path(__file__)).parent
LOG_PATH = SRC_PATH / 'resources' / 'logs' / 'wxdown.log'
@@ -14,7 +14,8 @@ def setup_logger(
level: int = logging.INFO,
when: str = "midnight",
backup_count: int = 7,
console: bool = True
console: bool = True,
version: str = "",
) -> logging.Logger:
"""
设置并返回一个功能全面的logger。
@@ -25,14 +26,15 @@ def setup_logger(
:param when: 日志轮转的时间间隔('midnight'为每天轮转,'S', 'M', 'H', 'D', 'W0'-'W6'等)
:param backup_count: 保留旧日志文件的数量
:param console: 是否输出到控制台
:param version: 程序版本
:return: 配置好的logger对象
"""
logger = logging.getLogger(name)
logger.setLevel(level)
logger.propagate = False # 防止日志重复
_logger = logging.getLogger(name)
_logger.setLevel(level)
_logger.propagate = False # 防止日志重复
formatter = logging.Formatter(
fmt="[%(asctime)s] [%(levelname)s] [%(name)s] [%(filename)s:%(lineno)d] %(message)s",
fmt=f"[%(asctime)s] [%(levelname)s] [%(name)s:v{version}] [%(filename)s:%(lineno)d] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
@@ -46,15 +48,15 @@ def setup_logger(
log_file, when=when, backupCount=backup_count, encoding="utf-8"
)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
_logger.addHandler(file_handler)
# 控制台日志处理器
if console:
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
_logger.addHandler(console_handler)
return logger
return _logger
logger = setup_logger(
@@ -64,4 +66,5 @@ logger = setup_logger(
when="midnight",
backup_count=14,
console=False,
version=__version.version,
)
+1
View File
@@ -21,6 +21,7 @@ def mitmproxy_process(args: list[str], output_queue: multiprocessing.Queue):
sys.stdout = sys.stderr = utils.Capture(output_queue)
print(f'Run mitmdump process {args} ({os.getpid()})...', flush=True)
mitmdump(args)
logger.info(f'mitmdump process terminated')
def start(port: str, debug = False):
-7
View File
@@ -1,7 +0,0 @@
__
/\ \
__ __ __ __ _ \_\ \ ___ __ __ __ ___
/\ \/\ \/\ \/\ \/'\ /'_` \ / __`\/\ \/\ \/\ \ /' _ `\
\ \ \_/ \_/ \/> <//\ \L\ \/\ \L\ \ \ \_/ \_/ \/\ \/\ \
\ \___x___/'/\_/\_\ \___,_\ \____/\ \___x___/'\ \_\ \_\
\/__//__/ \//\/_/\/__,_ /\/___/ \/__//__/ \/_/\/_/
+2 -5
View File
@@ -1,10 +1,7 @@
from rich.panel import Panel
from rich.table import Table
import version
from pathlib import Path
# SRC_PATH = Path.absolute(Path(__file__)).parent.parent
# LOGO_FILE = str(SRC_PATH / 'resources' / 'logo.txt')
import version
logo = r''' __
/\ \
@@ -16,7 +13,7 @@ logo = r''' __
'''
class Header:
class HeaderPanel:
def __init__(self, clients = 0, credentials = 0):
self.clients = clients
self.credentials = credentials
-25
View File
@@ -1,25 +0,0 @@
from rich import box
from rich.panel import Panel
from rich.table import Table
def make_message(data) -> Panel:
table = Table(expand=True, box=box.ROUNDED)
table.add_column('服务名称', justify="center")
table.add_column('监听地址', justify="center")
for service in data:
table.add_row(
service['name'],
service['address'],
style="",
end_section=True,
)
message_panel = Panel(
table,
box=box.ROUNDED,
title="服务列表",
title_align='left',
border_style="bright_blue",
)
return message_panel
+29
View File
@@ -0,0 +1,29 @@
from rich import box
from rich.panel import Panel
from rich.table import Table
class ServicePanel:
def __init__(self, data):
self.data = data
def __rich__(self) -> Panel:
table = Table(expand=True, box=box.ROUNDED)
table.add_column('服务名称', justify="center")
table.add_column('监听地址', justify="center")
for service in self.data:
table.add_row(
service['name'],
service['address'],
style="",
end_section=True,
)
message_panel = Panel(
table,
box=box.ROUNDED,
title="服务列表",
title_align='left',
border_style="bright_blue",
)
return message_panel
+9 -6
View File
@@ -2,10 +2,10 @@ import multiprocessing
from rich.layout import Layout
from ui.header import Header
from ui.layout import make_layout
from ui.main import make_message
from ui.footer import StatusPanel
from ui.header_panel import HeaderPanel
from ui.service_panel import ServicePanel
from ui.status_panel import StatusPanel
from rich.live import Live
import time
import utils
@@ -13,11 +13,13 @@ import cert
import platform
import threading
from logger import logger
def startup_ui_loop(watcher_output_queue: multiprocessing.Queue, mitm_proxy_address = None, ws_address = None):
layout = make_layout()
layout['header'].update(Header())
layout['service'].update(make_message([
layout['header'].update(HeaderPanel())
layout['service'].update(ServicePanel([
{'name': 'mitmproxy', 'address': mitm_proxy_address},
{'name': 'websocket', 'address': ws_address},
]))
@@ -42,6 +44,7 @@ def startup_ui_loop(watcher_output_queue: multiprocessing.Queue, mitm_proxy_addr
details=f"执行以下命令安装证书:\n[bold green]{cmd}[/]"))
continue
except Exception as e:
logger.warning(e)
layout['status'].update(
StatusPanel(is_success=False, reason="系统检测 mitmproxy 证书时异常。",
details="请将日志文件发送给开发者"))
@@ -62,5 +65,5 @@ def log_watcher_output(watcher_output_queue: multiprocessing.Queue, layout: Layo
clients = int(parts[1])
if parts[0] == 'credentials':
credentials = int(parts[1])
layout['header'].update(Header(clients, credentials))
layout['header'].update(HeaderPanel(clients, credentials))
+2 -2
View File
@@ -11,7 +11,7 @@ class StatusPanel:
def __rich__(self) -> Panel:
if self.isSuccess:
content = f':rocket:服务启动/监听成功!\n\n现在可以将 websocket 地址 ([bold green]{self.ws_address}[/]) 配置到网站中了。'
content = f':rocket: 服务启动/监听成功!\n\n现在可以将 websocket 地址 ([bold green]{self.ws_address}[/]) 配置到网站中了。'
else:
content = f'失败原因: [bold red]{self.reason}[/]\n\n解决方案: \n\n{self.details}'
@@ -21,5 +21,5 @@ class StatusPanel:
title_align='left',
highlight=True,
border_style=f'{'bright_green' if self.isSuccess else 'bright_red'}',
padding=(1)
padding=1,
)
+2 -2
View File
@@ -4,7 +4,7 @@ import re
import urllib.request
from pathlib import Path
import version
import version as __version
from logger import logger
SRC_PATH = Path.absolute(Path(__file__)).parent
@@ -47,7 +47,7 @@ def check_system_proxy(mitm_proxy_address):
def get_version():
return f"wxdown-service {version.version}"
return f"wxdown-service {__version.version}"
class Capture(io.TextIOBase):
def __init__(self, q: multiprocessing.Queue):
+1
View File
@@ -110,6 +110,7 @@ def watcher_process(port: str, output_queue: multiprocessing.Queue):
finally:
observer.stop()
observer.join()
logger.info(f"watcher process terminated")
def start(port: str):
+1 -1
View File
@@ -5,7 +5,7 @@ a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[('resources/credential.py', 'resources'), ('resources/logo.txt', 'resources')],
datas=[('resources/credential.py', 'resources')],
hiddenimports=[],
hookspath=[],
hooksconfig={},