Add Public IP Service handling to config and GetPublicIP().

This commit is contained in:
cameronts 2022-07-27 16:45:12 -07:00
parent 2585e88d79
commit 1cb42e8f8b
5 changed files with 27 additions and 4 deletions

View file

@ -66,6 +66,13 @@ func GetFlags(hostname string) []cli.Flag {
Value: "",
Usage: "Identifiable name for machine within Netmaker network.",
},
&cli.StringFlag{
Name: "publicipservice",
Aliases: []string{"ip-service"},
EnvVars: []string{"NETCLIENT_IP_SERVICE"},
Value: "",
Usage: "The service to call to obtain the public IP of the machine that is running netclient.",
},
&cli.StringFlag{
Name: "name",
EnvVars: []string{"NETCLIENT_NAME"},

View file

@ -26,12 +26,18 @@ type ClientConfig struct {
Server models.ServerConfig `yaml:"server"`
Node models.Node `yaml:"node"`
NetworkSettings models.Network `yaml:"networksettings"`
GlobalSettings GlobalSettings `yaml:"globalSettings"`
Network string `yaml:"network"`
Daemon string `yaml:"daemon"`
OperatingSystem string `yaml:"operatingsystem"`
AccessKey string `yaml:"accesskey"`
}
// GlobalSettings - settings that apply for the netclient across networks
type GlobalSettings struct {
PublicIPService string `yaml:"publicIPService"`
}
// RegisterRequest - struct for registation with netmaker server
type RegisterRequest struct {
Key ed25519.PrivateKey
@ -231,6 +237,7 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) {
cfg.Server.CoreDNSAddr = c.String("corednsaddr")
cfg.Server.API = c.String("apiserver")
}
cfg.GlobalSettings.PublicIPService = c.String("publicipservice")
cfg.Node.Name = c.String("name")
cfg.Node.Interface = c.String("interface")
cfg.Node.Password = c.String("password")

View file

@ -85,7 +85,7 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
if cfg.Node.IsLocal == "yes" && cfg.Node.LocalAddress != "" {
cfg.Node.Endpoint = cfg.Node.LocalAddress
} else {
cfg.Node.Endpoint, err = ncutils.GetPublicIP()
cfg.Node.Endpoint, err = ncutils.GetPublicIP(cfg.GlobalSettings.PublicIPService)
}
if err != nil || cfg.Node.Endpoint == "" {
logger.Log(0, "network:", cfg.Network, "error setting cfg.Node.Endpoint.")

View file

@ -44,7 +44,7 @@ func checkin() {
nodeCfg.Network = network
nodeCfg.ReadConfig()
if nodeCfg.Node.IsStatic != "yes" {
extIP, err := ncutils.GetPublicIP()
extIP, err := ncutils.GetPublicIP(nodeCfg.GlobalSettings.PublicIPService)
if err != nil {
logger.Log(1, "error encountered checking public ip addresses: ", err.Error())
}

View file

@ -126,12 +126,20 @@ func IsEmptyRecord(err error) bool {
}
// GetPublicIP - gets public ip
func GetPublicIP() (string, error) {
func GetPublicIP(publicIpService string) (string, error) {
iplist := []string{"https://ip.server.gravitl.com", "https://ifconfig.me", "https://api.ipify.org", "https://ipinfo.io/ip"}
if publicIpService != "" {
logger.Log(3, "User (config file) provided public IP service is", publicIpService)
// prepend the user-specified service so it's checked first
iplist = append([]string{publicIpService}, iplist...)
}
iplist := []string{"https://ip.client.gravitl.com", "https://ifconfig.me", "https://api.ipify.org", "https://ipinfo.io/ip"}
endpoint := ""
var err error
for _, ipserver := range iplist {
logger.Log(3, "Running public IP check with service", ipserver)
client := &http.Client{
Timeout: time.Second * 10,
}
@ -146,6 +154,7 @@ func GetPublicIP() (string, error) {
continue
}
endpoint = string(bodyBytes)
logger.Log(3, "Public IP address is", endpoint)
break
}
}