netmaker/controllers/ipservice.go
Sayan Mallick c551c487ca
New Docs (#3034)
* 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
2024-08-15 11:55:01 +05:30

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")
}