package main import ( "fmt" "io/ioutil" "net/http" "os" "strings" "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) domname := r.URL.Query().Get("domain") flag := r.URL.Query().Get("flag") msg, err := ioutil.ReadAll(r.Body) // Read the body as []byte if err != nil { fmt.Fprintln(w, "ReadAll() error =", err) return } log.Info("Got URL msg:", string(msg)) if route == "/" { fmt.Fprintln(w, "OK") return } // exit the virtigo daemon & have systemd restart it // this can happen & when it does, access to // to libvirtd will hang (aka: virsh list will hang) // One way to trigger this is to not properly close // domain sockets opened from go-qemu/hypervisor // it's a good idea in any case so leave it here if route == "/kill" { log.Warn("KILLED") fmt.Fprintln(w, "KILLED") os.Exit(-1) return } // curl http://localhost:2520/import?domain=foo.bar.com if route == "/import" { fmt.Fprint(w, "import domain:", domname) return } // toggle logging flags if route == "/flag" { log.HttpMode(w) defer log.HttpMode(nil) log.Info("going to toggle flag:", flag) switch flag { case "PING": if PING.Bool() { log.Log(NOW, "toogle PING false") PING.SetBool(false) } else { log.Log(NOW, "toogle PING true") PING.SetBool(true) } default: log.Info("unknown looging flag:", flag) } return } if route == "/favicon.ico" { writeFile(w, "ipv6.png") return } log.Warn("BAD URL =", route) } func writeFile(w http.ResponseWriter, filename string) { // fmt.Fprintln(w, "GOT TEST?") fullname := "resources/" + filename pfile, err := resources.ReadFile(fullname) if err != nil { log.Println("ERROR:", err) // w.Write(pfile) return } var repohtml string repohtml = string(pfile) if filename == "goReference.svg" { w.Header().Set("Content-Type", "image/svg+xml") } fmt.Fprintln(w, repohtml) log.Println("writeFile() found internal file:", filename) } // 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) } }