parent
f805554534
commit
e63496a6b6
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -2,6 +2,17 @@
|
|||
|
||||
## Feature
|
||||
|
||||
* add subcommand local for shorthand
|
||||
* allow server to log to file
|
||||
|
||||
## Fix
|
||||
|
||||
* Chinese breaking the format
|
||||
|
||||
# 0.1.5
|
||||
|
||||
## Feature
|
||||
|
||||
* add minimal basic client
|
||||
|
||||
# 0.1.4
|
||||
|
|
|
@ -18,7 +18,7 @@ ENV PATH="/go/bin:${PATH}"
|
|||
|
||||
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
|
||||
COPY --from=builder /go/bin/myip /go/bin/myip
|
||||
CMD ["/go/bin/myip","serve"]
|
||||
CMD ["/go/bin/myip","serve","-f","/var/log/myip.log"]
|
||||
|
||||
# use cmd instead for flexibility
|
||||
# ENTRYPOINT ["/go/bin/myip","serve"]
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
a tool that can get your public ip
|
||||
|
||||
|
||||
```shell
|
||||
```
|
||||
myip is a easy way to get public ip of current system.
|
||||
|
||||
Usage:
|
||||
|
@ -13,12 +13,12 @@ Usage:
|
|||
Available Commands:
|
||||
completion generate the autocompletion script for the specified shell
|
||||
help Help about any command
|
||||
local short hand for `myip -altc --no-pub`
|
||||
serve Simple server that returns the resolved IP.
|
||||
version version
|
||||
|
||||
Flags:
|
||||
-a, --all show local ip
|
||||
-c, --cell show cell, must used with --list
|
||||
--cron run as cron service
|
||||
-h, --help help for myip
|
||||
-u, --host string hostname to connect (default "kumoly.io")
|
||||
|
@ -26,6 +26,7 @@ Flags:
|
|||
-n, --name string tell the server who you are
|
||||
--no-pub disable PublicIP
|
||||
-p, --port string server port to connect (default "5080")
|
||||
-c, --pretty show table cell, must used with --list
|
||||
--secure use https
|
||||
-s, --spec string hostname to connect (default "0 */5 * * * *")
|
||||
-t, --title show title, used with --list
|
||||
|
@ -56,6 +57,7 @@ services:
|
|||
- 5080:5080
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- ./log:/var/log
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -10,9 +10,10 @@ import (
|
|||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
"text/tabwriter"
|
||||
"time"
|
||||
|
||||
"github.com/jedib0t/go-pretty/v6/table"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
@ -44,9 +45,6 @@ var ClientCmd = &cobra.Command{
|
|||
Use: "myip",
|
||||
Short: "myip is a easy way to get public ip of current system.",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if name == "" {
|
||||
name, _ = os.Hostname()
|
||||
}
|
||||
if cronMode {
|
||||
block := make(chan struct{}, 1)
|
||||
c := cron.New()
|
||||
|
@ -69,7 +67,7 @@ func init() {
|
|||
|
||||
ClientCmd.Flags().BoolVarP(&showList, "list", "l", false, "show list")
|
||||
ClientCmd.Flags().BoolVarP(&showTitle, "title", "t", false, "show title, used with --list")
|
||||
ClientCmd.Flags().BoolVarP(&showCell, "cell", "c", false, "show cell, must used with --list")
|
||||
ClientCmd.Flags().BoolVarP(&showCell, "pretty", "c", false, "show table cell, must used with --list")
|
||||
ClientCmd.Flags().BoolVarP(&showAll, "all", "a", false, "show local ip")
|
||||
|
||||
ClientCmd.Flags().BoolVar(&noPub, "no-pub", false, "disable PublicIP")
|
||||
|
@ -81,6 +79,9 @@ func init() {
|
|||
|
||||
func Scan() error {
|
||||
// fmt.Printf("title: %v\nlist: %v\nall: %v\ntab: %v\n", showTitle, showList, showAll, showCell)
|
||||
if name == "" {
|
||||
name, _ = os.Hostname()
|
||||
}
|
||||
if !showAll {
|
||||
if noPub {
|
||||
return errors.New("`--no-pub` can only be used with `--all`")
|
||||
|
@ -104,24 +105,33 @@ func Scan() error {
|
|||
return err
|
||||
}
|
||||
if showList {
|
||||
var wFlag uint = 0
|
||||
|
||||
t := table.NewWriter()
|
||||
t.SetOutputMirror(os.Stdout)
|
||||
if showCell {
|
||||
wFlag = tabwriter.Debug
|
||||
t.SetStyle(table.StyleLight)
|
||||
} else {
|
||||
t.Style().Options.DrawBorder = false
|
||||
t.Style().Options.SeparateColumns = false
|
||||
t.Style().Options.SeparateFooter = false
|
||||
t.Style().Options.SeparateHeader = false
|
||||
t.Style().Options.SeparateRows = false
|
||||
}
|
||||
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', wFlag)
|
||||
if showTitle {
|
||||
fmt.Fprintln(w, "\tInterface\tIP\t")
|
||||
t.AppendHeader(table.Row{"Interface", "IP"})
|
||||
if showCell {
|
||||
fmt.Fprintln(w, "\t\t\t")
|
||||
t.AppendSeparator()
|
||||
}
|
||||
}
|
||||
if !noPub {
|
||||
fmt.Fprintf(w, "\t%v\t%v\t\n", "PublicIP", ip)
|
||||
t.AppendRow([]interface{}{"PublicIP", ip})
|
||||
}
|
||||
for _, iface := range local {
|
||||
fmt.Fprintf(w, "\t%v\t%v\t\n", iface.Name, iface.IP)
|
||||
t.AppendRow([]interface{}{iface.Name, iface.IP})
|
||||
}
|
||||
return w.Flush()
|
||||
t.Render()
|
||||
// fmt.Println(t.Render())
|
||||
return nil
|
||||
|
||||
} else {
|
||||
if !noPub {
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var LocalIPCmd = &cobra.Command{
|
||||
Use: "local",
|
||||
Short: "short hand for `myip -altc --no-pub`",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
showList = true
|
||||
showTitle = true
|
||||
showCell = true
|
||||
showAll = true
|
||||
noPub = true
|
||||
revNoPub, err := cmd.Flags().GetBool("show-public")
|
||||
if err == nil && revNoPub {
|
||||
noPub = false
|
||||
}
|
||||
Scan()
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
||||
LocalIPCmd.Flags().StringVarP(&port, "port", "p", "5080", "server port to connect")
|
||||
LocalIPCmd.Flags().StringVarP(&host, "host", "u", "kumoly.io", "hostname to connect")
|
||||
LocalIPCmd.Flags().StringVarP(&name, "name", "n", "", "tell the server who you are")
|
||||
|
||||
LocalIPCmd.Flags().BoolVar(&secure, "secure", false, "use https")
|
||||
|
||||
LocalIPCmd.Flags().BoolP("show-public", "P", false, "show public ip")
|
||||
}
|
|
@ -2,9 +2,11 @@ package cmd
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
@ -14,6 +16,15 @@ var ServerCmd = &cobra.Command{
|
|||
Use: "serve",
|
||||
Short: "Simple server that returns the resolved IP.",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if logToFile != "" {
|
||||
f, err := os.OpenFile(logToFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if err != nil {
|
||||
log.Fatalf("Error opening file: %v", err)
|
||||
}
|
||||
defer f.Close()
|
||||
mwriter := io.MultiWriter(f, os.Stderr)
|
||||
log.SetOutput(mwriter)
|
||||
}
|
||||
StartServer()
|
||||
},
|
||||
}
|
||||
|
@ -23,11 +34,15 @@ var (
|
|||
// port string
|
||||
|
||||
addr string
|
||||
|
||||
logToFile string
|
||||
)
|
||||
|
||||
func init() {
|
||||
ServerCmd.Flags().StringVarP(&port, "port", "p", "5080", "server port to listen")
|
||||
ServerCmd.Flags().StringVarP(&addr, "address", "b", "0.0.0.0", "address the server binds on")
|
||||
|
||||
ServerCmd.Flags().StringVarP(&logToFile, "log", "f", "", "log to file if filepath provided")
|
||||
}
|
||||
|
||||
func StartServer() error {
|
||||
|
|
3
go.mod
3
go.mod
|
@ -3,11 +3,14 @@ module kumoly.io/tools/myip
|
|||
go 1.17
|
||||
|
||||
require (
|
||||
github.com/jedib0t/go-pretty/v6 v6.2.4
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/spf13/cobra v1.2.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
|
||||
)
|
||||
|
|
12
go.sum
12
go.sum
|
@ -57,6 +57,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
|
|||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
|
@ -67,6 +68,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m
|
|||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
|
@ -160,6 +162,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
|
|||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jedib0t/go-pretty/v6 v6.2.4 h1:wdaj2KHD2W+mz8JgJ/Q6L/T5dB7kyqEFI16eLq7GEmk=
|
||||
github.com/jedib0t/go-pretty/v6 v6.2.4/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0=
|
||||
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
|
@ -173,6 +177,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
|
@ -188,7 +194,9 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
|
|||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
|
||||
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
|
@ -216,6 +224,7 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
|||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
|
@ -337,6 +346,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
@ -377,6 +387,7 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
@ -555,6 +566,7 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
|
Loading…
Reference in New Issue