utils.go
1 package utils 2 3 import ( 4 "fmt" 5 "io" 6 "log" 7 "os" 8 "os/exec" 9 "strings" 10 ) 11 12 func IsAlphanumeric(s string) bool { 13 for _, r := range s { 14 if (r < 'a' || r > 'z') && (r < 'A' || r > 'Z') && (r < '0' || r > '9') { 15 return false 16 } 17 } 18 return true 19 } 20 21 func IsAbsolutePath(path string) bool { 22 return len(path) > 0 && path[0] == '/' 23 } 24 25 func RunParted(device string, args ...string) { 26 args = append([]string{"parted", "-s", device, "--"}, args...) 27 RunCommand(args...) 28 } 29 30 func RunCommand(args ...string) string { 31 log.Printf("----------------------------------------") 32 log.Printf("Running command: %+v", args) 33 cmd := exec.Command(args[0], args[1:]...) 34 output := &strings.Builder{} 35 cmd.Stdout = io.MultiWriter(os.Stdout, output) 36 cmd.Stderr = io.MultiWriter(os.Stderr, output) 37 if err := cmd.Run(); err != nil { 38 log.Printf("Error running command: %v", err.Error()) 39 panic(err) 40 } 41 42 log.Printf("----------------------------------------") 43 44 return output.String() 45 } 46 47 func GetLoopDeviceBackingFile(loopDevice string) (string, error) { 48 cmd := exec.Command("losetup", "-O", "NAME,BACK-FILE", loopDevice) 49 output, err := cmd.Output() 50 if err != nil { 51 return "", fmt.Errorf("failed to get loop device backing file: %w", err) 52 } 53 54 lines := strings.Split(string(output), "\n") 55 for _, line := range lines { 56 if strings.HasPrefix(line, loopDevice) { 57 fields := strings.Fields(line) 58 if len(fields) >= 2 { 59 return fields[1], nil 60 } 61 } 62 } 63 64 return "", fmt.Errorf("loop device %s not found", loopDevice) 65 }