diff --git a/README.md b/README.md index b872b5a..90249d7 100644 --- a/README.md +++ b/README.md @@ -43,63 +43,63 @@ add your theme to [service/singleton/frontend-templates.yaml](service/singleton/ ## Contributors -naiba -UUBulb -Akkia -卖女孩的小火柴 -nap0o -黑歌 -xykt -MikoyChinese -JackieSung4ev -Kris -Lemoe -spiritlhl -刘颜溪 -CosmosZ-code -Ko no dio -Kris -1ridic -Mmx -rootmelo92118 -Moraxyc -zhucaidan -Sean -fscarmen -no-name-now -HsukqiLee -Darc Z. -Creling -Core F -Weblate (bot) -adminsama -Acgpiano -eya46 -guoyongchang -hiDandelion -I -lvyaoting -lyj -unclezs -缘生 -严浩 -凌 -榆木 -玖叁 -Tony -Tater Li -Tao Chen -Spetrum -Nanjing Hopefun Network Technology Co. Ltd. -Mingzhuo Yin -Martijn Lindeman -Leon -KorenKrita -Ian Li -GreenTeodoro839 -Esdese -:D -Coming +naiba +UUBulb +Akkia +卖女孩的小火柴 +nap0o +黑歌 +xykt +MikoyChinese +JackieSung4ev +Kris +Lemoe +spiritlhl +刘颜溪 +CosmosZ-code +Ko no dio +Kris +1ridic +Mmx +rootmelo92118 +Moraxyc +zhucaidan +Sean +fscarmen +no-name-now +Weblate (bot) +HsukqiLee +Darc Z. +Creling +Core F +adminsama +Acgpiano +eya46 +guoyongchang +hiDandelion +I +lvyaoting +lyj +unclezs +缘生 +严浩 +凌 +榆木 +玖叁 +Tony +Tater Li +Tao Chen +Spetrum +Nanjing Hopefun Network Technology Co. Ltd. +Mingzhuo Yin +Martijn Lindeman +Leon +KorenKrita +Ian Li +GreenTeodoro839 +Esdese +:D +Coming ## Special Thanks - [IPInfo](https://ipinfo.io/) for providing an accurate GeoIP Database. diff --git a/cmd/dashboard/rpc/rpc.go b/cmd/dashboard/rpc/rpc.go index dd95637..1618870 100644 --- a/cmd/dashboard/rpc/rpc.go +++ b/cmd/dashboard/rpc/rpc.go @@ -36,22 +36,24 @@ func waf(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handl } func getRealIp(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + var ip, connectingIp string + p, ok := peer.FromContext(ctx) + if ok { + addrPort, err := netip.ParseAddrPort(p.Addr.String()) + if err == nil { + connectingIp = addrPort.Addr().String() + } + } + ctx = context.WithValue(ctx, model.CtxKeyConnectingIP{}, connectingIp) + if singleton.Conf.RealIPHeader == "" { return handler(ctx, req) } - var ip string - if singleton.Conf.RealIPHeader == model.ConfigUsePeerIP { - p, ok := peer.FromContext(ctx) - if !ok { - return nil, fmt.Errorf("peer not found") + if connectingIp == "" { + return nil, fmt.Errorf("connecting ip not found") } - addrPort, err := netip.ParseAddrPort(p.Addr.String()) - if err != nil { - return nil, err - } - ip = addrPort.Addr().String() } else { vals := metadata.ValueFromIncomingContext(ctx, singleton.Conf.RealIPHeader) if len(vals) == 0 { @@ -65,7 +67,7 @@ func getRealIp(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, } if singleton.Conf.Debug { - log.Printf("NEZHA>> gRPC Real IP: %s", ip) + log.Printf("NEZHA>> gRPC Agent Real IP: %s, connecting IP: %s\n", ip, connectingIp) } ctx = context.WithValue(ctx, model.CtxKeyRealIP{}, ip) diff --git a/go.mod b/go.mod index 040d195..f0c6f0e 100644 --- a/go.mod +++ b/go.mod @@ -31,11 +31,11 @@ require ( github.com/swaggo/swag v1.16.4 github.com/tidwall/gjson v1.18.0 golang.org/x/crypto v0.31.0 - golang.org/x/exp v0.0.0-20241210194714-1829a127f884 - golang.org/x/net v0.32.0 + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 + golang.org/x/net v0.33.0 golang.org/x/sync v0.10.0 - google.golang.org/grpc v1.69.0 - google.golang.org/protobuf v1.35.2 + google.golang.org/grpc v1.69.2 + google.golang.org/protobuf v1.36.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/sqlite v1.5.7 gorm.io/gorm v1.25.12 diff --git a/go.sum b/go.sum index e15ae49..8c35b05 100644 --- a/go.sum +++ b/go.sum @@ -187,8 +187,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= -golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= @@ -196,8 +196,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= @@ -228,10 +228,10 @@ golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.69.0 h1:quSiOM1GJPmPH5XtU+BCoVXcDVJJAzNcoyfC2cCjGkI= -google.golang.org/grpc v1.69.0/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= +google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/model/alertrule.go b/model/alertrule.go index 717f8e4..431dc86 100644 --- a/model/alertrule.go +++ b/model/alertrule.go @@ -19,7 +19,7 @@ type AlertRule struct { NotificationGroupID uint64 `json:"notification_group_id"` // 该报警规则所在的通知组 FailTriggerTasksRaw string `gorm:"default:'[]'" json:"-"` RecoverTriggerTasksRaw string `gorm:"default:'[]'" json:"-"` - Rules []Rule `gorm:"-" json:"rules"` + Rules []*Rule `gorm:"-" json:"rules"` FailTriggerTasks []uint64 `gorm:"-" json:"fail_trigger_tasks"` // 失败时执行的触发任务id RecoverTriggerTasks []uint64 `gorm:"-" json:"recover_trigger_tasks"` // 恢复时执行的触发任务id } diff --git a/model/alertrule_api.go b/model/alertrule_api.go index 074cb81..9a3fdc3 100644 --- a/model/alertrule_api.go +++ b/model/alertrule_api.go @@ -2,7 +2,7 @@ package model type AlertRuleForm struct { Name string `json:"name" minLength:"1"` - Rules []Rule `json:"rules"` + Rules []*Rule `json:"rules"` FailTriggerTasks []uint64 `json:"fail_trigger_tasks"` // 失败时触发的任务id RecoverTriggerTasks []uint64 `json:"recover_trigger_tasks"` // 恢复时触发的任务id NotificationGroupID uint64 `json:"notification_group_id"` diff --git a/model/common.go b/model/common.go index d70317b..cc2a08f 100644 --- a/model/common.go +++ b/model/common.go @@ -12,6 +12,7 @@ const ( ) type CtxKeyRealIP struct{} +type CtxKeyConnectingIP struct{} type Common struct { ID uint64 `gorm:"primaryKey" json:"id,omitempty"` diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index 91cbca1..89de331 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -16,6 +16,7 @@ var Languages = map[string]string{ "zh_TW": "繁體中文", "en_US": "English", "es_ES": "Español", + "de_DE": "Deutsch", } type Localizer struct { diff --git a/pkg/i18n/translations/de_DE/LC_MESSAGES/nezha.mo b/pkg/i18n/translations/de_DE/LC_MESSAGES/nezha.mo new file mode 100644 index 0000000..7103fd1 Binary files /dev/null and b/pkg/i18n/translations/de_DE/LC_MESSAGES/nezha.mo differ diff --git a/pkg/i18n/translations/de_DE/LC_MESSAGES/nezha.po b/pkg/i18n/translations/de_DE/LC_MESSAGES/nezha.po new file mode 100644 index 0000000..9cb2a95 --- /dev/null +++ b/pkg/i18n/translations/de_DE/LC_MESSAGES/nezha.po @@ -0,0 +1,228 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-23 23:56+0800\n" +"PO-Revision-Date: 2024-12-17 04:52+0000\n" +"Last-Translator: UUBulb \n" +"Language-Team: German \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.9\n" + +#: cmd/dashboard/controller/alertrule.go:100 +#, c-format +msgid "alert id %d does not exist" +msgstr "benachrichtigungs ID %d existiert nicht" + +#: cmd/dashboard/controller/alertrule.go:155 +msgid "duration need to be at least 3" +msgstr "dauer muss mindestens 3 sein" + +#: cmd/dashboard/controller/alertrule.go:159 +msgid "cycle_interval need to be at least 1" +msgstr "cycle_interval muss mindestens 1 sein" + +#: cmd/dashboard/controller/alertrule.go:162 +msgid "cycle_start is not set" +msgstr "cycle_start ist nicht eingestellt" + +#: cmd/dashboard/controller/alertrule.go:165 +msgid "cycle_start is a future value" +msgstr "cycle_start ist ein zukünftiger wert" + +#: cmd/dashboard/controller/alertrule.go:170 +msgid "need to configure at least a single rule" +msgstr "mindestens eine Regel muss konfiguriert sein" + +#: cmd/dashboard/controller/controller.go:195 +msgid "database error" +msgstr "datenbankfehler" + +#: cmd/dashboard/controller/cron.go:63 cmd/dashboard/controller/cron.go:122 +msgid "scheduled tasks cannot be triggered by alarms" +msgstr "geplante aufgaben können nicht durch Alarme ausgelöst werden" + +#: cmd/dashboard/controller/cron.go:161 +#, c-format +msgid "task id %d does not exist" +msgstr "task ID %d existiert nicht" + +#: cmd/dashboard/controller/ddns.go:56 cmd/dashboard/controller/ddns.go:120 +msgid "the retry count must be an integer between 1 and 10" +msgstr "der retry_count muss eine Zahl zwischen 1 und 10 sein" + +#: cmd/dashboard/controller/ddns.go:79 cmd/dashboard/controller/ddns.go:148 +msgid "error parsing %s: %v" +msgstr "fehler beim parsen von %s: %v" + +#: cmd/dashboard/controller/ddns.go:125 cmd/dashboard/controller/nat.go:95 +#, c-format +msgid "profile id %d does not exist" +msgstr "profil ID %d existiert nicht" + +#: cmd/dashboard/controller/fm.go:45 cmd/dashboard/controller/terminal.go:43 +msgid "server not found or not connected" +msgstr "server nicht gefunden oder nicht verbunden" + +#: cmd/dashboard/controller/notification.go:67 +#: cmd/dashboard/controller/notification.go:125 +msgid "a test message" +msgstr "testnachricht" + +#: cmd/dashboard/controller/notification.go:106 +#, c-format +msgid "notification id %d does not exist" +msgstr "benachrichtigung ID %d existiert nicht" + +#: cmd/dashboard/controller/notification_group.go:80 +#: cmd/dashboard/controller/notification_group.go:142 +msgid "have invalid notification id" +msgstr "haben ungültige Benachrichtigungs ID" + +#: cmd/dashboard/controller/notification_group.go:131 +#: cmd/dashboard/controller/server_group.go:130 +#, c-format +msgid "group id %d does not exist" +msgstr "gruppen ID %d existiert nicht" + +#: cmd/dashboard/controller/server.go:60 +#, c-format +msgid "server id %d does not exist" +msgstr "server ID %d existiert nicht" + +#: cmd/dashboard/controller/server_group.go:78 +#: cmd/dashboard/controller/server_group.go:139 +msgid "have invalid server id" +msgstr "haben ungültige Server ID" + +#: cmd/dashboard/controller/service.go:79 +#: cmd/dashboard/controller/service.go:155 +msgid "server not found" +msgstr "server nicht gefunden" + +#: cmd/dashboard/controller/service.go:86 cmd/dashboard/controller/user.go:23 +msgid "unauthorized" +msgstr "nicht autorisiert" + +#: cmd/dashboard/controller/service.go:247 +#, c-format +msgid "service id %d does not exist" +msgstr "service ID %d existiert nicht" + +#: cmd/dashboard/controller/user.go:66 +msgid "password length must be greater than 6" +msgstr "passwort muss länger als 6 Zeichen sein" + +#: cmd/dashboard/controller/user.go:69 +msgid "username can't be empty" +msgstr "benutzername darf nicht leer sein" + +#: service/rpc/io_stream.go:122 +msgid "timeout: no connection established" +msgstr "timeout: Keine Verbindung hergestellt" + +#: service/rpc/io_stream.go:125 +msgid "timeout: user connection not established" +msgstr "timeout: Benutzerverbindung nicht etabliert" + +#: service/rpc/io_stream.go:128 +msgid "timeout: agent connection not established" +msgstr "timeout: Agent-Verbindung nicht etabliert" + +#: service/rpc/nezha.go:58 +msgid "Scheduled Task Executed Successfully" +msgstr "geplante Aufgabe erfolgreich ausgeführt" + +#: service/rpc/nezha.go:62 +msgid "Scheduled Task Executed Failed" +msgstr "geplante Aufgabe fehlgeschlagen" + +#: service/rpc/nezha.go:217 +msgid "IP Changed" +msgstr "IP geändert" + +#: service/singleton/alertsentinel.go:159 +msgid "Incident" +msgstr "Vorfall" + +#: service/singleton/alertsentinel.go:169 +msgid "Resolved" +msgstr "Gelöst" + +#: service/singleton/crontask.go:53 +msgid "Tasks failed to register: [" +msgstr "Aufgaben konnten nicht registriert werden: [" + +#: service/singleton/crontask.go:60 +msgid "" +"] These tasks will not execute properly. Fix them in the admin dashboard." +msgstr "" +"] Diese Aufgaben werden nicht korrekt ausgeführt. Reparieren Sie diese im " +"Admin-Dashboard." + +#: service/singleton/crontask.go:146 service/singleton/crontask.go:171 +#, c-format +msgid "[Task failed] %s: server %s is offline and cannot execute the task" +msgstr "" +"[Aufgabe fehlgeschlagen] %s: Server %s ist offline und kann die Aufgabe " +"nicht ausführen" + +#: service/singleton/servicesentinel.go:439 +#, c-format +msgid "[Latency] %s %2f > %2f, Reporter: %s" +msgstr "[Latency] %s %2f > %2f, Reporter: %s" + +#: service/singleton/servicesentinel.go:446 +#, c-format +msgid "[Latency] %s %2f < %2f, Reporter: %s" +msgstr "[Latency] %s %2f < %2f, Reporter: %s" + +#: service/singleton/servicesentinel.go:472 +#, c-format +msgid "[%s] %s Reporter: %s, Error: %s" +msgstr "[%s] %s Reporter: %s, Fehler: %s" + +#: service/singleton/servicesentinel.go:515 +#, c-format +msgid "[TLS] Fetch cert info failed, Reporter: %s, Error: %s" +msgstr "[TLS] Fetch cert info gescheitert, Reporter: %s, Fehler: %s" + +#: service/singleton/servicesentinel.go:555 +#, c-format +msgid "The TLS certificate will expire within seven days. Expiration time: %s" +msgstr "Das TLS-Zertifikat läuft innerhalb von sieben Tagen ab. Ablaufzeit: %s" + +#: service/singleton/servicesentinel.go:568 +#, c-format +msgid "" +"TLS certificate changed, old: issuer %s, expires at %s; new: issuer %s, " +"expires at %s" +msgstr "" +"TLS-Zertifikat geändert, alt: Emittent %s, läuft ab bei %s; neu: Emittent " +"%s, läuft ab bei %s" + +#: service/singleton/servicesentinel.go:604 +msgid "No Data" +msgstr "Keine Daten" + +#: service/singleton/servicesentinel.go:606 +msgid "Good" +msgstr "Gut" + +#: service/singleton/servicesentinel.go:608 +msgid "Low Availability" +msgstr "Niedere Verfügbarkeit" + +#: service/singleton/servicesentinel.go:610 +msgid "Down" +msgstr "Unten" diff --git a/pkg/i18n/translations/es_ES/LC_MESSAGES/nezha.mo b/pkg/i18n/translations/es_ES/LC_MESSAGES/nezha.mo new file mode 100644 index 0000000..582e4a7 Binary files /dev/null and b/pkg/i18n/translations/es_ES/LC_MESSAGES/nezha.mo differ diff --git a/pkg/i18n/translations/es_ES/LC_MESSAGES/nezha.po b/pkg/i18n/translations/es_ES/LC_MESSAGES/nezha.po new file mode 100644 index 0000000..edc7092 --- /dev/null +++ b/pkg/i18n/translations/es_ES/LC_MESSAGES/nezha.po @@ -0,0 +1,232 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-23 23:56+0800\n" +"PO-Revision-Date: 2024-12-17 04:52+0000\n" +"Last-Translator: UUBulb \n" +"Language-Team: Spanish \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.9\n" + +#: cmd/dashboard/controller/alertrule.go:100 +#, c-format +msgid "alert id %d does not exist" +msgstr "el ID de alerta %d no existe" + +#: cmd/dashboard/controller/alertrule.go:155 +msgid "duration need to be at least 3" +msgstr "la duración debe ser al menos de 3" + +#: cmd/dashboard/controller/alertrule.go:159 +msgid "cycle_interval need to be at least 1" +msgstr "cycle_interval debe ser al menos 1" + +#: cmd/dashboard/controller/alertrule.go:162 +msgid "cycle_start is not set" +msgstr "no se ha configurado el cycle_start" + +#: cmd/dashboard/controller/alertrule.go:165 +msgid "cycle_start is a future value" +msgstr "cycle_start es un valor futuro" + +#: cmd/dashboard/controller/alertrule.go:170 +msgid "need to configure at least a single rule" +msgstr "es necesario configurar al menos una regla" + +#: cmd/dashboard/controller/controller.go:195 +msgid "database error" +msgstr "error de base de datos" + +#: cmd/dashboard/controller/cron.go:63 cmd/dashboard/controller/cron.go:122 +msgid "scheduled tasks cannot be triggered by alarms" +msgstr "las tareas programadas no pueden ser activadas por alarmas" + +#: cmd/dashboard/controller/cron.go:161 +#, c-format +msgid "task id %d does not exist" +msgstr "el ID de la tarea %d no existe" + +#: cmd/dashboard/controller/ddns.go:56 cmd/dashboard/controller/ddns.go:120 +msgid "the retry count must be an integer between 1 and 10" +msgstr "el número de reintentos debe ser un número entero entre 1 y 10" + +#: cmd/dashboard/controller/ddns.go:79 cmd/dashboard/controller/ddns.go:148 +msgid "error parsing %s: %v" +msgstr "error al analizar %s: %v" + +#: cmd/dashboard/controller/ddns.go:125 cmd/dashboard/controller/nat.go:95 +#, c-format +msgid "profile id %d does not exist" +msgstr "el ID de perfil %d no existe" + +#: cmd/dashboard/controller/fm.go:45 cmd/dashboard/controller/terminal.go:43 +msgid "server not found or not connected" +msgstr "servidor no encontrado o no conectado" + +#: cmd/dashboard/controller/notification.go:67 +#: cmd/dashboard/controller/notification.go:125 +msgid "a test message" +msgstr "un mensaje de prueba" + +#: cmd/dashboard/controller/notification.go:106 +#, c-format +msgid "notification id %d does not exist" +msgstr "el ID de notificación %d no existe" + +#: cmd/dashboard/controller/notification_group.go:80 +#: cmd/dashboard/controller/notification_group.go:142 +msgid "have invalid notification id" +msgstr "hay un ID de notificación no válido" + +#: cmd/dashboard/controller/notification_group.go:131 +#: cmd/dashboard/controller/server_group.go:130 +#, c-format +msgid "group id %d does not exist" +msgstr "el ID de grupo %d no existe" + +#: cmd/dashboard/controller/server.go:60 +#, c-format +msgid "server id %d does not exist" +msgstr "el ID de servidor %d no existe" + +#: cmd/dashboard/controller/server_group.go:78 +#: cmd/dashboard/controller/server_group.go:139 +msgid "have invalid server id" +msgstr "hay un ID de servidor no válido" + +#: cmd/dashboard/controller/service.go:79 +#: cmd/dashboard/controller/service.go:155 +msgid "server not found" +msgstr "servidor no encontrado" + +#: cmd/dashboard/controller/service.go:86 cmd/dashboard/controller/user.go:23 +msgid "unauthorized" +msgstr "no autorizado" + +#: cmd/dashboard/controller/service.go:247 +#, c-format +msgid "service id %d does not exist" +msgstr "el ID de servicio %d no existe" + +#: cmd/dashboard/controller/user.go:66 +msgid "password length must be greater than 6" +msgstr "la longitud de la contraseña debe ser mayor a 6" + +#: cmd/dashboard/controller/user.go:69 +msgid "username can't be empty" +msgstr "el nombre de usuario no puede estar vacío" + +#: service/rpc/io_stream.go:122 +msgid "timeout: no connection established" +msgstr "tiempo de espera agotado: no se pudo establecer conexión" + +#: service/rpc/io_stream.go:125 +msgid "timeout: user connection not established" +msgstr "tiempo de espera agotado: no se pudo establecer conexión con el usuario" + +#: service/rpc/io_stream.go:128 +msgid "timeout: agent connection not established" +msgstr "tiempo de espera agotado: no se pudo establecer conexión con agent" + +#: service/rpc/nezha.go:58 +msgid "Scheduled Task Executed Successfully" +msgstr "tarea programada ejecutada con éxito" + +#: service/rpc/nezha.go:62 +msgid "Scheduled Task Executed Failed" +msgstr "falló la ejecución de la tarea programada" + +#: service/rpc/nezha.go:217 +msgid "IP Changed" +msgstr "IP cambiada" + +#: service/singleton/alertsentinel.go:159 +msgid "Incident" +msgstr "Incidente" + +#: service/singleton/alertsentinel.go:169 +msgid "Resolved" +msgstr "Resuelto" + +#: service/singleton/crontask.go:53 +msgid "Tasks failed to register: [" +msgstr "Las tareas no se pudieron registrar: [" + +#: service/singleton/crontask.go:60 +msgid "" +"] These tasks will not execute properly. Fix them in the admin dashboard." +msgstr "" +"] Estas tareas no se ejecutarán correctamente. Corríjalas en el dashboard de " +"administración." + +#: service/singleton/crontask.go:146 service/singleton/crontask.go:171 +#, c-format +msgid "[Task failed] %s: server %s is offline and cannot execute the task" +msgstr "" +"[Tarea fallida] %s: el servidor %s está fuera de línea y no puede ejecutar " +"la tarea" + +#: service/singleton/servicesentinel.go:439 +#, c-format +msgid "[Latency] %s %2f > %2f, Reporter: %s" +msgstr "[Latencia] %s %2f > %2f, Reportado por: %s" + +#: service/singleton/servicesentinel.go:446 +#, c-format +msgid "[Latency] %s %2f < %2f, Reporter: %s" +msgstr "[Latencia] %s %2f < %2f, Reportado por: %s" + +#: service/singleton/servicesentinel.go:472 +#, c-format +msgid "[%s] %s Reporter: %s, Error: %s" +msgstr "[%s] %s Reportado por: %s, Error: %s" + +#: service/singleton/servicesentinel.go:515 +#, c-format +msgid "[TLS] Fetch cert info failed, Reporter: %s, Error: %s" +msgstr "" +"[TLS] Error al obtener información del certificado, Reportado por: %s, Error:" +" %s" + +#: service/singleton/servicesentinel.go:555 +#, c-format +msgid "The TLS certificate will expire within seven days. Expiration time: %s" +msgstr "" +"El certificado TLS expirará en los próximos siete días. Fecha de expiración: " +"%s" + +#: service/singleton/servicesentinel.go:568 +#, c-format +msgid "" +"TLS certificate changed, old: issuer %s, expires at %s; new: issuer %s, " +"expires at %s" +msgstr "" +"El certificado TLS ha cambiado. Antiguo: emisor %s, expira en %s; Nuevo: " +"emisor %s, expira en %s" + +#: service/singleton/servicesentinel.go:604 +msgid "No Data" +msgstr "Sin datos" + +#: service/singleton/servicesentinel.go:606 +msgid "Good" +msgstr "Bueno" + +#: service/singleton/servicesentinel.go:608 +msgid "Low Availability" +msgstr "Baja disponibilidad" + +#: service/singleton/servicesentinel.go:610 +msgid "Down" +msgstr "Fallo" diff --git a/service/rpc/nezha.go b/service/rpc/nezha.go index 672529b..8002f26 100644 --- a/service/rpc/nezha.go +++ b/service/rpc/nezha.go @@ -201,9 +201,18 @@ func (s *NezhaHandler) ReportGeoIP(c context.Context, r *pb.GeoIP) (*pb.GeoIP, e } geoip := model.PB2GeoIP(r) - joinedIP := geoip.IP.Join() use6 := r.GetUse6() + if geoip.IP.IPv4Addr == "" && geoip.IP.IPv6Addr == "" { + ip, _ := c.Value(model.CtxKeyRealIP{}).(string) + if ip == "" { + ip, _ = c.Value(model.CtxKeyConnectingIP{}).(string) + } + geoip.IP.IPv4Addr = ip + } + + joinedIP := geoip.IP.Join() + singleton.ServerLock.RLock() // 检查并更新DDNS if singleton.ServerList[clientID].EnableDDNS && joinedIP != "" && diff --git a/service/singleton/frontend-templates.yaml b/service/singleton/frontend-templates.yaml index 9235266..fb4c63a 100644 --- a/service/singleton/frontend-templates.yaml +++ b/service/singleton/frontend-templates.yaml @@ -2,17 +2,17 @@ name: "OfficialAdmin" repository: "https://github.com/nezhahq/admin-frontend" author: "nezhahq" - version: "v1.2.0" + version: "v1.2.2" isadmin: true isofficial: true - path: "user-dist" name: "Official" repository: "https://github.com/hamster1963/nezha-dash-v1" author: "hamster1963" - version: "v1.3.5" + version: "v1.6.1" isofficial: true - path: "nazhua-dist" name: "Nazhua" repository: "https://github.com/hi2shark/nazhua" author: "hi2hi" - version: "v0.4.20" + version: "v0.4.22"