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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
## 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"