package main import ( "flag" "fmt" "io/ioutil" "net" "net/http" "os" "strings" ) var ( serverMode bool addr string port string envP string host string envHost string ) func init() { envP = os.Getenv("MYIP_PORT") envHost = os.Getenv("MYIP_HOST") flag.BoolVar(&serverMode, "s", false, "run in server mode") flag.StringVar(&host, "u", "kumoly.io", "hostname to ask for") flag.StringVar(&port, "p", "5080", "port to listen|connect") flag.StringVar(&addr, "b", "0.0.0.0", "the address the server binds on") } func usage() { fmt.Fprintf(os.Stderr, "Usage: myip [options]\n") flag.PrintDefaults() } func main() { flag.Parse() if envP != "" { port = envP } if envHost != "" { host = envHost } if serverMode { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ip := r.Header.Get("X-Real-Ip") if ip == "" { ip = r.Header.Get("X-Forwarded-For") } if ip == "" { var err error ip, _, err = net.SplitHostPort(r.RemoteAddr) if err != nil { ip = r.RemoteAddr } } fmt.Fprint(w, ip+"\n") }) err := http.ListenAndServe(addr+":"+port, nil) if err != nil { fmt.Println(err) os.Exit(1) } } else { res, err := http.Get("http://" + host + ":" + port) if err != nil { fmt.Println(err) os.Exit(2) } body, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { fmt.Println(err) os.Exit(3) } fmt.Println(strings.TrimRight(string(body), "\r\n")) } }