package main import ( "fmt" "io/ioutil" "net/http" "strings" "go.wit.com/lib/protobuf/zoopb" "go.wit.com/log" ) // remove '?' part and trailing '/' func cleanURL(url string) string { url = "/" + strings.Trim(url, "/") return url } func okHandler(w http.ResponseWriter, r *http.Request) { log.Info("Got URL Path: ", r.URL.Path) route := cleanURL(r.URL.Path) hostname := r.URL.Query().Get("hostname") msg, err := ioutil.ReadAll(r.Body) // Read the body as []byte if err != nil { log.Info("ReadAll() error =", err) return } if route == "/" { return } if route == "/machine" { var m *zoopb.Machine m = new(zoopb.Machine) if err := m.Unmarshal(msg); err != nil { log.Info("proto.Unmarshal() failed on wire message len", len(msg)) log.Info("error =", err) return } log.Info("proto.Unmarshal() worked on wire message len", len(msg), "from", m.Hostname) switch updateMachine(m) { case "upgrade": fmt.Fprintln(w, "upgrade") default: fmt.Fprintln(w, "notsure") } return } if route == "/status" { if hostname == "" { // ignore junk log.Info("hostname was blank") return } var packs *zoopb.Packages packs = new(zoopb.Packages) if err := packs.Unmarshal(msg); err != nil { log.Info("proto.Unmarshal() failed on wire message len", len(msg), "from", hostname) return } log.Info("Unmarshal worked with msg len", len(msg), "from", hostname) log.Info(hostname, "has", packs.Len(), "packages installed") fmt.Fprintln(w, "upgrade") return } log.Warn("BAD URL =", route) } // starts and sits waiting for HTTP requests func startHTTP() { http.HandleFunc("/", okHandler) p := fmt.Sprintf(":%d", argv.Port) log.Println("Running on port", p) err := http.ListenAndServe(p, nil) if err != nil { log.Println("Error starting server:", err) } }