summaryrefslogtreecommitdiff
path: root/config.go
blob: 9a149de2e7b745d167f65ec79c5687b31c7988ea (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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 <hostname>.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()
	log.Info("zoopb.ConfigLoad()", m.Hostname, "runs", m.Distro, "with", m.Packages.Len(), "packages")
	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
}