83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
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"))
|
|
}
|
|
}
|