diff --git a/server/common/database.go b/server/common/database.go index 09df25b..540656a 100644 --- a/server/common/database.go +++ b/server/common/database.go @@ -74,7 +74,6 @@ func dbAutoMigrate() { &model.RaspFile{}, &model.RaspErrorLogs{}, &model.HostResource{}, - &model.SystemSetting{}, ) if err != nil { return diff --git a/server/common/init_data.go b/server/common/init_data.go index e56bf84..df04814 100644 --- a/server/common/init_data.go +++ b/server/common/init_data.go @@ -2,7 +2,6 @@ package common import ( "errors" - "reflect" "server/config" "server/model" "server/util" @@ -97,7 +96,6 @@ func InitData() { menuIcon := "menu" roleIcon := "role" userIcon := "user" - settingIcon := "config" menus := []model.Menu{ { @@ -252,72 +250,60 @@ func InitData() { }, { Model: gorm.Model{ID: systemId + 1}, - Name: "Settings", - Title: "系统配置", - Icon: &settingIcon, - Path: "settings", - Component: "/system/settings/index", - Sort: systemId + 1, - ParentId: &systemId, - Roles: roles[:1], - Creator: "系统", - }, - { - Model: gorm.Model{ID: systemId + 2}, Name: "User", Title: "用户管理", Icon: &userIcon, Path: "user", Component: "/system/user/index", - Sort: systemId + 2, + Sort: systemId + 1, ParentId: &systemId, Roles: roles[:1], Creator: "系统", }, { - Model: gorm.Model{ID: systemId + 3}, + Model: gorm.Model{ID: systemId + 2}, Name: "Role", Title: "角色管理", Icon: &roleIcon, Path: "role", Component: "/system/role/index", - Sort: systemId + 3, + Sort: systemId + 2, ParentId: &systemId, Roles: roles[:1], Creator: "系统", }, { - Model: gorm.Model{ID: systemId + 4}, + Model: gorm.Model{ID: systemId + 3}, Name: "Menu", Title: "菜单管理", Icon: &menuIcon, Path: "menu", Component: "/system/menu/index", - Sort: systemId + 4, + Sort: systemId + 3, ParentId: &systemId, Roles: roles[:1], Creator: "系统", }, { - Model: gorm.Model{ID: systemId + 5}, + Model: gorm.Model{ID: systemId + 4}, Name: "Api", Title: "接口管理", Icon: &apiIcon, Path: "api", Component: "/system/api/index", - Sort: systemId + 5, + Sort: systemId + 4, ParentId: &systemId, Roles: roles[:1], Creator: "系统", }, { - Model: gorm.Model{ID: systemId + 6}, + Model: gorm.Model{ID: systemId + 5}, Name: "OperationLog", Title: "操作日志", Icon: &apiLogIcon, Path: "operation-log", Component: "/system/operation-log/index", - Sort: systemId + 6, + Sort: systemId + 5, ParentId: &systemId, Roles: roles[:1], Creator: "系统", @@ -361,28 +347,6 @@ func InitData() { Creator: "系统", Roles: roles[:1], }, - //{ - // Model: gorm.Model{ID: 3}, - // Username: "user", - // Password: util.GenPasswd("123456"), - // Mobile: "13899999999", - // Avatar: "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif", - // Introduction: new(string), - // Status: 1, - // Creator: "系统", - // Roles: roles[1:2], - //}, - //{ - // Model: gorm.Model{ID: 4}, - // Username: "guest", - // Password: util.GenPasswd("123456"), - // Mobile: "13833333333", - // Avatar: "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif", - // Introduction: new(string), - // Status: 1, - // Creator: "系统", - // Roles: roles[1:2], - //}, } for _, user := range users { @@ -947,27 +911,6 @@ func InitData() { Desc: "批量删除rasp日志", Creator: "系统", }, - { - Method: "POST", - Path: "/settings/update", - Category: "settings", - Desc: "更新系统配置", - Creator: "系统", - }, - { - Method: "GET", - Path: "/settings/list", - Category: "settings", - Desc: "获取系统配置", - Creator: "系统", - }, - { - Method: "POST", - Path: "/settings/getProjectInfo", - Category: "settings", - Desc: "获取项目guid", - Creator: "系统", - }, } newApi := make([]model.Api, 0) newRoleCasbin := make([]model.RoleCasbin, 0) @@ -1029,46 +972,4 @@ func InitData() { Log.Errorf("写入casbin数据失败:%v", err) } } - - // 写入系统默认设置 - settings := []model.SystemSetting{ - { - Name: "autoUpdate", - Type: reflect.Bool.String(), - Value: "false", - }, - { - Name: "reportUrl", - Type: reflect.String.String(), - Value: "", - }, - { - Name: "projectGuid", - Type: reflect.String.String(), - Value: "", - }, - { - Name: "updateUrl", - Type: reflect.String.String(), - Value: "ws://security.epoint.com.cn:8024", - }, - { - Name: "projectType", - Type: reflect.String.String(), - Value: "live-project", - }, - } - newSettings := make([]model.SystemSetting, 0) - for i, item := range settings { - item.ID = uint(i + 1) - err := DB.First(&item, item.ID).Error - if errors.Is(err, gorm.ErrRecordNotFound) { - newSettings = append(newSettings, item) - } - } - if len(newSettings) > 0 { - if err := DB.Create(&newSettings).Error; err != nil { - Log.Errorf("写入settings数据失败:%v", err) - } - } } diff --git a/server/common/install_scripts.go b/server/common/install_scripts.go deleted file mode 100644 index 041a4ce..0000000 --- a/server/common/install_scripts.go +++ /dev/null @@ -1,26 +0,0 @@ -package common - -import ( - "os" - "path/filepath" - "server/config" - "strconv" - "strings" -) - -func InitInstallScripts() { - data, err := os.ReadFile(filepath.Join("install", "install-agent-template.sh")) - if err != nil { - Log.Errorf("读取文件: %v 失败", "install-agent-template.sh") - return - } - text := string(data) - text = strings.Replace(text, "{RASP_SERVER_IP}", config.Conf.Env.Ip, 1) - text = strings.Replace(text, "{RASP_SERVER_PORT}", strconv.Itoa(config.Conf.System.Port), 1) - err = os.WriteFile(filepath.Join("install", "install-agent.sh"), []byte(text), 0777) - if err != nil { - Log.Errorf("写入文件: %v 失败", "install-agent.sh") - return - } - Log.Infof("初始化安装脚本成功") -} diff --git a/server/common/logger.go b/server/common/logger.go index 03bf86f..b73078b 100644 --- a/server/common/logger.go +++ b/server/common/logger.go @@ -103,55 +103,3 @@ func InitLogger() { Log = logger.Sugar() Log.Info("初始化zap日志完成!") } - -func InitReportLog() { - now := time.Now() - attackLogFileName := fmt.Sprintf("%s/report-attack/%04d-%02d-%02d.log", config.Conf.Logs.Path, now.Year(), now.Month(), now.Day()) - errorLogFileName := fmt.Sprintf("%s/report-error/%04d-%02d-%02d.log", config.Conf.Logs.Path, now.Year(), now.Month(), now.Day()) - var coreArr []zapcore.Core - - encoderConfig := zapcore.EncoderConfig{ - MessageKey: "msg", - LineEnding: zapcore.DefaultLineEnding, - } - encoder := zapcore.NewConsoleEncoder(encoderConfig) - - // 日志级别 - highPriority := zap.LevelEnablerFunc(func(level zapcore.Level) bool { - return level == zap.ErrorLevel - }) - lowPriority := zap.LevelEnablerFunc(func(level zapcore.Level) bool { - return level == zap.WarnLevel - }) - - // info文件writeSyncer - infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ - Filename: attackLogFileName, //日志文件存放目录,如果文件夹不存在会自动创建 - MaxSize: config.Conf.Logs.MaxSize, //文件大小限制,单位MB - MaxAge: config.Conf.Logs.MaxAge, //日志文件保留天数 - MaxBackups: config.Conf.Logs.MaxBackups, //最大保留日志文件数量 - LocalTime: false, - Compress: config.Conf.Logs.Compress, //是否压缩处理 - }) - // 第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 - infoFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer), lowPriority) - - // error文件writeSyncer - errorFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ - Filename: errorLogFileName, //日志文件存放目录 - MaxSize: config.Conf.Logs.MaxSize, //文件大小限制,单位MB - MaxAge: config.Conf.Logs.MaxAge, //日志文件保留天数 - MaxBackups: config.Conf.Logs.MaxBackups, //最大保留日志文件数量 - LocalTime: false, - Compress: config.Conf.Logs.Compress, //是否压缩处理 - }) - // 第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 - errorFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(errorFileWriteSyncer), highPriority) - - coreArr = append(coreArr, infoFileCore) - coreArr = append(coreArr, errorFileCore) - - logger := zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()) - ReportLog = logger.Sugar() - Log.Info("初始化上报日志完成!") -} diff --git a/server/config/config.go b/server/config/config.go index 3acd311..e89f742 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -110,13 +110,12 @@ type SystemConfig struct { } type LogsConfig struct { - Level zapcore.Level `mapstructure:"level" json:"level"` - Path string `mapstructure:"path" json:"path"` - MaxSize int `mapstructure:"max-size" json:"maxSize"` - MaxBackups int `mapstructure:"max-backups" json:"maxBackups"` - MaxAge int `mapstructure:"max-age" json:"maxAge"` - Compress bool `mapstructure:"compress" json:"compress"` - EnableReportLog bool `mapstructure:"enable-report-log" json:"enableReportLog"` + Level zapcore.Level `mapstructure:"level" json:"level"` + Path string `mapstructure:"path" json:"path"` + MaxSize int `mapstructure:"max-size" json:"maxSize"` + MaxBackups int `mapstructure:"max-backups" json:"maxBackups"` + MaxAge int `mapstructure:"max-age" json:"maxAge"` + Compress bool `mapstructure:"compress" json:"compress"` } type CasbinConfig struct { diff --git a/server/controller/system_setting_controller.go b/server/controller/system_setting_controller.go deleted file mode 100644 index 9787a79..0000000 --- a/server/controller/system_setting_controller.go +++ /dev/null @@ -1,295 +0,0 @@ -package controller - -import ( - "encoding/json" - "errors" - "fmt" - "github.com/fatih/structs" - "github.com/gin-gonic/gin" - "github.com/go-playground/validator/v10" - "github.com/gookit/goutil/fsutil" - "github.com/imroc/req" - "github.com/spf13/viper" - "gopkg.in/yaml.v3" - url2 "net/url" - "os" - "path" - "path/filepath" - "reflect" - "server/common" - "server/config" - "server/model" - "server/report" - "server/repository" - "server/response" - "server/vo" - "strconv" -) - -type ISystemSettingController interface { - Update(c *gin.Context) - List(c *gin.Context) - GetProjectInfo(c *gin.Context) -} - -type SystemSettingController struct { - SystemSettingRepository repository.ISystemSettingRepository -} - -func NewSystemSettingController() ISystemSettingController { - systemSettingController := SystemSettingController{ - SystemSettingRepository: repository.NewSystemSettingRepository(), - } - return systemSettingController -} - -func (this SystemSettingController) Update(c *gin.Context) { - var req vo.UpdateSettingRequest - // 参数绑定 - if err := c.ShouldBind(&req); err != nil { - response.Fail(c, nil, err.Error()) - return - } - // 参数校验 - if err := common.Validate.Struct(&req); err != nil { - errStr := err.(validator.ValidationErrors)[0].Translate(common.Trans) - response.Fail(c, nil, errStr) - return - } - setting, err := this.SystemSettingRepository.GetSettingByName(req.Name) - if err != nil { - response.Fail(c, nil, fmt.Sprintf("更新配置失败, error: %v", err)) - return - } - if setting != nil { - setting.Value = AnyToStr(req.Value) - if err = this.SystemSettingRepository.SaveSetting(setting); err != nil { - response.Fail(c, nil, fmt.Sprintf("更新配置失败, error: %v", err)) - } - // 判断如果是连接更新服务器 - switch setting.Name { - case "autoUpdate": - err = HandleAutoUpdate(setting.Value) - case "reportUrl": - err = HandleReportUrl(setting.Value) - } - if err != nil { - response.Fail(c, nil, fmt.Sprintf("更新配置失败: %v", err.Error())) - return - } - response.Success(c, nil, "更新配置成功") - } else { - response.Fail(c, nil, fmt.Sprintf("未找到配置: %v", req.Name)) - } -} - -func (this SystemSettingController) List(c *gin.Context) { - settings, err := this.SystemSettingRepository.GetSettings() - if err != nil { - response.Fail(c, nil, "获取系统设置列表失败") - return - } - var result = make(map[string]interface{}) - for _, item := range settings { - switch item.Type { - case reflect.String.String(): - result[item.Name] = item.Value - case reflect.Bool.String(): - result[item.Name], _ = strconv.ParseBool(item.Value) - case reflect.Int.String(): - result[item.Name], _ = strconv.Atoi(item.Value) - } - } - response.Success(c, gin.H{ - "list": result, - }, "获取配置列表成功") -} - -func (this SystemSettingController) GetProjectInfo(c *gin.Context) { - var request vo.GetProjectInfoRequest - // 参数绑定 - if err := c.ShouldBind(&request); err != nil { - response.Fail(c, nil, err.Error()) - return - } - // 参数校验 - if err := common.Validate.Struct(&request); err != nil { - errStr := err.(validator.ValidationErrors)[0].Translate(common.Trans) - response.Fail(c, nil, errStr) - return - } - url, err := url2.Parse(request.ReportUrl) - if err != nil { - response.Fail(c, nil, "获取项目guid失败, 请检查reportUrl是否正确: "+err.Error()) - return - } - urlPath := path.Join(url.Path, "rest", "getProjectInfo") - resp, err := req.Get(fmt.Sprintf("%v://%v%v", url.Scheme, url.Host, urlPath)) - if err != nil { - response.Fail(c, nil, "获取项目guid失败, 请检查reportUrl是否正确: "+err.Error()) - return - } - var projectInfo vo.ProjectInfo - err = resp.ToJSON(&projectInfo) - if err != nil { - response.Fail(c, nil, "获取项目guid失败, 请检查reportUrl是否正确: "+err.Error()) - return - } - setting, err := this.SystemSettingRepository.GetSettingByName("projectGuid") - if err != nil { - response.Fail(c, nil, "更新projectGuid配置项失败: "+err.Error()) - return - } - if setting != nil { - setting.Value = projectInfo.ProjectGuid - if err = this.SystemSettingRepository.SaveSetting(setting); err != nil { - response.Fail(c, nil, "更新projectGuid配置项失败: "+err.Error()) - return - } - } - response.Success(c, nil, "获取项目guid成功") -} - -// Strval 获取变量的字符串值 -// 浮点型 3.0将会转换成字符串3, "3" -// 非数值或字符类型的变量将会被转换成JSON格式字符串 -func AnyToStr(value interface{}) string { - var key string - if value == nil { - return key - } - - switch value.(type) { - case float64: - ft := value.(float64) - key = strconv.FormatFloat(ft, 'f', -1, 64) - case float32: - ft := value.(float32) - key = strconv.FormatFloat(float64(ft), 'f', -1, 64) - case int: - it := value.(int) - key = strconv.Itoa(it) - case uint: - it := value.(uint) - key = strconv.Itoa(int(it)) - case int8: - it := value.(int8) - key = strconv.Itoa(int(it)) - case uint8: - it := value.(uint8) - key = strconv.Itoa(int(it)) - case int16: - it := value.(int16) - key = strconv.Itoa(int(it)) - case uint16: - it := value.(uint16) - key = strconv.Itoa(int(it)) - case int32: - it := value.(int32) - key = strconv.Itoa(int(it)) - case uint32: - it := value.(uint32) - key = strconv.Itoa(int(it)) - case int64: - it := value.(int64) - key = strconv.FormatInt(it, 10) - case uint64: - it := value.(uint64) - key = strconv.FormatUint(it, 10) - case string: - key = value.(string) - case []byte: - key = string(value.([]byte)) - default: - newValue, _ := json.Marshal(value) - key = string(newValue) - } - - return key -} - -func HandleAutoUpdate(value string) error { - if value == "false" { - report.UpdateManager.AutoUpdate = false - report.UpdateManager.DisConnect() - } else { - report.UpdateManager.AutoUpdate = true - } - configPath := filepath.Join(config.Conf.Env.WorkDir, "filebeat", "filebeat.yml") - viperConfig, err := readFilebeatConfig(configPath) - if err != nil { - return err - } - var filebeatConfig model.FilebeatConfig - err = viperConfig.Unmarshal(&filebeatConfig) - for index, _ := range filebeatConfig.Filebeat.Inputs { - item := filebeatConfig.Filebeat.Inputs[index] - item.Enabled = report.UpdateManager.AutoUpdate - } - err = writeFilebeatConfig(configPath, structs.Map(filebeatConfig)) - return err -} - -func HandleReportUrl(remoteHost string) error { - url, _ := url2.Parse(remoteHost) - urlPath := path.Join(url.Path, "rest", "exchangedata") - if url.Scheme == "https" { - remoteHost = fmt.Sprintf("%v://%v%v", "https", url.Host, urlPath) - } - if url.Scheme == "http" { - remoteHost = fmt.Sprintf("%v://%v%v", "http", url.Host, urlPath) - } - err := writeFilebeatConfigByKey("output.http.hosts", []string{remoteHost}) - return err -} - -func readFilebeatConfig(fileName string) (*viper.Viper, error) { - // 修改filebeat配置 - if !fsutil.PathExist(fileName) { - return nil, errors.New(fmt.Sprintf("%v does not exists", fileName)) - } - var filebeatConfig = viper.New() - filebeatConfig.SetConfigFile(fileName) - filebeatConfig.SetConfigType("yaml") - if err := filebeatConfig.ReadInConfig(); err != nil { - return nil, errors.New(fmt.Sprintf("Read Filebeat Config File Failed, error: %v", err)) - } - return filebeatConfig, nil -} - -func writeFilebeatConfig(fileName string, setting map[string]interface{}) error { - configData, err := yaml.Marshal(setting) - if err != nil { - return errors.New(fmt.Sprintf("Marshal Filebeat Config File Failed, error: %v", err)) - } - err = os.WriteFile(fileName, configData, 0755) - if err != nil { - return errors.New(fmt.Sprintf("Write Filebeat Config File Failed error: %v", err)) - } - return nil -} - -func writeFilebeatConfigByKey(configName string, configValue interface{}) error { - // 修改filebeat配置 - fileName := filepath.Join(config.Conf.Env.WorkDir, "filebeat", "filebeat.yml") - if !fsutil.PathExist(fileName) { - return errors.New(fmt.Sprintf("%v does not exists", fileName)) - } - var filebeatConfig = viper.New() - filebeatConfig.SetConfigFile(fileName) - filebeatConfig.SetConfigType("yaml") - if err := filebeatConfig.ReadInConfig(); err != nil { - return errors.New(fmt.Sprintf("Read Filebeat Config File Failed, error: %v", err)) - } - filebeatConfig.Set(configName, configValue) - setting := filebeatConfig.AllSettings() - configData, err := yaml.Marshal(setting) - if err != nil { - return errors.New(fmt.Sprintf("Marshal Filebeat Config File Failed, error: %v", err)) - } - err = os.WriteFile(fileName, configData, 0755) - if err != nil { - return errors.New(fmt.Sprintf("Write Filebeat Config File Failed error: %v", err)) - } - return nil -} diff --git a/server/go.mod b/server/go.mod index a724ccc..52f9d4f 100644 --- a/server/go.mod +++ b/server/go.mod @@ -6,7 +6,6 @@ require ( github.com/appleboy/gin-jwt/v2 v2.6.4 github.com/casbin/casbin/v2 v2.22.0 github.com/casbin/gorm-adapter/v3 v3.1.0 - github.com/fatih/structs v1.1.0 github.com/fsnotify/fsnotify v1.6.0 github.com/gin-gonic/gin v1.8.1 github.com/go-playground/locales v0.14.1 @@ -15,7 +14,6 @@ require ( github.com/google/uuid v1.3.0 github.com/gookit/goutil v0.6.8 github.com/h2non/filetype v1.1.3 - github.com/imroc/req v0.3.2 github.com/juju/ratelimit v1.0.1 github.com/mholt/archiver/v4 v4.0.0-alpha.8 github.com/patrickmn/go-cache v2.1.0+incompatible @@ -25,7 +23,6 @@ require ( go.uber.org/zap v1.16.0 golang.org/x/crypto v0.7.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0 - gopkg.in/yaml.v3 v3.0.1 gorm.io/datatypes v1.2.0 gorm.io/driver/sqlite v1.5.0 gorm.io/gorm v1.25.1 @@ -79,7 +76,7 @@ require ( github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/microsoft/go-mssqldb v0.20.0 // indirect - github.com/mitchellh/mapstructure v1.4.1 + github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml v1.8.1 // indirect diff --git a/server/go.sum b/server/go.sum index dbad096..d0ed510 100644 --- a/server/go.sum +++ b/server/go.sum @@ -87,8 +87,6 @@ github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdf github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= @@ -216,8 +214,6 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imroc/req v0.3.2 h1:M/JkeU6RPmX+WYvT2vaaOL0K+q8ufL5LxwvJc4xeB4o= -github.com/imroc/req v0.3.2/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= diff --git a/server/main.go b/server/main.go index 05230d5..0882ad6 100644 --- a/server/main.go +++ b/server/main.go @@ -12,7 +12,6 @@ import ( "server/common" "server/config" "server/middleware" - "server/report" "server/repository" "server/routes" "server/socket" @@ -52,10 +51,6 @@ func main() { // 给客户端发送消息 go socket.WebsocketManager.SendService() - // 检查是否开启远程更新及日志上报 - report.InitUpdateManager() - go report.UpdateManager.Start() - // 注册所有路由 r := routes.InitRoutes() diff --git a/server/model/system_settings.go b/server/model/system_settings.go deleted file mode 100644 index c71230d..0000000 --- a/server/model/system_settings.go +++ /dev/null @@ -1,10 +0,0 @@ -package model - -import "gorm.io/gorm" - -type SystemSetting struct { - gorm.Model - Name string `gorm:"type:varchar(255);index;comment:'参数名称'" json:"name"` - Type string `gorm:"type:varchar(255);index;comment:'参数类型'" json:"type"` - Value string `gorm:"type:varchar(255);index;comment:'参数值'" json:"value"` -} diff --git a/server/report/ws.go b/server/report/ws.go deleted file mode 100644 index b079f83..0000000 --- a/server/report/ws.go +++ /dev/null @@ -1,280 +0,0 @@ -package report - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "github.com/fatih/structs" - "github.com/go-playground/validator/v10" - "github.com/gookit/goutil/fsutil" - "github.com/gorilla/websocket" - "github.com/mitchellh/mapstructure" - url2 "net/url" - "os" - "server/common" - "server/config" - "server/repository" - "server/util" - "strconv" - "strings" - "time" -) - -const WS_URL_FORMAT = "%s://%s/log-collect/ws/%s/%s" - -var UpdateManager *UpdateClient - -type UpdateClient struct { - SystemSettingRepository repository.ISystemSettingRepository - RaspHostRepository repository.IRaspHostRepository - JavaProcessInfoRepository repository.IJavaProcessInfoRepository - RaspFileRepository repository.IRaspFileRepository - RaspModuleRepository repository.IRaspModuleRepository - RaspComponentRepository repository.IRaspComponentRepository - RaspConfigRepository repository.IRaspConfigRepository - RaspConfigHistoryRepository repository.IRaspConfigHistoryRepository - conn *websocket.Conn - err error - AutoUpdate bool - isConnected bool -} - -func InitUpdateManager() { - // 判断bin目录下是否存在server.del文件,如果存在则删除 - exist := fsutil.PathExists(config.Conf.Env.BinFileName + ".del") - if exist { - err := os.Remove(config.Conf.Env.BinFileName + ".del") - if err != nil { - common.Log.Errorf(" delete server.del error: %v", err) - } - } - - SystemSettingRepository := repository.NewSystemSettingRepository() - RaspHostRepository := repository.NewRaspHostRepository() - JavaProcessInfoRepository := repository.NewJavaProcessInfoRepository(RaspHostRepository) - RaspFileRepository := repository.NewRaspFileRepository() - RaspModuleRepository := repository.NewRaspModuleRepository() - RaspComponentRepository := repository.NewRaspComponentRepository() - RaspConfigRepository := repository.NewRaspConfigRepository() - RaspConfigHistoryRepository := repository.NewRaspConfigHistoryRepository() - UpdateManager = &UpdateClient{ - isConnected: false, - AutoUpdate: false, - SystemSettingRepository: SystemSettingRepository, - RaspHostRepository: RaspHostRepository, - JavaProcessInfoRepository: JavaProcessInfoRepository, - RaspFileRepository: RaspFileRepository, - RaspModuleRepository: RaspModuleRepository, - RaspComponentRepository: RaspComponentRepository, - RaspConfigRepository: RaspConfigRepository, - RaspConfigHistoryRepository: RaspConfigHistoryRepository, - } -} - -func (this *UpdateClient) Start() { - autoUpdate, err := this.SystemSettingRepository.GetSettingByName("autoUpdate") - if err != nil { - common.Log.Errorf("获取系统配置%v失败, error: %v", "autoUpdate", err) - return - } - this.AutoUpdate, _ = strconv.ParseBool(autoUpdate.Value) - for { - if this.AutoUpdate && this.isConnected == false { - this.Connect() - } - time.Sleep(time.Second * 10) - } -} - -func (this *UpdateClient) Connect() { - updateUrl, err := this.SystemSettingRepository.GetSettingByName("updateUrl") - if err != nil { - common.Log.Errorf("获取系统配置%v失败, error: %v", "autoUpdate", err) - return - } - url, err := url2.Parse(updateUrl.Value) - if err != nil { - common.Log.Errorf("解析服务器地址%v失败, error: %v", updateUrl.Value, err) - return - } - projectGuid, err := this.SystemSettingRepository.GetSettingByName("projectGuid") - if err != nil { - common.Log.Errorf("获取系统配置%v失败, error: %v", "projectGuid", err) - return - } - Url := fmt.Sprintf(WS_URL_FORMAT, url.Scheme, url.Host, projectGuid.Value, config.Conf.Env.HostName) - // 判断协议是否加密 - var tlsConfig tls.Config - if strings.HasPrefix(Url, "wss://") { - tlsConfig = tls.Config{InsecureSkipVerify: true} - } - dialer := &websocket.Dialer{ - TLSClientConfig: &tlsConfig, - } - this.conn, _, this.err = dialer.Dial(Url, nil) - defer this.DisConnect() - if this.err != nil { - common.Log.Errorf("连接远程更新服务端: %s 错误, error: %v", Url, this.err) - } else { - common.Log.Infof("连接远程更新服务端: %s 成功", Url) - this.isConnected = true - // 连接上远程服务端后立即更新client信息 - updateRequest, err := this.generateUpdateRequest() - if err != nil { - common.Log.Errorf("生成更新服务端数据失败, error: %v", err) - } else { - wsMessageRequest := &WebSocketMessageRequest{ - MessageType: CLIENT_UPDATE, - MessageContent: structs.Map(updateRequest), - } - err = this.conn.WriteJSON(wsMessageRequest) - if err != nil { - common.Log.Errorf("发送json消息失败, error: %v", err) - } - } - // 开启心跳线程 - go this.Heartbeat() - // 读取服务端发过来的信息 - for { - messageType, message, err := this.conn.ReadMessage() - if err != nil { - common.Log.Errorf("读取远程更新服务端信息出错: %v", err) - break - } - if messageType == websocket.TextMessage { - common.Log.Infof("读取远程更新服务端信息成功: \n%v", string(message)) - var webSocketMessage WebSocketMessageRequest - err = json.Unmarshal(message, &webSocketMessage) - if err != nil { - common.Log.Error("反序列化消息失败, %v", err) - continue - } - // 参数校验 - if err = common.Validate.Struct(&webSocketMessage); err != nil { - errStr := err.(validator.ValidationErrors)[0].Translate(common.Trans) - if err != nil { - common.Log.Error("校验数据格式出错 err: %s", errStr) - } - continue - } - switch webSocketMessage.MessageType { - case CLIENT_UPGRADE: - var messageContent ClientUpgradeRequest - err = mapstructure.Decode(webSocketMessage.MessageContent, &messageContent) - if err != nil { - common.Log.Error("反序列化消息失败, %v", err) - break - } - this.handleClientUpgrade(messageContent) - } - } - - } - } -} - -func (this *UpdateClient) Heartbeat() { - for { - if this.conn == nil || this.AutoUpdate == false || this.isConnected == false { - break - } - heartBeatRequest, err := this.generateHeartbeat() - if err != nil { - common.Log.Errorf("生成心跳数据失败, error: %v", err) - } else { - heartMessage := WebSocketMessageRequest{ - MessageType: CLIENT_HEARTBEAT, - MessageContent: structs.Map(heartBeatRequest), - } - err = this.conn.WriteJSON(heartMessage) - if err != nil { - common.Log.Errorf("发送心跳数据失败, error: %v", err) - break - } - } - time.Sleep(time.Second * 180) - } -} - -func (this *UpdateClient) generateUpdateRequest() (*ServerUpdateRequest, error) { - projectType, err := this.SystemSettingRepository.GetSettingByName("projectType") - if err != nil { - common.Log.Errorf("获取系统配置%v失败, error: %v", "projectType", err) - return nil, err - } - updateRequest := &ServerUpdateRequest{ - GroupType: projectType.Value, - Ip: config.Conf.Env.Ip, - ExeFileHash: config.Conf.Env.BinFileHash, - OsType: config.Conf.Env.OsType, - } - return updateRequest, nil -} - -func (this *UpdateClient) generateHeartbeat() (*ServerHeartRequest, error) { - // 生成时间 - location := time.FixedZone("CST", 8*3600) - t := time.Now().In(location) - now := t.Format("2006-01-02 15:04:05.000") - // 构造host list - var agentInfoList = []AgentInfo{} - hostList, _, err := this.RaspHostRepository.GetRaspHostList() - if err != nil { - common.Log.Errorf("获取Agent列表失败, error: %v", err) - return nil, err - } - for _, item := range hostList { - var agentInfo AgentInfo - agentInfo.HostName = item.HostName - agentInfo.Ip = item.Ip - agentInfo.AgentMode = item.AgentMode - agentInfo.CreateTime = item.CreatedAt.Format("2006-01-02 15:04:05.000") - agentInfo.HeartbeatTime = item.HeartbeatTime - agentInfo.Version = item.Version - agentInfo.ExeFileHash = item.ExeFileHash - agentInfo.OsType = item.OsType - agentInfo.SuccessInject = item.SuccessInject - agentInfo.FailedInject = item.FailedInject - agentInfo.NotInject = item.NotInject - var processInfo = []JavaProcessInfo{} - procList, err := this.JavaProcessInfoRepository.GetAllJavaProcessInfos(item.HostName) - if err != nil { - common.Log.Errorf("获取java进程失败, error: %v", err) - return nil, err - } - for _, proc := range procList { - var process JavaProcessInfo - util.Struct2Struct(proc, &process) - processInfo = append(processInfo, process) - } - agentInfo.ProcessInfo = processInfo - agentInfoList = append(agentInfoList, agentInfo) - } - - serverInfo := ServerInfo{ - HostName: config.Conf.Env.HostName, - Ip: config.Conf.Env.Ip, - Time: now, - List: agentInfoList, - } - - heartRequest := &ServerHeartRequest{ - HeartBeatTime: now, - LogName: "heart", - LogType: "rasp", - Version: "v2", - LogContent: serverInfo, - } - return heartRequest, nil -} - -func (this *UpdateClient) DisConnect() { - if this.conn != nil { - err := this.conn.Close() - if err != nil { - common.Log.Errorf("关闭服务端连接失败, error: %v", err) - } - this.conn = nil - } - this.isConnected = false -} diff --git a/server/report/ws_message_handle.go b/server/report/ws_message_handle.go deleted file mode 100644 index b9dd6ce..0000000 --- a/server/report/ws_message_handle.go +++ /dev/null @@ -1,435 +0,0 @@ -package report - -import ( - "archive/zip" - "encoding/json" - "fmt" - "github.com/fatih/structs" - "github.com/go-playground/validator/v10" - "github.com/gookit/goutil/fsutil" - "github.com/imroc/req" - "io" - "os" - "path" - "path/filepath" - "runtime" - "server/common" - "server/config" - "server/model" - "server/util" -) - -func (this *UpdateClient) handleClientUpgrade(messageContent ClientUpgradeRequest) { - // 参数校验 - if err := common.Validate.Struct(&messageContent); err != nil { - errStr := err.(validator.ValidationErrors)[0].Translate(common.Trans) - if err != nil { - common.Log.Error("校验数据格式出错 err: %s", errStr) - } - return - } - switch messageContent.Type { - case "config": - this.upgradeConfig(messageContent) - case "server": - success := this.upgradeServer(messageContent) - if success { - os.Exit(0) // 进程退出 - } - default: - } -} - -func (this *UpdateClient) upgradeConfig(messageContent ClientUpgradeRequest) { - defer func() { - upgradeResult := WebSocketMessageRequest{ - MessageType: CLIENT_UPGRADE_RESULT, - MessageContent: structs.Map(messageContent), - } - err := this.conn.WriteJSON(upgradeResult) - if err != nil { - common.Log.Errorf("发送心跳数据失败, error: %v", err) - } - }() - - resp, err := req.Get(messageContent.DownloadUrl) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - downPath := filepath.Join(config.Conf.Env.WorkDir, "tmp") - if !fsutil.PathExists(downPath) { - err = os.MkdirAll(downPath, 0755) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - } - newFilePath := filepath.Join(downPath, "config.zip") - err = resp.ToFile(newFilePath) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - newMd5, err := util.GetFileMd5(newFilePath) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - if newMd5 != messageContent.Md5 { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", "校验md5失败") - return - } - - // 开始更新通用防护策略 - r, err := zip.OpenReader(newFilePath) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - // 读取config.json配置文件并反序列化 - configHandler, err := r.Open("config.json") - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", "读取config.json失败") - return - } - jsonData, err := io.ReadAll(configHandler) - configHandler.Close() - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", "读取config.json失败") - return - } - var exportConfig model.RaspExportConfig - err = json.Unmarshal(jsonData, &exportConfig) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", "反序列化配置失败") - return - } - // 写入file信息 - for _, item := range exportConfig.RaspFileInfo { - fileInfo, err := this.RaspFileRepository.GetRaspFileByHash(item.FileHash) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - // 如果文件不存在则写入 - if fileInfo == nil { - fileHandler, err := r.Open(path.Join("file", item.FileName)) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return - } - data, _ := io.ReadAll(fileHandler) - actualHash, err := util.GetMd5FromBytes(data) - if actualHash != item.FileHash { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("校验文件hash失败, actual hash:%v, expect hash: %v", actualHash, item.FileHash) - return - } - // hash校验成功 - uploadDir := path.Dir(item.DiskPath) - if !fsutil.PathExist(uploadDir) { - err = os.MkdirAll(uploadDir, 0755) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("创建上传目录失败, %v", err) - return - } - } - fileHandler.Close() - err = os.WriteFile(item.DiskPath, data, 0755) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("写入文件记录失败, %v", err) - return - } - // 构建表file记录 - raspFile := &model.RaspFile{ - Timestamp: item.Timestamp, - FileName: item.FileName, - FileHash: item.FileHash, - DiskPath: item.DiskPath, - DownLoadUrl: item.DownLoadUrl, - MimeType: item.MimeType, - Creator: "system", - } - err = this.RaspFileRepository.CreateRaspFile(raspFile) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("创建文件记录失败, %v", err) - return - } - } else { - common.Log.Debugf("文件: %v 已存在, 跳过导入", item.FileName) - } - } - // 写入module信息 - for _, item := range exportConfig.RaspModuleInfo { - moduleInfo, err := this.RaspModuleRepository.GetRaspModuleByName(item.ModuleName) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("查询module信息失败, %v", err) - return - } - // 如果模块名不存在则直接创建 - if moduleInfo == nil { - raspModule := &model.RaspModule{ - RowGuid: item.RowGuid, - ModuleName: item.ModuleName, - ModuleVersion: item.ModuleVersion, - Desc: item.Desc, - Parameters: item.Parameters, - Upgradable: item.Upgradable, - Creator: "system", - Operator: "system", - } - err = this.RaspModuleRepository.CreateRaspModule(raspModule) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("新建module记录失败, %v", err) - return - } - } else { - // 如果模块名存在则替换版本、描述、默认用户参数 - moduleInfo.RowGuid = item.RowGuid - moduleInfo.ModuleName = item.ModuleName - moduleInfo.ModuleVersion = item.ModuleVersion - moduleInfo.Desc = item.Desc - moduleInfo.Parameters = item.Parameters - moduleInfo.Upgradable = item.Upgradable - moduleInfo.Creator = "system" - moduleInfo.Operator = "system" - err = this.RaspModuleRepository.UpdateRaspModule(moduleInfo) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新module信息失败, %v", err) - return - } - } - } - // 写入component信息 - for _, item := range exportConfig.RaspComponentInfo { - componentInfo, err := this.RaspComponentRepository.GetRaspComponentsByGuidAndName(item.ParentGuid, item.ComponentName) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("查询component信息失败, %v", err) - return - } - if componentInfo == nil { - raspComponent := &model.RaspComponent{ - ParentGuid: item.ParentGuid, - ComponentName: item.ComponentName, - ComponentType: item.ComponentType, - ComponentVersion: item.ComponentVersion, - DownLoadURL: item.DownLoadURL, - Md5: item.Md5, - Parameters: item.Parameters, - } - err = this.RaspComponentRepository.CreateRaspComponent(raspComponent) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("新建component记录失败, %v", err) - return - } - } else { - componentInfo.ParentGuid = item.ParentGuid - componentInfo.ComponentName = item.ComponentName - componentInfo.ComponentType = item.ComponentType - componentInfo.ComponentVersion = item.ComponentVersion - componentInfo.DownLoadURL = item.DownLoadURL - componentInfo.Md5 = item.Md5 - componentInfo.Parameters = item.Parameters - err = this.RaspComponentRepository.UpdateRaspComponent(componentInfo) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新module信息失败, %v", err) - return - } - } - } - // 写入config信息 - configInfo, err := this.RaspConfigRepository.GetRaspConfigByName(exportConfig.RaspConfigInfo.Name) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("查询config信息失败, %v", err) - return - } - if configInfo == nil { - raspConfig := &model.RaspConfig{ - RowGuid: exportConfig.RaspConfigInfo.RowGuid, - Name: exportConfig.RaspConfigInfo.Name, - Version: 1, - Desc: exportConfig.RaspConfigInfo.Desc, - Status: exportConfig.RaspConfigInfo.Status, - Creator: "system", - Operator: "system", - IsDefault: exportConfig.RaspConfigInfo.IsDefault, - } - err = this.RaspConfigRepository.CreateRaspConfig(raspConfig) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("创建config信息失败, %v", err) - return - } - // 写入历史版本信息 - raspConfigHistory := &model.RaspConfigHistory{ - ParentGuid: raspConfig.RowGuid, - Version: 1, - AgentMode: exportConfig.RaspConfigHistoryInfo.AgentMode, - ModuleConfigs: exportConfig.RaspConfigHistoryInfo.ModuleConfigs, - LogPath: exportConfig.RaspConfigHistoryInfo.LogPath, - AgentConfigs: exportConfig.RaspConfigHistoryInfo.AgentConfigs, - RaspBinInfo: exportConfig.RaspConfigHistoryInfo.RaspBinInfo, - RaspLibInfo: exportConfig.RaspConfigHistoryInfo.RaspLibInfo, - Desc: exportConfig.RaspConfigHistoryInfo.Desc, - Source: "导入版本", - } - err = this.RaspConfigHistoryRepository.CreateRaspConfigHistory(raspConfigHistory) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("创建config版本信息失败, %v", err) - return - } - } else { - configInfo.Name = exportConfig.RaspConfigInfo.Name - configInfo.Version += 1 - configInfo.Desc = exportConfig.RaspConfigInfo.Desc - configInfo.Status = exportConfig.RaspConfigInfo.Status - configInfo.Creator = "system" - configInfo.Operator = "system" - configInfo.IsDefault = exportConfig.RaspConfigInfo.IsDefault - err = this.RaspConfigRepository.UpdateRaspConfig(configInfo) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新config信息失败, %v", err) - return - } - // 写入历史版本信息 - raspConfigHistory := &model.RaspConfigHistory{ - ParentGuid: configInfo.RowGuid, - Version: configInfo.Version, - AgentMode: exportConfig.RaspConfigHistoryInfo.AgentMode, - ModuleConfigs: exportConfig.RaspConfigHistoryInfo.ModuleConfigs, - LogPath: exportConfig.RaspConfigHistoryInfo.LogPath, - AgentConfigs: exportConfig.RaspConfigHistoryInfo.AgentConfigs, - RaspBinInfo: exportConfig.RaspConfigHistoryInfo.RaspBinInfo, - RaspLibInfo: exportConfig.RaspConfigHistoryInfo.RaspLibInfo, - Desc: exportConfig.RaspConfigHistoryInfo.Desc, - Source: "导入版本", - } - err = this.RaspConfigHistoryRepository.CreateRaspConfigHistory(raspConfigHistory) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("创建config版本信息失败, %v", err) - return - } - } - // 更新成功 - messageContent.State = 1 - messageContent.Message = "更新成功" - return -} - -func (this *UpdateClient) upgradeServer(messageContent ClientUpgradeRequest) bool { - defer func() { - upgradeResult := WebSocketMessageRequest{ - MessageType: CLIENT_UPGRADE_RESULT, - MessageContent: structs.Map(messageContent), - } - err := this.conn.WriteJSON(upgradeResult) - if err != nil { - common.Log.Errorf("发送心跳数据失败, error: %v", err) - } - }() - - resp, err := req.Get(messageContent.DownloadUrl) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } - downPath := filepath.Join(config.Conf.Env.WorkDir, "tmp") - if !fsutil.PathExists(downPath) { - err = os.MkdirAll(downPath, 0755) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } - } - newFilePath := filepath.Join(downPath, "server.zip") - err = resp.ToFile(newFilePath) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } - newMd5, err := util.GetFileMd5(newFilePath) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } - if newMd5 != messageContent.Md5 { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", "校验md5失败") - return false - } - // 开始更新 - data, err := util.ReadFileFromZipByPath(newFilePath, path.Join(runtime.GOOS, runtime.GOARCH, config.Conf.Env.BinFileName)) - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } - // 兼容windows环境下直接写daemon导致文件被占用的错误,应该先把运行中的daemon重命名为临时文件,再将新的文件覆盖 - err = os.Rename(config.Conf.Env.BinFileName, config.Conf.Env.BinFileName+".del") - if err != nil { - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } - err = os.WriteFile(config.Conf.Env.BinFileName, data, 0777) - if err != nil { - common.Log.Errorf("replace server error: %v", err) - messageContent.State = 2 - messageContent.Message = fmt.Sprintf("更新失败, error: %v", err) - return false - } else { - common.Log.Infof("update server file success, process will exit...") - this.clean(newFilePath) - exist := fsutil.PathExists(config.Conf.Env.BinFileName) - if exist { - // 更新成功 - messageContent.State = 1 - messageContent.Message = "更新成功" - return true - } else { - common.Log.Error("server 文件不存在") - messageContent.State = 2 - messageContent.Message = "server 文件不存在" - return false - } - } -} - -func (this *UpdateClient) clean(filePath string) { - exists := fsutil.PathExists(filePath) - if exists { - err := os.Remove(filePath) - if err != nil { - common.Log.Errorf("delete file error: %v", err) - } - } -} diff --git a/server/report/ws_request_model.go b/server/report/ws_request_model.go deleted file mode 100644 index 02d2ca0..0000000 --- a/server/report/ws_request_model.go +++ /dev/null @@ -1,70 +0,0 @@ -package report - -const ( - CLIENT_UPDATE int = 1 - CLIENT_HEARTBEAT int = 2 - CLIENT_UPGRADE int = 3 - CLIENT_UPGRADE_RESULT int = 4 -) - -type WebSocketMessageRequest struct { - MessageType int `json:"messageType"` - MessageContent map[string]interface{} `json:"messageContent"` -} - -type ServerUpdateRequest struct { - GroupType string `json:"groupType"` - Ip string `json:"ip"` - ExeFileHash string `json:"exeFileHash"` - OsType string `json:"osType"` -} - -type ServerHeartRequest struct { - HeartBeatTime string `json:"heartBeatTime"` - LogName string `json:"logName"` - LogType string `json:"logType"` - Version string `json:"version"` - LogContent ServerInfo `json:"logContent"` -} - -type ServerInfo struct { - HostName string `json:"hostname" structs:"hostname"` - Ip string `json:"ip" structs:"ip"` - Time string `json:"time" structs:"time"` - List []AgentInfo `json:"list" structs:"list"` -} - -type AgentInfo struct { - HostName string `json:"hostName" structs:"hostName"` - Ip string `json:"ip" structs:"ip"` - AgentMode string `json:"agentMode" structs:"agentMode"` - CreateTime string `json:"createTime" structs:"createTime"` - HeartbeatTime string `json:"heartbeatTime" structs:"heartbeatTime"` - Version string `json:"version" structs:"version"` - ExeFileHash string `json:"exeFileHash" structs:"exeFileHash"` - OsType string `json:"osType" structs:"osType"` - SuccessInject int64 `json:"successInject" structs:"successInject"` - FailedInject int64 `json:"failedInject" structs:"failedInject"` - NotInject int64 `json:"notInject" structs:"notInject"` - ProcessInfo []JavaProcessInfo `json:"processInfo" structs:"processInfo"` -} - -type JavaProcessInfo struct { - CmdlineInfo string `json:"cmdlineInfo" structs:"cmdlineInfo"` - AppNamesInfo string `json:"appNamesInfo" structs:"appNamesInfo"` - StartTime string `json:"startTime" structs:"startTime"` - Pid int `json:"pid" structs:"pid"` - Status int `json:"status" structs:"status"` - Message string `json:"message" structs:"message"` -} - -type ClientUpgradeRequest struct { - BatchGuid string `json:"batchGuid" structs:"batchGuid"` - ProjectGuid string `json:"projectGuid" structs:"projectGuid"` - HostName string `json:"hostName" structs:"hostName"` - DownloadUrl string `json:"downloadUrl" structs:"downloadUrl"` - Md5 string `json:"md5" structs:"md5"` - Type string `json:"type" structs:"type"` - State int `json:"state" structs:"state"` - Message string `json:"message" structs:"message"` -} diff --git a/server/repository/system_setting_repository.go b/server/repository/system_setting_repository.go deleted file mode 100644 index 955a41f..0000000 --- a/server/repository/system_setting_repository.go +++ /dev/null @@ -1,68 +0,0 @@ -package repository - -import ( - "errors" - "gorm.io/gorm" - "server/common" - "server/model" -) - -type ISystemSettingRepository interface { - CreateSetting(setting *model.SystemSetting) error - DeleteSettingByName(name string) error - SaveSetting(setting *model.SystemSetting) error - GetSettingByName(name string) (*model.SystemSetting, error) - GetSettings() ([]*model.SystemSetting, error) - SetSetting(name string, value string) error -} - -type SystemSettingRepository struct { -} - -func NewSystemSettingRepository() ISystemSettingRepository { - return SystemSettingRepository{} -} - -func (this SystemSettingRepository) CreateSetting(setting *model.SystemSetting) error { - err := common.DB.Create(setting).Error - return err -} - -func (this SystemSettingRepository) DeleteSettingByName(name string) error { - err := common.DB.Where("name = ?", name).Unscoped().Delete(&model.SystemSetting{}).Error - return err -} - -func (this SystemSettingRepository) SaveSetting(setting *model.SystemSetting) error { - err := common.DB.Save(setting).Error - return err -} - -func (this SystemSettingRepository) GetSettingByName(name string) (*model.SystemSetting, error) { - var record *model.SystemSetting - err := common.DB.Where("name = ?", name).First(&record).Error - if err == gorm.ErrRecordNotFound { - return nil, nil - } - return record, err -} - -func (this SystemSettingRepository) GetSettings() ([]*model.SystemSetting, error) { - var list []*model.SystemSetting - db := common.DB.Model(&model.SystemSetting{}).Order("created_at DESC") - err := db.Find(&list).Error - return list, err -} - -func (this SystemSettingRepository) SetSetting(name string, value string) error { - setting, err := this.GetSettingByName(name) - if err != nil { - return err - } - if setting == nil { - return errors.New("未找到配置: " + name) - } - setting.Value = value - err = this.SaveSetting(setting) - return err -} diff --git a/server/routes/routes.go b/server/routes/routes.go index 97eed20..0b95b37 100644 --- a/server/routes/routes.go +++ b/server/routes/routes.go @@ -70,7 +70,6 @@ func InitRoutes() *gin.Engine { InitRaspAttackRoutes(apiGroup, authMiddleware) InitFileUploadRoutes(apiGroup, authMiddleware) InitRaspLogRoutes(apiGroup, authMiddleware) - InitSystemSettingRoutes(apiGroup, authMiddleware) // 注册静态资源路由 InitStaticRouter(apiGroup, r) common.Log.Info("初始化路由完成!") diff --git a/server/routes/system_settings_routes.go b/server/routes/system_settings_routes.go deleted file mode 100644 index b38bde8..0000000 --- a/server/routes/system_settings_routes.go +++ /dev/null @@ -1,23 +0,0 @@ -package routes - -import ( - jwt "github.com/appleboy/gin-jwt/v2" - "github.com/gin-gonic/gin" - "server/controller" - "server/middleware" -) - -func InitSystemSettingRoutes(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) gin.IRoutes { - settingController := controller.NewSystemSettingController() - router := r.Group("/settings") - // 开启jwt认证中间件 - router.Use(authMiddleware.MiddlewareFunc()) - // 开启casbin鉴权中间件 - router.Use(middleware.CasbinMiddleware()) - { - router.POST("/update", settingController.Update) - router.GET("/list", settingController.List) - router.POST("/getProjectInfo", settingController.GetProjectInfo) - } - return r -} diff --git a/server/socket/udpserver.go b/server/socket/udpserver.go deleted file mode 100644 index b3addea..0000000 --- a/server/socket/udpserver.go +++ /dev/null @@ -1,86 +0,0 @@ -package socket - -import ( - "bytes" - "fmt" - "net" - "server/common" - "server/config" - "server/util" - "strings" - "time" -) - -type UDPServer struct { - conn *net.UDPConn - udpAddr *net.UDPAddr - err error -} - -func NewUDPServer() *UDPServer { - udpAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:8080") - if err != nil { - common.Log.Errorf("resolve udp address error %v", err.Error()) - return nil - } - return &UDPServer{ - udpAddr: udpAddr, - } -} - -func (c *UDPServer) Start() { - c.conn, c.err = net.ListenUDP("udp", c.udpAddr) - if c.err != nil { - common.Log.Errorf("bind udp port error: %v", c.err) - return - } - for { - buf := make([]byte, 2048) - length, addr, err := c.conn.ReadFromUDP(buf[:]) // 读取数据,返回值依次为读取数据长度、远端地址、错误信息 // 读取操作会阻塞直至有数据可读取 - if err != nil { - if strings.Index(err.Error(), "use of closed network connection") < 0 { - common.Log.Errorf("read udp data error: %v", err.Error()) - } - continue - } - data := buf[:length] - scannedPack := new(Package) - err = scannedPack.Unpack(bytes.NewReader(data)) - if err != nil { - common.Log.Errorf("unpack udp data error: %v", err.Error()) - continue - } - if scannedPack.Type == SEARCH_SERVER { - receivedMessage := string(scannedPack.Body) - common.Log.Infof("received udp data from remote: %v, message: %v", addr, receivedMessage) - dstAddr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%v:%v", addr.IP, 8080)) - if err != nil { - continue - } - conn, err := net.DialUDP("udp", nil, dstAddr) - sendMessage := fmt.Sprintf("%v://%v:%v/%v", - util.Ternary(config.Conf.Ssl.Enable, "wss", "ws"), - util.GetDefaultIp(), - config.Conf.System.Port, - config.Conf.System.UrlPathPrefix) - pack := &Package{ - Magic: MagicBytes, - Version: PROTOCOL_VERSION, - Type: UPDATE_SERVER, - BodySize: int32(len(sendMessage)), - TimeStamp: time.Now().Unix(), - Signature: EmptySignature, - Body: []byte((sendMessage)), - } - sendBuf := bytes.NewBuffer(nil) - err = pack.Pack(sendBuf) - if err != nil { - continue - } - _, err = conn.Write(sendBuf.Bytes()) - if err != nil { - continue - } - } - } -} diff --git a/server/vo/system_setting_request.go b/server/vo/system_setting_request.go deleted file mode 100644 index 507dc95..0000000 --- a/server/vo/system_setting_request.go +++ /dev/null @@ -1,14 +0,0 @@ -package vo - -type UpdateSettingRequest struct { - Name string `json:"name" validate:"required"` - Value interface{} `json:"value" validate:"required"` -} - -type GetProjectInfoRequest struct { - ReportUrl string `json:"reportUrl" validate:"required"` -} - -type ProjectInfo struct { - ProjectGuid string `json:"projectGuid"` -} diff --git a/ui/src/api/system/settings.js b/ui/src/api/system/settings.js deleted file mode 100644 index 32e9a3e..0000000 --- a/ui/src/api/system/settings.js +++ /dev/null @@ -1,24 +0,0 @@ -import request from '@/utils/request' - -export function updateSetting(name, value) { - return request({ - url: '/settings/update', - method: 'post', - data: { name: name, value: value } - }) -} - -export function getSettings() { - return request({ - url: '/settings/list', - method: 'get' - }) -} - -export function getProjectGuid(params) { - return request({ - url: '/settings/getProjectInfo', - method: 'post', - data: params - }) -} diff --git a/ui/src/views/system/settings/index.vue b/ui/src/views/system/settings/index.vue deleted file mode 100644 index d119120..0000000 --- a/ui/src/views/system/settings/index.vue +++ /dev/null @@ -1,175 +0,0 @@ - - - - -