github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/mdb-relayd/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "os" 8 "reflect" 9 10 "github.com/Cloud-Foundations/Dominator/lib/flags/loadflags" 11 "github.com/Cloud-Foundations/Dominator/lib/mdb" 12 "github.com/Cloud-Foundations/Dominator/lib/mdb/mdbd" 13 "github.com/Cloud-Foundations/Dominator/lib/srpc/setupclient" 14 ) 15 16 var ( 17 debug = flag.Bool("debug", false, 18 "If true, show debugging output") 19 mdbFile = flag.String("mdbFile", "/var/lib/Dominator/mdb", 20 "File to read MDB data from (default format is JSON)") 21 22 numMachines int 23 ) 24 25 func printUsage() { 26 fmt.Fprintln(os.Stderr, 27 "Usage: mdb-relayd [flags...]") 28 fmt.Fprintln(os.Stderr, "Common flags:") 29 flag.PrintDefaults() 30 } 31 32 func showMdb(mdb *mdb.Mdb) { 33 mdb.DebugWrite(os.Stdout) 34 fmt.Println() 35 } 36 37 func main() { 38 if err := loadflags.LoadForDaemon("mdb-relayd"); err != nil { 39 fmt.Fprintln(os.Stderr, err) 40 os.Exit(1) 41 } 42 flag.Usage = printUsage 43 flag.Parse() 44 if flag.NArg() != 0 { 45 printUsage() 46 os.Exit(2) 47 } 48 if err := setupclient.SetupTls(true); err != nil { 49 fmt.Fprintln(os.Stderr, err) 50 os.Exit(1) 51 } 52 logger := log.New(os.Stderr, "", log.LstdFlags) 53 mdbChannel := mdbd.StartMdbDaemon(*mdbFile, logger) 54 oldMachines := make(map[string]mdb.Machine) 55 firstTime := true 56 for mdb := range mdbChannel { 57 if *debug { 58 showMdb(mdb) 59 } 60 numNew := 0 61 numChanged := 0 62 machinesToDelete := make(map[string]struct{}) 63 for name := range oldMachines { 64 machinesToDelete[name] = struct{}{} 65 } 66 for _, machine := range mdb.Machines { 67 if machine.Hostname == "" { 68 logger.Println("Received machine with empty Hostname") 69 continue 70 } 71 delete(machinesToDelete, machine.Hostname) 72 if oldMachine, ok := oldMachines[machine.Hostname]; ok { 73 if !reflect.DeepEqual(oldMachine, machine) { 74 oldMachines[machine.Hostname] = machine 75 numChanged++ 76 } 77 } else { 78 oldMachines[machine.Hostname] = machine 79 numNew++ 80 } 81 } 82 if firstTime { 83 firstTime = false 84 logger.Printf("Initial MDB data: %d machines\n", 85 len(mdb.Machines)) 86 continue 87 } 88 for name := range machinesToDelete { 89 delete(oldMachines, name) 90 } 91 logger.Printf("MDB update: %d new, %d removed, %d changed\n", 92 numNew, len(machinesToDelete), numChanged) 93 } 94 }