Browse Source

giplib: separate functions in lib and app

Signed-off-by: Nagy Károly Gábriel <k@jpi.io>
master v.0.8
Nagy Károly Gábriel 6 years ago
parent
commit
af71b64160
Signed by: karasz
GPG Key ID: C6BA1070A8CBDA0C
  1. 94
      giplib/giplib.go
  2. 45
      main.go

94
gip.go → giplib/giplib.go

@ -1,9 +1,7 @@
package main package giplib
import ( import (
"fmt"
"github.com/miekg/dns" "github.com/miekg/dns"
"os"
) )
/* /*
@ -11,7 +9,26 @@ 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,-6} TXT +short o-o.myaddr.l.google.com @ns1.google.com
*/ */
func getO() (ipv4 string, ipv6 string) { 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" nameserver := dns.Fqdn("resolver1.opendns.com") + ":53"
c := new(dns.Client) c := new(dns.Client)
@ -21,28 +38,45 @@ func getO() (ipv4 string, ipv6 string) {
}, },
Question: make([]dns.Question, 1), Question: make([]dns.Question, 1),
} }
// get IPv4 first
c.Net = "udp4" c.Net = "udp4"
m.SetQuestion("myip.opendns.com.", dns.TypeA) m.SetQuestion("myip.opendns.com.", dns.TypeA)
r4, _, e4 := c.Exchange(m, nameserver) r4, _, e4 := c.Exchange(m, nameserver)
if e4 != nil { if e4 != nil {
ipv4 = "" ipv4 = ""
} else { } else {
ipv4 = getIP(r4.Answer) ipv4 = getIP(r4.Answer)
} }
// now IPv6
return ipv4
}
func getO6() string {
var ipv6 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" c.Net = "udp6"
m.SetQuestion("myip.opendns.com.", dns.TypeAAAA) m.SetQuestion("myip.opendns.com.", dns.TypeAAAA)
r6, _, e6 := c.Exchange(m, nameserver) r6, _, e6 := c.Exchange(m, nameserver)
if e6 != nil { if e6 != nil {
ipv6 = "" ipv6 = ""
} else { } else {
ipv6 = getIP(r6.Answer) ipv6 = getIP(r6.Answer)
} }
return ipv4, ipv6
return ipv6
} }
func getG() (ipv4 string, ipv6 string) { func getG4() string {
var ipv4 string
nameserver := dns.Fqdn("ns1.google.com") + ":53" nameserver := dns.Fqdn("ns1.google.com") + ":53"
c := new(dns.Client) c := new(dns.Client)
@ -52,25 +86,41 @@ func getG() (ipv4 string, ipv6 string) {
}, },
Question: make([]dns.Question, 1), Question: make([]dns.Question, 1),
} }
// get IPv4 first
c.Net = "udp4" c.Net = "udp4"
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT) m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT)
r4, _, e4 := c.Exchange(m, nameserver) r4, _, e4 := c.Exchange(m, nameserver)
if e4 != nil { if e4 != nil {
ipv4 = "" ipv4 = ""
} else { } else {
ipv4 = getIP(r4.Answer) ipv4 = getIP(r4.Answer)
} }
// now IPv6
return ipv4
}
func getG6() string {
var ipv6 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" c.Net = "udp6"
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT) m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT)
r6, _, e6 := c.Exchange(m, nameserver) r6, _, e6 := c.Exchange(m, nameserver)
if e6 != nil { if e6 != nil {
ipv6 = "" ipv6 = ""
} else { } else {
ipv6 = getIP(r6.Answer) ipv6 = getIP(r6.Answer)
} }
return ipv4, ipv6
return ipv6
} }
func getIP(ra []dns.RR) string { func getIP(ra []dns.RR) string {
@ -87,26 +137,6 @@ func getIP(ra []dns.RR) string {
ip = ansb.Txt[0] ip = ansb.Txt[0]
} }
} }
return ip
}
func main() { return ip
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)
} }

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.GetIPv4())
fmt.Println(giplib.GetIPv6())
os.Exit(0)
}
if *ptr4 {
fmt.Println(giplib.GetIPv4())
}
if *ptr6 {
fmt.Println(giplib.GetIPv6())
}
}
Loading…
Cancel
Save