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())