mirror of
https://github.com/zu1k/nali.git
synced 2025-01-22 13:19:02 +08:00
color print
This commit is contained in:
parent
40274f64a4
commit
592a2eabb5
38
README.md
38
README.md
@ -38,6 +38,7 @@ However the C version has too few functions, and the js version is too big and t
|
|||||||
- Both ipv4 and ipv6 supported
|
- Both ipv4 and ipv6 supported
|
||||||
- CDN provider query
|
- CDN provider query
|
||||||
- Full platform support
|
- Full platform support
|
||||||
|
- Color print
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
@ -154,28 +155,6 @@ Address: 2a00:1450:400e:809::200e [荷兰Amsterdam Google Inc. 服务器网段]
|
|||||||
|
|
||||||
### Query CDN provider
|
### Query CDN provider
|
||||||
|
|
||||||
#### Query CDN provider only
|
|
||||||
|
|
||||||
```
|
|
||||||
$ nslookup www.gov.cn | nali cdn
|
|
||||||
Server: 127.0.0.53
|
|
||||||
Address: 127.0.0.53#53
|
|
||||||
|
|
||||||
Non-authoritative answer:
|
|
||||||
www.gov.cn canonical name = www.gov.cn.bsgslb.cn [白山云 CDN].
|
|
||||||
www.gov.cn.bsgslb.cn [白山云 CDN] canonical name = zgovweb.v.bsgslb.cn [白山云 CDN].
|
|
||||||
Name: zgovweb.v.bsgslb.cn [白山云 CDN]
|
|
||||||
Address: 185.232.56.148
|
|
||||||
Name: zgovweb.v.bsgslb.cn [白山云 CDN]
|
|
||||||
Address: 185.232.56.147
|
|
||||||
Name: zgovweb.v.bsgslb.cn [白山云 CDN]
|
|
||||||
Address: 2001:428:6402:21b::6
|
|
||||||
Name: zgovweb.v.bsgslb.cn [白山云 CDN]
|
|
||||||
Address: 2001:428:6402:21b::5
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Also query IP geo
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ nslookup www.gov.cn | nali
|
$ nslookup www.gov.cn | nali
|
||||||
Server: 127.0.0.53 [局域网 IP]
|
Server: 127.0.0.53 [局域网 IP]
|
||||||
@ -192,14 +171,6 @@ Name: zgovweb.v.bsgslb.cn [白山云 CDN]
|
|||||||
Address: 2001:428:6402:21b::6 [美国Louisiana州Monroe Qwest Communications Company, LLC (CenturyLink)]
|
Address: 2001:428:6402:21b::6 [美国Louisiana州Monroe Qwest Communications Company, LLC (CenturyLink)]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Use standalone
|
|
||||||
|
|
||||||
You should parse cname by yourself
|
|
||||||
|
|
||||||
```
|
|
||||||
$ nali cdn cdn.somecdncname.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## Interface
|
## Interface
|
||||||
|
|
||||||
### Help
|
### Help
|
||||||
@ -211,14 +182,13 @@ Usage:
|
|||||||
nali [command]
|
nali [command]
|
||||||
|
|
||||||
Available Commands:
|
Available Commands:
|
||||||
cdn Query cdn service provider
|
completion generate the autocompletion script for the specified shell
|
||||||
help Help about any command
|
help Help about any command
|
||||||
parse Query IP information
|
|
||||||
update update chunzhen ip database
|
update update chunzhen ip database
|
||||||
|
|
||||||
Flags:
|
Flags:
|
||||||
-h, --help help for nali
|
--gbk Use GBK decoder
|
||||||
-t, --toggle Help message for toggle
|
-h, --help help for nali
|
||||||
|
|
||||||
Use "nali [command] --help" for more information about a command.
|
Use "nali [command] --help" for more information about a command.
|
||||||
```
|
```
|
||||||
|
10
cmd/root.go
10
cmd/root.go
@ -4,8 +4,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/zu1k/nali/internal/app"
|
"github.com/zu1k/nali/internal/app"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var rootCmd = &cobra.Command{
|
var rootCmd = &cobra.Command{
|
||||||
@ -52,7 +53,8 @@ Find document on: https://github.com/zu1k/nali
|
|||||||
`,
|
`,
|
||||||
Args: cobra.MinimumNArgs(0),
|
Args: cobra.MinimumNArgs(0),
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
app.Root(args)
|
gbk, _ := cmd.Flags().GetBool("gbk")
|
||||||
|
app.Root(args, gbk)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,3 +65,7 @@ func Execute() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.Flags().Bool("gbk", false, "Use GBK decoder")
|
||||||
|
}
|
||||||
|
@ -4,14 +4,11 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/zu1k/nali/internal/constant"
|
|
||||||
|
|
||||||
"github.com/zu1k/nali/pkg/cdn"
|
|
||||||
"github.com/zu1k/nali/pkg/zxipv6wry"
|
|
||||||
|
|
||||||
"github.com/zu1k/nali/pkg/qqwry"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/zu1k/nali/internal/constant"
|
||||||
|
"github.com/zu1k/nali/pkg/cdn"
|
||||||
|
"github.com/zu1k/nali/pkg/qqwry"
|
||||||
|
"github.com/zu1k/nali/pkg/zxipv6wry"
|
||||||
)
|
)
|
||||||
|
|
||||||
// updateCmd represents the update command
|
// updateCmd represents the update command
|
||||||
|
1
go.mod
1
go.mod
@ -3,6 +3,7 @@ module github.com/zu1k/nali
|
|||||||
go 1.14
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/fatih/color v1.12.0 // indirect
|
||||||
github.com/ipipdotnet/ipdb-go v1.3.1
|
github.com/ipipdotnet/ipdb-go v1.3.1
|
||||||
github.com/oschwald/geoip2-golang v1.5.0
|
github.com/oschwald/geoip2-golang v1.5.0
|
||||||
github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda
|
github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda
|
||||||
|
7
go.sum
7
go.sum
@ -67,6 +67,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
|
|||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc=
|
||||||
|
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
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 v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
@ -177,7 +179,11 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
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/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-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
|
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
||||||
|
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
|
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||||
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
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/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@ -372,6 +378,7 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
@ -2,21 +2,16 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/zu1k/nali/internal/entity"
|
||||||
"golang.org/x/text/encoding/simplifiedchinese"
|
"golang.org/x/text/encoding/simplifiedchinese"
|
||||||
"golang.org/x/text/transform"
|
"golang.org/x/text/transform"
|
||||||
)
|
)
|
||||||
|
|
||||||
var needTransform = false
|
func Root(args []string, needTransform bool) {
|
||||||
|
|
||||||
func init() {
|
|
||||||
stat, _ := os.Stdin.Stat()
|
|
||||||
needTransform = ((stat.Mode() & os.ModeNamedPipe) != 0) && runtime.GOOS == "windows"
|
|
||||||
}
|
|
||||||
|
|
||||||
func Root(args []string) {
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
stdin := bufio.NewScanner(os.Stdin)
|
stdin := bufio.NewScanner(os.Stdin)
|
||||||
for stdin.Scan() {
|
for stdin.Scan() {
|
||||||
@ -27,11 +22,9 @@ func Root(args []string) {
|
|||||||
if line == "quit" || line == "exit" {
|
if line == "quit" || line == "exit" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// TODO: pring line
|
fmt.Printf("%s\n", entity.ParseLine(line).ColorString())
|
||||||
//fmt.Printf("%s\n", ReplaceIPInString(ReplaceCDNInString(line)))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: do something
|
fmt.Printf("%s\n", entity.ParseLine(strings.Join(args, " ")).ColorString())
|
||||||
//ParseIPs(args)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
package app
|
|
||||||
|
|
||||||
import (
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
db2 "github.com/zu1k/nali/internal/db"
|
|
||||||
|
|
||||||
"github.com/zu1k/nali/internal/constant"
|
|
||||||
|
|
||||||
geoip2 "github.com/zu1k/nali/pkg/geoip"
|
|
||||||
"github.com/zu1k/nali/pkg/ipip"
|
|
||||||
"github.com/zu1k/nali/pkg/qqwry"
|
|
||||||
"github.com/zu1k/nali/pkg/zxipv6wry"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
db []db2.IPDB
|
|
||||||
qqip qqwry.QQwry
|
|
||||||
geoip geoip2.GeoIP
|
|
||||||
)
|
|
||||||
|
|
||||||
// InitIPDB init ip database content
|
|
||||||
func InitIPDB(ipdbtype db2.IPDBType) {
|
|
||||||
db = make([]db2.IPDB, 1)
|
|
||||||
switch ipdbtype {
|
|
||||||
case db2.GEOIP2:
|
|
||||||
db[0] = geoip2.NewGeoIP(filepath.Join(constant.HomePath, "GeoLite2-City.mmdb"))
|
|
||||||
case db2.QQIP:
|
|
||||||
db[0] = qqwry.NewQQwry(filepath.Join(constant.HomePath, "qqwry.dat"))
|
|
||||||
db = append(db, zxipv6wry.NewZXwry(filepath.Join(constant.HomePath, "ipv6wry.database")))
|
|
||||||
case db2.IPIP:
|
|
||||||
db[0] = ipip.NewIPIPFree(filepath.Join(constant.HomePath, "ipipfree.ipdb"))
|
|
||||||
db = append(db, zxipv6wry.NewZXwry(filepath.Join(constant.HomePath, "ipv6wry.database")))
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,6 +3,8 @@ package entity
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/fatih/color"
|
||||||
|
|
||||||
"github.com/zu1k/nali/pkg/dbif"
|
"github.com/zu1k/nali/pkg/dbif"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -52,3 +54,23 @@ func (es Entities) String() string {
|
|||||||
}
|
}
|
||||||
return result.String()
|
return result.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (es Entities) ColorString() string {
|
||||||
|
var line strings.Builder
|
||||||
|
for _, e := range es {
|
||||||
|
s := e.Text
|
||||||
|
switch e.Type {
|
||||||
|
case TypeIPv4:
|
||||||
|
s = color.GreenString(e.Text)
|
||||||
|
case TypeIPv6:
|
||||||
|
s = color.BlueString(e.Text)
|
||||||
|
case TypeDomain:
|
||||||
|
s = color.YellowString(e.Text)
|
||||||
|
}
|
||||||
|
if e.Type != TypePlain && len(e.Info) > 0 {
|
||||||
|
s += " [" + color.RedString(e.Info) + "] "
|
||||||
|
}
|
||||||
|
line.WriteString(s)
|
||||||
|
}
|
||||||
|
return line.String()
|
||||||
|
}
|
||||||
|
@ -57,5 +57,13 @@ func ParseLine(line string) Entities {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(es) == 0 {
|
||||||
|
es = append(es, &Entity{
|
||||||
|
Loc: []int{0, len(line)},
|
||||||
|
Type: TypePlain,
|
||||||
|
Text: line,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return es
|
return es
|
||||||
}
|
}
|
||||||
|
@ -9,3 +9,7 @@ func TestParse(t *testing.T) {
|
|||||||
fmt.Println(ParseLine("2001:0db8:85a3:0000:0000:8a2e:0370:7334 baidu.com 1.2.3.4 baidu.com"))
|
fmt.Println(ParseLine("2001:0db8:85a3:0000:0000:8a2e:0370:7334 baidu.com 1.2.3.4 baidu.com"))
|
||||||
fmt.Println(ParseLine("a.cn.b.com.c.org d.com"))
|
fmt.Println(ParseLine("a.cn.b.com.c.org d.com"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestColorPrint(t *testing.T) {
|
||||||
|
fmt.Println(ParseLine("2001:0db8:85a3:0000:0000:8a2e:0370:7334 baidu.com 1.2.3.4 baidu.com").ColorString())
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user