// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "embed" "fmt" "os" "time" "go.wit.com/dev/alexflint/arg" "go.wit.com/lib/hostname" "go.wit.com/lib/protobuf/zoopb" "go.wit.com/log" ) var VERSION string var BUILDTIME string //go:embed resources/* var resources embed.FS func main() { me = new(zoodStruct) me.pp = arg.MustParse(&argv) if me.pp == nil { me.pp.WriteHelp(os.Stdout) os.Exit(0) } if argv.Daemon { // turn off timestamps for STDOUT (systemd adds them) log.DaemonMode(true) me.machine, me.fullpath = zoopb.InitDaemon() } else { me.machine, me.fullpath = zoopb.InitMachine() } if err := testZoo(); err != nil { log.Info("FAILED TO CONNECT TO ZOOKEEPER: ", err) log.Info("sleeping for 3 minutes") time.Sleep(3 * time.Minute) os.Exit(0) } me.pollDelay = 3 * time.Second me.failcountmax = 20 // die every minute if zookeeper can't be found if argv.Test != nil { testURL(me.urlbase, me.machine) os.Exit(0) } zood() // talks to zookeeper } func testZoo() error { var err error if argv.URL != "" { log.Info("USING ARGV URL:", argv.URL) if err = testURL(argv.URL, me.machine); err == nil { me.urlbase = argv.URL return nil } } zooname := findZookeeper() url := fmt.Sprintf("http://%s:8080/", zooname) if err = testURL(url, me.machine); err == nil { me.urlbase = url return nil } url = fmt.Sprintf("https://%s/", zooname) if err = testURL(url, me.machine); err == nil { me.urlbase = url return nil } url = "http://zookeeper.wit.com:8080/" if err = testURL(url, me.machine); err == nil { me.urlbase = url return nil } url = "https://zookeeper.wit.com/" if err = testURL(url, me.machine); err == nil { me.urlbase = url return nil } return err } func findZookeeper() string { hname, dname, err := hostname.GetDomainname() if err != nil { log.Info("error with os.Hostname()", hname, dname, err) } if dname == "" { return "zookeeper.wit.com" } return hostname.Join("zookeeper", dname) } func testURL(urlbase string, pb *zoopb.Machine) error { newpb, wsPB, err := pb.HttpPost(urlbase, "test") if err != nil { log.Info("got error:", err) return err } wsPB.DumpClient() newpb.Dump() log.Info("got error:", err) return err }