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 from logic.deployment_controller import DeploymentController from logic.logger import Logger LOG_FILE = "logs/nginx_deploy_gui.log" 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): # Prompt user for Certbot confirmation from PySide6.QtWidgets import QMessageBox reply = QMessageBox.question(self, 'Run Certbot', 'Run Certbot for the discovered domains?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.controller.run_certbot(lambda prompt: True) else: self.controller.run_certbot(lambda prompt: False) 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())