Files
proxy_deployer/app/nginx_deploy_gui.py
2025-06-25 20:48:40 +01:00

123 lines
4.2 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
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())