/ cmd / _dbxroot / utils / utils.go
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  }