diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 0a2c86b..c25ec27 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -61,6 +61,7 @@ var ( arch string client pb.NezhaServiceClient inited bool + geoip *pb.GeoIP ) var agentCmd = &cobra.Command{ @@ -426,6 +427,7 @@ func reportState() { if lastReportHostInfo.Before(time.Now().Add(-10 * time.Minute)) { lastReportHostInfo = time.Now() client.ReportSystemInfo(context.Background(), monitor.GetHost().PB()) + geoip, _ = client.LookupGeoIP(context.Background(), &pb.GeoIP{Ip: monitor.QueryIP}) } } time.Sleep(time.Second * time.Duration(agentCliParam.ReportDelay)) @@ -434,7 +436,8 @@ func reportState() { // doSelfUpdate 执行更新检查 如果更新成功则会结束进程 func doSelfUpdate(useLocalVersion bool) { - if monitor.CachedCountry == "" { + code := geoip.GetCountryCode() + if code == "" { return } v := semver.MustParse("0.1.0") @@ -444,7 +447,7 @@ func doSelfUpdate(useLocalVersion bool) { println("检查更新:", v) var latest *selfupdate.Release var err error - if monitor.CachedCountry != "CN" && !agentCliParam.UseGiteeToUpgrade { + if code != "cn" && !agentCliParam.UseGiteeToUpgrade { latest, err = selfupdate.UpdateSelf(v, "nezhahq/agent") } else { latest, err = selfupdate.UpdateSelfGitee(v, "naibahq/agent") diff --git a/pkg/monitor/monitor.go b/pkg/monitor/monitor.go index 97bf6d5..bff63ad 100644 --- a/pkg/monitor/monitor.go +++ b/pkg/monitor/monitor.go @@ -151,9 +151,11 @@ func GetHost() *model.Host { cachedBootTime = time.Unix(int64(hi.BootTime), 0) ret.IP = CachedIP - ret.CountryCode = strings.ToLower(CachedCountry) ret.Version = Version + // stub + ret.CountryCode = "" + return &ret } diff --git a/pkg/monitor/myip.go b/pkg/monitor/myip.go index 3ede6ae..67bd1ad 100644 --- a/pkg/monitor/myip.go +++ b/pkg/monitor/myip.go @@ -12,55 +12,25 @@ import ( const MacOSChromeUA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" -type geoIP struct { - CountryCode string `json:"country_code,omitempty"` - CountryCode2 string `json:"countryCode,omitempty"` - IP string `json:"ip,omitempty"` - Query string `json:"query,omitempty"` - Location struct { - CountryCode string `json:"country_code,omitempty"` - } `json:"location,omitempty"` -} - -func (ip *geoIP) Unmarshal(body []byte) error { - if err := util.Json.Unmarshal(body, ip); err != nil { - return err - } - if ip.IP == "" && ip.Query != "" { - ip.IP = ip.Query - } - if ip.CountryCode == "" && ip.CountryCode2 != "" { - ip.CountryCode = ip.CountryCode2 - } - if ip.CountryCode == "" && ip.Location.CountryCode != "" { - ip.CountryCode = ip.Location.CountryCode - } - return nil -} - var ( - geoIPApiList = []string{ - "http://api.myip.la/en?json", - "https://api.ip.sb/geoip", - "https://ipapi.co/json", - "http://ip-api.com/json/", - // "https://extreme-ip-lookup.com/json/", // 不精确 - // "https://ip.seeip.org/geoip", // 不精确 - // "https://freegeoip.app/json/", // 需要 Key + cfList = []string{ + "https://blog.cloudflare.com/cdn-cgi/trace", + "https://dash.cloudflare.com/cdn-cgi/trace", + "https://cf-ns.com/cdn-cgi/trace", // 有国内节点 } - CachedIP, CachedCountry string - httpClientV4 = util.NewSingleStackHTTPClient(time.Second*20, time.Second*5, time.Second*10, false) - httpClientV6 = util.NewSingleStackHTTPClient(time.Second*20, time.Second*5, time.Second*10, true) + CachedIP, QueryIP string + httpClientV4 = util.NewSingleStackHTTPClient(time.Second*20, time.Second*5, time.Second*10, false) + httpClientV6 = util.NewSingleStackHTTPClient(time.Second*20, time.Second*5, time.Second*10, true) ) -// UpdateIP 按设置时间间隔更新IP地址与国家码的缓存 +// UpdateIP 按设置时间间隔更新IP地址的缓存 func UpdateIP(useIPv6CountryCode bool, period uint32) { for { util.Println(agentConfig.Debug, "正在更新本地缓存IP信息") - ipv4 := fetchGeoIP(geoIPApiList, false) - ipv6 := fetchGeoIP(geoIPApiList, true) + ipv4 := fetchIP(cfList, false) + ipv6 := fetchIP(cfList, true) - if ipv4.IP == "" && ipv6.IP == "" { + if ipv4 == "" && ipv6 == "" { if period > 60 { time.Sleep(time.Minute) } else { @@ -68,25 +38,24 @@ func UpdateIP(useIPv6CountryCode bool, period uint32) { } continue } - if ipv4.IP == "" || ipv6.IP == "" { - CachedIP = fmt.Sprintf("%s%s", ipv4.IP, ipv6.IP) + if ipv4 == "" || ipv6 == "" { + CachedIP = fmt.Sprintf("%s%s", ipv4, ipv6) } else { - CachedIP = fmt.Sprintf("%s/%s", ipv4.IP, ipv6.IP) + CachedIP = fmt.Sprintf("%s/%s", ipv4, ipv6) } - if ipv4.CountryCode != "" { - CachedCountry = ipv4.CountryCode - } - if ipv6.CountryCode != "" && (useIPv6CountryCode || CachedCountry == "") { - CachedCountry = ipv6.CountryCode + if !useIPv6CountryCode { + QueryIP = ipv4 + } else { + QueryIP = ipv6 } time.Sleep(time.Second * time.Duration(period)) } } -func fetchGeoIP(servers []string, isV6 bool) geoIP { - var ip geoIP +func fetchIP(servers []string, isV6 bool) string { + var ip string var resp *http.Response var err error @@ -103,20 +72,20 @@ func fetchGeoIP(servers []string, isV6 bool) geoIP { continue } resp.Body.Close() - newIP := geoIP{} - if err := newIP.Unmarshal(body); err != nil { - continue + lines := strings.Split(string(body), "\n") + var newIP string + for _, line := range lines { + if strings.HasPrefix(line, "ip=") { + newIP = strings.TrimPrefix(line, "ip=") + break + } } // 没取到 v6 IP - if isV6 && !strings.Contains(newIP.IP, ":") { + if isV6 && !strings.Contains(newIP, ":") { continue } // 没取到 v4 IP - if !isV6 && !strings.Contains(newIP.IP, ".") { - continue - } - // 未获取到国家码 - if newIP.CountryCode == "" { + if !isV6 && !strings.Contains(newIP, ".") { continue } ip = newIP diff --git a/pkg/monitor/myip_test.go b/pkg/monitor/myip_test.go index a46d038..51ce951 100644 --- a/pkg/monitor/myip_test.go +++ b/pkg/monitor/myip_test.go @@ -6,31 +6,27 @@ import ( ) func TestGeoIPApi(t *testing.T) { - for i := 0; i < len(geoIPApiList); i++ { - resp, err := httpGetWithUA(httpClientV4, geoIPApiList[i]) + for i := 0; i < len(cfList); i++ { + resp, err := httpGetWithUA(httpClientV4, cfList[i]) if err != nil { - t.Fatalf("httpGetWithUA(%s) error: %v", geoIPApiList[i], err) + t.Fatalf("httpGetWithUA(%s) error: %v", cfList[i], err) } body, err := io.ReadAll(resp.Body) if err != nil { - t.Fatalf("io.ReadAll(%s) error: %v", geoIPApiList[i], err) + t.Fatalf("io.ReadAll(%s) error: %v", cfList[i], err) } resp.Body.Close() - var ip geoIP - err = ip.Unmarshal(body) - if err != nil { - t.Fatalf("ip.Unmarshal(%s) error: %v", geoIPApiList[i], err) - } - t.Logf("%s %s %s", geoIPApiList[i], ip.CountryCode, ip.IP) - if ip.IP == "" || ip.CountryCode == "" { - t.Fatalf("ip.Unmarshal(%s) error: %v", geoIPApiList[i], err) + ip := string(body) + t.Logf("%s %s", cfList[i], ip) + if ip == "" { + t.Fatalf("httpGetWithUA(%s) error: %v", cfList[i], err) } } } func TestFetchGeoIP(t *testing.T) { - ip := fetchGeoIP(geoIPApiList, false) - if ip.IP == "" || ip.CountryCode == "" { + ip := fetchIP(cfList, false) + if ip == "" { t.Fatalf("fetchGeoIP() error: %v", ip) } } diff --git a/proto/nezha.pb.go b/proto/nezha.pb.go index 0d7720e..729deb0 100644 --- a/proto/nezha.pb.go +++ b/proto/nezha.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc-gen-go v1.34.1 +// protoc v5.26.1 // source: proto/nezha.proto package proto @@ -35,7 +35,7 @@ type Host struct { Virtualization string `protobuf:"bytes,8,opt,name=virtualization,proto3" json:"virtualization,omitempty"` BootTime uint64 `protobuf:"varint,9,opt,name=boot_time,json=bootTime,proto3" json:"boot_time,omitempty"` Ip string `protobuf:"bytes,10,opt,name=ip,proto3" json:"ip,omitempty"` - CountryCode string `protobuf:"bytes,11,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` + CountryCode string `protobuf:"bytes,11,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` // deprecated Version string `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"` Gpu []string `protobuf:"bytes,13,rep,name=gpu,proto3" json:"gpu,omitempty"` } @@ -629,6 +629,61 @@ func (x *IOStreamData) GetData() []byte { return nil } +type GeoIP struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` + CountryCode string `protobuf:"bytes,2,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` +} + +func (x *GeoIP) Reset() { + *x = GeoIP{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_nezha_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GeoIP) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GeoIP) ProtoMessage() {} + +func (x *GeoIP) ProtoReflect() protoreflect.Message { + mi := &file_proto_nezha_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GeoIP.ProtoReflect.Descriptor instead. +func (*GeoIP) Descriptor() ([]byte, []int) { + return file_proto_nezha_proto_rawDescGZIP(), []int{7} +} + +func (x *GeoIP) GetIp() string { + if x != nil { + return x.Ip + } + return "" +} + +func (x *GeoIP) GetCountryCode() string { + if x != nil { + return x.CountryCode + } + return "" +} + var File_proto_nezha_proto protoreflect.FileDescriptor var file_proto_nezha_proto_rawDesc = []byte{ @@ -712,26 +767,32 @@ var file_proto_nezha_proto_rawDesc = []byte{ 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x22, 0x22, 0x0a, 0x0c, 0x49, 0x4f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, - 0x92, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x7a, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x33, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x0b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x49, 0x4f, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x4f, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x49, 0x4f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x22, 0x00, - 0x28, 0x01, 0x30, 0x01, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x3a, 0x0a, 0x05, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x32, 0xbf, 0x02, 0x0a, 0x0c, + 0x4e, 0x65, 0x7a, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x11, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, + 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, + 0x00, 0x12, 0x31, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x49, 0x4f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x4f, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x4f, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, + 0x12, 0x2b, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x12, + 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x1a, 0x0c, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x22, 0x00, 0x42, 0x09, 0x5a, + 0x07, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -746,8 +807,8 @@ func file_proto_nezha_proto_rawDescGZIP() []byte { return file_proto_nezha_proto_rawDescData } -var file_proto_nezha_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_proto_nezha_proto_goTypes = []any{ +var file_proto_nezha_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_proto_nezha_proto_goTypes = []interface{}{ (*Host)(nil), // 0: proto.Host (*State)(nil), // 1: proto.State (*State_SensorTemperature)(nil), // 2: proto.State_SensorTemperature @@ -755,6 +816,7 @@ var file_proto_nezha_proto_goTypes = []any{ (*TaskResult)(nil), // 4: proto.TaskResult (*Receipt)(nil), // 5: proto.Receipt (*IOStreamData)(nil), // 6: proto.IOStreamData + (*GeoIP)(nil), // 7: proto.GeoIP } var file_proto_nezha_proto_depIdxs = []int32{ 2, // 0: proto.State.temperatures:type_name -> proto.State_SensorTemperature @@ -763,13 +825,15 @@ var file_proto_nezha_proto_depIdxs = []int32{ 4, // 3: proto.NezhaService.ReportTask:input_type -> proto.TaskResult 0, // 4: proto.NezhaService.RequestTask:input_type -> proto.Host 6, // 5: proto.NezhaService.IOStream:input_type -> proto.IOStreamData - 5, // 6: proto.NezhaService.ReportSystemState:output_type -> proto.Receipt - 5, // 7: proto.NezhaService.ReportSystemInfo:output_type -> proto.Receipt - 5, // 8: proto.NezhaService.ReportTask:output_type -> proto.Receipt - 3, // 9: proto.NezhaService.RequestTask:output_type -> proto.Task - 6, // 10: proto.NezhaService.IOStream:output_type -> proto.IOStreamData - 6, // [6:11] is the sub-list for method output_type - 1, // [1:6] is the sub-list for method input_type + 7, // 6: proto.NezhaService.LookupGeoIP:input_type -> proto.GeoIP + 5, // 7: proto.NezhaService.ReportSystemState:output_type -> proto.Receipt + 5, // 8: proto.NezhaService.ReportSystemInfo:output_type -> proto.Receipt + 5, // 9: proto.NezhaService.ReportTask:output_type -> proto.Receipt + 3, // 10: proto.NezhaService.RequestTask:output_type -> proto.Task + 6, // 11: proto.NezhaService.IOStream:output_type -> proto.IOStreamData + 7, // 12: proto.NezhaService.LookupGeoIP:output_type -> proto.GeoIP + 7, // [7:13] is the sub-list for method output_type + 1, // [1:7] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name @@ -781,7 +845,7 @@ func file_proto_nezha_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_proto_nezha_proto_msgTypes[0].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Host); i { case 0: return &v.state @@ -793,7 +857,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[1].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*State); i { case 0: return &v.state @@ -805,7 +869,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[2].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*State_SensorTemperature); i { case 0: return &v.state @@ -817,7 +881,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[3].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Task); i { case 0: return &v.state @@ -829,7 +893,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[4].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskResult); i { case 0: return &v.state @@ -841,7 +905,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[5].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt); i { case 0: return &v.state @@ -853,7 +917,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[6].Exporter = func(v any, i int) any { + file_proto_nezha_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IOStreamData); i { case 0: return &v.state @@ -865,6 +929,18 @@ func file_proto_nezha_proto_init() { return nil } } + file_proto_nezha_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeoIP); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -872,7 +948,7 @@ func file_proto_nezha_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_nezha_proto_rawDesc, NumEnums: 0, - NumMessages: 7, + NumMessages: 8, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/nezha.proto b/proto/nezha.proto index da62c9a..b2a3600 100644 --- a/proto/nezha.proto +++ b/proto/nezha.proto @@ -9,6 +9,7 @@ service NezhaService { rpc ReportTask(TaskResult)returns(Receipt){} rpc RequestTask(Host)returns(stream Task){} rpc IOStream(stream IOStreamData)returns(stream IOStreamData){} + rpc LookupGeoIP(GeoIP)returns(GeoIP){} } message Host { @@ -22,7 +23,7 @@ message Host { string virtualization = 8; uint64 boot_time = 9; string ip = 10; - string country_code = 11; + string country_code = 11; // deprecated string version = 12; repeated string gpu = 13; } @@ -73,3 +74,8 @@ message Receipt{ message IOStreamData { bytes data = 1; } + +message GeoIP { + string ip = 1; + string country_code = 2; +} \ No newline at end of file diff --git a/proto/nezha_grpc.pb.go b/proto/nezha_grpc.pb.go index 2c59636..07543ce 100644 --- a/proto/nezha_grpc.pb.go +++ b/proto/nezha_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.27.1 +// - protoc v5.26.1 // source: proto/nezha.proto package proto @@ -24,6 +24,7 @@ const ( NezhaService_ReportTask_FullMethodName = "/proto.NezhaService/ReportTask" NezhaService_RequestTask_FullMethodName = "/proto.NezhaService/RequestTask" NezhaService_IOStream_FullMethodName = "/proto.NezhaService/IOStream" + NezhaService_LookupGeoIP_FullMethodName = "/proto.NezhaService/LookupGeoIP" ) // NezhaServiceClient is the client API for NezhaService service. @@ -35,6 +36,7 @@ type NezhaServiceClient interface { ReportTask(ctx context.Context, in *TaskResult, opts ...grpc.CallOption) (*Receipt, error) RequestTask(ctx context.Context, in *Host, opts ...grpc.CallOption) (NezhaService_RequestTaskClient, error) IOStream(ctx context.Context, opts ...grpc.CallOption) (NezhaService_IOStreamClient, error) + LookupGeoIP(ctx context.Context, in *GeoIP, opts ...grpc.CallOption) (*GeoIP, error) } type nezhaServiceClient struct { @@ -135,6 +137,15 @@ func (x *nezhaServiceIOStreamClient) Recv() (*IOStreamData, error) { return m, nil } +func (c *nezhaServiceClient) LookupGeoIP(ctx context.Context, in *GeoIP, opts ...grpc.CallOption) (*GeoIP, error) { + out := new(GeoIP) + err := c.cc.Invoke(ctx, NezhaService_LookupGeoIP_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // NezhaServiceServer is the server API for NezhaService service. // All implementations should embed UnimplementedNezhaServiceServer // for forward compatibility @@ -144,6 +155,7 @@ type NezhaServiceServer interface { ReportTask(context.Context, *TaskResult) (*Receipt, error) RequestTask(*Host, NezhaService_RequestTaskServer) error IOStream(NezhaService_IOStreamServer) error + LookupGeoIP(context.Context, *GeoIP) (*GeoIP, error) } // UnimplementedNezhaServiceServer should be embedded to have forward compatible implementations. @@ -165,6 +177,9 @@ func (UnimplementedNezhaServiceServer) RequestTask(*Host, NezhaService_RequestTa func (UnimplementedNezhaServiceServer) IOStream(NezhaService_IOStreamServer) error { return status.Errorf(codes.Unimplemented, "method IOStream not implemented") } +func (UnimplementedNezhaServiceServer) LookupGeoIP(context.Context, *GeoIP) (*GeoIP, error) { + return nil, status.Errorf(codes.Unimplemented, "method LookupGeoIP not implemented") +} // UnsafeNezhaServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to NezhaServiceServer will @@ -278,6 +293,24 @@ func (x *nezhaServiceIOStreamServer) Recv() (*IOStreamData, error) { return m, nil } +func _NezhaService_LookupGeoIP_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GeoIP) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NezhaServiceServer).LookupGeoIP(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NezhaService_LookupGeoIP_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NezhaServiceServer).LookupGeoIP(ctx, req.(*GeoIP)) + } + return interceptor(ctx, in, info, handler) +} + // NezhaService_ServiceDesc is the grpc.ServiceDesc for NezhaService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -297,6 +330,10 @@ var NezhaService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ReportTask", Handler: _NezhaService_ReportTask_Handler, }, + { + MethodName: "LookupGeoIP", + Handler: _NezhaService_LookupGeoIP_Handler, + }, }, Streams: []grpc.StreamDesc{ {