Compare commits

...

2 Commits
v0.6 ... master

Author SHA1 Message Date
Nagy Károly Gábriel 308041d440
gip: rework giplib in a more propper library 6 years ago
Nagy Károly Gábriel af71b64160
giplib: separate functions in lib and app 6 years ago
  1. 114
      giplib/giplib.go
  2. 45
      main.go

114
gip.go → giplib/giplib.go

@ -1,76 +1,122 @@
package main
/*
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 (
"fmt"
"github.com/miekg/dns"
"os"
)
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 getO() (ipv4 string, ipv6 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),
}
// get IPv4 first
}
//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 {
ipv4 = ""
} else {
ipv4 = getIP(r4.Answer)
}
// now IPv6
return ipv4
}
//GetOpenDNS6 will retrieve the IPv6 IP as seen by OpenDNS
func GetOpenDNS6() string {
nameserver := dns.Fqdn("resolver1.opendns.com") + ":53"
c.Net = "udp6"
m.SetQuestion("myip.opendns.com.", dns.TypeAAAA)
r6, _, e6 := c.Exchange(m, nameserver)
if e6 != nil {
ipv6 = ""
} else {
ipv6 = getIP(r6.Answer)
}
return ipv4, ipv6
return ipv6
}
func getG() (ipv4 string, ipv6 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),
}
// get IPv4 first
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)
}
// now IPv6
return ipv4
}
//GetGoogle6 will retrieve the IPv6 IP as seen by Google
func GetGoogle6() string {
nameserver := dns.Fqdn("ns1.google.com") + ":53"
c.Net = "udp6"
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT)
r6, _, e6 := c.Exchange(m, nameserver)
if e6 != nil {
ipv6 = ""
} else {
ipv6 = getIP(r6.Answer)
}
return ipv4, ipv6
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 {
@ -87,26 +133,6 @@ func getIP(ra []dns.RR) string {
ip = ansb.Txt[0]
}
}
return ip
}
func main() {
var ipv4, ipv6 string
exit := 0
o4, o6 := getO()
g4, g6 := getG()
if o4 == g4 {
ipv4 = o4
} else {
ipv4 = ""
exit = 111
}
if o6 == g6 {
ipv6 = o6
} else {
ipv6 = ""
exit = 111
}
fmt.Printf("%s\t%s\n", ipv4, ipv6)
os.Exit(exit)
return ip
}

45
main.go

@ -0,0 +1,45 @@
package main
import (
"flag"
"fmt"
"git.jpi.io/karasz/gip/giplib"
"os"
)
var (
//Version contains the git hashtag injected by make
Version = "N/A"
//BuildTime contains the build timestamp injected by make
BuildTime = "N/A"
)
func main() {
var all bool
ptr4 := flag.Bool("4", false, "return only IPv4")
ptr6 := flag.Bool("6", false, "return only IPv6")
version := flag.Bool("v", false, "return version")
flag.Parse()
if *version {
fmt.Println(Version, " built on ", BuildTime)
os.Exit(0)
}
if *ptr4 == *ptr6 {
all = true
}
if all {
fmt.Println(giplib.GetOpenDNS4())
fmt.Println(giplib.GetGoogle6())
os.Exit(0)
}
if *ptr4 {
fmt.Println(giplib.GetOpenDNS4())
}
if *ptr6 {
fmt.Println(giplib.GetOpenDNS6())
}
}
Loading…
Cancel
Save