package osimage import ( "fmt" "os" "strings" "sync" monov1alpha1 "example.com/monok8s/pkg/apis/monok8s/v1alpha1" ) var ( bootStateOnce sync.Once bootState map[string]string bootStateErr error ) func PercentOf(done, total int64) int64 { if total <= 0 { return 0 } p := (done * 100) / total if p < 0 { return 0 } if p > 100 { return 100 } return p } func ReadBootState() (map[string]string, error) { bootStateOnce.Do(func() { data, err := os.ReadFile(monov1alpha1.BootStateFile) if err != nil { bootStateErr = err return } out := make(map[string]string) for _, line := range strings.Split(string(data), "\n") { line = strings.TrimSpace(line) if line == "" || strings.HasPrefix(line, "#") { continue } k, v, ok := strings.Cut(line, "=") if !ok { bootStateErr = fmt.Errorf("invalid line: %q", line) return } out[strings.TrimSpace(k)] = strings.TrimSpace(v) } bootState = out }) return bootState, bootStateErr }