myip/main.go

83 lines
1.5 KiB
Go
Raw Normal View History

2021-10-15 08:17:56 +00:00
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"))
}
}