Compare commits

..

No commits in common. "master" and "v0.0.61" have entirely different histories.

5 changed files with 177 additions and 78 deletions

157
config.go
View File

@ -4,20 +4,161 @@ package zoopb
// data to and from config files
import (
"go.wit.com/lib/config"
"errors"
"fmt"
"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(fullname string) error {
return config.SavePB(m, fullname)
func (m *Machines) ConfigSave() error {
if m == nil {
return fmt.Errorf("ConfigSave() machines == n")
}
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
}
func (m *Machines) ConfigLoad() (string, error) {
fullname, err := config.LoadPB(m, "/var/lib", "machines")
// 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("zoopb.ConfigLoad() failed", err, fullname)
log.Info("proto.Marshal() failed len", len(data), err)
return err
}
fullname, err = config.LoadPB(m, "zookeeper", "machines")
return fullname, 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.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|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 *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|os.O_TRUNC, 0644)
defer cfgfile.Close()
if err != nil {
log.Warn("open config file :", err)
return err
}
cfgfile.Write(data)
return nil
}

49
init.go
View File

@ -1,49 +0,0 @@
package zoopb
import (
"os"
"time"
"go.wit.com/lib/config"
"go.wit.com/log"
)
// sent via -ldflags
var VERSION string
var BUILDTIME string
func (m *Machine) SinceLastUpdate() time.Duration {
age := m.Laststamp.AsTime()
return time.Since(age)
}
func InitMachine() (*Machine, string) {
var fullname string
var err error
m := new(Machine)
if fullname, err = config.LoadPB(m, "forge", "machine"); err != nil {
log.Info("zoopb.ConfigLoad() failed", err)
}
hostname, _ := os.Hostname()
m.Hostname = hostname
m.Distro = detectDistro()
m.initPackages()
m.InitWitMirrors()
config.SavePB(m, fullname)
return m, fullname
}
func InitDaemon() (*Machine, string) {
var fullname string
var err error
machine := new(Machine)
if fullname, err = config.LoadPB(machine, "/etc/zookeeper", "machine"); err != nil {
log.Info("zoopb.ConfigLoad() failed", err)
}
machine.InitWitMirrors()
config.SavePB(machine, fullname)
return machine, fullname
}

26
main.go Normal file
View File

@ -0,0 +1,26 @@
package zoopb
import (
"time"
"go.wit.com/log"
)
// sent via -ldflags
var VERSION string
var BUILDTIME string
func InitMachine() *Machine {
machine := new(Machine)
if err := machine.ConfigLoad(); err != nil {
log.Info("zoopb.ConfigLoad() failed", err)
}
machine.InitWit()
return machine
}
func (m *Machine) SinceLastUpdate() time.Duration {
age := m.Laststamp.AsTime()
return time.Since(age)
}

View File

@ -1,13 +0,0 @@
package zoopb
import "go.wit.com/log"
// init the installed package list
func (m *Machine) Dump() {
log.Infof("mem=%d cpus=%d\n", m.Memory, m.Cpus)
// totalMemGB := float64(sysInfo.Totalram) * float64(sysInfo.Unit) / (1024 * 1024 * 1024)
// Print results
// fmt.Printf("Total Memory: %.2f GB\n", totalMemGB)
// fmt.Printf("Number of CPUs: %d\n", numCPUs)
}

8
wit.go
View File

@ -19,12 +19,6 @@ func (m *Machine) IsInstalled(name string) bool {
}
func (m *Machine) FindInstalledByName(name string) *Package {
if m == nil {
panic("m == nil")
}
if m.Packages == nil {
panic("m.Packages == nil")
}
for p := range m.Packages.IterByName() {
if name == p.Name {
// log.Info("package installed:", p.Name, p.Version, p.PkgName)
@ -83,7 +77,7 @@ func (m *Machine) FindByVersion(name string, version string) *Package {
// read the package list file from mirrors.wit.com
// obviously a hack at this point
func (m *Machine) InitWitMirrors() error {
func (m *Machine) InitWit() error {
if m.Wit == nil {
m.Wit = new(Packages)
}