完成Django的标签的功能

This commit is contained in:
2025-08-31 13:08:06 +08:00
parent 9854a00542
commit d20ddfed59
10 changed files with 1993 additions and 4 deletions

Binary file not shown.

Binary file not shown.

696
app.log
View File

@@ -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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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 <module>
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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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__:<module>: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 - 命令输出:

456
django_tab.py Normal file
View File

@@ -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}")

364
django_threads.py Normal file
View File

@@ -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}")

17
main.py
View File

@@ -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)
@@ -51,6 +56,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")
logger.info("启动应用程序")

View File

@@ -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("删除目录")
@@ -397,3 +545,85 @@ class RemoteCommandsTab(QWidget):
self.command_thread.output_signal.connect(self.append_output)
self.command_thread.finished_signal.connect(self.on_command_finished)
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()

113
settings.py Normal file
View File

@@ -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'

View File

@@ -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'