summaryrefslogtreecommitdiff
path: root/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'config.go')
-rw-r--r--config.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/config.go b/config.go
new file mode 100644
index 0000000..220db76
--- /dev/null
+++ b/config.go
@@ -0,0 +1,139 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "time"
+
+ pb "go.wit.com/lib/protobuf/virtbuf"
+ "go.wit.com/log"
+)
+
+var ErrorNoFile error = errors.New("missing file")
+var ErrorParseJSON error = errors.New("invalid json")
+var ErrorParseXML error = errors.New("invalid xml")
+
+// something is wrong somewhere and sometimes the
+// protobuf json files get written out with garbage
+func cfgfile() {
+ err := readConfigFile("virtigo.json")
+ if err == nil {
+ return
+ }
+ if err == ErrorParseJSON {
+ os.Exit(-1)
+ }
+ err = readConfigFile("virtigo.json.last")
+ if err == nil {
+ log.Info("read json failed", err)
+ os.Exit(-1)
+ }
+ if err == ErrorNoFile {
+ log.Info("no config file created yet", err)
+ os.Exit(-1)
+ }
+}
+
+func readConfigFile(filename string) error {
+ me.cluster = new(pb.Cluster)
+ fullname := filepath.Join(os.Getenv("VIRTIGO_HOME"), filename)
+ pfile, err := os.ReadFile(fullname)
+ if err != nil {
+ log.Info("open config file :", err)
+ return err
+ }
+ err = me.cluster.UnmarshalJSON(pfile)
+ if err != nil {
+ log.Info("read json failed", err)
+ os.Exit(-1)
+ return err
+ }
+
+ // initialize each hypervisor
+ for _, pbh := range me.cluster.Hypervisors {
+ h := findHypervisor(pbh.Hostname)
+ if h != nil {
+ continue
+ }
+ // this is a new unknown droplet (not in the config file)
+ h = new(HyperT)
+ h.pb = pbh
+
+ h.lastpoll = time.Now()
+
+ me.hypers = append(me.hypers, h)
+ log.Log(EVENT, "config new hypervisors", h.pb.Hostname)
+ }
+
+ // initialize values for each droplet
+ for _, pbd := range me.cluster.Droplets {
+ d := findDroplet(pbd.Hostname)
+ if d != nil {
+ continue
+ }
+ // this is a new unknown droplet (not in the config file)
+ d = new(DropletT)
+ d.pb = pbd
+ me.droplets = append(me.droplets, d)
+ log.Log(EVENT, "config new droplet", d.pb.Hostname, d.pb.StartState, d.pb.PreferredHypervisor)
+ }
+
+ return nil
+}
+
+func writeConfigFile() {
+ // Get the current time
+ now := time.Now()
+
+ // Format the time to match your desired format: YYYY.MM.DD.HHMMSS
+ timestamp := now.Format("2006.01.02.150405")
+
+ filename := "virtigo.json.new." + timestamp
+ if !writeConfigFileTmp(filename) {
+ log.Println("config file write error")
+ os.Exit(-1)
+ }
+
+ origname := filepath.Join(os.Getenv("VIRTIGO_HOME"), "virtigo.json")
+ newname := filepath.Join(os.Getenv("VIRTIGO_HOME"), "virtigo.json.old")
+ err := os.Rename(origname, newname)
+ if err != nil {
+ log.Printf("rename fail: %s", err)
+ os.Exit(-1)
+ }
+
+ if !writeConfigFileTmp("virtigo.json") {
+ log.Println("config file write error")
+ os.Exit(-1)
+ }
+}
+
+func writeConfigFileTmp(filename string) bool {
+ fullname := filepath.Join(os.Getenv("VIRTIGO_HOME"), filename)
+ cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE, 0666)
+ defer cfgfile.Close()
+ if err != nil {
+ log.Info("open config file :", err)
+ return false
+ }
+ json := me.cluster.FormatJSON()
+ fmt.Fprintln(cfgfile, json)
+ log.Info("Write:", fullname, "OK")
+ return true
+}
+
+func writeConfigFileDroplets() {
+ fullname := filepath.Join(os.Getenv("VIRTIGO_HOME"), "droplets.text")
+ cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE, 0666)
+ defer cfgfile.Close()
+ if err != nil {
+ log.Info("open config file :", err)
+ return
+ }
+ // text := me.cluster.Droplets.FormatTEXT()
+ text := me.cluster.FormatTEXT()
+ fmt.Fprintln(cfgfile, text)
+ log.Info("Write:", fullname, "OK")
+}