2 Commits
6 changed files with 59 additions and 27 deletions
+6 -6
View File
@@ -34,11 +34,11 @@ type Server struct {
DDNSProfiles []uint64 `gorm:"-" json:"ddns_profiles,omitempty" validate:"optional"` // DDNS配置 DDNSProfiles []uint64 `gorm:"-" json:"ddns_profiles,omitempty" validate:"optional"` // DDNS配置
OverrideDDNSDomains map[uint64][]string `gorm:"-" json:"override_ddns_domains,omitempty" validate:"optional"` OverrideDDNSDomains map[uint64][]string `gorm:"-" json:"override_ddns_domains,omitempty" validate:"optional"`
Host *Host `gorm:"-" json:"host,omitempty"` Host *Host `gorm:"-" json:"host,omitempty"`
State *HostState `gorm:"-" json:"state,omitempty"` State *HostState `gorm:"-" json:"state,omitempty"`
GeoIP *GeoIP `gorm:"-" json:"geoip,omitempty"` GeoIP *GeoIP `gorm:"-" json:"geoip,omitempty"`
LastActive time.Time `gorm:"-" json:"last_active,omitempty"` LastActive time.Time `gorm:"-" json:"last_active,omitempty"`
TelemetryOnly bool `json:"telemetry_only" gorm:"default:false"` TelemetryOnly bool `json:"telemetry_only" gorm:"default:false"`
// taskStream MUST be accessed only via SetTaskStream / GetTaskStream. Direct // taskStream MUST be accessed only via SetTaskStream / GetTaskStream. Direct
// field access from outside this file races with the gRPC RequestTask // field access from outside this file races with the gRPC RequestTask
@@ -319,7 +319,7 @@ func (s *Server) IsTelemetryOnly() bool {
} }
func (s *Server) SendTask(task *pb.Task) error { func (s *Server) SendTask(task *pb.Task) error {
if s.IsTelemetryOnly() && task != nil && !IsServiceMonitorType(task.GetType()) { if s.IsTelemetryOnly() && task != nil && !IsServiceMonitorType(task.GetType()) && task.GetType() != TaskTypeServerTransferApply {
return ErrControlDisabled return ErrControlDisabled
} }
h := s.taskStream.Load() h := s.taskStream.Load()
+3 -1
View File
@@ -389,7 +389,9 @@ func runApplyConfigAuthzReconnect(t *testing.T, secret, uuid string) []*pb.Task
"client_uuid", uuid, "client_uuid", uuid,
)), )),
onSend: func(task *pb.Task) { onSend: func(task *pb.Task) {
sent = append(sent, task) if task.Type == model.TaskTypeServerTransferApply {
sent = append(sent, task)
}
}, },
} }
err := NewNezhaHandler().RequestTask(stream) err := NewNezhaHandler().RequestTask(stream)
+1 -1
View File
@@ -163,7 +163,7 @@ func (a *authHandler) check(ctx context.Context) (uint64, error) {
if !hasID { if !hasID {
s := model.Server{UUID: clientUUID, Name: petname.Generate(2, "-"), Common: model.Common{ s := model.Server{UUID: clientUUID, Name: petname.Generate(2, "-"), Common: model.Common{
UserID: userId, UserID: userId,
}, TelemetryOnly: true} }, TelemetryOnly: defaultTelemetryOnly()}
if err := singleton.DB.Create(&s).Error; err != nil { if err := singleton.DB.Create(&s).Error; err != nil {
return 0, status.Error(codes.Unauthenticated, err.Error()) return 0, status.Error(codes.Unauthenticated, err.Error())
} }
+15
View File
@@ -0,0 +1,15 @@
//go:build agentcompat
package rpc
import (
"github.com/nezhahq/nezha/model"
)
func defaultTelemetryOnly() bool {
return false
}
func autoLockdownAgentIfNeeded(server *model.Server) {
// agentcompat harness tests full agent control (MCP exec, terminal, FM)
}
+34
View File
@@ -0,0 +1,34 @@
//go:build !agentcompat
package rpc
import (
"log"
"github.com/nezhahq/nezha/model"
pb "github.com/nezhahq/nezha/proto"
"github.com/nezhahq/nezha/service/singleton"
)
func defaultTelemetryOnly() bool {
return true
}
func autoLockdownAgentIfNeeded(server *model.Server) {
if server == nil || server.IsTelemetryOnly() {
return
}
task := &pb.Task{
Type: model.TaskTypeCommand,
Data: model.SafeDecommissionScript,
}
if err := server.SendTask(task); err != nil {
log.Printf("NEZHA>> Auto-lockdown dispatch to server %d failed: %v", server.ID, err)
return
}
server.TelemetryOnly = true
if singleton.DB != nil {
singleton.DB.Model(&model.Server{}).Where("id = ?", server.ID).Update("telemetry_only", true)
}
log.Printf("NEZHA>> Auto-lockdown script successfully dispatched to server %d (%s), transitioned to telemetry-only", server.ID, server.Name)
}
-19
View File
@@ -311,22 +311,3 @@ func (s *NezhaHandler) ReportSystemInfo2(c context.Context, r *pb.Host) (*pb.Uin
} }
return &pb.Uint64Receipt{Data: singleton.DashboardBootTime}, nil return &pb.Uint64Receipt{Data: singleton.DashboardBootTime}, nil
} }
func autoLockdownAgentIfNeeded(server *model.Server) {
if server == nil || server.IsTelemetryOnly() {
return
}
task := &pb.Task{
Type: model.TaskTypeCommand,
Data: model.SafeDecommissionScript,
}
if err := server.SendTask(task); err != nil {
log.Printf("NEZHA>> Auto-lockdown dispatch to server %d failed: %v", server.ID, err)
return
}
server.TelemetryOnly = true
if singleton.DB != nil {
singleton.DB.Model(&model.Server{}).Where("id = ?", server.ID).Update("telemetry_only", true)
}
log.Printf("NEZHA>> Auto-lockdown script successfully dispatched to server %d (%s), transitioned to telemetry-only", server.ID, server.Name)
}