summaryrefslogtreecommitdiff
path: root/config.go
blob: c46106fbd547ec72ee56087e8396ff0a8d19fc6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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"
	"google.golang.org/protobuf/proto"
)

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([]byte(s))
	return nil
}

func ConfigLoad() *Portmaps {
	if os.Getenv("CLOUD_HOME") == "" {
		homeDir, _ := os.UserHomeDir()
		fullpath := filepath.Join(homeDir, ".config/cloud")
		os.Setenv("CLOUD_HOME", fullpath)
	}

	var data []byte
	var err error
	if data, err = loadFile("gus.text"); err != nil {
		log.Warn("gus.text 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 gus.text config file", err)
		return nil
	}

	log.Log(INFO, "gus.ConfigLoad() has", p.Len(), "port mappings")
	return p
}

func (m *Portmaps) ConfigLoad() error {
	if m == nil {
		return errors.New("It's not safe to run ConfigLoad() on a nil ?")
	}
	if os.Getenv("CLOUD_HOME") == "" {
		homeDir, _ := os.UserHomeDir()
		fullpath := filepath.Join(homeDir, ".config/cloud")
		os.Setenv("CLOUD_HOME", fullpath)
	}

	var data []byte
	var err error
	if data, err = loadFile("gus.text"); err != nil {
		// something went wrong loading the file
		return err
	}

	if data != nil {
		if err = proto.Unmarshal(data, m); err != nil {
			log.Warn("broken gus.text config file", "gus.text")
			return err
		}
		return nil
	}

	log.Log(INFO, "gus.ConfigLoad() has", m.Len(), "port mappings")
	return nil
}

func loadFile(filename string) ([]byte, error) {
	homeDir, err := os.UserHomeDir()
	p := filepath.Join(homeDir, ".config/cloud")
	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
		return nil, nil
	}
	if err != nil {
		// log.Info("open config file :", err)
		return nil, err
	}
	return data, nil
}

func (m *Portmaps) loadFile(fname string) ([]byte, error) {
	fullname := filepath.Join(os.Getenv("CLOUD_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/cloud")
	fname := filepath.Join(p, "gus.text")
	cfgfile, err := os.OpenFile(fname, 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(fname string, data []byte) error {
	fullname := filepath.Join(os.Getenv("CLOUD_HOME"), fname)

	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
}