pep-mklive/live-installer.py

194 lines
7.2 KiB
Python

import sys
import subprocess
from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QLabel, QPushButton,
QWidget, QComboBox, QLineEdit, QProgressBar, QMessageBox,
QStackedWidget, QHBoxLayout, QFormLayout)
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtCore import Qt
class InstallerWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Void Linux Installer")
self.setGeometry(300, 200, 800, 600)
# Widget com layout empilhado para etapas de instalação
self.stack = QStackedWidget()
self.setCentralWidget(self.stack)
# Fontes e estilos básicos
self.title_font = QFont("Arial", 18, QFont.Bold)
self.normal_font = QFont("Arial", 12)
# Etapas do instalador
self.create_welcome_page()
self.create_partition_page()
self.create_user_page()
self.create_install_page()
# Layout para os botões de navegação
self.nav_layout = QHBoxLayout()
self.prev_button = QPushButton("Anterior")
self.prev_button.clicked.connect(self.prev_page)
self.prev_button.setEnabled(False) # Desativado na primeira página
self.next_button = QPushButton("Próximo")
self.next_button.clicked.connect(self.next_page)
self.nav_layout.addWidget(self.prev_button)
self.nav_layout.addWidget(self.next_button)
# Adicionar os botões de navegação no final
nav_widget = QWidget()
nav_widget.setLayout(self.nav_layout)
layout = QVBoxLayout()
layout.addWidget(self.stack)
layout.addWidget(nav_widget)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def create_welcome_page(self):
"""Página de boas-vindas."""
page = QWidget()
layout = QVBoxLayout()
welcome_label = QLabel("Bem-vindo ao Instalador do Void Linux")
welcome_label.setFont(self.title_font)
layout.addWidget(welcome_label, alignment=Qt.AlignCenter)
img_label = QLabel()
img = QPixmap("image.png") # Certifique-se de que o caminho da imagem esteja correto
img_label.setPixmap(img.scaled(300, 300, Qt.KeepAspectRatio))
layout.addWidget(img_label, alignment=Qt.AlignCenter)
page.setLayout(layout)
self.stack.addWidget(page)
def create_partition_page(self):
"""Página de seleção de partição."""
page = QWidget()
layout = QVBoxLayout()
title = QLabel("Seleção de Partição")
title.setFont(self.title_font)
layout.addWidget(title)
form_layout = QFormLayout()
self.partition_combo = QComboBox()
self.partition_combo.addItems(self.get_partitions())
form_layout.addRow("Escolha uma partição:", self.partition_combo)
# Botão para abrir GParted
gparted_button = QPushButton("Abrir GParted para Particionamento")
gparted_button.clicked.connect(self.open_gparted)
layout.addLayout(form_layout)
layout.addWidget(gparted_button)
page.setLayout(layout)
self.stack.addWidget(page)
def create_user_page(self):
"""Página de configuração de usuário e senha."""
page = QWidget()
layout = QVBoxLayout()
title = QLabel("Configuração do Usuário")
title.setFont(self.title_font)
layout.addWidget(title)
form_layout = QFormLayout()
self.user_input = QLineEdit()
self.password_input = QLineEdit()
self.password_input.setEchoMode(QLineEdit.Password)
form_layout.addRow("Nome do usuário:", self.user_input)
form_layout.addRow("Senha:", self.password_input)
layout.addLayout(form_layout)
page.setLayout(layout)
self.stack.addWidget(page)
def create_install_page(self):
"""Página de instalação com barra de progresso."""
page = QWidget()
layout = QVBoxLayout()
title = QLabel("Instalação do Sistema")
title.setFont(self.title_font)
layout.addWidget(title)
self.progress_bar = QProgressBar()
self.progress_bar.setAlignment(Qt.AlignCenter)
layout.addWidget(self.progress_bar)
install_button = QPushButton("Iniciar Instalação")
install_button.clicked.connect(self.start_installation)
layout.addWidget(install_button, alignment=Qt.AlignCenter)
page.setLayout(layout)
self.stack.addWidget(page)
def get_partitions(self):
"""Função para listar partições do sistema."""
partitions = subprocess.getoutput("lsblk -nd -o NAME").splitlines()
return [f"/dev/{p}" for p in partitions]
def open_gparted(self):
"""Abre o GParted para particionamento de disco."""
try:
subprocess.Popen(["gparted"])
except FileNotFoundError:
QMessageBox.critical(self, "Erro", "GParted não está instalado.")
def start_installation(self):
"""Inicia a instalação e atualiza a barra de progresso."""
partition = self.partition_combo.currentText()
username = self.user_input.text()
password = self.password_input.text()
if not partition or not username or not password:
QMessageBox.warning(self, "Erro", "Por favor, preencha todos os campos.")
return
try:
self.progress_bar.setValue(0)
subprocess.run(["./mklive.sh"], check=True)
self.progress_bar.setValue(25)
subprocess.run(["./mkrootfs.sh"], check=True)
self.progress_bar.setValue(50)
subprocess.run(["./mkimage.sh"], check=True)
self.progress_bar.setValue(75)
subprocess.run(["./installer.sh", partition, username, password], check=True)
self.progress_bar.setValue(100)
QMessageBox.information(self, "Sucesso", "Instalação concluída com sucesso!")
except subprocess.CalledProcessError as e:
QMessageBox.critical(self, "Erro", f"Ocorreu um erro: {e}")
def next_page(self):
"""Avançar para a próxima página."""
current_index = self.stack.currentIndex()
if current_index < self.stack.count() - 1:
self.stack.setCurrentIndex(current_index + 1)
self.prev_button.setEnabled(True)
# Alterar o texto do botão para "Instalar" na última página
if current_index == self.stack.count() - 2:
self.next_button.setText("Instalar")
else:
self.next_button.setText("Próximo")
def prev_page(self):
"""Voltar para a página anterior."""
current_index = self.stack.currentIndex()
if current_index > 0:
self.stack.setCurrentIndex(current_index - 1)
self.next_button.setText("Próximo")
if current_index == 1:
self.prev_button.setEnabled(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = InstallerWindow()
window.show()
sys.exit(app.exec_())