From d20ddfed59b8e1a48d5b05e41cd75a92790fa0b8 Mon Sep 17 00:00:00 2001 From: xiaji Date: Sun, 31 Aug 2025 13:08:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90Django=E7=9A=84=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/django_tab.cpython-38.pyc | Bin 0 -> 12594 bytes __pycache__/django_threads.cpython-38.pyc | Bin 0 -> 7793 bytes .../remote_commands_tab.cpython-38.pyc | Bin 10252 -> 16673 bytes app.log | 696 ++++++++++++++++++ django_tab.py | 456 ++++++++++++ django_threads.py | 364 +++++++++ main.py | 17 + remote_commands_tab.py | 238 +++++- settings.py | 113 +++ settings_backup_20250831_115953.py | 113 +++ 10 files changed, 1993 insertions(+), 4 deletions(-) create mode 100644 __pycache__/django_tab.cpython-38.pyc create mode 100644 __pycache__/django_threads.cpython-38.pyc create mode 100644 django_tab.py create mode 100644 django_threads.py create mode 100644 settings.py create mode 100644 settings_backup_20250831_115953.py diff --git a/__pycache__/django_tab.cpython-38.pyc b/__pycache__/django_tab.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d997625950ee146fda09eec03a43192dfdeb2ae8 GIT binary patch literal 12594 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 literal 0 HcmV?d00001 diff --git a/__pycache__/django_threads.cpython-38.pyc b/__pycache__/django_threads.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0444e40b3a7cf0dea35d3e708e712f7116b1606 GIT binary patch literal 7793 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 tvz!s<`DP5w)o4bX)X7S++QmD{tKD*QzHNX literal 0 HcmV?d00001 diff --git a/__pycache__/remote_commands_tab.cpython-38.pyc b/__pycache__/remote_commands_tab.cpython-38.pyc index 72fa8aa08847905be628948b61d49944cd13309d..89a5226086c1750de1f50b2b82c6cacc07ff31bb 100644 GIT binary patch literal 16673 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:66 - 启动应用程序 +2025-08-31 11:50:12.919 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 11:50:12.919 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:50:12.925 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:50:12.926 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:50:12.926 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:50:12.927 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:50:12.928 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:50:12.930 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:50:12.930 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 11:50:14.548 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:50:14.646 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:50:18.772 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 11:50:18.772 | INFO | remote_commands_tab:set_ssh_client:232 - 设置SSH客户端 +2025-08-31 11:50:18.773 | INFO | remote_commands_tab:set_server_config:243 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 11:50:18.773 | INFO | remote_commands_tab:refresh_directory:332 - 刷新目录列表 +2025-08-31 11:50:18.773 | INFO | remote_commands_tab:refresh_directory:344 - 使用用户输入目录: /home/xiaji +2025-08-31 11:50:18.774 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 11:50:18.784 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 11:50:19.919 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 11:50:19.919 | INFO | django_tab:set_ssh_client:134 - Django标签页已设置SSH客户端 +2025-08-31 11:50:22.055 | INFO | django_tab:run:21 - 执行Django命令: sudo pip3 install django +2025-08-31 11:50:22.068 | ERROR | django_tab:run:32 - 命令错误: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper +2025-08-31 11:50:22.069 | ERROR | django_tab:run:32 - 命令错误: sudo: a password is required +2025-08-31 11:50:22.069 | ERROR | django_tab:run:41 - 命令执行失败,退出状态: 1 +2025-08-31 11:50:22.071 | INFO | django_tab:on_command_finished:142 - Django命令执行完成 +2025-08-31 11:51:08.217 | INFO | __main__::66 - 启动应用程序 +2025-08-31 11:51:08.241 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 11:51:08.241 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:51:08.247 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:51:08.247 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:51:08.248 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:51:08.248 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:51:08.250 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:51:08.251 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:51:08.252 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 11:51:09.584 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:51:09.672 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:51:11.558 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 11:51:11.558 | INFO | remote_commands_tab:set_ssh_client:232 - 设置SSH客户端 +2025-08-31 11:51:11.560 | INFO | remote_commands_tab:set_server_config:243 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 11:51:11.561 | INFO | remote_commands_tab:refresh_directory:332 - 刷新目录列表 +2025-08-31 11:51:11.561 | INFO | remote_commands_tab:refresh_directory:344 - 使用用户输入目录: /home/xiaji +2025-08-31 11:51:11.562 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 11:51:11.572 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 11:51:13.197 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 11:51:13.199 | INFO | django_tab:set_ssh_client:201 - Django标签页已设置SSH客户端 +2025-08-31 11:51:14.569 | INFO | django_tab:run:57 - 执行Django命令: sudo pip3 install django +2025-08-31 11:54:32.351 | INFO | __main__::73 - 启动应用程序 +2025-08-31 11:54:32.374 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 11:54:32.375 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:54:32.382 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:54:32.383 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:54:32.383 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:54:32.384 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:54:32.385 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:54:32.386 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:54:32.388 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 11:54:33.719 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:54:33.806 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:54:35.832 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 11:54:35.833 | INFO | django_tab:set_ssh_client:202 - Django标签页已设置SSH客户端 +2025-08-31 11:54:35.833 | INFO | django_tab:set_username:207 - Django标签页已设置用户名: xiaji +2025-08-31 11:54:39.090 | INFO | django_tab:run:57 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 11:54:39.101 | INFO | django_tab:process_manage_py_result:328 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 11:54:39.101 | INFO | django_tab:run:92 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 11:54:39.101 | INFO | django_tab:run:105 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 11:54:39.103 | INFO | django_tab:run:57 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 11:54:39.152 | INFO | django_tab:run:92 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 11:54:39.152 | INFO | django_tab:process_settings_py_result:355 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 11:54:39.152 | INFO | django_tab:run:105 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 11:54:39.153 | INFO | django_tab:on_command_finished:215 - Django命令执行完成 +2025-08-31 11:54:47.558 | INFO | django_tab:run:57 - 执行Django命令: sudo pip3 install django +2025-08-31 11:54:53.269 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 11:54:53.278 | ERROR | django_tab:run:99 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 11:54:53.278 | ERROR | django_tab:run:108 - 命令执行失败,退出状态: 1 +2025-08-31 11:54:53.280 | INFO | django_tab:on_command_finished:215 - Django命令执行完成 +2025-08-31 11:54:55.069 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 11:54:55.077 | ERROR | django_tab:run:99 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 11:54:55.078 | ERROR | django_tab:run:108 - 命令执行失败,退出状态: 1 +2025-08-31 11:54:55.079 | INFO | django_tab:on_command_finished:215 - Django命令执行完成 +2025-08-31 11:56:47.501 | INFO | __main__::73 - 启动应用程序 +2025-08-31 11:56:47.531 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 11:56:47.532 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:56:47.539 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:56:47.540 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:56:47.541 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:56:47.542 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:56:47.543 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:56:47.545 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:56:47.545 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 11:56:48.820 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:56:48.910 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:56:50.639 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 11:56:50.640 | INFO | django_tab:set_ssh_client:202 - Django标签页已设置SSH客户端 +2025-08-31 11:56:50.640 | INFO | django_tab:set_username:207 - Django标签页已设置用户名: xiaji +2025-08-31 11:56:52.641 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip -y +2025-08-31 11:57:15.256 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 11:57:15.265 | ERROR | django_tab:run:99 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 11:57:15.265 | ERROR | django_tab:run:108 - 命令执行失败,退出状态: 1 +2025-08-31 11:57:15.267 | INFO | django_tab:on_command_finished:215 - Django命令执行完成 +2025-08-31 11:57:17.761 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip -y +2025-08-31 11:57:44.145 | INFO | __main__::73 - 启动应用程序 +2025-08-31 11:57:44.169 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 11:57:44.169 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:57:44.181 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:57:44.181 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:57:44.182 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:57:44.182 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:57:44.183 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:57:44.184 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:57:44.185 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 11:57:45.561 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:57:45.651 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:57:47.524 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 11:57:47.525 | INFO | django_tab:set_ssh_client:202 - Django标签页已设置SSH客户端 +2025-08-31 11:57:47.525 | INFO | django_tab:set_username:207 - Django标签页已设置用户名: xiaji +2025-08-31 11:58:14.822 | INFO | __main__::73 - 启动应用程序 +2025-08-31 11:58:14.847 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 11:58:14.848 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:58:14.853 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:58:14.854 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:58:14.854 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:58:14.854 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:58:14.857 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:58:14.859 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:58:14.859 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 11:58:16.130 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:58:16.239 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:58:18.723 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 11:58:18.725 | INFO | django_tab:set_ssh_client:232 - Django标签页已设置SSH客户端 +2025-08-31 11:58:18.727 | INFO | django_tab:set_username:237 - Django标签页已设置用户名: xiaji +2025-08-31 11:58:19.975 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 11:58:19.984 | ERROR | django_tab:run:129 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 11:58:19.985 | ERROR | django_tab:run:138 - 命令执行失败,退出状态: 1 +2025-08-31 11:58:19.986 | INFO | django_tab:on_command_finished:245 - Django命令执行完成 +2025-08-31 11:58:23.621 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip -y +2025-08-31 11:59:37.350 | INFO | django_tab:run:57 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 11:59:37.362 | INFO | django_tab:run:122 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 11:59:37.362 | INFO | django_tab:process_manage_py_result:372 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 11:59:37.363 | INFO | django_tab:run:135 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 11:59:37.364 | INFO | django_tab:run:57 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 11:59:37.414 | INFO | django_tab:run:122 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 11:59:37.414 | INFO | django_tab:process_settings_py_result:399 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 11:59:37.414 | INFO | django_tab:run:135 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 11:59:37.415 | INFO | django_tab:on_command_finished:245 - Django命令执行完成 +2025-08-31 11:59:39.026 | INFO | django_tab:run:57 - 执行Django命令: cd /home/xiaji/webstatus && python3 manage.py runserver 0.0.0.0:8000 +2025-08-31 11:59:39.174 | ERROR | django_tab:run:129 - 命令错误: Traceback (most recent call last): +2025-08-31 11:59:39.176 | ERROR | django_tab:run:129 - 命令错误: File "/home/xiaji/webstatus/manage.py", line 11, in main +2025-08-31 11:59:39.176 | ERROR | django_tab:run:129 - 命令错误: from django.core.management import execute_from_command_line +2025-08-31 11:59:39.177 | ERROR | django_tab:run:129 - 命令错误: ModuleNotFoundError: No module named 'django' +2025-08-31 11:59:39.177 | ERROR | django_tab:run:129 - 命令错误: +2025-08-31 11:59:39.177 | ERROR | django_tab:run:129 - 命令错误: The above exception was the direct cause of the following exception: +2025-08-31 11:59:39.178 | ERROR | django_tab:run:129 - 命令错误: +2025-08-31 11:59:39.179 | ERROR | django_tab:run:129 - 命令错误: Traceback (most recent call last): +2025-08-31 11:59:39.179 | ERROR | django_tab:run:129 - 命令错误: File "/home/xiaji/webstatus/manage.py", line 22, in +2025-08-31 11:59:39.180 | ERROR | django_tab:run:129 - 命令错误: main() +2025-08-31 11:59:39.180 | ERROR | django_tab:run:129 - 命令错误: File "/home/xiaji/webstatus/manage.py", line 13, in main +2025-08-31 11:59:39.182 | ERROR | django_tab:run:129 - 命令错误: raise ImportError( +2025-08-31 11:59:39.183 | ERROR | django_tab:run:129 - 命令错误: ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment? +2025-08-31 11:59:39.183 | ERROR | django_tab:run:138 - 命令执行失败,退出状态: 1 +2025-08-31 11:59:39.186 | INFO | django_tab:on_command_finished:245 - Django命令执行完成 +2025-08-31 11:59:49.810 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 11:59:49.820 | ERROR | django_tab:run:129 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 11:59:49.821 | ERROR | django_tab:run:138 - 命令执行失败,退出状态: 1 +2025-08-31 11:59:49.821 | INFO | django_tab:on_command_finished:245 - Django命令执行完成 +2025-08-31 11:59:53.567 | INFO | django_tab:download_settings:422 - settings.py已下载到: settings_backup_20250831_115953.py +2025-08-31 12:01:40.095 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:01:40.121 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:01:40.122 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:01:40.129 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:01:40.129 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:01:40.130 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:01:40.130 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:01:40.132 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:01:40.135 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 12:01:40.136 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:01:42.110 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:01:42.208 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:01:43.858 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:01:43.859 | INFO | remote_commands_tab:set_ssh_client:232 - 设置SSH客户端 +2025-08-31 12:01:43.859 | INFO | remote_commands_tab:set_server_config:243 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:01:43.861 | INFO | remote_commands_tab:refresh_directory:332 - 刷新目录列表 +2025-08-31 12:01:43.861 | INFO | remote_commands_tab:refresh_directory:344 - 使用用户输入目录: /home/xiaji +2025-08-31 12:01:43.862 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:01:43.871 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:01:45.194 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:01:45.195 | INFO | django_tab:set_ssh_client:249 - Django标签页已设置SSH客户端 +2025-08-31 12:01:45.195 | INFO | django_tab:set_username:254 - Django标签页已设置用户名: xiaji +2025-08-31 12:01:46.523 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip -y +2025-08-31 12:01:58.327 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:01:58.336 | ERROR | django_tab:run:129 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:01:58.337 | ERROR | django_tab:run:138 - 命令执行失败,退出状态: 1 +2025-08-31 12:01:58.339 | INFO | django_tab:on_command_finished:262 - Django命令执行完成 +2025-08-31 12:03:54.709 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:03:54.732 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:03:54.732 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:03:54.739 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:03:54.739 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:03:54.740 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:03:54.740 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:03:54.742 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:03:54.743 | INFO | remote_commands_tab:init_ui:252 - 远程命令标签页UI初始化完成 +2025-08-31 12:03:54.744 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:03:56.261 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:03:56.351 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:03:58.091 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:03:58.092 | INFO | remote_commands_tab:set_ssh_client:255 - 设置SSH客户端 +2025-08-31 12:03:58.092 | INFO | remote_commands_tab:set_server_config:266 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:03:58.093 | INFO | remote_commands_tab:refresh_directory:355 - 刷新目录列表 +2025-08-31 12:03:58.093 | INFO | remote_commands_tab:refresh_directory:367 - 使用用户输入目录: /home/xiaji +2025-08-31 12:03:58.094 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:03:58.104 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:03:58.109 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: /home/xiaji +2025-08-31 12:03:58.109 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: total 84 +2025-08-31 12:03:58.109 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxr-x--- 6 xiaji xiaji 4096 Aug 31 03:17 . +2025-08-31 12:03:58.110 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxr-xr-x 3 root root 4096 Aug 31 2025 .. +2025-08-31 12:03:58.110 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 220 Aug 20 2024 .bash_logout +2025-08-31 12:03:58.111 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 3771 Aug 20 2024 .bashrc +2025-08-31 12:03:58.111 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 02:56 .cache +2025-08-31 12:03:58.111 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxrwxr-x 3 xiaji xiaji 4096 Aug 31 02:59 django.remote +2025-08-31 12:03:58.112 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 807 Aug 20 2024 .profile +2025-08-31 12:03:58.112 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 2025 .ssh +2025-08-31 12:03:58.112 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxrwxr-x 5 xiaji xiaji 4096 Aug 31 02:59 webstatus +2025-08-31 12:03:58.113 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-rw-r-- 1 xiaji xiaji 47664 Aug 31 03:33 xiaji +2025-08-31 12:03:58.113 | INFO | remote_commands_tab:on_dir_refresh_finished:387 - 目录列表刷新成功 +2025-08-31 12:04:01.061 | INFO | remote_commands_tab:set_timezone:395 - 设置时区为北京时区 +2025-08-31 12:04:02.346 | INFO | remote_commands_tab:run:53 - 执行远程命令: sudo timedatectl set-timezone Asia/Shanghai +2025-08-31 12:04:09.774 | INFO | remote_commands_tab:reboot_server:446 - 重启服务器 +2025-08-31 12:04:11.373 | INFO | remote_commands_tab:run:53 - 执行远程命令: sudo reboot +2025-08-31 12:04:14.248 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 0 +2025-08-31 12:04:15.455 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:04:15.537 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:04:19.266 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:04:19.352 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:04:21.496 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:04:21.496 | INFO | remote_commands_tab:set_ssh_client:255 - 设置SSH客户端 +2025-08-31 12:04:21.497 | INFO | remote_commands_tab:set_server_config:266 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:04:21.497 | INFO | remote_commands_tab:refresh_directory:355 - 刷新目录列表 +2025-08-31 12:04:21.497 | INFO | remote_commands_tab:refresh_directory:367 - 使用用户输入目录: /home/xiaji +2025-08-31 12:04:21.499 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:04:21.508 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: /home/xiaji +2025-08-31 12:04:21.509 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: total 84 +2025-08-31 12:04:21.509 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:04:21.509 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxr-x--- 6 xiaji xiaji 4096 Aug 31 03:17 . +2025-08-31 12:04:21.510 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxr-xr-x 3 root root 4096 Aug 31 2025 .. +2025-08-31 12:04:21.511 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 220 Aug 20 2024 .bash_logout +2025-08-31 12:04:21.511 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 3771 Aug 20 2024 .bashrc +2025-08-31 12:04:21.512 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 02:56 .cache +2025-08-31 12:04:21.512 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxrwxr-x 3 xiaji xiaji 4096 Aug 31 02:59 django.remote +2025-08-31 12:04:21.512 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 807 Aug 20 2024 .profile +2025-08-31 12:04:21.513 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 2025 .ssh +2025-08-31 12:04:21.513 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxrwxr-x 5 xiaji xiaji 4096 Aug 31 02:59 webstatus +2025-08-31 12:04:21.513 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-rw-r-- 1 xiaji xiaji 47664 Aug 31 03:33 xiaji +2025-08-31 12:04:21.513 | INFO | remote_commands_tab:on_dir_refresh_finished:387 - 目录列表刷新成功 +2025-08-31 12:04:24.593 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:04:24.594 | INFO | django_tab:set_ssh_client:270 - Django标签页已设置SSH客户端 +2025-08-31 12:04:24.594 | INFO | django_tab:set_username:275 - Django标签页已设置用户名: xiaji +2025-08-31 12:04:26.295 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip -y +2025-08-31 12:04:46.725 | ERROR | remote_commands_tab:run:104 - 命令执行失败,退出状态: -1 +2025-08-31 12:05:32.307 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:05:32.331 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:05:32.332 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:05:32.338 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:05:32.338 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:05:32.339 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:05:32.339 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:05:32.340 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:05:32.342 | INFO | remote_commands_tab:init_ui:252 - 远程命令标签页UI初始化完成 +2025-08-31 12:05:32.343 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:05:34.113 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:05:34.201 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:05:35.614 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:05:35.615 | INFO | django_tab:set_ssh_client:270 - Django标签页已设置SSH客户端 +2025-08-31 12:05:35.615 | INFO | django_tab:set_username:275 - Django标签页已设置用户名: xiaji +2025-08-31 12:05:38.420 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip +2025-08-31 12:05:52.071 | INFO | django_tab:run:57 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:05:52.080 | INFO | django_tab:run:143 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 12:05:52.081 | INFO | django_tab:process_manage_py_result:410 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 12:05:52.081 | INFO | django_tab:run:156 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:05:52.083 | INFO | django_tab:run:57 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:05:52.133 | INFO | django_tab:run:143 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:05:52.133 | INFO | django_tab:process_settings_py_result:437 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:05:52.133 | INFO | django_tab:run:156 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:05:52.134 | INFO | django_tab:on_command_finished:283 - Django命令执行完成 +2025-08-31 12:05:59.266 | INFO | django_tab:download_settings:462 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:06:06.617 | INFO | django_tab:run:57 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:06:06.626 | ERROR | django_tab:run:150 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:06:06.626 | ERROR | django_tab:run:159 - 命令执行失败,退出状态: 1 +2025-08-31 12:06:06.628 | INFO | django_tab:on_command_finished:283 - Django命令执行完成 +2025-08-31 12:06:09.544 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip +2025-08-31 12:08:06.341 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:08:06.363 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:08:06.363 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:08:06.371 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:08:06.371 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:08:06.372 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:08:06.372 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:08:06.373 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:08:06.375 | INFO | remote_commands_tab:init_ui:252 - 远程命令标签页UI初始化完成 +2025-08-31 12:08:06.376 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:08:07.652 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:08:07.741 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:08:09.766 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:08:09.767 | INFO | remote_commands_tab:set_ssh_client:255 - 设置SSH客户端 +2025-08-31 12:08:09.767 | INFO | remote_commands_tab:set_server_config:266 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:08:09.768 | INFO | remote_commands_tab:refresh_directory:355 - 刷新目录列表 +2025-08-31 12:08:09.768 | INFO | remote_commands_tab:refresh_directory:367 - 使用用户输入目录: /home/xiaji +2025-08-31 12:08:09.770 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:08:09.779 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: /home/xiaji +2025-08-31 12:08:09.780 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:08:09.780 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: total 84 +2025-08-31 12:08:09.781 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxr-x--- 6 xiaji xiaji 4096 Aug 31 03:17 . +2025-08-31 12:08:09.781 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxr-xr-x 3 root root 4096 Aug 31 2025 .. +2025-08-31 12:08:09.782 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 220 Aug 20 2024 .bash_logout +2025-08-31 12:08:09.782 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 3771 Aug 20 2024 .bashrc +2025-08-31 12:08:09.782 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 02:56 .cache +2025-08-31 12:08:09.782 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxrwxr-x 3 xiaji xiaji 4096 Aug 31 02:59 django.remote +2025-08-31 12:08:09.783 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 807 Aug 20 2024 .profile +2025-08-31 12:08:09.783 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 2025 .ssh +2025-08-31 12:08:09.783 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: drwxrwxr-x 5 xiaji xiaji 4096 Aug 31 02:59 webstatus +2025-08-31 12:08:09.783 | INFO | remote_commands_tab:append_dir_output:381 - 目录列表信息: -rw-rw-r-- 1 xiaji xiaji 47664 Aug 31 03:33 xiaji +2025-08-31 12:08:09.785 | INFO | remote_commands_tab:on_dir_refresh_finished:387 - 目录列表刷新成功 +2025-08-31 12:08:12.487 | INFO | remote_commands_tab:set_timezone:395 - 设置时区为北京时区 +2025-08-31 12:08:13.691 | INFO | remote_commands_tab:run:53 - 执行远程命令: sudo timedatectl set-timezone Asia/Shanghai +2025-08-31 12:08:15.997 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:08:15.998 | INFO | django_tab:set_ssh_client:291 - Django标签页已设置SSH客户端 +2025-08-31 12:08:15.998 | INFO | django_tab:set_username:296 - Django标签页已设置用户名: xiaji +2025-08-31 12:08:18.262 | INFO | django_tab:run:57 - 执行Django命令: sudo apt install python3-pip +2025-08-31 12:12:38.278 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:12:38.304 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:12:38.305 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:12:38.311 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:12:38.312 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:12:38.313 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:12:38.313 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:12:38.314 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:12:38.316 | INFO | remote_commands_tab:init_ui:252 - 远程命令标签页UI初始化完成 +2025-08-31 12:12:38.317 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:12:39.573 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:12:39.669 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:12:41.242 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:12:41.243 | INFO | django_tab:set_ssh_client:297 - Django标签页已设置SSH客户端 +2025-08-31 12:12:41.243 | INFO | django_tab:set_username:302 - Django标签页已设置用户名: xiaji +2025-08-31 12:12:41.857 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:14:16.554 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:14:16.576 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:14:16.577 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:14:16.583 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:14:16.584 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:14:16.584 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:14:16.584 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:14:16.586 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:14:16.587 | INFO | remote_commands_tab:init_ui:257 - 远程命令标签页UI初始化完成 +2025-08-31 12:14:16.588 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:14:18.055 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:14:18.143 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:14:19.906 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:14:19.906 | INFO | django_tab:set_ssh_client:297 - Django标签页已设置SSH客户端 +2025-08-31 12:14:19.907 | INFO | django_tab:set_username:302 - Django标签页已设置用户名: xiaji +2025-08-31 12:14:20.718 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:17:12.265 | INFO | django_tab:run:58 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:17:12.276 | ERROR | django_tab:run:177 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:17:12.277 | ERROR | django_tab:run:186 - 命令执行失败,退出状态: 1 +2025-08-31 12:17:12.278 | INFO | django_tab:on_command_finished:310 - Django命令执行完成 +2025-08-31 12:17:14.516 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:17:15.418 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:17:15.599 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:17:15.753 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:17:15.897 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:17:16.070 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:28:14.682 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:28:14.713 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:28:14.713 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:28:14.719 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:28:14.720 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:28:14.720 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:28:14.723 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:28:14.729 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 12:28:14.732 | INFO | remote_commands_tab:init_ui:257 - 远程命令标签页UI初始化完成 +2025-08-31 12:28:14.734 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:28:16.581 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:28:16.677 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:28:18.548 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:28:18.549 | INFO | remote_commands_tab:set_ssh_client:260 - 设置SSH客户端 +2025-08-31 12:28:18.550 | INFO | remote_commands_tab:set_server_config:271 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:28:18.551 | INFO | remote_commands_tab:refresh_directory:360 - 刷新目录列表 +2025-08-31 12:28:18.551 | INFO | remote_commands_tab:refresh_directory:372 - 使用用户输入目录: /home/xiaji +2025-08-31 12:28:18.553 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:28:18.560 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: /home/xiaji +2025-08-31 12:28:18.561 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:28:18.564 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: total 84 +2025-08-31 12:28:18.564 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: drwxr-x--- 6 xiaji xiaji 4096 Aug 31 03:17 . +2025-08-31 12:28:18.565 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: drwxr-xr-x 3 root root 4096 Aug 31 2025 .. +2025-08-31 12:28:18.565 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 220 Aug 20 2024 .bash_logout +2025-08-31 12:28:18.565 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 3771 Aug 20 2024 .bashrc +2025-08-31 12:28:18.566 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 02:56 .cache +2025-08-31 12:28:18.566 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: drwxrwxr-x 3 xiaji xiaji 4096 Aug 31 02:59 django.remote +2025-08-31 12:28:18.566 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 807 Aug 20 2024 .profile +2025-08-31 12:28:18.567 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 2025 .ssh +2025-08-31 12:28:18.567 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: drwxrwxr-x 5 xiaji xiaji 4096 Aug 31 02:59 webstatus +2025-08-31 12:28:18.567 | INFO | remote_commands_tab:append_dir_output:386 - 目录列表信息: -rw-rw-r-- 1 xiaji xiaji 47664 Aug 31 03:33 xiaji +2025-08-31 12:28:18.567 | INFO | remote_commands_tab:on_dir_refresh_finished:392 - 目录列表刷新成功 +2025-08-31 12:28:21.355 | INFO | remote_commands_tab:configure_sudo_nopasswd:521 - 配置sudo免密 +2025-08-31 12:28:23.426 | INFO | remote_commands_tab:run:53 - 执行远程命令: whoami && echo ' +' | sudo -S visudo -c && (echo ' +' | sudo -S visudo -f /etc/sudoers.d/nopasswd && echo '$(whoami) ALL=(ALL) NOPASSWD: ALL' | sudo -S tee /etc/sudoers.d/nopasswd && sudo -S chmod 440 /etc/sudoers.d/nopasswd) +2025-08-31 12:28:25.388 | INFO | remote_commands_tab:request_password:298 - 请求输入sudo密码 +2025-08-31 12:28:28.907 | ERROR | remote_commands_tab:run:108 - 执行命令时发生错误: Socket is closed +2025-08-31 12:28:35.787 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:28:35.788 | INFO | django_tab:set_ssh_client:297 - Django标签页已设置SSH客户端 +2025-08-31 12:28:35.789 | INFO | django_tab:set_username:302 - Django标签页已设置用户名: xiaji +2025-08-31 12:28:36.671 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:36:47.844 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:36:47.867 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:36:47.867 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:36:47.874 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:36:47.874 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:36:47.875 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:36:47.876 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:36:47.877 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 12:36:47.878 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 12:36:47.879 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:36:52.798 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:36:52.896 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:36:59.623 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:36:59.624 | INFO | remote_commands_tab:set_ssh_client:279 - 设置SSH客户端 +2025-08-31 12:36:59.624 | INFO | remote_commands_tab:set_server_config:290 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:36:59.625 | INFO | remote_commands_tab:refresh_directory:389 - 刷新目录列表 +2025-08-31 12:36:59.625 | INFO | remote_commands_tab:refresh_directory:401 - 使用用户输入目录: /home/xiaji +2025-08-31 12:36:59.626 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:36:59.636 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: /home/xiaji +2025-08-31 12:36:59.636 | INFO | remote_commands_tab:run:113 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:36:59.636 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: total 84 +2025-08-31 12:36:59.637 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxr-x--- 6 xiaji xiaji 4096 Aug 31 03:17 . +2025-08-31 12:36:59.638 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxr-xr-x 3 root root 4096 Aug 31 2025 .. +2025-08-31 12:36:59.638 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 220 Aug 20 2024 .bash_logout +2025-08-31 12:36:59.638 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 3771 Aug 20 2024 .bashrc +2025-08-31 12:36:59.639 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 02:56 .cache +2025-08-31 12:36:59.639 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxrwxr-x 3 xiaji xiaji 4096 Aug 31 02:59 django.remote +2025-08-31 12:36:59.639 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 807 Aug 20 2024 .profile +2025-08-31 12:36:59.639 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 2025 .ssh +2025-08-31 12:36:59.640 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxrwxr-x 5 xiaji xiaji 4096 Aug 31 02:59 webstatus +2025-08-31 12:36:59.640 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-rw-r-- 1 xiaji xiaji 47664 Aug 31 03:33 xiaji +2025-08-31 12:36:59.640 | INFO | remote_commands_tab:on_dir_refresh_finished:421 - 目录列表刷新成功 +2025-08-31 12:36:59.947 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:36:59.948 | INFO | django_tab:set_ssh_client:297 - Django标签页已设置SSH客户端 +2025-08-31 12:36:59.948 | INFO | django_tab:set_username:302 - Django标签页已设置用户名: xiaji +2025-08-31 12:37:00.651 | INFO | django_tab:run:58 - 执行Django命令: sudo apt install -y -v python3-pip +2025-08-31 12:37:07.983 | INFO | django_tab:run:58 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:37:07.991 | ERROR | django_tab:run:177 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:37:07.992 | ERROR | django_tab:run:186 - 命令执行失败,退出状态: 1 +2025-08-31 12:37:07.993 | INFO | django_tab:on_command_finished:310 - Django命令执行完成 +2025-08-31 12:37:08.763 | INFO | django_tab:run:58 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:37:08.772 | ERROR | django_tab:run:177 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:37:08.772 | ERROR | django_tab:run:186 - 命令执行失败,退出状态: 1 +2025-08-31 12:37:08.774 | INFO | django_tab:on_command_finished:310 - Django命令执行完成 +2025-08-31 12:37:08.922 | INFO | django_tab:run:58 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:37:08.931 | ERROR | django_tab:run:177 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:37:08.932 | ERROR | django_tab:run:186 - 命令执行失败,退出状态: 1 +2025-08-31 12:37:08.933 | INFO | django_tab:on_command_finished:310 - Django命令执行完成 +2025-08-31 12:37:09.089 | INFO | django_tab:run:58 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:37:09.099 | ERROR | django_tab:run:177 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:37:09.099 | ERROR | django_tab:run:186 - 命令执行失败,退出状态: 1 +2025-08-31 12:37:09.100 | INFO | django_tab:on_command_finished:310 - Django命令执行完成 +2025-08-31 12:37:09.243 | INFO | django_tab:run:58 - 执行Django命令: pip3 list | grep Django +2025-08-31 12:37:09.252 | ERROR | django_tab:run:177 - 命令错误: bash: line 1: pip3: command not found +2025-08-31 12:37:09.252 | ERROR | django_tab:run:186 - 命令执行失败,退出状态: 1 +2025-08-31 12:37:09.253 | INFO | django_tab:on_command_finished:310 - Django命令执行完成 +2025-08-31 12:38:41.959 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:38:41.981 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:38:41.982 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:38:41.989 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:38:41.989 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:38:41.990 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:38:41.991 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:38:41.992 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 12:38:41.994 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 12:38:41.995 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:38:44.126 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:38:44.214 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:39:18.310 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 1 +2025-08-31 12:39:18.310 | INFO | remote_commands_tab:set_ssh_client:279 - 设置SSH客户端 +2025-08-31 12:39:18.311 | INFO | remote_commands_tab:set_server_config:290 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 12:39:18.311 | INFO | remote_commands_tab:refresh_directory:389 - 刷新目录列表 +2025-08-31 12:39:18.311 | INFO | remote_commands_tab:refresh_directory:401 - 使用用户输入目录: /home/xiaji +2025-08-31 12:39:18.312 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 12:39:18.321 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: /home/xiaji +2025-08-31 12:39:18.322 | INFO | remote_commands_tab:run:113 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 12:39:18.322 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: total 84 +2025-08-31 12:39:18.323 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxr-x--- 6 xiaji xiaji 4096 Aug 31 03:17 . +2025-08-31 12:39:18.324 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxr-xr-x 3 root root 4096 Aug 31 2025 .. +2025-08-31 12:39:18.324 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 220 Aug 20 2024 .bash_logout +2025-08-31 12:39:18.325 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 3771 Aug 20 2024 .bashrc +2025-08-31 12:39:18.325 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 02:56 .cache +2025-08-31 12:39:18.325 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxrwxr-x 3 xiaji xiaji 4096 Aug 31 02:59 django.remote +2025-08-31 12:39:18.326 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-r--r-- 1 xiaji xiaji 807 Aug 20 2024 .profile +2025-08-31 12:39:18.326 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwx------ 2 xiaji xiaji 4096 Aug 31 2025 .ssh +2025-08-31 12:39:18.326 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: drwxrwxr-x 5 xiaji xiaji 4096 Aug 31 02:59 webstatus +2025-08-31 12:39:18.327 | INFO | remote_commands_tab:append_dir_output:415 - 目录列表信息: -rw-rw-r-- 1 xiaji xiaji 47664 Aug 31 03:33 xiaji +2025-08-31 12:39:18.327 | INFO | remote_commands_tab:on_dir_refresh_finished:421 - 目录列表刷新成功 +2025-08-31 12:39:18.637 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:39:18.638 | INFO | django_tab:set_ssh_client:142 - Django标签页已设置SSH客户端 +2025-08-31 12:39:18.638 | INFO | django_tab:set_username:147 - Django标签页已设置用户名: xiaji +2025-08-31 12:39:24.944 | INFO | django_tab:on_install_progress:180 - Django安装进度: 10% +2025-08-31 12:39:24.965 | INFO | django_tab:on_install_progress:180 - Django安装进度: 30% +2025-08-31 12:39:25.014 | INFO | django_tab:on_install_progress:180 - Django安装进度: 50% +2025-08-31 12:39:40.121 | INFO | django_tab:on_install_progress:180 - Django安装进度: 90% +2025-08-31 12:39:40.319 | INFO | django_threads:run:54 - Django安装成功: 4.2.15 +2025-08-31 12:39:40.320 | INFO | django_tab:on_install_result:186 - Django安装成功: Django安装成功: 4.2.15 +2025-08-31 12:39:46.796 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:39:46.806 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 12:39:46.806 | INFO | django_tab:process_manage_py_result:288 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 12:39:46.807 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:39:46.808 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:39:46.857 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:39:46.857 | INFO | django_tab:process_settings_py_result:315 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:39:46.858 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:39:46.859 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 12:39:48.404 | INFO | django_threads:run:85 - 执行Django命令: cd /home/xiaji/webstatus && python3 manage.py runserver 0.0.0.0:8000 +2025-08-31 12:39:48.933 | INFO | django_threads:run:197 - 命令输出: Performing system checks... +2025-08-31 12:39:48.934 | INFO | django_threads:run:197 - 命令输出: +2025-08-31 12:39:48.960 | INFO | django_threads:run:197 - 命令输出: System check identified no issues (0 silenced). +2025-08-31 12:39:48.984 | INFO | django_threads:run:197 - 命令输出: August 31, 2025 - 12:39:47 +2025-08-31 12:39:48.986 | INFO | django_threads:run:197 - 命令输出: Django version 4.2.15, using settings 'statuspage.settings' +2025-08-31 12:39:48.987 | INFO | django_threads:run:197 - 命令输出: Starting development server at http://0.0.0.0:8000/ +2025-08-31 12:39:48.988 | INFO | django_threads:run:197 - 命令输出: Quit the server with CONTROL-C. +2025-08-31 12:39:48.988 | INFO | django_threads:run:197 - 命令输出: +2025-08-31 12:40:06.466 | INFO | django_tab:download_settings:340 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:55:01.455 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:55:01.480 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:55:01.480 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:55:01.487 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:55:01.487 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:55:01.488 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:55:01.488 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:55:01.490 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 12:55:01.491 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 12:55:01.492 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:55:05.316 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:55:05.402 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:55:07.197 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:55:07.197 | INFO | django_tab:set_ssh_client:142 - Django标签页已设置SSH客户端 +2025-08-31 12:55:07.197 | INFO | django_tab:set_username:147 - Django标签页已设置用户名: xiaji +2025-08-31 12:55:11.461 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:55:11.472 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 12:55:11.472 | INFO | django_tab:process_manage_py_result:288 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 12:55:11.473 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:55:11.475 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:55:11.523 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:55:11.523 | INFO | django_tab:process_settings_py_result:315 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:55:11.523 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:55:11.524 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 12:55:12.221 | INFO | django_tab:download_settings:340 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:57:27.532 | INFO | __main__::73 - 启动应用程序 +2025-08-31 12:57:27.554 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 12:57:27.555 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 12:57:27.562 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 12:57:27.562 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 12:57:27.563 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 12:57:27.563 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 12:57:27.564 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 12:57:27.566 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 12:57:27.567 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 12:57:28.922 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 12:57:29.009 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 12:58:29.681 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 12:58:29.682 | INFO | django_tab:set_ssh_client:142 - Django标签页已设置SSH客户端 +2025-08-31 12:58:29.682 | INFO | django_tab:set_username:147 - Django标签页已设置用户名: xiaji +2025-08-31 12:58:33.077 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:58:33.089 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 12:58:33.089 | INFO | django_tab:process_manage_py_result:288 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 12:58:33.089 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 12:58:33.091 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:58:33.140 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:58:33.140 | INFO | django_tab:process_settings_py_result:315 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:58:33.141 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 12:58:33.142 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 12:58:34.017 | INFO | django_threads:run:85 - 执行Django命令: cd /home/xiaji/webstatus && python3 manage.py runserver 0.0.0.0:8000 +2025-08-31 12:58:34.552 | INFO | django_threads:run:197 - 命令输出: Performing system checks... +2025-08-31 12:58:34.552 | INFO | django_threads:run:197 - 命令输出: +2025-08-31 12:58:34.575 | INFO | django_threads:run:197 - 命令输出: System check identified no issues (0 silenced). +2025-08-31 12:58:34.655 | ERROR | django_threads:run:204 - 命令错误: Watching for file changes with StatReloader +2025-08-31 12:58:34.656 | ERROR | django_threads:run:204 - 命令错误: Error: That port is already in use. +2025-08-31 12:58:34.657 | ERROR | django_threads:run:213 - 命令执行失败,退出状态: 1 +2025-08-31 12:58:34.658 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 12:58:36.203 | INFO | django_tab:download_settings:340 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 12:59:03.421 | INFO | django_tab:upload_settings:426 - 开始上传settings.py文件: C:/Users/xiaji/Documents/个人文件夹/夏骥/桌面部署/settings_backup_20250831_115953.py +2025-08-31 12:59:03.500 | ERROR | django_threads:run:261 - settings.py上传失败: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper +sudo: a password is required + +2025-08-31 12:59:03.500 | ERROR | django_tab:on_upload_result:441 - settings.py上传失败: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper +sudo: a password is required + +2025-08-31 13:00:29.853 | INFO | __main__::73 - 启动应用程序 +2025-08-31 13:00:29.877 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 13:00:29.878 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 13:00:29.884 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 13:00:29.884 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 13:00:29.884 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 13:00:29.886 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 13:00:29.887 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 13:00:29.888 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 13:00:29.890 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 13:00:33.127 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 13:00:33.217 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 13:00:34.538 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 13:00:34.539 | INFO | django_tab:set_ssh_client:142 - Django标签页已设置SSH客户端 +2025-08-31 13:00:34.539 | INFO | django_tab:set_username:147 - Django标签页已设置用户名: xiaji +2025-08-31 13:00:37.157 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 13:00:37.167 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 13:00:37.167 | INFO | django_tab:process_manage_py_result:288 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 13:00:37.167 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 13:00:37.169 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 13:00:37.218 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:00:37.218 | INFO | django_tab:process_settings_py_result:315 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:00:37.218 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 13:00:37.219 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 13:00:38.230 | INFO | django_threads:run:85 - 执行Django命令: cd /home/xiaji/webstatus && python3 manage.py runserver 0.0.0.0:8000 +2025-08-31 13:00:38.750 | INFO | django_threads:run:197 - 命令输出: Performing system checks... +2025-08-31 13:00:38.751 | INFO | django_threads:run:197 - 命令输出: +2025-08-31 13:00:38.774 | INFO | django_threads:run:197 - 命令输出: System check identified no issues (0 silenced). +2025-08-31 13:00:38.852 | ERROR | django_threads:run:204 - 命令错误: Watching for file changes with StatReloader +2025-08-31 13:00:38.853 | ERROR | django_threads:run:204 - 命令错误: Error: That port is already in use. +2025-08-31 13:00:38.854 | ERROR | django_threads:run:213 - 命令执行失败,退出状态: 1 +2025-08-31 13:00:38.856 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 13:01:05.516 | INFO | django_tab:upload_settings:426 - 开始上传settings.py文件: C:/Users/xiaji/Documents/个人文件夹/夏骥/桌面部署/settings.py +2025-08-31 13:01:05.593 | ERROR | django_threads:run:263 - 备份原文件失败: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper +sudo: a password is required + +2025-08-31 13:01:05.594 | ERROR | django_tab:on_upload_result:441 - settings.py上传失败: 备份原文件失败: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper +sudo: a password is required + +2025-08-31 13:01:57.247 | INFO | __main__::73 - 启动应用程序 +2025-08-31 13:01:57.271 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 13:01:57.272 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 13:01:57.278 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 13:01:57.279 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 13:01:57.279 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 13:01:57.280 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 13:01:57.281 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 13:01:57.282 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 13:01:57.283 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 13:02:01.683 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 13:02:01.773 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 13:02:03.835 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 13:02:03.835 | INFO | django_tab:set_ssh_client:142 - Django标签页已设置SSH客户端 +2025-08-31 13:02:03.836 | INFO | django_tab:set_username:147 - Django标签页已设置用户名: xiaji +2025-08-31 13:02:05.469 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 13:02:05.478 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 13:02:05.479 | INFO | django_tab:process_manage_py_result:288 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 13:02:05.479 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 13:02:05.481 | INFO | django_threads:run:85 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 13:02:05.529 | INFO | django_threads:run:197 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:02:05.530 | INFO | django_tab:process_settings_py_result:315 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:02:05.530 | INFO | django_threads:run:210 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 13:02:05.531 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 13:02:11.447 | INFO | django_tab:upload_settings:427 - 开始上传settings.py文件: C:/Users/xiaji/Documents/个人文件夹/夏骥/桌面部署/settings.py +2025-08-31 13:05:46.775 | INFO | __main__::73 - 启动应用程序 +2025-08-31 13:05:46.798 | INFO | __main__:__init__:14 - 初始化主窗口 +2025-08-31 13:05:46.799 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 13:05:46.804 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 13:05:46.805 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 13:05:46.805 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 13:05:46.806 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 13:05:46.807 | INFO | remote_commands_tab:__init__:135 - 初始化远程命令标签页 +2025-08-31 13:05:46.808 | INFO | remote_commands_tab:init_ui:276 - 远程命令标签页UI初始化完成 +2025-08-31 13:05:46.809 | INFO | __main__:__init__:37 - 主窗口初始化完成 +2025-08-31 13:05:48.150 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 13:05:48.236 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 13:05:50.256 | INFO | __main__:on_tab_changed:40 - 标签页切换到: 2 +2025-08-31 13:05:50.256 | INFO | django_tab:set_ssh_client:142 - Django标签页已设置SSH客户端 +2025-08-31 13:05:50.257 | INFO | django_tab:set_username:147 - Django标签页已设置用户名: xiaji +2025-08-31 13:05:51.020 | INFO | django_threads:run:86 - 执行Django命令: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 13:05:51.031 | INFO | django_threads:run:198 - 命令输出: /home/xiaji/webstatus/manage.py +2025-08-31 13:05:51.031 | INFO | django_tab:process_manage_py_result:288 - 找到manage.py文件: /home/xiaji/webstatus/manage.py +2025-08-31 13:05:51.031 | INFO | django_threads:run:211 - 命令执行成功: find /home/xiaji -name "manage.py" 2>/dev/null | head -5 +2025-08-31 13:05:51.033 | INFO | django_threads:run:86 - 执行Django命令: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 13:05:51.081 | INFO | django_threads:run:198 - 命令输出: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:05:51.081 | INFO | django_tab:process_settings_py_result:315 - 找到settings.py文件: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:05:51.082 | INFO | django_threads:run:211 - 命令执行成功: find /home/xiaji -name "settings.py" 2>/dev/null | head -5 +2025-08-31 13:05:51.083 | INFO | django_tab:on_command_finished:155 - Django命令执行完成 +2025-08-31 13:05:53.120 | INFO | django_tab:download_settings:340 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:06:01.708 | INFO | django_tab:upload_settings:427 - 开始上传settings.py文件: C:/Users/xiaji/Documents/个人文件夹/夏骥/桌面部署/settings.py +2025-08-31 13:06:12.182 | INFO | django_tab:download_settings:340 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:06:54.294 | INFO | django_tab:save_settings_to_server:368 - settings.py已保存到服务器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:06:59.281 | INFO | django_tab:download_settings:340 - settings.py已加载到编辑器: /home/xiaji/webstatus/statuspage/settings.py +2025-08-31 13:07:04.074 | INFO | django_threads:run:86 - 执行Django命令: cd /home/xiaji/webstatus && python3 manage.py runserver 0.0.0.0:8000 +2025-08-31 13:07:04.606 | INFO | django_threads:run:198 - 命令输出: Performing system checks... +2025-08-31 13:07:04.609 | INFO | django_threads:run:198 - 命令输出: +2025-08-31 13:07:04.631 | INFO | django_threads:run:198 - 命令输出: System check identified no issues (0 silenced). +2025-08-31 13:07:04.653 | INFO | django_threads:run:198 - 命令输出: August 31, 2025 - 13:07:02 +2025-08-31 13:07:04.654 | INFO | django_threads:run:198 - 命令输出: Django version 4.2.15, using settings 'statuspage.settings' +2025-08-31 13:07:04.655 | INFO | django_threads:run:198 - 命令输出: Starting development server at http://0.0.0.0:8000/ +2025-08-31 13:07:04.655 | INFO | django_threads:run:198 - 命令输出: Quit the server with CONTROL-C. +2025-08-31 13:07:04.656 | INFO | django_threads:run:198 - 命令输出: diff --git a/django_tab.py b/django_tab.py new file mode 100644 index 0000000..7290f3b --- /dev/null +++ b/django_tab.py @@ -0,0 +1,456 @@ +import os +import sys +import datetime +from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton, + QLabel, QTextEdit, QFileDialog, QMessageBox, + QLineEdit, QDialog, QDialogButtonBox) +from PySide6.QtCore import QThread, Signal +from loguru import logger +from django_threads import DjangoInstallThread, DjangoCommandThread, UploadSettingsThread + +class PasswordDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("输入密码") + self.setMinimumWidth(300) + + layout = QVBoxLayout() + + # 提示标签 + label = QLabel("请输入sudo密码:") + layout.addWidget(label) + + # 密码输入框 + self.password_input = QLineEdit() + self.password_input.setEchoMode(QLineEdit.Password) + layout.addWidget(self.password_input) + + # 按钮 + button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + button_box.accepted.connect(self.accept) + button_box.rejected.connect(self.reject) + layout.addWidget(button_box) + + self.setLayout(layout) + + def get_password(self): + return self.password_input.text() + +class DjangoTab(QWidget): + def __init__(self): + super().__init__() + self.ssh_client = None + self.username = "" + self.manage_py_path = "" + self.settings_py_path = "" + self.init_ui() + + def init_ui(self): + layout = QVBoxLayout() + + # Django管理区域 + manage_layout = QHBoxLayout() + + # 安装Django按钮 + self.install_django_btn = QPushButton("安装Django") + self.install_django_btn.clicked.connect(self.install_django) + manage_layout.addWidget(self.install_django_btn) + + # 测试启动按钮 + self.test_server_btn = QPushButton("测试启动") + self.test_server_btn.clicked.connect(self.test_server) + manage_layout.addWidget(self.test_server_btn) + + # 检查Django状态按钮 + self.check_django_btn = QPushButton("检查Django状态") + self.check_django_btn.clicked.connect(self.check_django_status) + manage_layout.addWidget(self.check_django_btn) + + # 收集静态文件按钮 + self.collect_static_btn = QPushButton("收集静态文件") + self.collect_static_btn.clicked.connect(self.collect_static) + manage_layout.addWidget(self.collect_static_btn) + + layout.addLayout(manage_layout) + + # 文件管理区域 + file_layout = QHBoxLayout() + + # 查找文件按钮 + self.find_files_btn = QPushButton("查找manage.py和settings.py") + self.find_files_btn.clicked.connect(self.find_django_files) + file_layout.addWidget(self.find_files_btn) + + # 下载settings.py按钮 + self.download_settings_btn = QPushButton("下载settings.py") + self.download_settings_btn.clicked.connect(self.download_settings) + file_layout.addWidget(self.download_settings_btn) + + # 上传settings.py按钮 + self.upload_settings_btn = QPushButton("上传settings.py") + self.upload_settings_btn.clicked.connect(self.upload_settings) + file_layout.addWidget(self.upload_settings_btn) + + layout.addLayout(file_layout) + + # 文件路径显示区域 + path_layout = QHBoxLayout() + + # manage.py路径 + manage_path_layout = QVBoxLayout() + manage_path_layout.addWidget(QLabel("manage.py路径:")) + self.manage_path_label = QLabel("未找到") + manage_path_layout.addWidget(self.manage_path_label) + path_layout.addLayout(manage_path_layout) + + # settings.py路径 + settings_path_layout = QVBoxLayout() + settings_path_layout.addWidget(QLabel("settings.py路径:")) + self.settings_path_label = QLabel("未找到") + settings_path_layout.addWidget(self.settings_path_label) + path_layout.addLayout(settings_path_layout) + + layout.addLayout(path_layout) + + # 文件编辑区域 + edit_layout = QVBoxLayout() + edit_layout.addWidget(QLabel("settings.py编辑器:")) + + # 文件编辑文本框 + self.settings_editor = QTextEdit() + self.settings_editor.setReadOnly(True) + edit_layout.addWidget(self.settings_editor) + + # 保存按钮 + self.save_settings_btn = QPushButton("保存settings.py到服务器") + self.save_settings_btn.clicked.connect(self.save_settings_to_server) + self.save_settings_btn.setEnabled(False) # 初始状态禁用 + edit_layout.addWidget(self.save_settings_btn) + + layout.addLayout(edit_layout) + + # 输出区域 + self.output_text = QTextEdit() + self.output_text.setReadOnly(True) + layout.addWidget(self.output_text) + + self.setLayout(layout) + + def set_ssh_client(self, ssh_client): + """设置SSH客户端""" + self.ssh_client = ssh_client + logger.info("Django标签页已设置SSH客户端") + + def set_username(self, username): + """设置用户名""" + self.username = username + logger.info(f"Django标签页已设置用户名: {username}") + + def append_output(self, text): + """添加输出到文本框""" + self.output_text.append(text) + + def on_command_finished(self): + """命令执行完成时的处理""" + logger.info("Django命令执行完成") + + def install_django(self): + """安装Django""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + # 请求用户输入sudo密码 + dialog = PasswordDialog(self) + if dialog.exec_() == QDialog.Accepted: + password = dialog.get_password() + self.append_output("正在安装Django...") + + # 创建并启动Django安装线程 + self.install_thread = DjangoInstallThread(self.ssh_client, password) + self.install_thread.progress_updated.connect(self.on_install_progress) + self.install_thread.result_ready.connect(self.on_install_result) + self.install_thread.start() + else: + self.append_output("用户取消了密码输入") + + def on_install_progress(self, progress): + """处理安装进度更新""" + self.append_output(f"安装进度: {progress}%") + logger.info(f"Django安装进度: {progress}%") + + def on_install_result(self, success, message): + """处理安装结果""" + if success: + self.append_output(f"安装成功: {message}") + logger.info(f"Django安装成功: {message}") + QMessageBox.information(self, "成功", message) + else: + self.append_output(f"安装失败: {message}") + logger.error(f"Django安装失败: {message}") + QMessageBox.warning(self, "错误", f"Django安装失败: {message}") + + def request_password(self): + """请求用户输入密码""" + dialog = PasswordDialog(self) + if dialog.exec_() == QDialog.Accepted: + password = dialog.get_password() + self.thread.set_password(password) + logger.info("用户已输入密码") + else: + self.thread.set_password("") + logger.info("用户取消了密码输入") + + def test_server(self): + """测试启动Django服务器""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.manage_py_path: + self.append_output("错误: 未找到manage.py文件,请先查找文件") + return + + # 切换到manage.py所在目录并执行命令 + manage_dir = os.path.dirname(self.manage_py_path) + command = f"cd {manage_dir} && python3 manage.py runserver 0.0.0.0:8000" + self.append_output(f"执行命令: {command}") + + # 创建并启动线程执行命令 + self.thread = DjangoCommandThread(self.ssh_client, command) + self.thread.output_signal.connect(self.append_output) + self.thread.finished_signal.connect(self.on_command_finished) + self.thread.start() + + def check_django_status(self): + """检查Django安装状态""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + command = "pip3 list | grep Django" + self.append_output(f"执行命令: {command}") + + # 创建并启动线程执行命令 + self.thread = DjangoCommandThread(self.ssh_client, command) + self.thread.output_signal.connect(self.append_output) + self.thread.finished_signal.connect(self.on_command_finished) + self.thread.start() + + def collect_static(self): + """收集静态文件""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.manage_py_path: + self.append_output("错误: 未找到manage.py文件,请先查找文件") + return + + # 切换到manage.py所在目录并执行命令 + manage_dir = os.path.dirname(self.manage_py_path) + command = f"cd {manage_dir} && python3 manage.py collectstatic --noinput" + self.append_output(f"执行命令: {command}") + + # 创建并启动线程执行命令 + self.thread = DjangoCommandThread(self.ssh_client, command) + self.thread.output_signal.connect(self.append_output) + self.thread.finished_signal.connect(self.on_command_finished) + self.thread.start() + + def find_django_files(self): + """查找manage.py和settings.py文件""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.username: + self.append_output("错误: 未获取到用户名") + return + + self.append_output("正在查找Django项目文件...") + + # 查找manage.py文件 + find_manage_cmd = f"find /home/{self.username} -name \"manage.py\" 2>/dev/null | head -5" + self.append_output(f"执行命令: {find_manage_cmd}") + + # 创建并启动线程执行命令 + self.thread = DjangoCommandThread(self.ssh_client, find_manage_cmd) + self.thread.output_signal.connect(self.process_manage_py_result) + self.thread.finished_signal.connect(self.find_settings_py) + self.thread.start() + + def process_manage_py_result(self, text): + """处理manage.py查找结果""" + if text.startswith("/") and text.endswith("manage.py"): + self.manage_py_path = text + self.manage_path_label.setText(text) + logger.info(f"找到manage.py文件: {text}") + + def find_settings_py(self): + """查找settings.py文件""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.username: + self.append_output("错误: 未获取到用户名") + return + + # 查找settings.py文件 + find_settings_cmd = f"find /home/{self.username} -name \"settings.py\" 2>/dev/null | head -5" + self.append_output(f"执行命令: {find_settings_cmd}") + + # 创建并启动线程执行命令 + self.thread = DjangoCommandThread(self.ssh_client, find_settings_cmd) + self.thread.output_signal.connect(self.process_settings_py_result) + self.thread.finished_signal.connect(self.on_command_finished) + self.thread.start() + + def process_settings_py_result(self, text): + """处理settings.py查找结果""" + if text.startswith("/") and text.endswith("settings.py"): + self.settings_py_path = text + self.settings_path_label.setText(text) + logger.info(f"找到settings.py文件: {text}") + + def download_settings(self): + """下载settings.py文件并在编辑器中显示""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.settings_py_path: + self.append_output("错误: 未找到settings.py文件,请先查找文件") + return + + try: + # 使用SFTP下载文件内容 + sftp = self.ssh_client.open_sftp() + with sftp.file(self.settings_py_path, 'r') as remote_file: + file_content = remote_file.read().decode('utf-8') + sftp.close() + + # 在编辑器中显示文件内容 + self.settings_editor.setPlainText(file_content) + self.settings_editor.setReadOnly(False) # 允许编辑 + self.save_settings_btn.setEnabled(True) # 启用保存按钮 + + self.append_output(f"文件已加载到编辑器: {self.settings_py_path}") + logger.info(f"settings.py已加载到编辑器: {self.settings_py_path}") + + except Exception as e: + error_msg = f"下载文件时出错: {str(e)}" + self.append_output(error_msg) + logger.error(error_msg) + + def save_settings_to_server(self): + """将编辑器中的settings.py内容保存到服务器""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.settings_py_path: + self.append_output("错误: 未找到settings.py文件,请先查找文件") + return + + try: + # 获取编辑器中的内容 + file_content = self.settings_editor.toPlainText() + + # 使用SFTP上传文件内容 + sftp = self.ssh_client.open_sftp() + with sftp.file(self.settings_py_path, 'w') as remote_file: + remote_file.write(file_content.encode('utf-8')) + sftp.close() + + self.append_output(f"文件已保存到服务器: {self.settings_py_path}") + logger.info(f"settings.py已保存到服务器: {self.settings_py_path}") + + # 显示成功消息 + QMessageBox.information(self, "保存成功", "settings.py文件已成功保存到服务器") + + except Exception as e: + error_msg = f"保存文件时出错: {str(e)}" + self.append_output(error_msg) + logger.error(error_msg) + + def upload_settings(self): + """上传settings.py文件""" + if not self.ssh_client: + self.append_output("错误: 未连接到服务器") + return + + if not self.settings_py_path: + self.append_output("错误: 未找到settings.py文件,请先查找文件") + return + + # 直接打开文件选择对话框,让用户选择本地settings.py文件 + file_path, _ = QFileDialog.getOpenFileName( + self, + "选择要上传的settings.py文件", + "", + "Python文件 (*.py);;所有文件 (*)" + ) + + if not file_path: + self.append_output("用户取消了文件选择") + return + + # 验证选择的文件是否为settings.py + if os.path.basename(file_path) != "settings.py": + reply = QMessageBox.question( + self, + "文件名验证", + "选择的文件不是settings.py,是否继续上传?", + QMessageBox.Yes | QMessageBox.No + ) + if reply == QMessageBox.No: + self.append_output("用户取消了上传") + return + + try: + # 读取文件内容 + with open(file_path, 'r', encoding='utf-8') as f: + settings_content = f.read() + + # 获取Django项目路径(settings.py所在目录的父目录) + django_path = os.path.dirname(os.path.dirname(self.settings_py_path)) + + # 创建并启动上传线程 + self.upload_thread = UploadSettingsThread(self.ssh_client, django_path, settings_content) + self.upload_thread.result_ready.connect(self.on_upload_result) + self.upload_thread.password_request_signal.connect(self.request_upload_password) + self.upload_thread.start() + + self.append_output(f"正在上传文件: {os.path.basename(file_path)}...") + logger.info(f"开始上传settings.py文件: {file_path}") + + except Exception as e: + error_msg = f"读取文件时出错: {str(e)}" + self.append_output(error_msg) + logger.error(error_msg) + + def request_upload_password(self): + """请求用户输入密码(用于上传settings.py)""" + dialog = PasswordDialog(self) + if dialog.exec_() == QDialog.Accepted: + password = dialog.get_password() + self.upload_thread.set_password(password) + self.append_output("密码已发送") + logger.info("用户已输入上传密码") + else: + self.upload_thread.set_password("") + self.append_output("用户取消了密码输入") + logger.info("用户取消了上传密码输入") + + def on_upload_result(self, success, message): + """处理上传结果""" + if success: + self.append_output(f"上传成功: {message}") + logger.info(f"settings.py上传成功: {message}") + QMessageBox.information(self, "上传成功", message) + else: + self.append_output(f"上传失败: {message}") + logger.error(f"settings.py上传失败: {message}") + QMessageBox.warning(self, "上传失败", f"settings.py上传失败: {message}") \ No newline at end of file diff --git a/django_threads.py b/django_threads.py new file mode 100644 index 0000000..4d9cba4 --- /dev/null +++ b/django_threads.py @@ -0,0 +1,364 @@ +import os +import sys +import time +from PySide6.QtCore import QThread, Signal +from loguru import logger + +class DjangoInstallThread(QThread): + """安装Django的线程""" + result_ready = Signal(bool, str) + progress_updated = Signal(int) + + def __init__(self, ssh_client, password): + super().__init__() + self.ssh_client = ssh_client + self.password = password + + def run(self): + try: + self.progress_updated.emit(10) + + # 检查Django是否已安装 + stdin, stdout, stderr = self.ssh_client.exec_command("python3 -m django --version") + django_version = stdout.read().decode().strip() + + if django_version: + self.result_ready.emit(True, f"Django已安装: {django_version}") + logger.info(f"Django已安装: {django_version}") + return + + self.progress_updated.emit(30) + + # 尝试使用pip安装 + stdin, stdout, stderr = self.ssh_client.exec_command("pip3 install --break-system-packages django") + exit_status = stdout.channel.recv_exit_status() + + if exit_status == 0: + self.progress_updated.emit(90) + stdin, stdout, stderr = self.ssh_client.exec_command("python3 -m django --version") + django_version = stdout.read().decode().strip() + self.result_ready.emit(True, f"Django安装成功: {django_version}") + logger.info(f"Django安装成功: {django_version}") + return + + self.progress_updated.emit(50) + + # 如果pip安装失败,尝试使用apt安装,使用-S选项从标准输入读取密码 + stdin, stdout, stderr = self.ssh_client.exec_command(f"echo '{self.password}' | sudo -S apt update && echo '{self.password}' | sudo -S apt install -y python3-django") + exit_status = stdout.channel.recv_exit_status() + + if exit_status == 0: + self.progress_updated.emit(90) + stdin, stdout, stderr = self.ssh_client.exec_command("python3 -m django --version") + django_version = stdout.read().decode().strip() + self.result_ready.emit(True, f"Django安装成功: {django_version}") + logger.info(f"Django安装成功: {django_version}") + else: + error = stderr.read().decode() + self.result_ready.emit(False, f"Django安装失败: {error}") + logger.error(f"Django安装失败: {error}") + + except Exception as e: + error_msg = str(e) + self.result_ready.emit(False, error_msg) + logger.error(f"Django安装异常: {error_msg}") + +class DjangoCommandThread(QThread): + """执行Django相关命令的线程""" + output_signal = Signal(str) + finished_signal = Signal() + password_request_signal = Signal() # 请求密码的信号 + + def __init__(self, ssh_client, command, log_file=None): + super().__init__() + self.ssh_client = ssh_client + self.command = command + self.password = None + self.waiting_for_password = False + self.log_file = log_file # 日志文件路径,如果提供则将输出重定向到该文件 + + def set_password(self, password): + self.password = password + self.waiting_for_password = False + + def run(self): + try: + logger.info(f"执行Django命令: {self.command}") + + # 如果提供了日志文件路径,修改命令以重定向输出 + if self.log_file: + self.command = f"{self.command} > {self.log_file} 2>&1" + self.output_signal.emit(f"命令输出将重定向到日志文件: {self.log_file}") + + # 如果命令包含sudo,修改为使用-S选项从标准输入读取密码 + if "sudo" in self.command: + command_with_sudo = self.command.replace("sudo", "sudo -S") + stdin, stdout, stderr = self.ssh_client.exec_command(command_with_sudo) + + # 检查是否需要密码 + password_prompt = False + for line in iter(stderr.readline, ""): + line_text = line.strip() + self.output_signal.emit(line_text) + if "password for" in line_text.lower() or "密码" in line_text: + password_prompt = True + break + + # 如果需要密码,请求用户输入 + if password_prompt: + self.waiting_for_password = True + self.password_request_signal.emit() + + # 等待密码输入 + while self.waiting_for_password: + self.msleep(100) + + # 发送密码 + if self.password: + stdin.write(self.password + "\n") + stdin.flush() + self.output_signal.emit("密码已发送") + else: + self.output_signal.emit("未提供密码,命令可能失败") + else: + stdin, stdout, stderr = self.ssh_client.exec_command(self.command) + + # 对于apt命令,使用特殊处理以显示进度 + if "apt install" in self.command: + # 使用非交互模式并显示进度 + self.output_signal.emit("正在安装软件包,请稍候...") + + # 读取输出和错误,实时显示 + import select + import time + + # 检查是否需要密码 + password_sent = False + + while not stdout.channel.exit_status_ready(): + # 检查是否有数据可读 + r, w, e = select.select([stdout.channel, stderr.channel], [], [], 0.1) + + if stdout.channel in r: + output = stdout.channel.recv(1024).decode('utf-8', errors='replace') + if output: + self.output_signal.emit(output.strip()) + logger.info(f"命令输出: {output.strip()}") + + if stderr.channel in r: + error = stderr.channel.recv(1024).decode('utf-8', errors='replace') + if error: + # 检查是否需要密码 + if ("password for" in error.lower() or "密码" in error) and not password_sent: + self.output_signal.emit("检测到需要输入密码") + self.waiting_for_password = True + self.password_request_signal.emit() + + # 等待密码输入 + while self.waiting_for_password: + self.msleep(100) + + # 发送密码 + if self.password: + stdin.write(self.password + "\n") + stdin.flush() + password_sent = True + self.output_signal.emit("密码已发送") + else: + self.output_signal.emit("未提供密码,命令可能失败") + else: + self.output_signal.emit(error.strip()) + logger.error(f"命令错误: {error.strip()}") + + # 短暂休眠以避免过度占用CPU + time.sleep(0.01) + + # 读取剩余输出 + while True: + r, w, e = select.select([stdout.channel, stderr.channel], [], [], 0.1) + if not r: + break + + if stdout.channel in r: + output = stdout.channel.recv(1024).decode('utf-8', errors='replace') + if output: + self.output_signal.emit(output.strip()) + logger.info(f"命令输出: {output.strip()}") + + if stderr.channel in r: + error = stderr.channel.recv(1024).decode('utf-8', errors='replace') + if error: + self.output_signal.emit(error.strip()) + logger.error(f"命令错误: {error.strip()}") + else: + # 对于非apt命令,使用原有的行读取方式 + # 读取输出 + for line in iter(stdout.readline, ""): + self.output_signal.emit(line.strip()) + logger.info(f"命令输出: {line.strip()}") + + # 读取错误 + for line in iter(stderr.readline, ""): + line_text = line.strip() + if "password for" not in line_text.lower() and "密码" not in line_text: # 避免重复显示密码提示 + self.output_signal.emit(f"错误: {line_text}") + logger.error(f"命令错误: {line_text}") + + # 检查退出状态 + exit_status = stdout.channel.recv_exit_status() + if exit_status == 0: + self.output_signal.emit("命令执行成功") + logger.info(f"命令执行成功: {self.command}") + else: + self.output_signal.emit(f"命令执行失败,退出状态: {exit_status}") + logger.error(f"命令执行失败,退出状态: {exit_status}") + except Exception as e: + error_msg = f"执行命令时出错: {str(e)}" + self.output_signal.emit(error_msg) + logger.error(error_msg) + finally: + self.finished_signal.emit() + +class UploadSettingsThread(QThread): + """上传settings.py文件的线程""" + result_ready = Signal(bool, str) + password_request_signal = Signal() # 请求密码的信号 + + def __init__(self, ssh_client, django_path, settings_content): + super().__init__() + self.ssh_client = ssh_client + self.django_path = django_path + self.settings_content = settings_content + self.password = None + self.waiting_for_password = False + + def set_password(self, password): + self.password = password + self.waiting_for_password = False + + def run(self): + try: + # 查找settings.py文件 + stdin, stdout, stderr = self.ssh_client.exec_command(f"find {self.django_path} -name settings.py") + exit_status = stdout.channel.recv_exit_status() + + if exit_status != 0: + self.result_ready.emit(False, "未找到settings.py文件") + logger.error("未找到settings.py文件") + return + + settings_path = stdout.read().decode().strip() + + # 创建临时文件 + temp_file = "/tmp/settings_upload.py" + sftp = self.ssh_client.open_sftp() + + with sftp.file(temp_file, 'w') as f: + f.write(self.settings_content) + + # 在覆盖前备份原文件(带时间戳) + import datetime + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + backup_path = f"{settings_path}.backup_{timestamp}" + + # 备份原文件 + stdin, stdout, stderr = self.ssh_client.exec_command(f"sudo -S cp {settings_path} {backup_path}") + + # 检查是否需要密码 + password_sent = False + while True: + if stderr.channel.recv_ready(): + error = stderr.channel.recv(1024).decode('utf-8', errors='replace') + if error: + # 检查是否需要密码 + if ("password for" in error.lower() or "密码" in error) and not password_sent: + self.waiting_for_password = True + self.password_request_signal.emit() + + # 等待密码输入 + while self.waiting_for_password: + self.msleep(100) + + # 发送密码 + if self.password: + stdin.write(self.password + "\n") + stdin.flush() + password_sent = True + else: + self.result_ready.emit(False, "未提供密码,备份失败") + logger.error("未提供密码,备份失败") + sftp.close() + return + else: + logger.error(f"备份错误: {error.strip()}") + + if stdout.channel.exit_status_ready(): + break + + # 短暂休眠以避免过度占用CPU + time.sleep(0.01) + + exit_status = stdout.channel.recv_exit_status() + + if exit_status != 0: + error = stderr.read().decode() + self.result_ready.emit(False, f"备份原文件失败: {error}") + logger.error(f"备份原文件失败: {error}") + sftp.close() + return + + logger.info(f"原文件已备份至: {backup_path}") + + # 移动临时文件到目标位置 + stdin, stdout, stderr = self.ssh_client.exec_command(f"sudo -S mv {temp_file} {settings_path}") + + # 检查是否需要密码 + password_sent = False + while True: + if stderr.channel.recv_ready(): + error = stderr.channel.recv(1024).decode('utf-8', errors='replace') + if error: + # 检查是否需要密码 + if ("password for" in error.lower() or "密码" in error) and not password_sent: + self.waiting_for_password = True + self.password_request_signal.emit() + + # 等待密码输入 + while self.waiting_for_password: + self.msleep(100) + + # 发送密码 + if self.password: + stdin.write(self.password + "\n") + stdin.flush() + password_sent = True + else: + self.result_ready.emit(False, "未提供密码,移动文件失败") + logger.error("未提供密码,移动文件失败") + sftp.close() + return + else: + logger.error(f"移动文件错误: {error.strip()}") + + if stdout.channel.exit_status_ready(): + break + + # 短暂休眠以避免过度占用CPU + time.sleep(0.01) + + exit_status = stdout.channel.recv_exit_status() + + if exit_status == 0: + self.result_ready.emit(True, f"settings.py上传成功,原文件已备份为: {os.path.basename(backup_path)}") + logger.info(f"settings.py上传成功,原文件已备份为: {os.path.basename(backup_path)}") + else: + error = stderr.read().decode() + self.result_ready.emit(False, error) + logger.error(f"settings.py上传失败: {error}") + + sftp.close() + + except Exception as e: + error_msg = str(e) + self.result_ready.emit(False, error_msg) + logger.error(f"settings.py上传异常: {error_msg}") \ No newline at end of file diff --git a/main.py b/main.py index ee27901..0e999ff 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,7 @@ from loguru import logger from server_connection_tab import ServerConnectionTab from remote_commands_tab import RemoteCommandsTab +from django_tab import DjangoTab class MainWindow(QMainWindow): def __init__(self): @@ -26,6 +27,10 @@ class MainWindow(QMainWindow): self.remote_commands_tab = RemoteCommandsTab() self.tabs.addTab(self.remote_commands_tab, "远程命令") + # 添加Django管理标签页 + self.django_tab = DjangoTab() + self.tabs.addTab(self.django_tab, "Django") + # 连接标签页切换信号 self.tabs.currentChanged.connect(self.on_tab_changed) @@ -50,6 +55,18 @@ class MainWindow(QMainWindow): # 如果没有配置远程目录,初始化为默认目录 self.remote_commands_tab.current_dir_display.setText("~") self.remote_commands_tab.refresh_directory() + + # 当切换到Django标签页时,传递SSH客户端和用户名 + elif index == 2: # Django标签页 + ssh_client = self.server_connection_tab.get_ssh_client() + self.django_tab.set_ssh_client(ssh_client) + + # 获取当前选中的服务器配置中的用户名 + current_alias = self.server_connection_tab.alias_combo.currentText() + if current_alias and current_alias in self.server_connection_tab.config_data: + server_config = self.server_connection_tab.config_data[current_alias] + username = server_config.get("username", "") + self.django_tab.set_username(username) if __name__ == "__main__": logger.add("app.log", rotation="10 MB") diff --git a/remote_commands_tab.py b/remote_commands_tab.py index c34ac00..7198c08 100644 --- a/remote_commands_tab.py +++ b/remote_commands_tab.py @@ -52,6 +52,18 @@ class RemoteCommandThread(QThread): try: logger.info(f"执行远程命令: {self.command}") + # 检查SSH连接是否仍然有效 + try: + # 尝试执行一个简单的命令来检查连接 + transport = self.ssh_client.get_transport() if self.ssh_client else None + if not transport or not transport.is_active(): + raise Exception("SSH连接已断开") + except Exception as e: + logger.error(f"SSH连接检查失败: {str(e)}") + self.output_signal.emit(f"错误: SSH连接已断开,请重新连接服务器") + self.finished_signal.emit(False, f"SSH连接已断开,请重新连接服务器") + return + # 如果命令包含sudo,修改为使用-S选项从标准输入读取密码 if "sudo" in self.command: command_with_sudo = self.command.replace("sudo", "sudo -S") @@ -106,8 +118,15 @@ class RemoteCommandThread(QThread): except Exception as e: logger.error(f"执行命令时发生错误: {str(e)}") - self.output_signal.emit(f"错误: {str(e)}") - self.finished_signal.emit(False, f"执行命令时发生错误: {str(e)}") + error_msg = str(e) + + # 检查是否是Socket关闭错误 + if "Socket is closed" in error_msg or "SSH session not active" in error_msg: + self.output_signal.emit(f"错误: SSH连接已断开,请重新连接服务器") + self.finished_signal.emit(False, "SSH连接已断开,请重新连接服务器") + else: + self.output_signal.emit(f"错误: {error_msg}") + self.finished_signal.emit(False, f"执行命令时发生错误: {error_msg}") class RemoteCommandsTab(QWidget): def __init__(self): @@ -161,6 +180,34 @@ class RemoteCommandsTab(QWidget): git_group.setLayout(git_layout) main_layout.addWidget(git_group) + # 系统管理组 + system_group = QGroupBox("系统管理") + system_layout = QVBoxLayout() + + # 时区设置 + timezone_layout = QHBoxLayout() + self.set_timezone_button = QPushButton("设置时区为北京时区") + self.set_timezone_button.clicked.connect(self.set_timezone) + timezone_layout.addWidget(self.set_timezone_button) + timezone_layout.addStretch() + system_layout.addLayout(timezone_layout) + + # 服务器重启 + reboot_layout = QHBoxLayout() + self.reboot_button = QPushButton("重启服务器") + self.reboot_button.clicked.connect(self.reboot_server) + reboot_layout.addWidget(self.reboot_button) + reboot_layout.addStretch() + system_layout.addLayout(reboot_layout) + + # 配置sudo免密按钮 + self.sudo_nopasswd_button = QPushButton("配置sudo免密") + self.sudo_nopasswd_button.clicked.connect(self.configure_sudo_nopasswd) + system_layout.addWidget(self.sudo_nopasswd_button) + + system_group.setLayout(system_layout) + main_layout.addWidget(system_group) + # 目录管理组 dir_group = QGroupBox("目录管理") dir_layout = QVBoxLayout() @@ -326,7 +373,17 @@ class RemoteCommandsTab(QWidget): else: self.status_label.setText(message) self.status_label.setStyleSheet("color: red;") - QMessageBox.warning(self, "错误", message) + + # 检查是否是SSH连接断开错误 + if "SSH连接已断开" in message: + reply = QMessageBox.question(self, "SSH连接已断开", + f"{message}\n\n是否现在重新连接服务器?", + QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) + + if reply == QMessageBox.Yes: + self.reconnect_ssh() + else: + QMessageBox.warning(self, "错误", message) def refresh_directory(self): logger.info("刷新目录列表") @@ -354,16 +411,107 @@ class RemoteCommandsTab(QWidget): def append_dir_output(self, text): self.dir_list_text.append(text) + # 将目录信息输出到日志文件 + logger.info(f"目录列表信息: {text.strip()}") def on_dir_refresh_finished(self, success, message): if success: self.status_label.setText("目录列表已刷新") self.status_label.setStyleSheet("color: green;") + logger.info("目录列表刷新成功") else: self.status_label.setText("刷新目录列表失败") self.status_label.setStyleSheet("color: red;") + logger.error(f"刷新目录列表失败: {message}") QMessageBox.warning(self, "错误", f"刷新目录列表失败: {message}") + def set_timezone(self): + logger.info("设置时区为北京时区") + + if not self.ssh_client: + QMessageBox.warning(self, "警告", "请先连接到服务器") + return + + # 确认操作 + reply = QMessageBox.question(self, "确认设置时区", + "确定要将服务器时区设置为北京时区吗?", + QMessageBox.Yes | QMessageBox.No, QMessageBox.No) + + if reply == QMessageBox.No: + return + + self.output_text.clear() + self.status_label.setText("正在设置时区...") + + # 创建并启动线程执行命令 + command = "sudo timedatectl set-timezone Asia/Shanghai" + self.command_thread = RemoteCommandThread(self.ssh_client, command) + self.command_thread.output_signal.connect(self.append_output) + self.command_thread.finished_signal.connect(self.on_timezone_set) + self.command_thread.password_request_signal.connect(self.request_password) + self.command_thread.start() + + def on_timezone_set(self, success, message): + if success: + self.status_label.setText("时区设置成功") + self.status_label.setStyleSheet("color: green;") + QMessageBox.information(self, "成功", "服务器时区已设置为北京时区") + + # 显示当前时区 + self.show_current_timezone() + else: + self.status_label.setText("时区设置失败") + self.status_label.setStyleSheet("color: red;") + QMessageBox.warning(self, "错误", f"设置时区失败: {message}") + + def show_current_timezone(self): + logger.info("显示当前时区") + + if not self.ssh_client: + return + + command = "timedatectl status" + self.command_thread = RemoteCommandThread(self.ssh_client, command) + self.command_thread.output_signal.connect(self.append_output) + self.command_thread.finished_signal.connect(lambda success, message: None) + self.command_thread.start() + + def reboot_server(self): + logger.info("重启服务器") + + if not self.ssh_client: + QMessageBox.warning(self, "警告", "请先连接到服务器") + return + + # 确认操作 + reply = QMessageBox.question(self, "确认重启", + "确定要重启服务器吗?\n此操作将导致服务器临时不可用!", + QMessageBox.Yes | QMessageBox.No, QMessageBox.No) + + if reply == QMessageBox.No: + return + + self.output_text.clear() + self.status_label.setText("正在重启服务器...") + + # 创建并启动线程执行命令 + command = "sudo reboot" + self.command_thread = RemoteCommandThread(self.ssh_client, command) + self.command_thread.output_signal.connect(self.append_output) + self.command_thread.finished_signal.connect(self.on_reboot_initiated) + self.command_thread.password_request_signal.connect(self.request_password) + self.command_thread.start() + + def on_reboot_initiated(self, success, message): + if success: + self.status_label.setText("服务器重启命令已发送") + self.status_label.setStyleSheet("color: green;") + QMessageBox.information(self, "重启已启动", "服务器重启命令已发送,服务器将在几秒后重启。\n请等待服务器重启完成后重新连接。") + else: + self.status_label.setText("服务器重启失败") + self.status_label.setStyleSheet("color: red;") + QMessageBox.warning(self, "错误", f"服务器重启失败: {message}") + def delete_directory(self): logger.info("删除目录") @@ -396,4 +544,86 @@ class RemoteCommandsTab(QWidget): self.command_thread = RemoteCommandThread(self.ssh_client, command) self.command_thread.output_signal.connect(self.append_output) self.command_thread.finished_signal.connect(self.on_command_finished) - self.command_thread.start() \ No newline at end of file + self.command_thread.start() + + def configure_sudo_nopasswd(self): + logger.info("配置sudo免密") + + if not self.ssh_client: + QMessageBox.warning(self, "警告", "请先连接到服务器") + return + + # 确认操作 + reply = QMessageBox.question(self, "确认配置sudo免密", + "确定要配置sudo免密吗?\n此操作将允许当前用户无需密码执行sudo命令,请谨慎操作!", + QMessageBox.Yes | QMessageBox.No, QMessageBox.No) + + if reply == QMessageBox.No: + return + + self.output_text.clear() + self.status_label.setText("正在配置sudo免密...") + + # 创建并启动线程执行命令 + # 首先获取当前用户名,然后配置sudo免密 + command = "whoami && echo '\n' | sudo -S visudo -c && (echo '\n' | sudo -S visudo -f /etc/sudoers.d/nopasswd && echo '$(whoami) ALL=(ALL) NOPASSWD: ALL' | sudo -S tee /etc/sudoers.d/nopasswd && sudo -S chmod 440 /etc/sudoers.d/nopasswd)" + self.command_thread = RemoteCommandThread(self.ssh_client, command) + self.command_thread.output_signal.connect(self.append_output) + self.command_thread.finished_signal.connect(self.on_sudo_nopasswd_configured) + self.command_thread.password_request_signal.connect(self.request_password) + self.command_thread.start() + + def on_sudo_nopasswd_configured(self, success, message): + if success: + self.status_label.setText("sudo免密配置成功") + self.status_label.setStyleSheet("color: green;") + QMessageBox.information(self, "成功", "sudo免密配置成功!\n当前用户现在可以无需密码执行sudo命令。") + else: + self.status_label.setText("sudo免密配置失败") + self.status_label.setStyleSheet("color: red;") + QMessageBox.warning(self, "错误", f"sudo免密配置失败: {message}") + + def check_ssh_connection(self): + """检查SSH连接是否有效""" + if not self.ssh_client: + return False + + try: + transport = self.ssh_client.get_transport() + return transport and transport.is_active() + except Exception as e: + logger.error(f"检查SSH连接时发生错误: {str(e)}") + return False + + def reconnect_ssh(self): + """重新连接SSH服务器""" + logger.info("尝试重新连接SSH服务器") + + # 关闭现有连接 + if self.ssh_client: + try: + self.ssh_client.close() + except: + pass + self.ssh_client = None + + # 切换到服务器连接标签页 + main_window = self.parent().parent() + if hasattr(main_window, 'tabs'): + main_window.tabs.setCurrentIndex(0) # 切换到服务器连接标签页 + + # 显示提示信息 + self.status_label.setText("请重新连接服务器") + self.status_label.setStyleSheet("color: orange;") + self.output_text.append("\n=== SSH连接已断开 ===\n") + self.output_text.append("请切换到\"服务器连接\"标签页重新连接服务器\n") + + # 显示重新连接的对话框 + reply = QMessageBox.question(self, "SSH连接已断开", + "SSH连接已断开,是否现在重新连接?", + QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) + + if reply == QMessageBox.Yes: + # 模拟点击连接按钮 + server_connection_tab = main_window.server_connection_tab + server_connection_tab.connect_to_server() \ No newline at end of file diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..bf307ee --- /dev/null +++ b/settings.py @@ -0,0 +1,113 @@ +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-$w+8+hw%p$2xi_fi+7avahc&03-y@x05e^r02-x3nt5johmk6l' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'status', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'statuspage.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'statuspage.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'zh-hans' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/settings_backup_20250831_115953.py b/settings_backup_20250831_115953.py new file mode 100644 index 0000000..bf307ee --- /dev/null +++ b/settings_backup_20250831_115953.py @@ -0,0 +1,113 @@ +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-$w+8+hw%p$2xi_fi+7avahc&03-y@x05e^r02-x3nt5johmk6l' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'status', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'statuspage.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'statuspage.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'zh-hans' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'