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