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  }