myip/server.go

101 lines
2.2 KiB
Go
Raw Normal View History

2021-10-16 21:23:55 +00:00
package myip
2021-10-15 16:58:49 +00:00
import (
"fmt"
2021-10-16 18:22:55 +00:00
"io"
2021-10-15 16:58:49 +00:00
"log"
"net"
"net/http"
2021-10-16 18:22:55 +00:00
"os"
2021-10-18 16:47:09 +00:00
"strings"
"time"
2021-10-15 16:58:49 +00:00
"github.com/spf13/cobra"
)
var ServerCmd = &cobra.Command{
Use: "serve",
Short: "Simple server that returns the resolved IP.",
Run: func(cmd *cobra.Command, args []string) {
2021-10-16 18:22:55 +00:00
if logToFile != "" {
f, err := os.OpenFile(logToFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Error opening file: %v", err)
}
defer f.Close()
mwriter := io.MultiWriter(f, os.Stderr)
log.SetOutput(mwriter)
}
2021-10-15 16:58:49 +00:00
StartServer()
},
}
var (
// declared in client
// port string
2021-10-15 16:58:49 +00:00
addr string
2021-10-16 18:22:55 +00:00
logToFile string
2021-10-15 16:58:49 +00:00
)
func init() {
ServerCmd.Flags().StringVarP(&port, "port", "p", "5080", "server port to listen")
ServerCmd.Flags().StringVarP(&addr, "address", "b", "0.0.0.0", "address the server binds on")
2021-10-16 18:22:55 +00:00
ServerCmd.Flags().StringVarP(&logToFile, "log", "f", "", "log to file if filepath provided")
2021-10-15 16:58:49 +00:00
}
func StartServer() error {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
ip := GetIP(r)
2021-10-15 16:58:49 +00:00
fmt.Fprint(w, ip+"\n")
// logging
user := r.URL.Query().Get("name")
if user == "" {
user = r.URL.String()
}
host, _, _ := net.SplitHostPort(r.RemoteAddr)
log.Printf("%s %s %s %s %s\n", time.Now().Format("2006-01-02-15:04:05"), host, ip, user, r.Header.Get("User-Agent"))
2021-10-15 16:58:49 +00:00
})
err := http.ListenAndServe(addr+":"+port, simpleLogger(http.DefaultServeMux))
if err != nil {
log.Println(err)
return err
}
return nil
}
func GetIP(r *http.Request) string {
ip := r.Header.Get("X-Real-Ip")
if ip == "" {
2021-10-18 16:47:09 +00:00
ips := r.Header.Get("X-Forwarded-For")
ipArr := strings.Split(ips, ",")
ip = strings.Trim(ipArr[len(ipArr)-1], " ")
}
if ip == "" {
var err error
ip, _, err = net.SplitHostPort(r.RemoteAddr)
if err != nil {
ip = r.RemoteAddr
}
}
return ip
}
2021-10-15 16:58:49 +00:00
func simpleLogger(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
2021-10-15 19:15:49 +00:00
// for name, values := range r.Header {
// // Loop over all values for the name.
// for _, value := range values {
// fmt.Println(name, value)
// }
// }
// log.Printf("%s %s %s %s\n", r.RemoteAddr, r.Method, r.URL, r.Header.Get("User-Agent"))
2021-10-15 16:58:49 +00:00
handler.ServeHTTP(w, r)
})
}