zookeeper/machine.go

132 lines
3.3 KiB
Go
Raw Permalink Normal View History

2025-02-15 09:11:45 -06:00
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0
2024-11-15 21:51:25 -06:00
package main
import (
2025-02-15 09:11:45 -06:00
"net/http"
"strings"
2025-02-15 07:17:35 -06:00
"time"
2024-11-15 21:51:25 -06:00
"go.wit.com/lib/protobuf/zoopb"
"go.wit.com/log"
2025-02-15 07:17:35 -06:00
"google.golang.org/protobuf/types/known/timestamppb"
2024-11-15 21:51:25 -06:00
)
2025-02-15 11:39:25 -06:00
func rawGetHostname(data []byte) *zoopb.Machine {
newm := new(zoopb.Machine)
newm.Unmarshal(data)
return newm
}
2025-02-16 12:02:09 -06:00
func handleMachine(r *http.Request, w http.ResponseWriter, hostname string, data []byte) {
2025-02-15 09:11:45 -06:00
hostname = strings.TrimSpace(hostname)
2025-02-15 11:39:25 -06:00
newm := rawGetHostname(data)
if newm == nil {
log.Info("unmarshal failed on data len =", len(data))
}
2025-02-16 12:02:09 -06:00
if hostname != newm.Hostname {
// log.Info("hostname mismatch", hostname, "vs", newm.Hostname)
2025-02-15 11:39:25 -06:00
hostname = newm.Hostname
}
2025-02-15 09:11:45 -06:00
if hostname == "" {
2025-02-16 12:02:09 -06:00
ua := dumpUserAgent(r)
ra := dumpRemoteAddr(r)
log.Info("hostname is blank even after unmarshal. data len =", len(data), ra, ua, newm.Cpus, newm.Hostname)
2025-02-15 11:39:25 -06:00
return
2025-02-15 09:11:45 -06:00
}
2025-02-16 12:02:09 -06:00
// log.Info("lookoing for", hostname)
2025-02-15 09:11:45 -06:00
m := me.machines.FindByHostname(hostname)
if m == nil {
2025-02-15 11:39:25 -06:00
am := new(zoopb.Machine)
am.Hostname = newm.Hostname
am.Memory = newm.Memory
me.machines2.Append(am)
2025-02-16 12:02:09 -06:00
me.machines.Append(newm)
log.Info("new machine", am.Hostname, am.Memory)
2025-02-15 09:11:45 -06:00
return
}
2025-02-16 12:02:09 -06:00
ua := dumpUserAgent(r)
ra := dumpRemoteAddr(r)
if m.UserAgent != ua {
log.Info("hostname ua changed len =", len(data), ra, hostname, ua)
m.UserAgent = ua
}
// log.Info("update machine protobuf", hostname)
updateMachine(newm)
2025-02-15 09:11:45 -06:00
}
2024-11-15 21:51:25 -06:00
// someone sent machine 'u' is it new?
// if not, update the record of it
func updateMachine(u *zoopb.Machine) string {
if u == nil {
return "nil"
}
2024-12-04 02:25:46 -06:00
m := me.machines.FindByHostname(u.Hostname)
2024-11-15 21:51:25 -06:00
if m == nil {
log.Info("adding new machine", u.Hostname)
2024-11-15 21:51:25 -06:00
me.machines.Append(u)
2025-02-15 09:11:45 -06:00
log.Info("save machines pb file here...")
2025-02-15 11:39:25 -06:00
me.machines2.ConfigSave()
2024-11-15 21:51:25 -06:00
return "new"
}
// log.Info("updating machine", m.Hostname)
2024-11-15 21:51:25 -06:00
// did the # of cpus change?
if m.Cpus != u.Cpus {
m.Cpus = u.Cpus
log.Info("cpus changed to", m.Cpus)
}
// did the memory change?
if m.Memory != u.Memory {
m.Memory = u.Memory
log.Info("memory changed to", m.Memory)
}
// init these if nil
if m.Packages == nil {
m.Packages = new(zoopb.Packages)
}
if u.Packages == nil {
u.Packages = new(zoopb.Packages)
}
2024-12-04 02:25:46 -06:00
if zood := m.Packages.FindByName("zood"); zood != nil {
log.Log(INFO, m.Hostname, "has zood version", zood.Version)
}
2025-02-15 07:17:35 -06:00
m.Laststamp = timestamppb.New(time.Now())
2024-11-15 21:51:25 -06:00
updatePackages(m, u.Packages)
2024-11-15 21:51:25 -06:00
return "upgrade"
}
// looks to see if any packages:
// changed versions
// were newly installed
// were uninstalled
func updatePackages(m *zoopb.Machine, newp *zoopb.Packages) bool {
2024-11-15 21:51:25 -06:00
var changed bool = false
loop := newp.SortByName()
for loop.Scan() {
2024-12-04 02:25:46 -06:00
p := loop.Next()
if p.Name == "zood" {
2024-12-04 02:25:46 -06:00
if pold := m.Packages.FindByName("zood"); pold == nil {
changed = true
2025-02-15 03:45:32 -06:00
log.Log(ZOOD, "updatePackages() new package", p.Name, "version", p.Version, "machine", m.Hostname)
m.Packages.Append(p)
} else {
if p.Version == pold.Version {
log.Log(ZOOD, "updatePackages() unchanged", p.Version, "machine", m.Hostname)
} else {
changed = true
2025-02-15 03:45:32 -06:00
log.Log(NOW, "updatePackages() package", p.Name, "version changed", pold.Version, "to", p.Version, "machine", m.Hostname)
pold.Version = p.Version
}
}
}
}
2024-11-15 21:51:25 -06:00
return changed
}