mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 10:54:28 +00:00
102 lines
2.1 KiB
Go
102 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
|
|
"github.com/micro/services/ip/handler"
|
|
pb "github.com/micro/services/ip/proto"
|
|
"github.com/micro/services/pkg/tracing"
|
|
|
|
"github.com/micro/micro/v3/service"
|
|
"github.com/micro/micro/v3/service/config"
|
|
"github.com/micro/micro/v3/service/logger"
|
|
"github.com/micro/micro/v3/service/store"
|
|
"github.com/oschwald/geoip2-golang"
|
|
)
|
|
|
|
// loadFile from the blob store
|
|
func loadFile(p string) (string, error) {
|
|
name := path.Base(p)
|
|
|
|
f, err := os.Create("./" + name)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer f.Close()
|
|
|
|
reader, err := store.DefaultBlobStore.Read(p)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
_, err = io.Copy(f, reader)
|
|
return "./" + name, err
|
|
}
|
|
|
|
func main() {
|
|
// Create service
|
|
srv := service.New(
|
|
service.Name("ip"),
|
|
service.Version("latest"),
|
|
)
|
|
|
|
// get the ip city database
|
|
v, err := config.Get("ip.city.database")
|
|
if err != nil {
|
|
logger.Fatalf("failed to get config: %v", err)
|
|
}
|
|
path := v.String("./GeoLite2-City.mmdb")
|
|
|
|
// load from blob store if specified
|
|
if strings.HasPrefix(path, "blob://") {
|
|
f, err := loadFile(strings.TrimPrefix(path, "blob://"))
|
|
if err != nil {
|
|
logger.Fatal("failed to load db: %v", err)
|
|
}
|
|
|
|
path = f
|
|
}
|
|
|
|
// load the ip city database
|
|
cr, err := geoip2.Open(path)
|
|
if err != nil {
|
|
logger.Fatalf("failed to open ip db: %v", err)
|
|
}
|
|
|
|
// get the asn database
|
|
v, err = config.Get("ip.asn.database")
|
|
if err != nil {
|
|
logger.Fatalf("failed to get config: %v", err)
|
|
}
|
|
path = v.String("./GeoLite2-ASN.mmdb")
|
|
|
|
// load from blob store if specified
|
|
if strings.HasPrefix(path, "blob://") {
|
|
f, err := loadFile(strings.TrimPrefix(path, "blob://"))
|
|
if err != nil {
|
|
logger.Fatal("failed to load db: %v", err)
|
|
}
|
|
|
|
path = f
|
|
}
|
|
|
|
ar, err := geoip2.Open(path)
|
|
if err != nil {
|
|
logger.Fatalf("failed to open ip db: %v", err)
|
|
}
|
|
|
|
// Register handler
|
|
pb.RegisterIpHandler(srv.Server(), &handler.Ip{CityReader: cr, ASNReader: ar})
|
|
|
|
traceCloser := tracing.SetupOpentracing("ip")
|
|
defer traceCloser.Close()
|
|
|
|
// Run service
|
|
if err := srv.Run(); err != nil {
|
|
logger.Fatal(err)
|
|
}
|
|
}
|