Skip to content

Instantly share code, notes, and snippets.

@nictuku
Created July 30, 2012 23:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nictuku/3211943 to your computer and use it in GitHub Desktop.
Save nictuku/3211943 to your computer and use it in GitHub Desktop.
pingmeplz
package main
import (
"fmt"
logpkg "log"
"log/syslog"
"net"
"net/http"
"os"
"os/exec"
"syscall"
)
const (
waitSeconds = "3"
pingCount = "5"
)
var log *logpkg.Logger
func init() {
var err error
log, err = syslog.NewLogger(syslog.LOG_INFO, logpkg.LstdFlags)
if err != nil {
log = logpkg.New(os.Stderr, "", logpkg.LstdFlags)
log.Println("syslog.NewLogger:", err.Error())
}
log.Println("init.")
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Printf("%v => %v", r.RemoteAddr, r.URL.String())
host, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
http.Error(w, fmt.Sprintf("RemoteAddr %v: %v", r.RemoteAddr, err), http.StatusBadRequest)
return
}
cmd := exec.Command("ping", "-w", waitSeconds, "-c", pingCount, host)
out, err := cmd.CombinedOutput()
if err == nil {
log.Println("Unexected nil error from exec.Command")
http.Error(w, "oops", http.StatusInternalServerError)
return
}
if e, ok := err.(*exec.ExitError); ok {
status := e.Sys().(syscall.WaitStatus).ExitStatus()
log.Printf("%v : exit status: %d", string(out), status)
fmt.Fprintf(w, "%v\nexit status: %d\n", string(out), status)
return
}
log.Println("exec CombinedOutput failure:", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment