diff --git a/__pycache__/django_tab.cpython-38.pyc b/__pycache__/django_tab.cpython-38.pyc new file mode 100644 index 0000000..d997625 Binary files /dev/null and b/__pycache__/django_tab.cpython-38.pyc differ diff --git a/__pycache__/django_threads.cpython-38.pyc b/__pycache__/django_threads.cpython-38.pyc new file mode 100644 index 0000000..f0444e4 Binary files /dev/null and b/__pycache__/django_threads.cpython-38.pyc differ diff --git a/__pycache__/remote_commands_tab.cpython-38.pyc b/__pycache__/remote_commands_tab.cpython-38.pyc index 72fa8aa..89a5226 100644 Binary files a/__pycache__/remote_commands_tab.cpython-38.pyc and b/__pycache__/remote_commands_tab.cpython-38.pyc differ diff --git a/app.log b/app.log index a76da02..8f49326 100644 --- a/app.log +++ b/app.log @@ -277,3 +277,699 @@ 2025-08-31 11:44:58.890 | INFO | remote_commands_tab:clone_repository:285 - 克隆仓库 2025-08-31 11:44:58.891 | INFO | remote_commands_tab:run:53 - 执行远程命令: mkdir -p /home/xiaji && cd /home/xiaji && git clone --verbose http://192.168.3.241:3000/xiaji/webstatus.git 2025-08-31 11:44:58.900 | ERROR | remote_commands_tab:run:104 - 命令执行失败,退出状态: 128 +2025-08-31 11:50:12.893 | INFO | __main__::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'