Files
parch-pilot/internal/deploy/deploy.go
2025-09-28 23:05:51 +03:30

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
}