summaryrefslogtreecommitdiff
path: root/config.go
blob: 03c81c5d67d2ff1be5b4d4ed11133f74d17b0ded (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
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"

	if data, err := m.loadFile(fname); err == nil {
		if err = proto.Unmarshal(data, m); err != nil {
			log.Warn("broken zookeeper.pb config file", fname)
			return err
		}
	} else {
		return err
	}
	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 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
}