cmd_geoip_lookup.go 960 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package main
  2. import (
  3. "net/netip"
  4. "os"
  5. "github.com/sagernet/sing-box/log"
  6. E "github.com/sagernet/sing/common/exceptions"
  7. N "github.com/sagernet/sing/common/network"
  8. "github.com/spf13/cobra"
  9. )
  10. var commandGeoipLookup = &cobra.Command{
  11. Use: "lookup <address>",
  12. Short: "Lookup if an IP address is contained in the GeoIP database",
  13. Args: cobra.ExactArgs(1),
  14. Run: func(cmd *cobra.Command, args []string) {
  15. err := geoipLookup(args[0])
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. },
  20. }
  21. func init() {
  22. commandGeoip.AddCommand(commandGeoipLookup)
  23. }
  24. func geoipLookup(address string) error {
  25. addr, err := netip.ParseAddr(address)
  26. if err != nil {
  27. return E.Cause(err, "parse address")
  28. }
  29. if !N.IsPublicAddr(addr) {
  30. os.Stdout.WriteString("private\n")
  31. return nil
  32. }
  33. var code string
  34. _ = geoipReader.Lookup(addr.AsSlice(), &code)
  35. if code != "" {
  36. os.Stdout.WriteString(code + "\n")
  37. return nil
  38. }
  39. os.Stdout.WriteString("unknown\n")
  40. return nil
  41. }