完善nginx标签。使用unix套接字。增加远程命令的运行和显示。
This commit is contained in:
141
nginx_tab.py
141
nginx_tab.py
@@ -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}")
|
||||
Reference in New Issue
Block a user