Browse Source

gip: rework giplib in a more propper library

and add Akamai for IPv4

Signed-off-by: Nagy Károly Gábriel <k@jpi.io>
master v0.9
Nagy Károly Gábriel 6 years ago
parent
commit
308041d440
Signed by: karasz
GPG Key ID: C6BA1070A8CBDA0C
  1. 100
      giplib/giplib.go
  2. 8
      main.go

100
giplib/giplib.go

@ -1,45 +1,44 @@
/*
Package giplib implements simple routines for
retrieving one's IPv4 and IPv6 addresses from
various DNS providers. For now it implements
OpenDNS for IPv4 and IPv6, Google for IPv4 and
IPv6 and Akamai for IPv4
*/
package giplib
import (
"github.com/miekg/dns"
)
var (
c *dns.Client
m *dns.Msg
ipv4, ipv6 string
)
/*
dig {-4,-6} +short myip.opendns.com @resolver1.opendns.com
dig {-4,-6} TXT +short o-o.myaddr.l.google.com @ns1.google.com
dig -4 @ns1-1.akamaitech.net whoami.akamai.net +short
*/
func GetIPv4() string {
o4 := getO4()
g4 := getG4()
if o4 == g4 {
return o4
}
return ""
}
func GetIPv6() string {
o6 := getO6()
g6 := getG6()
if o6 == g6 {
return o6
}
return ""
}
func getO4() string {
var ipv4 string
nameserver := dns.Fqdn("resolver1.opendns.com") + ":53"
c := new(dns.Client)
m := &dns.Msg{
func init() {
c = new(dns.Client)
m = &dns.Msg{
MsgHdr: dns.MsgHdr{
RecursionDesired: true,
},
Question: make([]dns.Question, 1),
}
}
//GetOpenDNS4 will retrieve the IPv4 public IP as seen by OpenDNS
func GetOpenDNS4() string {
nameserver := dns.Fqdn("ns1-1.akamaitech.net") + ":53"
c.Net = "udp4"
m.SetQuestion("myip.opendns.com.", dns.TypeA)
m.SetQuestion("whoami.akamai.net.", dns.TypeA)
r4, _, e4 := c.Exchange(m, nameserver)
if e4 != nil {
@ -51,17 +50,10 @@ func getO4() string {
return ipv4
}
func getO6() string {
var ipv6 string
//GetOpenDNS6 will retrieve the IPv6 IP as seen by OpenDNS
func GetOpenDNS6() string {
nameserver := dns.Fqdn("resolver1.opendns.com") + ":53"
c := new(dns.Client)
m := &dns.Msg{
MsgHdr: dns.MsgHdr{
RecursionDesired: true,
},
Question: make([]dns.Question, 1),
}
c.Net = "udp6"
m.SetQuestion("myip.opendns.com.", dns.TypeAAAA)
r6, _, e6 := c.Exchange(m, nameserver)
@ -75,17 +67,10 @@ func getO6() string {
return ipv6
}
func getG4() string {
var ipv4 string
//GetGoogle4 will retrieve the IPv4 public IP as seen by Google
func GetGoogle4() string {
nameserver := dns.Fqdn("ns1.google.com") + ":53"
c := new(dns.Client)
m := &dns.Msg{
MsgHdr: dns.MsgHdr{
RecursionDesired: true,
},
Question: make([]dns.Question, 1),
}
c.Net = "udp4"
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT)
r4, _, e4 := c.Exchange(m, nameserver)
@ -99,17 +84,10 @@ func getG4() string {
return ipv4
}
func getG6() string {
var ipv6 string
//GetGoogle6 will retrieve the IPv6 IP as seen by Google
func GetGoogle6() string {
nameserver := dns.Fqdn("ns1.google.com") + ":53"
c := new(dns.Client)
m := &dns.Msg{
MsgHdr: dns.MsgHdr{
RecursionDesired: true,
},
Question: make([]dns.Question, 1),
}
c.Net = "udp6"
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT)
r6, _, e6 := c.Exchange(m, nameserver)
@ -123,6 +101,24 @@ func getG6() string {
return ipv6
}
//GetAkamai4 will retrieve the IPv4 public IP as seen by Akamai
func GetAkamai4() string {
nameserver := dns.Fqdn("ns1.google.com") + ":53"
c.Net = "udp4"
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT)
r4, _, e4 := c.Exchange(m, nameserver)
if e4 != nil {
ipv4 = ""
} else {
ipv4 = getIP(r4.Answer)
}
return ipv4
}
func getIP(ra []dns.RR) string {
//the answer will always be one IP or none
var ip string

8
main.go

@ -31,15 +31,15 @@ func main() {
all = true
}
if all {
fmt.Println(giplib.GetIPv4())
fmt.Println(giplib.GetIPv6())
fmt.Println(giplib.GetOpenDNS4())
fmt.Println(giplib.GetGoogle6())
os.Exit(0)
}
if *ptr4 {
fmt.Println(giplib.GetIPv4())
fmt.Println(giplib.GetOpenDNS4())
}
if *ptr6 {
fmt.Println(giplib.GetIPv6())
fmt.Println(giplib.GetOpenDNS6())
}
}

Loading…
Cancel
Save