initial commit
This commit is contained in:
328
main.go
Normal file
328
main.go
Normal file
@@ -0,0 +1,328 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// MiasmaInstaller represents the installer for Miasma OS
|
||||
type MiasmaInstaller struct {
|
||||
device string
|
||||
username string
|
||||
password string
|
||||
installHardened bool
|
||||
installPackages []string
|
||||
}
|
||||
|
||||
// NewMiasmaInstaller creates a new MiasmaInstaller instance
|
||||
func NewMiasmaInstaller() *MiasmaInstaller {
|
||||
return &MiasmaInstaller{
|
||||
installHardened: true,
|
||||
installPackages: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
installer := NewMiasmaInstaller()
|
||||
|
||||
// Get system information
|
||||
fmt.Println("Miasma OS Installer")
|
||||
fmt.Println("===================")
|
||||
|
||||
// Create temporary config file
|
||||
if err := installer.createTempConfig(); err != nil {
|
||||
fmt.Printf("Error creating config: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Make sure we have root privileges
|
||||
if err := checkRootPrivileges(); err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Get user input
|
||||
if err := installer.getUserInput(); err != nil {
|
||||
fmt.Printf("Error getting user input: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Validate disk selection
|
||||
if err := installer.validateDisk(); err != nil {
|
||||
fmt.Printf("Error validating disk: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Run the actual installation
|
||||
if err := installer.runInstallation(); err != nil {
|
||||
fmt.Printf("Installation failed: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println("Installation completed successfully!")
|
||||
}
|
||||
|
||||
// detectDisks returns a list of available disks
|
||||
func detectDisks() ([]string, error) {
|
||||
cmd := exec.Command("lsblk", "-o", "NAME,SIZE,TYPE,MOUNTPOINT", "-n", "-l")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
lines := strings.Split(strings.TrimSpace(string(output)), "\n")
|
||||
var disks []string
|
||||
|
||||
for _, line := range lines {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) >= 3 {
|
||||
name := fields[0]
|
||||
deviceType := fields[2]
|
||||
|
||||
// Only include whole disks (not partitions)
|
||||
if deviceType == "disk" {
|
||||
disks = append(disks, "/dev/"+name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return disks, nil
|
||||
}
|
||||
|
||||
// checkRootPrivileges checks if the installer is running with root privileges
|
||||
func checkRootPrivileges() error {
|
||||
cmd := exec.Command("id", "-u")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to check privileges: %v", err)
|
||||
}
|
||||
|
||||
outputStr := strings.TrimSpace(string(output))
|
||||
if outputStr != "0" {
|
||||
return fmt.Errorf("this installer must be run as root")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getUserInput prompts user for installation parameters
|
||||
func (m *MiasmaInstaller) getUserInput() error {
|
||||
// Get disk selection
|
||||
diskList, err := detectDisks()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to detect disks: %v", err)
|
||||
}
|
||||
|
||||
if len(diskList) == 0 {
|
||||
return fmt.Errorf("no disks detected")
|
||||
}
|
||||
|
||||
fmt.Println("Available disks:")
|
||||
for i, disk := range diskList {
|
||||
fmt.Printf("%d. %s\n", i+1, disk)
|
||||
}
|
||||
|
||||
fmt.Printf("Select disk (1-%d): ", len(diskList))
|
||||
var diskChoice int
|
||||
_, err = fmt.Scanf("%d", &diskChoice)
|
||||
if err != nil || diskChoice < 1 || diskChoice > len(diskList) {
|
||||
return fmt.Errorf("invalid disk selection")
|
||||
}
|
||||
|
||||
m.device = diskList[diskChoice-1]
|
||||
|
||||
// Get username and password
|
||||
fmt.Print("Enter username: ")
|
||||
_, err = fmt.Scanf("%s", &m.username)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read username: %v", err)
|
||||
}
|
||||
|
||||
fmt.Print("Enter password: ")
|
||||
_, err = fmt.Scanf("%s", &m.password)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read password: %v", err)
|
||||
}
|
||||
|
||||
fmt.Printf("Installing to %s with user %s\n", m.device, m.username)
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateDisk validates the selected disk
|
||||
func (m *MiasmaInstaller) validateDisk() error {
|
||||
if m.device == "" {
|
||||
return fmt.Errorf("no device selected")
|
||||
}
|
||||
|
||||
// Simple check: device should start with /dev/
|
||||
if !strings.HasPrefix(m.device, "/dev/") {
|
||||
return fmt.Errorf("invalid device path: %s", m.device)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createTempConfig creates a temporary alis configuration for Miasma OS
|
||||
func (m *MiasmaInstaller) createTempConfig() error {
|
||||
config := fmt.Sprintf(`# Miasma OS Installer Configuration
|
||||
# Based on alis configuration format
|
||||
|
||||
# init
|
||||
LOG_TRACE="true"
|
||||
LOG_FILE="false"
|
||||
|
||||
# partition
|
||||
DEVICE="%s"
|
||||
DEVICE_TRIM="true"
|
||||
LVM="false"
|
||||
LUKS_PASSWORD=""
|
||||
LUKS_PASSWORD_RETYPE=""
|
||||
FILE_SYSTEM_TYPE="btrfs"
|
||||
BTRFS_SUBVOLUMES_MOUNTPOINTS=("root,root,/" "home,home,/home" "var,var,/var" "snapshots,snapshots,/.snapshots")
|
||||
SWAP_SIZE="4096"
|
||||
PARTITION_MODE="auto"
|
||||
PARTITION_MOUNT_POINTS=("1=/boot" "2=/")
|
||||
GPT_AUTOMOUNT="false"
|
||||
|
||||
# install
|
||||
REFLECTOR="true"
|
||||
REFLECTOR_COUNTRIES=("United States")
|
||||
PACMAN_MIRROR=""
|
||||
PACMAN_PARALLEL_DOWNLOADS="true"
|
||||
KERNELS="linux-hardened"
|
||||
KERNELS_COMPRESSION="zstd"
|
||||
KERNELS_PARAMETERS=""
|
||||
|
||||
# aur
|
||||
AUR_PACKAGE="paru-bin"
|
||||
|
||||
# display driver
|
||||
DISPLAY_DRIVER="auto"
|
||||
KMS="true"
|
||||
FASTBOOT="true"
|
||||
FRAMEBUFFER_COMPRESSION="true"
|
||||
DISPLAY_DRIVER_DDX="false"
|
||||
VULKAN="true"
|
||||
DISPLAY_DRIVER_HARDWARE_VIDEO_ACCELERATION="true"
|
||||
DISPLAY_DRIVER_HARDWARE_VIDEO_ACCELERATION_INTEL="intel-media-driver"
|
||||
|
||||
# config
|
||||
TIMEZONE="UTC"
|
||||
LOCALES=("en_US.UTF-8 UTF-8")
|
||||
LOCALE_CONF=("LANG=en_US.UTF-8")
|
||||
KEYLAYOUT="us"
|
||||
KEYMODEL=""
|
||||
KEYVARIANT=""
|
||||
KEYOPTIONS=""
|
||||
KEYMAP="us"
|
||||
FONT=""
|
||||
FONT_MAP=""
|
||||
HOSTNAME="miasma"
|
||||
ROOT_PASSWORD="%s"
|
||||
ROOT_PASSWORD_RETYPE="%s"
|
||||
|
||||
# user
|
||||
USER_NAME="%s"
|
||||
USER_PASSWORD="%s"
|
||||
USER_PASSWORD_RETYPE="%s"
|
||||
ADDITIONAL_USERS=()
|
||||
|
||||
# systemd-homed
|
||||
SYSTEMD_HOMED="false"
|
||||
SYSTEMD_HOMED_STORAGE="directory"
|
||||
SYSTEMD_HOMED_STORAGE_LUKS_TYPE="ext4"
|
||||
|
||||
# mkinitcpio
|
||||
HOOKS="base udev autodetect microcode modconf kms keyboard keymap consolefont block btrfs filesystems fsck"
|
||||
MODULES=""
|
||||
UKI="false"
|
||||
PLYMOUTH="false"
|
||||
|
||||
# bootloader
|
||||
BOOTLOADER="systemd"
|
||||
SECURE_BOOT="false"
|
||||
|
||||
# shell
|
||||
CUSTOM_SHELL="zsh"
|
||||
|
||||
# desktop
|
||||
DESKTOP_ENVIRONMENT="cosmic"
|
||||
DISPLAY_MANAGER="auto"
|
||||
|
||||
# packages
|
||||
PACKAGES_MULTILIB="false"
|
||||
PACKAGES_INSTALL="true"
|
||||
PACKAGES_PIPEWIRE="true"
|
||||
|
||||
# provision
|
||||
PROVISION="false"
|
||||
|
||||
# misc
|
||||
FWUPD="false"
|
||||
VAGRANT="false"
|
||||
|
||||
# systemd
|
||||
SYSTEMD_UNITS="+systemd-timesyncd.service +apparmor.service"
|
||||
|
||||
# reboot
|
||||
REBOOT="false"
|
||||
`,
|
||||
m.device, m.password, m.password, m.username, m.password, m.password)
|
||||
|
||||
return os.WriteFile("alis.conf", []byte(config), 0644)
|
||||
}
|
||||
|
||||
// runInstallation executes the installation process
|
||||
func (m *MiasmaInstaller) runInstallation() error {
|
||||
// Create a temporary file to store the username for post-install script
|
||||
err := os.WriteFile("/tmp/miasma-username", []byte(m.username), 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create username file: %v", err)
|
||||
}
|
||||
|
||||
// Copy our custom packages configuration to the alis directory
|
||||
cmd := exec.Command("cp", "alis-packages.conf", "alis/alis-packages.conf")
|
||||
if err := cmd.Run(); err != nil {
|
||||
return fmt.Errorf("failed to copy packages config: %v", err)
|
||||
}
|
||||
|
||||
// Copy post-install script to the chroot environment
|
||||
cmd = exec.Command("cp", "miasma-post-install.sh", "/mnt/miasma-post-install.sh")
|
||||
if err := cmd.Run(); err != nil {
|
||||
return fmt.Errorf("failed to copy post-install script: %v", err)
|
||||
}
|
||||
|
||||
// Prepare the alis script command
|
||||
cmd = exec.Command("./alis.sh")
|
||||
cmd.Dir = "./alis"
|
||||
|
||||
// Set environment variables
|
||||
cmd.Env = append(os.Environ(),
|
||||
"WARNING_CONFIRM=false",
|
||||
"ALIS_CONF_FILE=../alis.conf",
|
||||
)
|
||||
|
||||
// Start the installation
|
||||
fmt.Println("Starting Arch Linux installation with alis...")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Errorf("installation failed: %v\nOutput: %s", err, string(output))
|
||||
}
|
||||
|
||||
fmt.Printf("Installation completed. Applying Miasma OS configurations...\n")
|
||||
|
||||
// Run post-installation script
|
||||
fmt.Println("Running post-installation setup...")
|
||||
cmd = exec.Command("bash", "/mnt/miasma-post-install.sh")
|
||||
output, err = cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Errorf("post-installation failed: %v\nOutput: %s", err, string(output))
|
||||
}
|
||||
|
||||
fmt.Printf("Post-installation output: %s\n", output)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user