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 {
|
2024-11-17 23:23:02 -06:00
|
|
|
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"
|
|
|
|
}
|
2024-11-17 23:23:02 -06:00
|
|
|
// 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 {
|
2024-11-19 05:44:16 -06:00
|
|
|
log.Log(INFO, m.Hostname, "has zood version", zood.Version)
|
2024-11-18 20:13:22 -06:00
|
|
|
}
|
2025-02-15 07:17:35 -06:00
|
|
|
m.Laststamp = timestamppb.New(time.Now())
|
2024-11-15 21:51:25 -06:00
|
|
|
|
2024-11-18 20:13:22 -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
|
2024-11-18 20:13:22 -06:00
|
|
|
func updatePackages(m *zoopb.Machine, newp *zoopb.Packages) bool {
|
2024-11-15 21:51:25 -06:00
|
|
|
var changed bool = false
|
|
|
|
|
2024-11-18 20:13:22 -06:00
|
|
|
loop := newp.SortByName()
|
|
|
|
for loop.Scan() {
|
2024-12-04 02:25:46 -06:00
|
|
|
p := loop.Next()
|
2024-11-18 20:13:22 -06:00
|
|
|
if p.Name == "zood" {
|
2024-12-04 02:25:46 -06:00
|
|
|
if pold := m.Packages.FindByName("zood"); pold == nil {
|
2024-11-18 20:13:22 -06:00
|
|
|
changed = true
|
2025-02-15 03:45:32 -06:00
|
|
|
log.Log(ZOOD, "updatePackages() new package", p.Name, "version", p.Version, "machine", m.Hostname)
|
2024-11-18 20:13:22 -06:00
|
|
|
m.Packages.Append(p)
|
|
|
|
} else {
|
|
|
|
if p.Version == pold.Version {
|
2024-11-19 05:44:16 -06:00
|
|
|
log.Log(ZOOD, "updatePackages() unchanged", p.Version, "machine", m.Hostname)
|
2024-11-18 20:13:22 -06:00
|
|
|
} 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)
|
2024-11-19 05:44:16 -06:00
|
|
|
pold.Version = p.Version
|
2024-11-18 20:13:22 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-11-15 21:51:25 -06:00
|
|
|
return changed
|
|
|
|
}
|