mirror of
https://github.com/wechat-article/wxdown-service.git
synced 2026-08-30 17:56:59 +08:00
update
This commit is contained in:
@@ -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
|
||||
```
|
||||
|
||||
### 参数说明
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
__
|
||||
/\ \
|
||||
__ __ __ __ _ \_\ \ ___ __ __ __ ___
|
||||
/\ \/\ \/\ \/\ \/'\ /'_` \ / __`\/\ \/\ \/\ \ /' _ `\
|
||||
\ \ \_/ \_/ \/> <//\ \L\ \/\ \L\ \ \ \_/ \_/ \/\ \/\ \
|
||||
\ \___x___/'/\_/\_\ \___,_\ \____/\ \___x___/'\ \_\ \_\
|
||||
\/__//__/ \//\/_/\/__,_ /\/___/ \/__//__/ \/_/\/_/
|
||||
@@ -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
@@ -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
|
||||
@@ -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
@@ -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))
|
||||
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
@@ -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):
|
||||
|
||||
@@ -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
@@ -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={},
|
||||
|
||||
Reference in New Issue
Block a user