diff --git a/app/nginx_deploy_gui.py b/app/nginx_deploy_gui.py new file mode 100644 index 0000000..e38f199 --- /dev/null +++ b/app/nginx_deploy_gui.py @@ -0,0 +1,164 @@ +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())