package zoopb // functions to import and export the protobuf // data to and from config files import ( "errors" "os" "path/filepath" "go.wit.com/log" "google.golang.org/protobuf/proto" ) // writes out the cluster information it seperate files // to make it humanly possible to hand edit things as needed func (m *Machines) ConfigSave() error { data, err := m.Marshal() if err != nil { log.Info("proto.Marshal() failed len", len(data), err) return err } log.Info("proto.Marshal() worked len", len(data)) configWrite(data) return nil } // when running on a single machine, save the file in forge/ // as .pb // write to ~/.config/forge/ unless ENV{FORGE_HOME} is set func (m *Machine) ConfigSave() error { if os.Getenv("FORGE_HOME") == "" { homeDir, _ := os.UserHomeDir() fullpath := filepath.Join(homeDir, ".config/forge") os.Setenv("FORGE_HOME", fullpath) } data, err := m.Marshal() if err != nil { log.Info("proto.Marshal() failed len", len(data), err) return err } log.Info("ConfigSave() proto.Marshal() worked len", len(data)) hostname, _ := os.Hostname() fname := hostname + ".pb" return m.configWrite(fname, data) } func ConfigSaveRaw(data []byte) error { configWrite(data) return nil } func (m *Machines) ConfigLoad() error { if m == nil { return errors.New("It's not safe to run ConfigLoad() on a nil ?") } if data, err := loadFile("zookeeper.pb"); err == nil { if err = proto.Unmarshal(data, m); err != nil { log.Warn("broken zookeeper.pb config file") return err } } else { return err } return nil } func (m *Machine) ConfigLoad() error { if m == nil { return errors.New("It's not safe to run ConfigLoad() on a nil ?") } if os.Getenv("FORGE_HOME") == "" { homeDir, _ := os.UserHomeDir() fullpath := filepath.Join(homeDir, ".config/forge") os.Setenv("FORGE_HOME", fullpath) } hostname, _ := os.Hostname() fname := hostname + ".pb" var data []byte var err error if data, err = loadFile(fname); err != nil { // something went wrong loading the file return err } if data != nil { if err = proto.Unmarshal(data, m); err != nil { log.Warn("broken zookeeper.pb config file", fname) return err } return nil } m.Hostname = hostname m.Distro = detectDistro() m.initPackages() return nil } func loadFile(filename string) ([]byte, error) { homeDir, err := os.UserHomeDir() p := filepath.Join(homeDir, ".config/zookeeper") fullname := filepath.Join(p, filename) data, err := os.ReadFile(fullname) if errors.Is(err, os.ErrNotExist) { // if file does not exist, just return nil. this // will cause ConfigLoad() to try the next config file like "forge.text" // because the user might want to edit the .config by hand return nil, nil } if err != nil { // log.Info("open config file :", err) return nil, err } return data, nil } func (m *Machine) loadFile(fname string) ([]byte, error) { fullname := filepath.Join(os.Getenv("FORGE_HOME"), fname) data, err := os.ReadFile(fullname) if err != nil { // log.Info("open config file :", err) return nil, err } return data, nil } func configWrite(data []byte) error { homeDir, err := os.UserHomeDir() p := filepath.Join(homeDir, ".config/zookeeper") fname := filepath.Join(p, "zookeeper.pb") cfgfile, err := os.OpenFile(fname, os.O_RDWR|os.O_CREATE, 0666) defer cfgfile.Close() if err != nil { log.Warn("open config file :", err) return err } cfgfile.Write(data) return nil } func (m *Machine) configWrite(fname string, data []byte) error { fullname := filepath.Join(os.Getenv("FORGE_HOME"), fname) cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE, 0666) defer cfgfile.Close() if err != nil { log.Warn("open config file :", err) return err } cfgfile.Write(data) return nil }