完善nginx标签。使用unix套接字。增加远程命令的运行和显示。

This commit is contained in:
2025-08-31 22:16:45 +08:00
parent 47f3669dc4
commit 14e69c2bfd
7 changed files with 1561 additions and 161 deletions

View File

@@ -1,5 +1,6 @@
import os
import sys
import json
from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QLabel, QTextEdit, QFileDialog, QMessageBox,
QLineEdit, QDialog, QDialogButtonBox)
@@ -202,6 +203,51 @@ class NginxControlThread(QThread):
self.result_ready.emit(False, error_msg)
logger.error(f"Nginx服务控制异常: {error_msg}")
class NginxPermissionsThread(QThread):
"""设置Nginx权限的线程"""
result_ready = Signal(bool, str)
def __init__(self, ssh_client, commands, password):
super().__init__()
self.ssh_client = ssh_client
self.commands = commands # 命令列表
self.password = password
def run(self):
try:
logger.info("开始执行Nginx权限设置操作")
# 执行所有命令
for i, command in enumerate(self.commands):
logger.info(f"执行命令 {i+1}/{len(self.commands)}: {command}")
# 使用bash -c将命令组合在一起确保密码对所有sudo命令有效
# 使用-S选项让sudo从标准输入读取密码
full_command = f"bash -c 'echo \"{self.password}\" | sudo -S {command}'"
stdin, stdout, stderr = self.ssh_client.exec_command(full_command)
exit_status = stdout.channel.recv_exit_status()
output = stdout.read().decode()
error = stderr.read().decode()
if exit_status != 0:
error_msg = f"命令执行失败: {command}\n错误信息: {error}"
self.result_ready.emit(False, error_msg)
logger.error(error_msg)
return
logger.info(f"命令执行成功: {command}")
# 所有命令执行成功
success_msg = "所有权限设置命令执行成功"
self.result_ready.emit(True, success_msg)
logger.info(success_msg)
except Exception as e:
error_msg = str(e)
self.result_ready.emit(False, error_msg)
logger.error(f"Nginx权限设置异常: {error_msg}")
class NginxSiteThread(QThread):
"""处理Nginx站点配置的线程"""
result_ready = Signal(bool, str)
@@ -250,6 +296,24 @@ class NginxSiteThread(QThread):
elif self.operation == "enable":
# 启用站点配置
# 首先检查目标链接是否存在,如果存在则先删除
check_cmd = f"bash -c 'echo \"{self.password}\" | sudo -S test -f /etc/nginx/sites-enabled/{self.site_name}'"
stdin, stdout, stderr = self.ssh_client.exec_command(check_cmd)
check_status = stdout.channel.recv_exit_status()
if check_status == 0:
# 目标链接存在,先删除
remove_cmd = f"bash -c 'echo \"{self.password}\" | sudo -S rm -f /etc/nginx/sites-enabled/{self.site_name}'"
stdin, stdout, stderr = self.ssh_client.exec_command(remove_cmd)
remove_status = stdout.channel.recv_exit_status()
if remove_status != 0:
error = stderr.read().decode()
self.result_ready.emit(False, f"删除现有符号链接失败: {error}")
logger.error(f"删除现有符号链接失败: {error}")
return
# 创建符号链接
enable_cmd = f"bash -c 'echo \"{self.password}\" | sudo -S ln -s /etc/nginx/sites-available/{self.site_name} /etc/nginx/sites-enabled/'"
stdin, stdout, stderr = self.ssh_client.exec_command(enable_cmd)
exit_status = stdout.channel.recv_exit_status()
@@ -352,6 +416,11 @@ class NginxTab(QWidget):
self.check_nginx_status_btn.clicked.connect(self.check_nginx_status)
control_layout.addWidget(self.check_nginx_status_btn)
# 一键赋予权限按钮
self.set_permissions_btn = QPushButton("一键赋予权限")
self.set_permissions_btn.clicked.connect(self.set_permissions)
control_layout.addWidget(self.set_permissions_btn)
layout.addLayout(control_layout)
# 输出区域
@@ -782,4 +851,74 @@ http {
else:
self.append_output(f"操作失败: {message}")
logger.error(f"Nginx服务控制失败: {message}")
QMessageBox.warning(self, "错误", f"Nginx服务控制失败: {message}")
QMessageBox.warning(self, "错误", f"Nginx服务控制失败: {message}")
def set_permissions(self):
"""一键赋予权限"""
if not self.ssh_client:
self.append_output("错误: 未连接到服务器")
return
# 读取config.json文件获取username和git_url
try:
with open('config.json', 'r', encoding='utf-8') as f:
config = json.load(f)
# 获取第一个服务器配置(假设只有一个服务器配置)
server_config = next(iter(config.values()))
username = server_config.get('username', '')
git_url = server_config.get('git_url', '')
# 从git_url中提取项目名.git前的值
if git_url:
# 提取git_url中最后一个/和.git之间的部分
if '/' in git_url:
project_name = git_url.split('/')[-1]
if project_name.endswith('.git'):
project_name = project_name[:-4] # 移除.git后缀
else:
project_name = 'webstatus' # 默认值
else:
project_name = 'webstatus' # 默认值
logger.info(f"从配置文件获取用户名: {username}, 项目名: {project_name}")
except Exception as e:
error_msg = str(e)
self.append_output(f"读取配置文件失败: {error_msg}")
logger.error(f"读取配置文件失败: {error_msg}")
QMessageBox.warning(self, "错误", f"读取配置文件失败: {error_msg}")
return
# 请求用户输入sudo密码
dialog = PasswordDialog(self)
if dialog.exec_() == QDialog.Accepted:
password = dialog.get_password()
self.append_output("正在设置权限...")
# 构建命令序列
commands = [
f"sudo chmod g+x /home/{username}/",
f"sudo chown -R {username}:www-data /home/{username}/{project_name}",
f"sudo chmod g+x /home/{username}/{project_name}",
f"sudo chown -R {username}:www-data /home/{username}/{project_name}/sock",
f"sudo chmod -R 770 /home/{username}/{project_name}/sock"
]
# 创建并启动权限设置线程
self.permissions_thread = NginxPermissionsThread(self.ssh_client, commands, password)
self.permissions_thread.result_ready.connect(self.on_permissions_result)
self.permissions_thread.start()
else:
self.append_output("用户取消了密码输入")
def on_permissions_result(self, success, message):
"""处理权限设置结果"""
if success:
self.append_output(f"权限设置成功: {message}")
logger.info(f"权限设置成功: {message}")
QMessageBox.information(self, "成功", message)
else:
self.append_output(f"权限设置失败: {message}")
logger.error(f"权限设置失败: {message}")
QMessageBox.warning(self, "错误", f"权限设置失败: {message}")