github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/hyper-control/reinstall.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "os/exec" 8 "path/filepath" 9 "strings" 10 "time" 11 12 "github.com/Cloud-Foundations/Dominator/lib/log" 13 ) 14 15 func reinstallSubcommand(args []string, logger log.DebugLogger) error { 16 err := reinstall(logger) 17 if err != nil { 18 return fmt.Errorf("Error reinstalling: %s", err) 19 } 20 return nil 21 } 22 23 func getHostname() (string, error) { 24 cmd := exec.Command("hostname", "-f") 25 if stdout, err := cmd.Output(); err != nil { 26 return "", err 27 } else { 28 return strings.TrimSpace(string(stdout)), nil 29 } 30 } 31 32 func reinstall(logger log.DebugLogger) error { 33 kexec, err := exec.LookPath("kexec") 34 if err != nil { 35 return err 36 } 37 hostname, err := getHostname() 38 if err != nil { 39 return err 40 } 41 rootDir, err := ioutil.TempDir("", "kexec") 42 if err != nil { 43 return err 44 } 45 defer os.RemoveAll(rootDir) 46 _, initrdFile, err := makeInstallerDirectory(hostname, rootDir, logger) 47 if err != nil { 48 return err 49 } 50 logger.Println("running kexec in 5 seconds...") 51 time.Sleep(time.Second * 5) 52 var command string 53 var args []string 54 if os.Geteuid() == 0 { 55 command = kexec 56 } else { 57 command = "sudo" 58 args = []string{kexec} 59 } 60 args = append(args, "-l", filepath.Join(rootDir, "vmlinuz"), 61 "--append=console=tty0 console=ttyS0,115200n8", 62 "--console-serial", "--serial-baud=115200", 63 "--initrd="+initrdFile, "-f") 64 cmd := exec.Command(command, args...) 65 cmd.Stdin = os.Stdin 66 cmd.Stdout = os.Stdout 67 cmd.Stderr = os.Stderr 68 return cmd.Run() 69 }