From 7e8985a59991c1a12c43e1d3cbcdc0f6e19b8fb1 Mon Sep 17 00:00:00 2001 From: UUBulb <35923940+uubulb@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:33:53 +0800 Subject: [PATCH] feat: edit server config online (#980) * feat: edit server config online * clean * refactor * generate template * fix deadlocks * fix --- cmd/dashboard/controller/controller.go | 2 + cmd/dashboard/controller/server.go | 97 ++++++++++++++++++ model/server.go | 10 +- model/service.go | 11 +- pkg/i18n/template.pot | 74 +++++++------ .../translations/en_US/LC_MESSAGES/nezha.mo | Bin 5077 -> 4997 bytes .../translations/en_US/LC_MESSAGES/nezha.po | 84 +++++++-------- service/rpc/auth.go | 4 +- service/rpc/nezha.go | 27 +++-- service/singleton/server.go | 4 +- 10 files changed, 227 insertions(+), 86 deletions(-) diff --git a/cmd/dashboard/controller/controller.go b/cmd/dashboard/controller/controller.go index c3f853c175..b883c0fa3a 100644 --- a/cmd/dashboard/controller/controller.go +++ b/cmd/dashboard/controller/controller.go @@ -110,6 +110,8 @@ func routers(r *gin.Engine, frontendDist fs.FS) { auth.GET("/server", listHandler(listServer)) auth.PATCH("/server/:id", commonHandler(updateServer)) + auth.GET("/server/:id/config", commonHandler(getServerConfig)) + auth.POST("/server/:id/config", commonHandler(setServerConfig)) auth.POST("/batch-delete/server", commonHandler(batchDeleteServer)) auth.POST("/force-update/server", commonHandler(forceUpdateServer)) diff --git a/cmd/dashboard/controller/server.go b/cmd/dashboard/controller/server.go index c0e9d89a82..f8a208c761 100644 --- a/cmd/dashboard/controller/server.go +++ b/cmd/dashboard/controller/server.go @@ -2,6 +2,7 @@ package controller import ( "strconv" + "time" "github.com/gin-gonic/gin" "github.com/jinzhu/copier" @@ -213,3 +214,99 @@ func forceUpdateServer(c *gin.Context) (*model.ForceUpdateResponse, error) { return forceUpdateResp, nil } + +// Get server config +// @Summary Get server config +// @Security BearerAuth +// @Schemes +// @Description Get server config +// @Tags auth required +// @Produce json +// @Success 200 {object} model.CommonResponse[string] +// @Router /server/{id}/config [get] +func getServerConfig(c *gin.Context) (string, error) { + idStr := c.Param("id") + id, err := strconv.ParseUint(idStr, 10, 64) + if err != nil { + return "", err + } + + singleton.ServerLock.RLock() + s, ok := singleton.ServerList[id] + if !ok || s.TaskStream == nil { + singleton.ServerLock.RUnlock() + return "", nil + } + singleton.ServerLock.RUnlock() + + if !s.HasPermission(c) { + return "", singleton.Localizer.ErrorT("permission denied") + } + + if err := s.TaskStream.Send(&pb.Task{ + Type: model.TaskTypeReportConfig, + }); err != nil { + return "", err + } + + timeout := time.NewTimer(time.Second * 10) + select { + case <-timeout.C: + return "", singleton.Localizer.ErrorT("operation timeout") + case data := <-s.ConfigCache: + timeout.Stop() + switch data := data.(type) { + case string: + return data, nil + case error: + return "", singleton.Localizer.ErrorT("get server config failed: %v", data) + } + } + + return "", singleton.Localizer.ErrorT("get server config failed") +} + +// Set server config +// @Summary Set server config +// @Security BearerAuth +// @Schemes +// @Description Set server config +// @Tags auth required +// @Accept json +// @param request body string true "config" +// @Produce json +// @Success 200 {object} model.CommonResponse[any] +// @Router /server/{id}/config [post] +func setServerConfig(c *gin.Context) (any, error) { + idStr := c.Param("id") + id, err := strconv.ParseUint(idStr, 10, 64) + if err != nil { + return "", err + } + + var configRaw string + if err := c.ShouldBindJSON(&configRaw); err != nil { + return nil, err + } + + singleton.ServerLock.RLock() + s, ok := singleton.ServerList[id] + if !ok || s.TaskStream == nil { + singleton.ServerLock.RUnlock() + return "", nil + } + singleton.ServerLock.RUnlock() + + if !s.HasPermission(c) { + return "", singleton.Localizer.ErrorT("permission denied") + } + + if err := s.TaskStream.Send(&pb.Task{ + Type: model.TaskTypeApplyConfig, + Data: configRaw, + }); err != nil { + return "", err + } + + return nil, nil +} diff --git a/model/server.go b/model/server.go index 7f4255549e..67f655e007 100644 --- a/model/server.go +++ b/model/server.go @@ -32,12 +32,20 @@ type Server struct { GeoIP *GeoIP `gorm:"-" json:"geoip,omitempty"` LastActive time.Time `gorm:"-" json:"last_active,omitempty"` - TaskStream pb.NezhaService_RequestTaskServer `gorm:"-" json:"-"` + TaskStream pb.NezhaService_RequestTaskServer `gorm:"-" json:"-"` + ConfigCache chan any `gorm:"-" json:"-"` PrevTransferInSnapshot int64 `gorm:"-" json:"-"` // 上次数据点时的入站使用量 PrevTransferOutSnapshot int64 `gorm:"-" json:"-"` // 上次数据点时的出站使用量 } +func InitServer(s *Server) { + s.Host = &Host{} + s.State = &HostState{} + s.GeoIP = &GeoIP{} + s.ConfigCache = make(chan any, 1) +} + func (s *Server) CopyFromRunningServer(old *Server) { s.Host = old.Host s.State = old.State diff --git a/model/service.go b/model/service.go index 3c828c7b20..76e423c913 100644 --- a/model/service.go +++ b/model/service.go @@ -24,6 +24,8 @@ const ( TaskTypeNAT TaskTypeReportHostInfoDeprecated TaskTypeFM + TaskTypeReportConfig + TaskTypeApplyConfig ) type TerminalTask struct { @@ -127,5 +129,12 @@ func (m *Service) AfterFind(tx *gorm.DB) error { // IsServiceSentinelNeeded 判断该任务类型是否需要进行服务监控 需要则返回true func IsServiceSentinelNeeded(t uint64) bool { - return t != TaskTypeCommand && t != TaskTypeTerminalGRPC && t != TaskTypeUpgrade && t != TaskTypeKeepalive + switch t { + case TaskTypeCommand, TaskTypeTerminalGRPC, TaskTypeUpgrade, + TaskTypeKeepalive, TaskTypeNAT, TaskTypeFM, + TaskTypeReportConfig, TaskTypeApplyConfig: + return false + default: + return true + } } diff --git a/pkg/i18n/template.pot b/pkg/i18n/template.pot index 596ffd8e6f..f332181491 100644 --- a/pkg/i18n/template.pot +++ b/pkg/i18n/template.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-31 21:25+0800\n" +"POT-Creation-Date: 2025-01-30 21:58+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -25,28 +25,28 @@ msgstr "" #: cmd/dashboard/controller/alertrule.go:108 #: cmd/dashboard/controller/alertrule.go:156 #: cmd/dashboard/controller/alertrule.go:176 -#: cmd/dashboard/controller/controller.go:216 +#: cmd/dashboard/controller/controller.go:226 #: cmd/dashboard/controller/cron.go:58 cmd/dashboard/controller/cron.go:124 #: cmd/dashboard/controller/cron.go:136 cmd/dashboard/controller/cron.go:195 #: cmd/dashboard/controller/cron.go:224 cmd/dashboard/controller/ddns.go:131 #: cmd/dashboard/controller/ddns.go:192 cmd/dashboard/controller/fm.go:43 -#: cmd/dashboard/controller/nat.go:59 cmd/dashboard/controller/nat.go:110 -#: cmd/dashboard/controller/nat.go:121 cmd/dashboard/controller/nat.go:160 +#: cmd/dashboard/controller/nat.go:59 cmd/dashboard/controller/nat.go:111 +#: cmd/dashboard/controller/nat.go:122 cmd/dashboard/controller/nat.go:162 #: cmd/dashboard/controller/notification.go:112 #: cmd/dashboard/controller/notification.go:166 #: cmd/dashboard/controller/notification_group.go:76 #: cmd/dashboard/controller/notification_group.go:152 #: cmd/dashboard/controller/notification_group.go:164 #: cmd/dashboard/controller/notification_group.go:233 -#: cmd/dashboard/controller/server.go:65 cmd/dashboard/controller/server.go:77 -#: cmd/dashboard/controller/server.go:128 -#: cmd/dashboard/controller/server.go:192 +#: cmd/dashboard/controller/server.go:66 cmd/dashboard/controller/server.go:78 +#: cmd/dashboard/controller/server.go:137 +#: cmd/dashboard/controller/server.go:201 #: cmd/dashboard/controller/server_group.go:75 #: cmd/dashboard/controller/server_group.go:150 #: cmd/dashboard/controller/server_group.go:229 -#: cmd/dashboard/controller/service.go:273 -#: cmd/dashboard/controller/service.go:344 -#: cmd/dashboard/controller/service.go:371 +#: cmd/dashboard/controller/service.go:271 +#: cmd/dashboard/controller/service.go:342 +#: cmd/dashboard/controller/service.go:369 #: cmd/dashboard/controller/terminal.go:41 msgid "permission denied" msgstr "" @@ -71,15 +71,15 @@ msgstr "" msgid "need to configure at least a single rule" msgstr "" -#: cmd/dashboard/controller/controller.go:210 -#: cmd/dashboard/controller/oauth2.go:152 +#: cmd/dashboard/controller/controller.go:220 +#: cmd/dashboard/controller/oauth2.go:153 #: cmd/dashboard/controller/server_group.go:162 -#: cmd/dashboard/controller/service.go:96 cmd/dashboard/controller/user.go:27 +#: cmd/dashboard/controller/service.go:97 cmd/dashboard/controller/user.go:27 #: cmd/dashboard/controller/user.go:63 msgid "unauthorized" msgstr "" -#: cmd/dashboard/controller/controller.go:233 +#: cmd/dashboard/controller/controller.go:243 msgid "database error" msgstr "" @@ -100,7 +100,7 @@ msgstr "" msgid "error parsing %s: %v" msgstr "" -#: cmd/dashboard/controller/ddns.go:127 cmd/dashboard/controller/nat.go:117 +#: cmd/dashboard/controller/ddns.go:127 cmd/dashboard/controller/nat.go:118 #, c-format msgid "profile id %d does not exist" msgstr "" @@ -147,32 +147,44 @@ msgstr "" msgid "code is required" msgstr "" -#: cmd/dashboard/controller/oauth2.go:174 +#: cmd/dashboard/controller/oauth2.go:175 msgid "oauth2 user not binded yet" msgstr "" -#: cmd/dashboard/controller/oauth2.go:215 -#: cmd/dashboard/controller/oauth2.go:221 -#: cmd/dashboard/controller/oauth2.go:226 +#: cmd/dashboard/controller/oauth2.go:217 +#: cmd/dashboard/controller/oauth2.go:223 +#: cmd/dashboard/controller/oauth2.go:228 msgid "invalid state key" msgstr "" -#: cmd/dashboard/controller/server.go:73 +#: cmd/dashboard/controller/server.go:74 #, c-format msgid "server id %d does not exist" msgstr "" +#: cmd/dashboard/controller/server.go:250 +msgid "operation timeout" +msgstr "" + +#: cmd/dashboard/controller/server.go:257 +msgid "get server config failed: %v" +msgstr "" + +#: cmd/dashboard/controller/server.go:261 +msgid "get server config failed" +msgstr "" + #: cmd/dashboard/controller/server_group.go:92 #: cmd/dashboard/controller/server_group.go:172 msgid "have invalid server id" msgstr "" -#: cmd/dashboard/controller/service.go:89 +#: cmd/dashboard/controller/service.go:90 #: cmd/dashboard/controller/service.go:165 msgid "server not found" msgstr "" -#: cmd/dashboard/controller/service.go:269 +#: cmd/dashboard/controller/service.go:267 #, c-format msgid "service id %d does not exist" msgstr "" @@ -185,19 +197,19 @@ msgstr "" msgid "you don't have any oauth2 bindings" msgstr "" -#: cmd/dashboard/controller/user.go:130 +#: cmd/dashboard/controller/user.go:131 msgid "password length must be greater than 6" msgstr "" -#: cmd/dashboard/controller/user.go:133 +#: cmd/dashboard/controller/user.go:134 msgid "username can't be empty" msgstr "" -#: cmd/dashboard/controller/user.go:136 +#: cmd/dashboard/controller/user.go:137 msgid "invalid role" msgstr "" -#: cmd/dashboard/controller/user.go:175 +#: cmd/dashboard/controller/user.go:176 msgid "can't delete yourself" msgstr "" @@ -213,23 +225,23 @@ msgstr "" msgid "timeout: agent connection not established" msgstr "" -#: service/rpc/nezha.go:69 +#: service/rpc/nezha.go:71 msgid "Scheduled Task Executed Successfully" msgstr "" -#: service/rpc/nezha.go:73 +#: service/rpc/nezha.go:75 msgid "Scheduled Task Executed Failed" msgstr "" -#: service/rpc/nezha.go:245 +#: service/rpc/nezha.go:274 msgid "IP Changed" msgstr "" -#: service/singleton/alertsentinel.go:170 +#: service/singleton/alertsentinel.go:169 msgid "Incident" msgstr "" -#: service/singleton/alertsentinel.go:180 +#: service/singleton/alertsentinel.go:179 msgid "Resolved" msgstr "" diff --git a/pkg/i18n/translations/en_US/LC_MESSAGES/nezha.mo b/pkg/i18n/translations/en_US/LC_MESSAGES/nezha.mo index 896a21bace85de0f61ae9a74872b69d95a1dc3fd..3992b2784b64403d211526f506137458dad2d7b2 100644 GIT binary patch delta 1361 zcmZwHOGs2v9LMpKPQKq`nOS-@%~!W(e3XtvS!kJ}VH$xOZ#tT!Gc}GuPzX^A%N8-T z5ONW;iCP#!n~I=XB(!J~2vLN+2wD^bwyM6rnQ_;FGoN$roO{my{{MI8P34u!>GyfA zn}*gx-$MVj&X^v2mBsW*z zvE7(y^Or#h7uu6z3rFH!!$z(z-~s%C9azmNSvZNC@e*#pc~l^ar~_Z%R{Vw=F_~y} zUok2$8}m8ebTQCI4k`l|P&dqB9xh-8KF3^qja9gUrI?-?yWhqF=7&-125~!v;`2Gw z{`W8+Ut%8Tn|BOs{DDeMG5OV#_)rIQqHdhPLcEIgcn7O-8OtysJr-C6D&THZW(H7! zokgvi!A8n_AE#B@6;{iy$X@0<@^EGq6^O}<)ixJ(y%3ecGE}NtQMDaGJ-}mZ$7NJ$ zOUS#{?Tb5%D(y@b`B!b9a-jngvST&sLX~6y^#tcofy|;dnn%_48LCttkS)wADzGFL zE5#M4eSD}4_M_H^P^F#8A^$w2xy1$5>@KRdk5H-qgxVm9FO|Yl)VgLqRNKz@JcK&n zGV0*lr~@9NjZ3J^tRh<)H(zT1@<9f=u^m<0AyjQIqH6m9RkOFK!2X~Du5`yT(|`)> z2x{F)q_l<~RkZDhEF~6Y?qRI_)Xls& zhM#)0wJd&iop$90&-g=5cq|yO!ebNu;8b|AC$%Rb`)KRI&elV1*73I9V;w!+ktgXj zy>*_tM%&}H>phmY!B_9C^)z`rXk#;}oH>TwJgU=F{;bErfv zqc*&O&G-W6;a{lx>d9J(HRD|NH@z$r=v!0;#!)w%#@Tog>#%^c@IJQTBW%SFsQa6% zsRFLUuW=jd`UzCr(>NEepyJ*^oBhonEL4(zQBN?R`YLb`b>miS#5AtLV;IDn_!YiF zB~(>gN^}LPB0Z>t5~%A^c$@Z~LAq%Arc-|{Vl0SZ;>g385mX|hNY#v2K7SZhx)Z1p zUqbgs1e?_(QHL9hpGpK)zMRG=|H`h?5yoY*%=cq*9q5}Pg z>gf_rszsZSSY`y3SQ=I0Q>Zw0hH-`f(=pSC48rsD#a^()XhRq){b2 zj_T>p$j3b3pukU18@@*cp31?-MpQ*MBYT-KR9qi*-vv}l3)@(zr@y0mS}~{8t9DdE zaa5)gsEV9GCG-=jr`M5|8h%8@(Vl-%)iiw#Yt=;&*X1h$4YQWBTFmTV7Dql9XtI^6 z1}}u6w8b3>SbRG=@$=D@-yfJ03~_1|bM0q;>S3+_7FPM(QtZxO4K#GEV5JvIL;agy zTp3e|tC=gA)l7cc#St$28TcVk$W_NHTcVlN_#Q89wGC(X_-@h~@*Usxf>vAHJ(PBW z`G>X3Cr6@@?e<{8?u%Gk65+vE`|do#4}~`7x7M9qnz33pSY7LDcG;WVjGHTEx3d(? U>h9?3w3F_^!mGLw)gWB?3A9kTU;qFB diff --git a/pkg/i18n/translations/en_US/LC_MESSAGES/nezha.po b/pkg/i18n/translations/en_US/LC_MESSAGES/nezha.po index 6be86a9b38..9a77bc41ed 100644 --- a/pkg/i18n/translations/en_US/LC_MESSAGES/nezha.po +++ b/pkg/i18n/translations/en_US/LC_MESSAGES/nezha.po @@ -1,23 +1,21 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# English translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. +# Automatically generated, 2025. # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-31 21:25+0800\n" -"PO-Revision-Date: 2024-12-31 15:18+0000\n" -"Last-Translator: UUBulb \n" -"Language-Team: English (United States) \n" +"POT-Creation-Date: 2025-01-30 14:31+0800\n" +"PO-Revision-Date: 2025-01-30 14:31+0800\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" "Language: en_US\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.10-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cmd/dashboard/controller/alertrule.go:104 #, c-format @@ -27,28 +25,28 @@ msgstr "alert id %d does not exist" #: cmd/dashboard/controller/alertrule.go:108 #: cmd/dashboard/controller/alertrule.go:156 #: cmd/dashboard/controller/alertrule.go:176 -#: cmd/dashboard/controller/controller.go:216 +#: cmd/dashboard/controller/controller.go:226 #: cmd/dashboard/controller/cron.go:58 cmd/dashboard/controller/cron.go:124 #: cmd/dashboard/controller/cron.go:136 cmd/dashboard/controller/cron.go:195 #: cmd/dashboard/controller/cron.go:224 cmd/dashboard/controller/ddns.go:131 #: cmd/dashboard/controller/ddns.go:192 cmd/dashboard/controller/fm.go:43 -#: cmd/dashboard/controller/nat.go:59 cmd/dashboard/controller/nat.go:110 -#: cmd/dashboard/controller/nat.go:121 cmd/dashboard/controller/nat.go:160 +#: cmd/dashboard/controller/nat.go:59 cmd/dashboard/controller/nat.go:111 +#: cmd/dashboard/controller/nat.go:122 cmd/dashboard/controller/nat.go:162 #: cmd/dashboard/controller/notification.go:112 #: cmd/dashboard/controller/notification.go:166 #: cmd/dashboard/controller/notification_group.go:76 #: cmd/dashboard/controller/notification_group.go:152 #: cmd/dashboard/controller/notification_group.go:164 #: cmd/dashboard/controller/notification_group.go:233 -#: cmd/dashboard/controller/server.go:65 cmd/dashboard/controller/server.go:77 -#: cmd/dashboard/controller/server.go:128 -#: cmd/dashboard/controller/server.go:192 +#: cmd/dashboard/controller/server.go:66 cmd/dashboard/controller/server.go:78 +#: cmd/dashboard/controller/server.go:137 +#: cmd/dashboard/controller/server.go:201 #: cmd/dashboard/controller/server_group.go:75 #: cmd/dashboard/controller/server_group.go:150 #: cmd/dashboard/controller/server_group.go:229 -#: cmd/dashboard/controller/service.go:273 -#: cmd/dashboard/controller/service.go:344 -#: cmd/dashboard/controller/service.go:371 +#: cmd/dashboard/controller/service.go:271 +#: cmd/dashboard/controller/service.go:342 +#: cmd/dashboard/controller/service.go:369 #: cmd/dashboard/controller/terminal.go:41 msgid "permission denied" msgstr "permission denied" @@ -73,15 +71,15 @@ msgstr "cycle_start is a future value" msgid "need to configure at least a single rule" msgstr "need to configure at least a single rule" -#: cmd/dashboard/controller/controller.go:210 -#: cmd/dashboard/controller/oauth2.go:152 +#: cmd/dashboard/controller/controller.go:220 +#: cmd/dashboard/controller/oauth2.go:153 #: cmd/dashboard/controller/server_group.go:162 -#: cmd/dashboard/controller/service.go:96 cmd/dashboard/controller/user.go:27 +#: cmd/dashboard/controller/service.go:97 cmd/dashboard/controller/user.go:27 #: cmd/dashboard/controller/user.go:63 msgid "unauthorized" msgstr "unauthorized" -#: cmd/dashboard/controller/controller.go:233 +#: cmd/dashboard/controller/controller.go:243 msgid "database error" msgstr "database error" @@ -102,7 +100,7 @@ msgstr "the retry count must be an integer between 1 and 10" msgid "error parsing %s: %v" msgstr "error parsing %s: %v" -#: cmd/dashboard/controller/ddns.go:127 cmd/dashboard/controller/nat.go:117 +#: cmd/dashboard/controller/ddns.go:127 cmd/dashboard/controller/nat.go:118 #, c-format msgid "profile id %d does not exist" msgstr "profile id %d does not exist" @@ -149,32 +147,36 @@ msgstr "operation not permitted" msgid "code is required" msgstr "code is required" -#: cmd/dashboard/controller/oauth2.go:174 +#: cmd/dashboard/controller/oauth2.go:175 msgid "oauth2 user not binded yet" msgstr "oauth2 user not binded yet" -#: cmd/dashboard/controller/oauth2.go:215 -#: cmd/dashboard/controller/oauth2.go:221 -#: cmd/dashboard/controller/oauth2.go:226 +#: cmd/dashboard/controller/oauth2.go:217 +#: cmd/dashboard/controller/oauth2.go:223 +#: cmd/dashboard/controller/oauth2.go:228 msgid "invalid state key" msgstr "invalid state key" -#: cmd/dashboard/controller/server.go:73 +#: cmd/dashboard/controller/server.go:74 #, c-format msgid "server id %d does not exist" msgstr "server id %d does not exist" +#: cmd/dashboard/controller/server.go:251 +msgid "operation timeout" +msgstr "operation timeout" + #: cmd/dashboard/controller/server_group.go:92 #: cmd/dashboard/controller/server_group.go:172 msgid "have invalid server id" msgstr "have invalid server id" -#: cmd/dashboard/controller/service.go:89 +#: cmd/dashboard/controller/service.go:90 #: cmd/dashboard/controller/service.go:165 msgid "server not found" msgstr "server not found" -#: cmd/dashboard/controller/service.go:269 +#: cmd/dashboard/controller/service.go:267 #, c-format msgid "service id %d does not exist" msgstr "service id %d does not exist" @@ -187,19 +189,19 @@ msgstr "incorrect password" msgid "you don't have any oauth2 bindings" msgstr "you don't have any oauth2 bindings" -#: cmd/dashboard/controller/user.go:130 +#: cmd/dashboard/controller/user.go:131 msgid "password length must be greater than 6" msgstr "password length must be greater than 6" -#: cmd/dashboard/controller/user.go:133 +#: cmd/dashboard/controller/user.go:134 msgid "username can't be empty" msgstr "username can't be empty" -#: cmd/dashboard/controller/user.go:136 +#: cmd/dashboard/controller/user.go:137 msgid "invalid role" msgstr "invalid role" -#: cmd/dashboard/controller/user.go:175 +#: cmd/dashboard/controller/user.go:176 msgid "can't delete yourself" msgstr "can't delete yourself" @@ -215,23 +217,23 @@ msgstr "timeout: user connection not established" msgid "timeout: agent connection not established" msgstr "timeout: agent connection not established" -#: service/rpc/nezha.go:69 +#: service/rpc/nezha.go:70 msgid "Scheduled Task Executed Successfully" msgstr "Scheduled Task Executed Successfully" -#: service/rpc/nezha.go:73 +#: service/rpc/nezha.go:74 msgid "Scheduled Task Executed Failed" msgstr "Scheduled Task Executed Failed" -#: service/rpc/nezha.go:245 +#: service/rpc/nezha.go:268 msgid "IP Changed" msgstr "IP Changed" -#: service/singleton/alertsentinel.go:170 +#: service/singleton/alertsentinel.go:169 msgid "Incident" msgstr "Incident" -#: service/singleton/alertsentinel.go:180 +#: service/singleton/alertsentinel.go:179 msgid "Resolved" msgstr "Resolved" diff --git a/service/rpc/auth.go b/service/rpc/auth.go index a99949b790..5826354954 100644 --- a/service/rpc/auth.go +++ b/service/rpc/auth.go @@ -67,9 +67,7 @@ func (a *authHandler) Check(ctx context.Context) (uint64, error) { if err := singleton.DB.Create(&s).Error; err != nil { return 0, status.Error(codes.Unauthenticated, err.Error()) } - s.Host = &model.Host{} - s.State = &model.HostState{} - s.GeoIP = &model.GeoIP{} + model.InitServer(&s) singleton.ServerLock.Lock() singleton.ServerList[s.ID] = &s diff --git a/service/rpc/nezha.go b/service/rpc/nezha.go index 96e1c1c967..9c3e0abace 100644 --- a/service/rpc/nezha.go +++ b/service/rpc/nezha.go @@ -2,6 +2,7 @@ package rpc import ( "context" + "errors" "fmt" "log" "net" @@ -54,7 +55,8 @@ func (s *NezhaHandler) RequestTask(stream pb.NezhaService_RequestTaskServer) err log.Printf("NEZHA>> RequestTask error: %v, clientID: %d\n", err, clientID) return nil } - if result.GetType() == model.TaskTypeCommand { + switch result.GetType() { + case model.TaskTypeCommand: // 处理上报的计划任务 singleton.CronLock.RLock() cr := singleton.Crons[result.GetId()] @@ -78,11 +80,24 @@ func (s *NezhaHandler) RequestTask(stream pb.NezhaService_RequestTaskServer) err LastResult: result.GetSuccessful(), }) } - } else if model.IsServiceSentinelNeeded(result.GetType()) { - singleton.ServiceSentinelShared.Dispatch(singleton.ReportData{ - Data: result, - Reporter: clientID, - }) + case model.TaskTypeReportConfig: + singleton.ServerLock.RLock() + if len(singleton.ServerList[clientID].ConfigCache) < 1 { + if !result.GetSuccessful() { + singleton.ServerList[clientID].ConfigCache <- errors.New(result.Data) + singleton.ServerLock.RUnlock() + continue + } + singleton.ServerList[clientID].ConfigCache <- result.Data + } + singleton.ServerLock.RUnlock() + default: + if model.IsServiceSentinelNeeded(result.GetType()) { + singleton.ServiceSentinelShared.Dispatch(singleton.ReportData{ + Data: result, + Reporter: clientID, + }) + } } } } diff --git a/service/singleton/server.go b/service/singleton/server.go index c6afb32a71..5a731d4132 100644 --- a/service/singleton/server.go +++ b/service/singleton/server.go @@ -31,9 +31,7 @@ func loadServers() { DB.Find(&servers) for _, s := range servers { innerS := s - innerS.Host = &model.Host{} - innerS.State = &model.HostState{} - innerS.GeoIP = new(model.GeoIP) + model.InitServer(&innerS) ServerList[innerS.ID] = &innerS ServerUUIDToID[innerS.UUID] = innerS.ID }