165 lines
5.3 KiB
Python
165 lines
5.3 KiB
Python
import sys
|
|
import os
|
|
from PySide6.QtWidgets import (
|
|
QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
|
QPushButton, QLineEdit, QTextEdit, QLabel, QFileDialog, QStatusBar
|
|
)
|
|
from PySide6.QtCore import Qt
|
|
from datetime import datetime
|
|
|
|
LOG_FILE = "logs/nginx_deploy_gui.log"
|
|
|
|
class Logger:
|
|
def __init__(self, log_widget):
|
|
self.log_widget = log_widget
|
|
self.log_file = open(LOG_FILE, "a")
|
|
|
|
def log(self, message):
|
|
timestamp = datetime.now().strftime("[%Y-%m-%d %H:%M:%S]")
|
|
full_message = f"{timestamp} {message}\n"
|
|
self.log_widget.append(full_message)
|
|
self.log_file.write(full_message)
|
|
self.log_file.flush()
|
|
|
|
def close(self):
|
|
self.log_file.close()
|
|
|
|
class DeploymentController:
|
|
def __init__(self, logger):
|
|
self.logger = logger
|
|
# These will be set by the UI
|
|
self.ssh_key = None
|
|
self.config_dir = None
|
|
|
|
def preflight_checks(self):
|
|
self.logger.log("Running pre-flight checks...")
|
|
# Stub: implement actual checks
|
|
self.logger.log("Pre-flight checks complete.")
|
|
|
|
def scan_domains(self):
|
|
self.logger.log("Scanning for domains in configs...")
|
|
# Stub: implement domain scan
|
|
self.logger.log("Domain scan complete.")
|
|
|
|
def transfer_files(self):
|
|
self.logger.log("Transferring files to remote server...")
|
|
# Stub: implement file transfer
|
|
self.logger.log("File transfer complete.")
|
|
|
|
def remote_ops(self):
|
|
self.logger.log("Performing remote file operations...")
|
|
# Stub: implement remote ops
|
|
self.logger.log("Remote operations complete.")
|
|
|
|
def run_certbot(self):
|
|
self.logger.log("Prompting user for Certbot run...")
|
|
# Stub: implement certbot prompt and run
|
|
self.logger.log("Certbot step complete.")
|
|
|
|
def cleanup(self):
|
|
self.logger.log("Performing cleanup...")
|
|
# Stub: implement cleanup
|
|
self.logger.log("Cleanup complete.")
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setWindowTitle("NGINX Deployment Controller")
|
|
self.resize(700, 500)
|
|
self.central = QWidget()
|
|
self.setCentralWidget(self.central)
|
|
self.layout = QVBoxLayout(self.central)
|
|
|
|
# SSH Key Picker
|
|
self.ssh_key_line = QLineEdit()
|
|
self.ssh_key_browse = QPushButton("Browse")
|
|
self.ssh_key_browse.clicked.connect(self.browse_ssh_key)
|
|
ssh_key_layout = QHBoxLayout()
|
|
ssh_key_layout.addWidget(QLabel("SSH Key:"))
|
|
ssh_key_layout.addWidget(self.ssh_key_line)
|
|
ssh_key_layout.addWidget(self.ssh_key_browse)
|
|
self.layout.addLayout(ssh_key_layout)
|
|
|
|
# Config Directory Picker
|
|
self.config_dir_line = QLineEdit()
|
|
self.config_dir_browse = QPushButton("Browse")
|
|
self.config_dir_browse.clicked.connect(self.browse_config_dir)
|
|
config_dir_layout = QHBoxLayout()
|
|
config_dir_layout.addWidget(QLabel("Config Dir:"))
|
|
config_dir_layout.addWidget(self.config_dir_line)
|
|
config_dir_layout.addWidget(self.config_dir_browse)
|
|
self.layout.addLayout(config_dir_layout)
|
|
|
|
# Stage Buttons
|
|
self.buttons = {}
|
|
stages = [
|
|
("Pre-flight Checks", self.preflight_checks),
|
|
("Scan Domains", self.scan_domains),
|
|
("Transfer Files", self.transfer_files),
|
|
("Remote Ops", self.remote_ops),
|
|
("Run Certbot", self.run_certbot),
|
|
("Cleanup", self.cleanup),
|
|
]
|
|
btn_layout = QHBoxLayout()
|
|
for label, handler in stages:
|
|
btn = QPushButton(label)
|
|
btn.clicked.connect(handler)
|
|
btn_layout.addWidget(btn)
|
|
self.buttons[label] = btn
|
|
self.layout.addLayout(btn_layout)
|
|
|
|
# Log Output
|
|
self.log_widget = QTextEdit()
|
|
self.log_widget.setReadOnly(True)
|
|
self.layout.addWidget(self.log_widget)
|
|
|
|
# Status Bar
|
|
self.status = QStatusBar()
|
|
self.setStatusBar(self.status)
|
|
|
|
# Logger and Controller
|
|
self.logger = Logger(self.log_widget)
|
|
self.controller = DeploymentController(self.logger)
|
|
|
|
def browse_ssh_key(self):
|
|
file, _ = QFileDialog.getOpenFileName(self, "Select SSH Key", os.path.expanduser("~"))
|
|
if file:
|
|
self.ssh_key_line.setText(file)
|
|
self.controller.ssh_key = file
|
|
self.status.showMessage(f"SSH Key set: {file}", 3000)
|
|
|
|
def browse_config_dir(self):
|
|
dir = QFileDialog.getExistingDirectory(self, "Select Config Directory", os.path.expanduser("~"))
|
|
if dir:
|
|
self.config_dir_line.setText(dir)
|
|
self.controller.config_dir = dir
|
|
self.status.showMessage(f"Config directory set: {dir}", 3000)
|
|
|
|
def preflight_checks(self):
|
|
self.controller.preflight_checks()
|
|
|
|
def scan_domains(self):
|
|
self.controller.scan_domains()
|
|
|
|
def transfer_files(self):
|
|
self.controller.transfer_files()
|
|
|
|
def remote_ops(self):
|
|
self.controller.remote_ops()
|
|
|
|
def run_certbot(self):
|
|
self.controller.run_certbot()
|
|
|
|
def cleanup(self):
|
|
self.controller.cleanup()
|
|
|
|
def closeEvent(self, event):
|
|
self.logger.close()
|
|
super().closeEvent(event)
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication(sys.argv)
|
|
window = MainWindow()
|
|
window.show()
|
|
sys.exit(app.exec())
|