2022-08-21 20:36:56 +08:00
|
|
|
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
|
|
|
|
|
|
|
|
|
package iplibrary
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"compress/gzip"
|
|
|
|
|
_ "embed"
|
|
|
|
|
"net"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
//go:embed internal-ip-library.db
|
|
|
|
|
var ipLibraryData []byte
|
|
|
|
|
|
2022-08-23 14:54:53 +08:00
|
|
|
var defaultLibrary = NewIPLibrary()
|
2022-08-21 20:36:56 +08:00
|
|
|
|
2022-08-23 14:54:53 +08:00
|
|
|
func DefaultIPLibraryData() []byte {
|
|
|
|
|
return ipLibraryData
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func InitDefault() error {
|
|
|
|
|
defaultLibrary.reader = nil
|
|
|
|
|
return defaultLibrary.InitFromData(ipLibraryData)
|
2022-08-21 20:36:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Lookup(ip net.IP) *QueryResult {
|
2022-08-23 14:54:53 +08:00
|
|
|
return defaultLibrary.Lookup(ip)
|
2022-08-21 20:36:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func LookupIP(ip string) *QueryResult {
|
2022-08-23 14:54:53 +08:00
|
|
|
return defaultLibrary.LookupIP(ip)
|
2022-08-21 20:36:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type IPLibrary struct {
|
|
|
|
|
reader *Reader
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewIPLibrary() *IPLibrary {
|
|
|
|
|
return &IPLibrary{}
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-23 14:54:53 +08:00
|
|
|
func NewIPLibraryWithReader(reader *Reader) *IPLibrary {
|
|
|
|
|
return &IPLibrary{reader: reader}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *IPLibrary) InitFromData(data []byte) error {
|
|
|
|
|
if len(data) == 0 || this.reader != nil {
|
2022-08-21 23:09:25 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
2022-08-23 14:54:53 +08:00
|
|
|
var reader = bytes.NewReader(data)
|
2022-08-21 20:36:56 +08:00
|
|
|
gzipReader, err := gzip.NewReader(reader)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer func() {
|
|
|
|
|
_ = gzipReader.Close()
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
libReader, err := NewReader(gzipReader)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
this.reader = libReader
|
2022-08-21 23:09:25 +08:00
|
|
|
|
2022-08-21 20:36:56 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *IPLibrary) Lookup(ip net.IP) *QueryResult {
|
|
|
|
|
if this.reader == nil {
|
|
|
|
|
return &QueryResult{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var result = this.reader.Lookup(ip)
|
|
|
|
|
if result == nil {
|
|
|
|
|
result = &QueryResult{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *IPLibrary) LookupIP(ip string) *QueryResult {
|
|
|
|
|
if this.reader == nil {
|
|
|
|
|
return &QueryResult{}
|
|
|
|
|
}
|
|
|
|
|
return this.Lookup(net.ParseIP(ip))
|
|
|
|
|
}
|