@@ -0,0 +1,19 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
|
||||||
|
[*.go]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
||||||
|
/.GOPATH
|
||||||
|
/bin
|
||||||
|
/vendor
|
||||||
Generated
+50
@@ -0,0 +1,50 @@
|
|||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||||
|
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:d64a0aa67f715fd28f5ddfe0d74c06b6d6fe0fed931d77e662f2c4694f6854dc"
|
||||||
|
name = "github.com/miekg/dns"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "56be65265e34e731425e0269a301774938827c60"
|
||||||
|
version = "v1.1.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:d5891c5bca9c62e5d394ca26491d2b710a1dc08cedeb0ca8f9ac4c3305120b02"
|
||||||
|
name = "golang.org/x/crypto"
|
||||||
|
packages = [
|
||||||
|
"ed25519",
|
||||||
|
"ed25519/internal/edwards25519",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "ff983b9c42bc9fbf91556e191cc8efb585c16908"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:19beed19e4246df7aff387a2bcd4519a386e3fe9637690031c4d4b0cf75f7215"
|
||||||
|
name = "golang.org/x/net"
|
||||||
|
packages = [
|
||||||
|
"bpf",
|
||||||
|
"internal/iana",
|
||||||
|
"internal/socket",
|
||||||
|
"ipv4",
|
||||||
|
"ipv6",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "915654e7eabcea33ae277abbecf52f0d8b7a9fdc"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:f6f6d9d6f80c9e32acc0f4f3b904e0b9f5b18a7757c2ef941121bd79a10e7bdf"
|
||||||
|
name = "golang.org/x/sys"
|
||||||
|
packages = ["unix"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "11f53e03133963fb11ae0588e08b5e0b85be8be5"
|
||||||
|
|
||||||
|
[solve-meta]
|
||||||
|
analyzer-name = "dep"
|
||||||
|
analyzer-version = 1
|
||||||
|
input-imports = ["github.com/miekg/dns"]
|
||||||
|
solver-name = "gps-cdcl"
|
||||||
|
solver-version = 1
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
# Gopkg.toml example
|
||||||
|
#
|
||||||
|
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
|
||||||
|
# for detailed Gopkg.toml documentation.
|
||||||
|
#
|
||||||
|
# required = ["github.com/user/thing/cmd/thing"]
|
||||||
|
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project"
|
||||||
|
# version = "1.0.0"
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project2"
|
||||||
|
# branch = "dev"
|
||||||
|
# source = "github.com/myfork/project2"
|
||||||
|
#
|
||||||
|
# [[override]]
|
||||||
|
# name = "github.com/x/y"
|
||||||
|
# version = "2.4.0"
|
||||||
|
#
|
||||||
|
# [prune]
|
||||||
|
# non-go = false
|
||||||
|
# go-tests = true
|
||||||
|
# unused-packages = true
|
||||||
|
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/miekg/dns"
|
||||||
|
version = "1.1.3"
|
||||||
|
|
||||||
|
[prune]
|
||||||
|
go-tests = true
|
||||||
|
unused-packages = true
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Nagy Károly Gábriel
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
# The import path is where your repository can be found.
|
||||||
|
# To import subpackages, always prepend the full import path.
|
||||||
|
# If you change this, run `make clean`. Read more: https://git.io/vM7zV
|
||||||
|
|
||||||
|
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||||
|
current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path))))
|
||||||
|
|
||||||
|
IMPORT_PATH := git.jpi.io/$(USER)/$(current_dir)
|
||||||
|
|
||||||
|
# V := 1 # When V is set, print commands and build progress.
|
||||||
|
|
||||||
|
# Space separated patterns of packages to skip in list, test, format.
|
||||||
|
IGNORED_PACKAGES := /vendor/
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: build
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build: .GOPATH/.ok
|
||||||
|
$Q go install $(if $V,-v) $(VERSION_FLAGS) $(IMPORT_PATH)
|
||||||
|
|
||||||
|
### Code not in the repository root? Another binary? Add to the path like this.
|
||||||
|
# .PHONY: otherbin
|
||||||
|
# otherbin: .GOPATH/.ok
|
||||||
|
# $Q go install $(if $V,-v) $(VERSION_FLAGS) $(IMPORT_PATH)/cmd/otherbin
|
||||||
|
|
||||||
|
##### ^^^^^^ EDIT ABOVE ^^^^^^ #####
|
||||||
|
|
||||||
|
##### =====> Utility targets <===== #####
|
||||||
|
|
||||||
|
.PHONY: clean test list cover format gen
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$Q rm -rf bin .GOPATH
|
||||||
|
|
||||||
|
test: .GOPATH/.ok
|
||||||
|
$Q go test $(if $V,-v) -i -race $(allpackages) # install -race libs to speed up next run
|
||||||
|
ifndef CI
|
||||||
|
$Q go vet $(allpackages)
|
||||||
|
$Q GODEBUG=cgocheck=2 go test -race $(allpackages)
|
||||||
|
else
|
||||||
|
$Q ( go vet $(allpackages); echo $$? ) | \
|
||||||
|
tee .GOPATH/test/vet.txt | sed '$$ d'; exit $$(tail -1 .GOPATH/test/vet.txt)
|
||||||
|
$Q ( GODEBUG=cgocheck=2 go test -v -race $(allpackages); echo $$? ) | \
|
||||||
|
tee .GOPATH/test/output.txt | sed '$$ d'; exit $$(tail -1 .GOPATH/test/output.txt)
|
||||||
|
endif
|
||||||
|
|
||||||
|
list: .GOPATH/.ok
|
||||||
|
@echo $(allpackages)
|
||||||
|
|
||||||
|
cover: bin/gocovmerge .GOPATH/.ok
|
||||||
|
@echo "NOTE: make cover does not exit 1 on failure, don't use it to check for tests success!"
|
||||||
|
$Q rm -f .GOPATH/cover/*.out .GOPATH/cover/all.merged
|
||||||
|
$(if $V,@echo "-- go test -coverpkg=./... -coverprofile=.GOPATH/cover/... ./...")
|
||||||
|
@for MOD in $(allpackages); do \
|
||||||
|
go test -coverpkg=`echo $(allpackages)|tr " " ","` \
|
||||||
|
-coverprofile=.GOPATH/cover/unit-`echo $$MOD|tr "/" "_"`.out \
|
||||||
|
$$MOD 2>&1 | grep -v "no packages being tested depend on"; \
|
||||||
|
done
|
||||||
|
$Q ./bin/gocovmerge .GOPATH/cover/*.out > .GOPATH/cover/all.merged
|
||||||
|
ifndef CI
|
||||||
|
$Q go tool cover -html .GOPATH/cover/all.merged
|
||||||
|
else
|
||||||
|
$Q go tool cover -html .GOPATH/cover/all.merged -o .GOPATH/cover/all.html
|
||||||
|
endif
|
||||||
|
@echo ""
|
||||||
|
@echo "=====> Total test coverage: <====="
|
||||||
|
@echo ""
|
||||||
|
$Q go tool cover -func .GOPATH/cover/all.merged
|
||||||
|
|
||||||
|
format: bin/goimports .GOPATH/.ok
|
||||||
|
$Q find .GOPATH/src/$(IMPORT_PATH)/ -iname \*.go | grep -v \
|
||||||
|
-e "^$$" $(addprefix -e ,$(IGNORED_PACKAGES)) | xargs ./bin/goimports -w
|
||||||
|
|
||||||
|
gen: .GOPATH/.ok
|
||||||
|
@echo "Running go generate"
|
||||||
|
$Q cd $(CURDIR)/.GOPATH/src/$(IMPORT_PATH) && go generate
|
||||||
|
@echo "Done!"
|
||||||
|
|
||||||
|
##### =====> Internals <===== #####
|
||||||
|
|
||||||
|
.PHONY: setup
|
||||||
|
setup: clean .GOPATH/.ok
|
||||||
|
@if ! grep "/.GOPATH" .gitignore > /dev/null 2>&1; then \
|
||||||
|
echo "/.GOPATH" >> .gitignore; \
|
||||||
|
echo "/bin" >> .gitignore; \
|
||||||
|
fi
|
||||||
|
go get -u github.com/golang/dep/cmd/dep
|
||||||
|
- go get -u golang.org/x/tools/cmd/goimports
|
||||||
|
- go get -u github.com/wadey/gocovmerge
|
||||||
|
@test -f Gopkg.toml || \
|
||||||
|
(cd $(CURDIR)/.GOPATH/src/$(IMPORT_PATH) && ./bin/dep init)
|
||||||
|
(cd $(CURDIR)/.GOPATH/src/$(IMPORT_PATH) && ./bin/dep ensure)
|
||||||
|
VERSION := $(shell git describe --tags --always --dirty="-dev")
|
||||||
|
DATE := $(shell date -u '+%Y-%m-%d-%H%M UTC')
|
||||||
|
VERSION_FLAGS := -ldflags='-X "main.Version=$(VERSION)" -X "main.BuildTime=$(DATE)"'
|
||||||
|
|
||||||
|
# cd into the GOPATH to workaround ./... not following symlinks
|
||||||
|
_allpackages = $(shell ( cd $(CURDIR)/.GOPATH/src/$(IMPORT_PATH) && \
|
||||||
|
GOPATH=$(CURDIR)/.GOPATH go list ./... 2>&1 1>&3 | \
|
||||||
|
grep -v -e "^$$" $(addprefix -e ,$(IGNORED_PACKAGES)) 1>&2 ) 3>&1 | \
|
||||||
|
grep -v -e "^$$" $(addprefix -e ,$(IGNORED_PACKAGES)))
|
||||||
|
|
||||||
|
# memoize allpackages, so that it's executed only once and only if used
|
||||||
|
allpackages = $(if $(__allpackages),,$(eval __allpackages := $$(_allpackages)))$(__allpackages)
|
||||||
|
|
||||||
|
export GOPATH := $(CURDIR)/.GOPATH
|
||||||
|
unexport GOBIN
|
||||||
|
|
||||||
|
Q := $(if $V,,@)
|
||||||
|
|
||||||
|
.GOPATH/.ok:
|
||||||
|
$Q mkdir -p "$(dir .GOPATH/src/$(IMPORT_PATH))"
|
||||||
|
$Q ln -s ../../../.. ".GOPATH/src/$(IMPORT_PATH)"
|
||||||
|
$Q mkdir -p .GOPATH/test .GOPATH/cover
|
||||||
|
$Q mkdir -p bin
|
||||||
|
$Q ln -s ../bin .GOPATH/bin
|
||||||
|
$Q touch $@
|
||||||
|
|
||||||
|
.PHONY: bin/gocovmerge bin/goimports
|
||||||
|
bin/gocovmerge: .GOPATH/.ok
|
||||||
|
@test -d ./vendor/github.com/wadey/gocovmerge || \
|
||||||
|
{ echo "Vendored gocovmerge not found, try running 'make setup'..."; exit 1; }
|
||||||
|
$Q go install $(IMPORT_PATH)/vendor/github.com/wadey/gocovmerge
|
||||||
|
bin/goimports: .GOPATH/.ok
|
||||||
|
@test -d ./vendor/golang.org/x/tools/cmd/goimports || \
|
||||||
|
{ echo "Vendored goimports not found, try running 'make setup'..."; exit 1; }
|
||||||
|
$Q go install $(IMPORT_PATH)/vendor/golang.org/x/tools/cmd/goimports
|
||||||
|
|
||||||
|
# Based on https://github.com/cloudflare/hellogopher - v1.1 - MIT License
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017 Cloudflare
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/miekg/dns"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
dig {-4,-6} +short myip.opendns.com @resolver1.opendns.com
|
||||||
|
dig {-4,-6} TXT +short o-o.myaddr.l.google.com @ns1.google.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
func get4(c *dns.Client, m *dns.Msg, nameserver string) (*dns.Msg, error) {
|
||||||
|
c.Net = "udp4"
|
||||||
|
m.SetQuestion("myip.opendns.com.", dns.TypeA)
|
||||||
|
|
||||||
|
r, _, err := c.Exchange(m, nameserver)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func get6(c *dns.Client, m *dns.Msg, nameserver string) (*dns.Msg, error) {
|
||||||
|
c.Net = "udp6"
|
||||||
|
m.SetQuestion("myip.opendns.com.", dns.TypeAAAA)
|
||||||
|
|
||||||
|
r, _, err := c.Exchange(m, nameserver)
|
||||||
|
return r, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func printIP(ra []dns.RR) []string {
|
||||||
|
var ips []string
|
||||||
|
for _, ansa := range ra {
|
||||||
|
switch ansb := ansa.(type) {
|
||||||
|
case *dns.A:
|
||||||
|
ips = append(ips, ansb.A.String())
|
||||||
|
case *dns.AAAA:
|
||||||
|
ips = append(ips, ansb.AAAA.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ips
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
nameserver := dns.Fqdn("resolver1.opendns.com") + ":53"
|
||||||
|
|
||||||
|
c := new(dns.Client)
|
||||||
|
c.Net = "udp4"
|
||||||
|
m := &dns.Msg{
|
||||||
|
MsgHdr: dns.MsgHdr{
|
||||||
|
RecursionDesired: true,
|
||||||
|
},
|
||||||
|
Question: make([]dns.Question, 1),
|
||||||
|
}
|
||||||
|
r4, err := get4(c, m, nameserver)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
} else {
|
||||||
|
fmt.Println(printIP(r4.Answer))
|
||||||
|
}
|
||||||
|
r6, e6 := get6(c, m, nameserver)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(e6)
|
||||||
|
} else {
|
||||||
|
fmt.Println(printIP(r6.Answer))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user