update
							parent
							
								
									87ad47e371
								
							
						
					
					
						commit
						ef328a6a48
					
				
							
								
								
									
										147
									
								
								main.go
								
								
								
								
							
							
						
						
									
										147
									
								
								main.go
								
								
								
								
							| 
						 | 
				
			
			@ -4,10 +4,12 @@ import (
 | 
			
		|||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"text/tabwriter"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
| 
						 | 
				
			
			@ -17,16 +19,30 @@ var (
 | 
			
		|||
	envP       string
 | 
			
		||||
	host       string
 | 
			
		||||
	envHost    string
 | 
			
		||||
	showVer    bool
 | 
			
		||||
	showHeader bool
 | 
			
		||||
	showAll    bool
 | 
			
		||||
	showTab    bool
 | 
			
		||||
	// iface string
 | 
			
		||||
	// envIface string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var Version = "v0.1.0"
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	envP = os.Getenv("MYIP_PORT")
 | 
			
		||||
	envHost = os.Getenv("MYIP_HOST")
 | 
			
		||||
 | 
			
		||||
	flag.BoolVar(&showVer, "v", false, "show version")
 | 
			
		||||
	flag.BoolVar(&serverMode, "s", false, "run in server mode")
 | 
			
		||||
	flag.BoolVar(&showAll, "a", false, "show all interface")
 | 
			
		||||
	flag.BoolVar(&showHeader, "t", false, "show header")
 | 
			
		||||
	flag.BoolVar(&showTab, "T", false, "show tab")
 | 
			
		||||
	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")
 | 
			
		||||
 | 
			
		||||
	// flag.StringVar(&port, "p", "5080", "port to listen|connect")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func usage() {
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +52,10 @@ func usage() {
 | 
			
		|||
 | 
			
		||||
func main() {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	if showVer {
 | 
			
		||||
		fmt.Println(Version)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if envP != "" {
 | 
			
		||||
		port = envP
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -44,39 +64,104 @@ func main() {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		StartServer()
 | 
			
		||||
	} else {
 | 
			
		||||
		res, err := http.Get("http://" + host + ":" + port)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println(err)
 | 
			
		||||
			os.Exit(2)
 | 
			
		||||
		var wFlag uint = 0
 | 
			
		||||
		if showTab {
 | 
			
		||||
			wFlag = tabwriter.Debug
 | 
			
		||||
		}
 | 
			
		||||
		body, err := ioutil.ReadAll(res.Body)
 | 
			
		||||
		res.Body.Close()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println(err)
 | 
			
		||||
			os.Exit(3)
 | 
			
		||||
		w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', wFlag)
 | 
			
		||||
		if showHeader {
 | 
			
		||||
			fmt.Fprintln(w, "\tInterface\tIP\t")
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println(strings.TrimRight(string(body), "\r\n"))
 | 
			
		||||
		fmt.Fprintln(w, fmt.Sprintf("\t%v\t%v\t", "PublicIP", GetPublicIP()))
 | 
			
		||||
		if showAll {
 | 
			
		||||
			for k, v := range GetLocalIP() {
 | 
			
		||||
				fmt.Fprintln(w, fmt.Sprintf("\t%v\t%v\t", strings.Trim(k, " "), v))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		w.Flush()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StartServer() {
 | 
			
		||||
	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")
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	http.HandleFunc("/version", func(rw http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		fmt.Fprintf(rw, Version)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	err := http.ListenAndServe(addr+":"+port, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetLocalIP() map[string]string {
 | 
			
		||||
	ret := map[string]string{}
 | 
			
		||||
	ifaces, err := net.Interfaces()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return ret
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, i := range ifaces {
 | 
			
		||||
		addrs, err := i.Addrs()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Println(err)
 | 
			
		||||
			return ret
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, addr := range addrs {
 | 
			
		||||
			var ip net.IP
 | 
			
		||||
			switch v := addr.(type) {
 | 
			
		||||
			case *net.IPNet:
 | 
			
		||||
				ip = v.IP
 | 
			
		||||
				if ip.IsLoopback() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				if ip.To4() == nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			case *net.IPAddr:
 | 
			
		||||
				continue
 | 
			
		||||
				// ip = v.IP
 | 
			
		||||
				// if ip.IsLoopback() {
 | 
			
		||||
				// 	continue
 | 
			
		||||
				// }
 | 
			
		||||
			}
 | 
			
		||||
			ret[i.Name] = ip.String()
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetPublicIP() string {
 | 
			
		||||
	res, err := http.Get("http://" + host + ":" + port)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	body, err := ioutil.ReadAll(res.Body)
 | 
			
		||||
	res.Body.Close()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return strings.TrimRight(string(body), "\r\n")
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue