91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package deploy
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
"parch-pilot/internal/config"
|
|
"parch-pilot/internal/utils"
|
|
)
|
|
|
|
func DeploySystem(conf *config.Config, yamlPath string) error {
|
|
if conf.Deploy.RootDevice == "" {
|
|
return fmt.Errorf("root_device is required for --deploy")
|
|
}
|
|
|
|
mp := conf.Deploy.MountPoint
|
|
|
|
if err := utils.ExecCmd("mount", conf.Deploy.RootDevice, mp); err != nil {
|
|
return err
|
|
}
|
|
|
|
if conf.Deploy.EfiDevice != "" {
|
|
bootDir := filepath.Join(mp, "boot")
|
|
if err := os.MkdirAll(bootDir, 0755); err != nil {
|
|
return err
|
|
}
|
|
if err := utils.ExecCmd("mount", conf.Deploy.EfiDevice, bootDir); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
pacArgs := []string{mp, "base", "linux", "linux-firmware", "grub"} // Include grub for fallback, but use systemd-boot if EFI
|
|
if len(conf.PacmanPackages) > 0 {
|
|
pacArgs = append(pacArgs, conf.PacmanPackages...)
|
|
}
|
|
if err := utils.ExecCmd("pacstrap", pacArgs...); err != nil {
|
|
return err
|
|
}
|
|
|
|
fstabPath := filepath.Join(mp, "etc/fstab")
|
|
genCmd := exec.Command("genfstab", "-U", mp)
|
|
output, err := genCmd.Output()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := os.WriteFile(fstabPath, output, 0644); err != nil {
|
|
return err
|
|
}
|
|
|
|
if conf.Deploy.EfiDevice != "" {
|
|
if err := utils.ExecCmd("arch-chroot", mp, "bootctl", "--esp-path=/boot", "install"); err != nil {
|
|
fmt.Println("Warning: Failed to install systemd-boot; falling back to GRUB.")
|
|
if err := utils.ExecCmd("arch-chroot", mp, "grub-install", "--target=x86_64-efi", "--efi-directory=/boot", "--bootloader-id=GRUB"); err != nil {
|
|
return err
|
|
}
|
|
if err := utils.ExecCmd("arch-chroot", mp, "grub-mkconfig", "-o", "/boot/grub/grub.cfg"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
} else {
|
|
// BIOS GRUB
|
|
disk := filepath.Dir(conf.Deploy.RootDevice) // assume /dev/sda from /dev/sda2
|
|
if err := utils.ExecCmd("arch-chroot", mp, "grub-install", "--target=i386-pc", disk); err != nil {
|
|
return err
|
|
}
|
|
if err := utils.ExecCmd("arch-chroot", mp, "grub-mkconfig", "-o", "/boot/grub/grub.cfg"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
copyPath := filepath.Join(mp, "root/parch-pilot.yaml")
|
|
src, err := os.Open(yamlPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer src.Close()
|
|
dst, err := os.Create(copyPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer dst.Close()
|
|
if _, err := io.Copy(dst, src); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|