package main // functions to import and export the protobuf // data to and from config files import ( "errors" "fmt" "os" "path/filepath" "go.wit.com/log" ) func (m *Portmaps) ConfigSave() error { if m == nil { return fmt.Errorf("ConfigSave() nil") } s := m.FormatTEXT() log.Info("proto.Marshal() worked len", len(s)) configWrite(argv.Config, []byte(s)) return nil } func ConfigLoad() *Portmaps { var fullname string if os.Getenv("CLOUD_HOME") != "" { fullname = filepath.Join(os.Getenv("CLOUD_HOME"), "gus.text") if argv.Config == "" { argv.Config = fullname } } if argv.Config != "" { fullname = argv.Config } if fullname == "" { homeDir, _ := os.UserHomeDir() fullname = filepath.Join(homeDir, ".config/cloud", "gus.text") argv.Config = fullname } var data []byte var err error if data, err = loadFile(fullname); err != nil { log.Warn("config file failed to load", err) // something went wrong loading the file return nil } if data == nil { return nil } p := new(Portmaps) if err = p.UnmarshalTEXT(data); err != nil { log.Warn("unmarshal failed on config file", err) return nil } log.Log(INFO, "gus.ConfigLoad() has", p.Len(), "port mappings") return p } func EventLoad() *Events { pb := new(Events) var fullname string base, _ := filepath.Split(argv.Config) fullname = filepath.Join(base, "events.pb") var data []byte var err error if data, err = loadFile(fullname); err != nil { log.Warn("event file failed to load", err) // something went wrong loading the file return pb } if data == nil { return pb } if err = pb.Unmarshal(data); err != nil { log.Warn("unmarshal failed on config file", err) return pb } log.Log(INFO, "gus.EventLoad() has", pb.Len(), "port mappings") return pb } func (e *Events) Save() { var fullname string base, _ := filepath.Split(argv.Config) fullname = filepath.Join(base, "events.pb") data, err := e.Marshal() if err != nil { log.Info("proto.Marshal() failed", err) return } log.Info("proto.Marshal() worked len", len(data)) configWrite(fullname, data) } func loadFile(fullname string) ([]byte, error) { data, err := os.ReadFile(fullname) if errors.Is(err, os.ErrNotExist) { // if file does not exist, just return nil. this return nil, nil } if err != nil { // log.Info("open config file :", err) return nil, err } return data, nil } func (m *Portmaps) loadFile(fullname string) ([]byte, error) { data, err := os.ReadFile(fullname) if err != nil { // log.Info("open config file :", err) return nil, err } return data, nil } func configWrite(fullname string, data []byte) error { if _, base := filepath.Split(fullname); base == "" { return fmt.Errorf("--config option not set") } cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) defer cfgfile.Close() if err != nil { log.Warn("open config file :", err) return err } cfgfile.Write(data) return nil } func (m *Portmaps) configWrite(fullname string, data []byte) error { if _, base := filepath.Split(fullname); base == "" { return fmt.Errorf("--config option not set") } cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) defer cfgfile.Close() if err != nil { log.Warn("open config file :", err) return err } cfgfile.Write(data) return nil }