mirror of
https://github.com/gravitl/netmaker.git
synced 2024-09-20 07:16:06 +08:00
c551c487ca
* New Docs CSS update and Dockerfile to include docs folder flash of unrendered text fix markdown docs ignore docs/docs.go improving the docs generation github actions for docs generation go runner version fix updated docs.yml update repo action updated updated actions and dns docs dns complete More docs update Complete docs and updated workflow Update documentation Tue Aug 6 11:17:42 UTC 2024 Update documentation Thu Aug 8 12:26:57 UTC 2024 clean up clean up Dockerfile clean up Updated workflow Updated workflow Update docs.yml Update docs.yml * requested changes * changed ingress gateway to remote access gateway
76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package controller
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
)
|
|
|
|
func ipHandlers(r *mux.Router) {
|
|
r.HandleFunc("/api/getip", http.HandlerFunc(getPublicIP)).Methods(http.MethodGet)
|
|
}
|
|
|
|
// @Summary Get the current public IP address.
|
|
// @Router /api/getip [get]
|
|
// @Tags IP Service
|
|
// @Security oauth2
|
|
// @Success 200 {string} string "The public IP address."
|
|
// @Failure 400 {string} string "Invalid IP address or no IP found."
|
|
func getPublicIP(w http.ResponseWriter, r *http.Request) {
|
|
r.Header.Set("Connection", "close")
|
|
ip, err := parseIP(r)
|
|
if err != nil {
|
|
w.WriteHeader(400)
|
|
switch {
|
|
case ip != "":
|
|
_, _ = w.Write([]byte("ip is invalid: " + ip))
|
|
case ip == "":
|
|
_, _ = w.Write([]byte("no ip found"))
|
|
default:
|
|
fmt.Println(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(200)
|
|
_, _ = w.Write([]byte(ip))
|
|
}
|
|
|
|
func parseIP(r *http.Request) (string, error) {
|
|
// Get Public IP from header
|
|
ip := r.Header.Get("X-REAL-IP")
|
|
ipnet := net.ParseIP(ip)
|
|
if ipnet != nil && !ncutils.IpIsPrivate(ipnet) {
|
|
return ip, nil
|
|
}
|
|
|
|
// If above fails, get Public IP from other header instead
|
|
forwardips := r.Header.Get("X-FORWARDED-FOR")
|
|
iplist := strings.Split(forwardips, ",")
|
|
for _, ip := range iplist {
|
|
ipnet := net.ParseIP(ip)
|
|
if ipnet != nil && !ncutils.IpIsPrivate(ipnet) {
|
|
return ip, nil
|
|
}
|
|
}
|
|
|
|
// If above also fails, get Public IP from Remote Address of request
|
|
ip, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
ipnet = net.ParseIP(ip)
|
|
if ipnet != nil {
|
|
if ncutils.IpIsPrivate(ipnet) {
|
|
return ip, fmt.Errorf("ip is a private address")
|
|
}
|
|
return ip, nil
|
|
}
|
|
return "", fmt.Errorf("no ip found")
|
|
}
|