From 58e568869d496c31e8fdb952a06cb55a33d5101b Mon Sep 17 00:00:00 2001 From: leimingsheng Date: Mon, 1 Sep 2025 09:38:03 +0800 Subject: [PATCH] code sync --- docs/D01_环境部署.md | 29 +++++- misc/okd-env.yml | 56 ++++++++++ src/backend/__init__.py | 6 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 303 bytes .../__pycache__/back_service.cpython-311.pyc | Bin 0 -> 3848 bytes src/backend/back_service.py | 80 ++++++++++++++ src/backend/proj_app/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 266 bytes .../__pycache__/service_app.cpython-311.pyc | Bin 0 -> 518 bytes src/backend/proj_app/service_app.py | 7 ++ src/common/__init__.py | 23 +++- src/common/cache_mgmt.py | 46 +++++++- src/common/file_tool.py | 98 ++++++++++++++++++ 13 files changed, 343 insertions(+), 7 deletions(-) create mode 100644 misc/okd-env.yml create mode 100644 src/backend/__pycache__/__init__.cpython-311.pyc create mode 100644 src/backend/__pycache__/back_service.cpython-311.pyc create mode 100644 src/backend/proj_app/__pycache__/__init__.cpython-311.pyc create mode 100644 src/backend/proj_app/__pycache__/service_app.cpython-311.pyc create mode 100644 src/backend/proj_app/service_app.py diff --git a/docs/D01_环境部署.md b/docs/D01_环境部署.md index d7d4f74..4c34109 100644 --- a/docs/D01_环境部署.md +++ b/docs/D01_环境部署.md @@ -1 +1,28 @@ -# D01_环境部署 \ No newline at end of file +# D01_环境部署 + +操作系统: Windows + +Python版本:3.11.13 + +推荐使用Anaconda yml配置文件一键导入虚拟python环境 + +[配置文件路径](./../misc/okd-env.yml) + +## 使用配置文件构建虚拟环境 + +Anaconda版本 : conda 25.5.1 + +```shell +# 1.需要自行安装Anaconda, 建议安装同版本Anaconda + +# 2.将okd-env.yml文件复制到目标设备 + +# 3.打开 Anaconda Prompt / 终端,执行重建命令: +conda env create --file 路径/文件名.yml +# 例如:conda env create --file C:/Users/xxx/Desktop/okd-env.yml + +# 4.等待 conda 自动下载并安装所有依赖包,完成后激活环境验证 +conda activate okd-env +python --version +``` + diff --git a/misc/okd-env.yml b/misc/okd-env.yml new file mode 100644 index 0000000..abcffaa --- /dev/null +++ b/misc/okd-env.yml @@ -0,0 +1,56 @@ +name: okd-env +channels: + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/numba/label/dev/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/mro/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/ + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64/ + - default + - defaults +dependencies: + - bzip2=1.0.8=h2466b09_7 + - ca-certificates=2025.8.3=h4c7d964_0 + - libexpat=2.7.1=hac47afa_0 + - libffi=3.4.6=h537db12_1 + - liblzma=5.8.1=h2466b09_2 + - libsqlite=3.50.4=hf5d6505_0 + - libzlib=1.3.1=h2466b09_2 + - openssl=3.5.2=h725018a_0 + - pip=25.2=pyh8b19718_0 + - python=3.11.13=h3f84c4b_0_cpython + - setuptools=80.9.0=pyhff2d567_0 + - tk=8.6.13=h2c6b04d_2 + - tzdata=2025b=h78e105d_0 + - ucrt=10.0.22621.0=h57928b3_1 + - vc=14.3=h41ae7f8_31 + - vc14_runtime=14.44.35208=h818238b_31 + - vcomp14=14.44.35208=h818238b_31 + - wheel=0.45.1=pyhd8ed1ab_1 + - pip: + - altgraph==0.17.4 + - click==8.2.1 + - colorama==0.4.6 + - packaging==25.0 + - pefile==2023.2.7 + - pyinstaller==6.15.0 + - pyinstaller-hooks-contrib==2025.8 + - pyqt6==6.4.2 + - pyqt6-plugins==6.4.2.2.3 + - pyqt6-qt6==6.4.3 + - pyqt6-sip==13.10.2 + - pyqt6-tools==6.4.2.3.3 + - python-dotenv==1.1.1 + - pywin32-ctypes==0.2.3 + - qt6-applications==6.4.3.2.3 + - qt6-tools==6.4.3.1.3 +prefix: D:\Environment\Anaconda\envs\okd-env diff --git a/src/backend/__init__.py b/src/backend/__init__.py index e69de29..c840b67 100644 --- a/src/backend/__init__.py +++ b/src/backend/__init__.py @@ -0,0 +1,6 @@ +from .back_service import ( + get_all_proj_name, + do_proj_parse +) + +__all__ = [ get_all_proj_name, do_proj_parse ] \ No newline at end of file diff --git a/src/backend/__pycache__/__init__.cpython-311.pyc b/src/backend/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b633ab4bf92dec84f81d6505c3d3f16034edf451 GIT binary patch literal 303 zcmZ3^%ge<81diXfWK;v`#~=<2FhLog<$#Ro3@HpLj5!Rsj8TlaOi@gX45^H%OzBKf z%qdL444TX@8G(v4nQjTDr*t??@vJ_ET7zf4`MV#@Q2vWp86lT%~-^HRN2D}D0Q z<6SZn)5DBnii?tCKqjT;rNqR?XXa&=#K-FuRQ}?y$<0qG%}KQ@0(lPPuwq*v@qw9< gk?{i)Gb7Un2Eqgv1FzhS+6!EI4eTIT!~rw`0MQ6fm;e9( literal 0 HcmV?d00001 diff --git a/src/backend/__pycache__/back_service.cpython-311.pyc b/src/backend/__pycache__/back_service.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc301a4d479a137c559b3b6736d2f4bcaa3bd690 GIT binary patch literal 3848 zcmcH+e@q+K`Q6!PADn&I1`;hHjS0}=K}bSrMi@bhL>mam(?Zj#5uN4wF2rDL>+U=t zvMVo26vk*nDk9vbKU`_a*s7Lwt2!!mTl?4ky^BtYbrMpfq%|A@mRYQfy>lvUw6FONc`p5kZ&Dk+@87 z{G_NQN|F1}Q`=PAvn2U|0BU&5CVC`iagGpYO_KM} z2Rm@C6Z=T8Z&Pm1_K@J--sPx$B$R184jwVvPG0@!_4bq{X~`PiD`FK#&Q@ugP@hCu zrnp-^CM}hi1e!k%9YGuYcp6i4sylI=gDw{cZF=F*hxiU|{9JQ(6fe;Vb7_?cm_ydNxo zrE^piLZby~#u$Lp`b9Xzcf@Bj7e2mVBoZj9Co}+Od^Y0WA%mq+&gDrDKDIW>m0kDL zEk3u@{!V-5+VUC2^MdMmAw8rs&iNnR?wjk&v?Zv|#)Z!1v0HKl^3~0Ca`DsInJj`l9ZxT|AT-QrxYo zyLAJRRI>qQsT|{a#2kLe9L}6qm}ZrMb)u>{=cs?=Xn5#o$Xrq!O{$|wb~J5m*bsGG zwzik|9NQ$bO$ythvMuTJYbC>`Lsp$_}Tn9fLr7el1lXoY7|kK+vZ5A zR5KCUk+sn*c?DN&I*Iys?h#2`uPuJThUJ$@KsZa)V)@Mg?h?3SC(-MU6j1z% z2e59oJLJ3*xDfu|0V|E{IH_5~5rD%XVf?)axgPUYdKCE z)tbiiz~iDypvCeu0L9gy0?rKJ$Bsqebkc6FEXw67C0Jp7jTFc(Fufa`d1W7oLZPOk}St@9$q-8I; zm^Nj36Yhp1h1nD_g{Cd9p((;=OMD6pt8s4B=a%#7U*>=Pb^h)9`ut6O;Vu2EFZGqL z^_%ze%OC3>EE!lP>h0_KyMO30=9m;R=|pgh4`5e%d%PxfY1f#n|7}sf_u)2)$@uAe zH%#98%2(^3f84G=xSs#;eREI$&FAZ1+}CH{HA($YqYO^h=t6q#NYsJu`Pl`1?xS)& zp(+|1OWFLN?pAL26ZnHHU&}9jso%cybn&C_7T;Z8S?TfmD6J|y8IK84B>aZvG^c^d z7?+6fxR8dUlEw@g2xdL2dT~0$$E9#A>a%JNIEvsz;V6tZ<6w-UX)7=xcoCNjd~oKc z?%`(O>~9^SB4Q+2xg5G3~H2E~0^b)TNK zt$btZ=(V%bthC0Ip&CR6{;B1l%$|a- z(48vXDbt;~8Ur8G%t~9(HYgASqlk0Mt>;dlm49);z(c8|!zG=-KVIkNJWDjZ0X+0s9gA|4(q^D+VdrXV`-U96CQHO9D| z!2L)Nd7s7bhi1PT6oZl^2&aJqq%sR!n!w31VI1&`5P+OE5R7sWUJwiEtl(oO7c*}S z21DV;z~BNr;xGWXH`E@=jNCb!9@bsQvb~Dyr0P1E9$d4tvoo3FioI2}8^zC?qur0_ zBM<2#3Vl?ikIKcqVIe3lE{|R_;}Sv_*3c&4e;WeMnMU?CGN@sSp@87U8#p4&Qb6~b zUud7u3u`#tiB|vsbArgBs5?~J!@FA5zCq;mg`v60a Fe*(r zFByT-nvA!&i%SxVO5zI=i;7eIG?{_?)S|M?y;nQ(TlBla!d8otl>tQ&5zj1u`fm zK0Y%qvm`!Vub}c5hfQvNN@-52T@feHIFK`n4S>W4W=2NF4@^vqOdl9<5gZJ>5*_*t L>>yag4%7qyTKh!M literal 0 HcmV?d00001 diff --git a/src/backend/proj_app/__pycache__/service_app.cpython-311.pyc b/src/backend/proj_app/__pycache__/service_app.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad20ad1020d4587812d77685e30bfab23df04af3 GIT binary patch literal 518 zcmZWlJxc>Y5Z%4INIp%WU?rrmNt41#LJ|ljLQs;!NWk;tIB%C2^RdU?8HrU23p*=G zA!!w{^@l{T2nT{-Wg~%fshm9%L7bg^GxOM;w>uB9SQvrbd_AAuLi`ZL!lZdJ-GF3( z2qL(JG!dm1ZcCbk5s@{SC|5{R2(F@J;8R>FC$Sgi)MA_%EmrsBysBFBUVc~tlwnV| z00zj#KI;R)L~<9xz}$hvP`(G|>6Zmr1Y%0rQ%dEX$_yV}t{f-QiK=UIH=&x`p@~!~ zm6W&;@uJn@eyy}!G!72c;vVU$pK7cjPV$S Z`u-ZD_0eB{kFWNl69wbk1pNoU|2GG{di?+Z literal 0 HcmV?d00001 diff --git a/src/backend/proj_app/service_app.py b/src/backend/proj_app/service_app.py new file mode 100644 index 0000000..242c191 --- /dev/null +++ b/src/backend/proj_app/service_app.py @@ -0,0 +1,7 @@ +import os +from common import record_log + +SERVICE_TYPE = "APP" + +def start_parse(): + record_log("INFO", f"[{SERVICE_TYPE}] : Start Parse ...") \ No newline at end of file diff --git a/src/common/__init__.py b/src/common/__init__.py index 8207b8c..0a9e36b 100644 --- a/src/common/__init__.py +++ b/src/common/__init__.py @@ -1,8 +1,23 @@ from ._globals import ( - cache_dir + cache_dir, + source_dir ) -def init_package_coomon(): - pass +from .app_logger import ( + record_log +) -init_package_coomon() \ No newline at end of file +from .file_tool import( + force_empty_folder, + add_to_json_array, + get_user_appdata_path +) + +# From ._globals +__all__ = [ cache_dir, source_dir ] + +# From .app_logger +__all__ += [ record_log ] + +# From .file_tool +__all__ += [ force_empty_folder, add_to_json_array, get_user_appdata_path ] \ No newline at end of file diff --git a/src/common/cache_mgmt.py b/src/common/cache_mgmt.py index a4fae80..f78bb2a 100644 --- a/src/common/cache_mgmt.py +++ b/src/common/cache_mgmt.py @@ -1,12 +1,54 @@ import os +import time -from . import cache_dir -from app_logger import LOG_FILE +from ._globals import cache_dir +from .file_tool import force_empty_folder, add_to_json_array, get_user_appdata_path +from .app_logger import record_log def app_cache_create(): if not os.path.exists(cache_dir): os.makedirs(cache_dir) + + # 在用户目录创建APP目录及插件目录 + usr_appdata_path = get_user_appdata_path() + app_data_okd_path = os.path.join(usr_appdata_path, "onekeylog_diag") + if not os.path.exists(app_data_okd_path): + os.makedirs(app_data_okd_path) + record_log("Info", f"Create Dir:{app_data_okd_path}") + + app_plugin_path = os.path.join(app_data_okd_path, "plugin") + if not os.path.exists(app_plugin_path): + os.makedirs(app_plugin_path) + record_log("Info", f"Create Dir:{app_plugin_path}") + +def add_onekeylog_info_cache(log_name): + """ + 添加一份新日志时触发这个动作, 将日志名称以及解析日期全部记录到 + parse_history.json + + 参数: + log_name(str): 被解析的文件名 + """ + parseJsonFile = os.path.join(cache_dir, "parse_history.json") + # 获取当前时间戳 + current_time = time.strftime("%Y-%m-%d %H:%M:%S") + + # 生成新的记录Dict + new_entry = { + "filename" : log_name, + "timestamp" : current_time + } + + result_b = add_to_json_array(parseJsonFile, new_entry) + + if not result_b: + record_log("ERROR", "Fail to add parse history cache") + +def clean_app_cache(): + force_empty_folder(cache_dir) def clean_running_log(): + LOG_FILE = os.path.join(cache_dir, "running.log") + if os.path.exists(LOG_FILE): os.remove(LOG_FILE) \ No newline at end of file diff --git a/src/common/file_tool.py b/src/common/file_tool.py index e69de29..96c3390 100644 --- a/src/common/file_tool.py +++ b/src/common/file_tool.py @@ -0,0 +1,98 @@ +import os +import json +import shutil +import pathlib + +def force_empty_folder(folder_path): + """ + 强制清空指定文件夹内的所有内容(包括文件和子文件夹),但保留文件夹本身 + + 参数: + folder_path (str): 要清空的文件夹路径 + + 异常: + FileNotFoundError: 如果指定的文件夹不存在 + PermissionError: 如果没有足够的权限操作文件夹内容 + Exception: 其他可能出现的错误 + """ + # 检查文件夹是否存在 + if not os.path.exists(folder_path): + raise FileNotFoundError(f"文件夹不存在: {folder_path}") + + # 检查路径是否指向一个文件夹 + if not os.path.isdir(folder_path): + raise NotADirectoryError(f"指定路径不是一个文件夹: {folder_path}") + + # 遍历文件夹内的所有内容 + for item in os.listdir(folder_path): + item_path = os.path.join(folder_path, item) + + try: + # 如果是文件或符号链接,直接删除 + if os.path.isfile(item_path) or os.path.islink(item_path): + os.unlink(item_path) + # 如果是文件夹,递归删除整个文件夹 + elif os.path.isdir(item_path): + shutil.rmtree(item_path, ignore_errors=False, onerror=None) + except Exception as e: + raise Exception(f"删除 {item_path} 时出错: {str(e)}") + +def add_to_json_array(json_file_path, new_data): + """ + 向JSON文件中的数组添加一组新数据 + + 参数: + json_file_path (str): JSON文件的路径 + new_data: 要添加到数组中的新数据,可以是任何可序列化的类型(字典、列表、字符串等) + + 返回: + bool: 操作是否成功 + + 异常: + IOError: 文件操作相关错误 + json.JSONDecodeError: JSON格式解析错误 + Exception: 其他可能的错误 + """ + # 检查文件是否存在,如果不存在则创建并初始化一个空数组 + if not os.path.exists(json_file_path): + with open(json_file_path, 'w', encoding='utf-8') as f: + json.dump([], f, ensure_ascii=False, indent=2) + + # 读取现有数据 + try: + with open(json_file_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + # 确保数据是一个数组 + if not isinstance(data, list): + raise ValueError("JSON文件内容不是一个数组") + + # 添加新数据 + data.append(new_data) + + # 写回文件 + with open(json_file_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + return True + + except json.JSONDecodeError: + raise json.JSONDecodeError(f"文件 {json_file_path} 不是有效的JSON格式", json_file_path, 0) + except Exception as e: + raise Exception(f"添加数据时发生错误: {str(e)}") + +def get_user_appdata_path(): + """获取用户AppData目录路径""" + # 获取用户主目录 + user_home = pathlib.Path.home() + + # 根据操作系统获取AppData目录 + if os.name == 'nt': # Windows系统 + # 在Windows上,AppData通常通过环境变量获取 + appdata = os.getenv('APPDATA') + if appdata: + return pathlib.Path(appdata) + # 如果环境变量获取失败,使用默认路径 + return user_home / 'AppData' / 'Roaming' + else: + raise OSError(f"不支持的操作系统: {os.name}") \ No newline at end of file