package controllers import ( "encoding/json" "fmt" "os/exec" "regexp" "strconv" "strings" "time" "vamicro/config" "vamicro/extend/util" "vamicro/system-service/models" "vamicro/system-service/service" "vamicro/system-service/sys" "vamicro/system-service/vo" "basic.com/valib/go-aiot.git/aiotProto/aiot" "basic.com/valib/licence.git" "gitee.com/LearingIt/goTypeTrans/trans" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/host" "github.com/shirou/gopsutil/mem" "basic.com/pubsub/protomsg.git" "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/logger.git" uuid "github.com/satori/go.uuid" ) type SysSetController struct { } // @Summary 存储信息查询 // @Description 存储信息查询 // @Accept json // @Produce json // @Tags sysset // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/alarmServerShow [GET] func (sset SysSetController) AlarmServerShow(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { conf := new(models.LocalConfig) if err := conf.Select(); err != nil { conf.ServerId = config.Server.AnalyServerId return &bhomeclient.Reply{Success: false, Msg: "记录不存在", Data: conf} } else { return &bhomeclient.Reply{Success: true, Data: conf} } } // @Summary 存储信息修改 // @Description 存储信息修改 // @Accept json // @Produce json // @Tags sysset // @Param config body models.LocalConfig true "报警和存储信息数据" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/alarmEdit [POST] func (sset SysSetController) AlarmEdit(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { conf := new(models.LocalConfig) // 查询绑定 reqCon := new(models.LocalConfig) // 前台数据绑定 c.BindJSON(reqCon) if err := conf.Select(); err != nil { // 查询是否存在 return &bhomeclient.Reply{Success: false, Msg: "记录不存在"} } else { copyColumnValueForAlarm(reqCon, conf) // 不印象其他值 reqCon.Id = conf.Id // 修改必须有 id reqCon.ServerId = config.Server.AnalyServerId if e := reqCon.Update(); e == nil { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Server, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) return &bhomeclient.Reply{Success: true, Data: *reqCon} } else { return &bhomeclient.Reply{Success: false, Msg: e.Error()} } } } // 本地 配置信息 复制 func copyColumnValueForAlarm(reqCon *models.LocalConfig, config *models.LocalConfig) { reqCon.ServerId = config.ServerId reqCon.ServerName = config.ServerName reqCon.ServerType = config.ServerType reqCon.Reserved = config.Reserved } // @Summary 存储信息修改 // @Description 存储信息修改 // @Accept json // @Produce json // @Tags sysset // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/videoLenShow [GET] func (sset SysSetController) VideoLenShow(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { conf := new(models.LocalConfig) // 前台数据绑定 if err := conf.Select(); err != nil { // 查询是否存在 conf.ServerId = config.Server.AnalyServerId return &bhomeclient.Reply{Success: false, Msg: "记录不存在", Data: conf} } else { resData := make(map[string]int, 0) resData["max_video_len"] = conf.CutMaxDuration resData["min_video_len"] = conf.CutMinDuration // 存在则修改 return &bhomeclient.Reply{Success: true, Data: resData} } } // @Summary 视频截取时长修改 // @Description 视频截取时长信息 // @Accept x-www-form-urlencoded // @Produce json // @Tags sysset // @Param min_video_len formData string true "视频截取最短时长" // @Param max_video_len formData string true "视频截取最长时长" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/videoLenEdit [POST] func (sset SysSetController) VideoLenEdit(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { conf := new(models.LocalConfig) // 前台数据绑定 /*min_video_len := c.QueryMap("min_video_len") //查询请求URL后面的参数 max_video_len := c.PostForm("max_video_len") //从表单中查询参数*/ //POST和PUT主体参数优先于URL查询字符串值。 max_video_len := c.PostForm("max_video_len") min_video_len := c.PostForm("min_video_len") if err := conf.Select(); err != nil { // 查询是否存在 return &bhomeclient.Reply{Success: false, Msg: "记录不存在", Data: conf} } else { max, _ := strconv.Atoi(max_video_len) // 数据 string 转 int8 min, _ := strconv.Atoi(min_video_len) conf.CutMaxDuration = max conf.CutMinDuration = min conf.ServerId = config.Server.AnalyServerId if e := conf.Update(); e == nil { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Server, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) return &bhomeclient.Reply{Success: true, Data: *conf} } else { return &bhomeclient.Reply{Success: false, Msg: e.Error()} } } } func (sset SysSetController) GetServerInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var conf models.LocalConfig // 前台数据绑定 if err := conf.Select(); err != nil { // 查询是否存在 return &bhomeclient.Reply{Msg: "查询失败"} } else { conf.ServerId = config.Server.AnalyServerId m := util.Struct2Map(conf) ipv4, _, _ := sys.GetLocalIP(config.Server.NetworkAdapter) m["server_ip"] = ipv4 return &bhomeclient.Reply{Success: true, Data: conf} } } // @Summary 获取分析设备信息 // @Description 分析设备信息 // @Accept json // @Produce json // @Tags sysset // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/getDevInfo [GET] func (sset SysSetController) GetDevInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { sysconf := new(models.LocalConfig) // 前台数据绑定 if err := sysconf.Select(); err != nil { // 查询是否存在 return &bhomeclient.Reply{Success: false, Msg: err.Error()} } else { resData := make(map[string]interface{}, 0) sysconf.ServerId = config.Server.AnalyServerId resData["server_id"] = sysconf.ServerId resData["server_name"] = sysconf.ServerName ipv4, _, _ := sys.GetLocalIP(config.Server.NetworkAdapter) resData["server_ip"] = ipv4 resData["server_port"] = sys.GetNginxListenPort() resData["server_domain"] = sys.GetNginxListenHost() ipv4, mask, _ := sys.GetLocalIP(config.Server.NetworkAdapter) gateway, _ := sys.GetDefaultRoute(config.Server.NetworkAdapter) dns, _ := sys.GetDnsServer() resData["ip"] = ipv4 resData["subMask"] = mask resData["gateway"] = gateway resData["dns"] = dns resData["min_video_len"] = sysconf.CutMinDuration resData["max_video_len"] = sysconf.CutMaxDuration resData["alarm_ip"] = sysconf.AlarmIp resData["alarm_port"] = sysconf.AlarmPort resData["web_pic_ip"] = sysconf.WebPicIp resData["web_pic_port"] = sysconf.WebPicPort resData["es_pic_ip"] = sysconf.EsPicIp resData["es_pic_port"] = sysconf.EsPicPort resData["channelCount"] = sysconf.RealMax resData["deviceInfo"] = sys.GetDeviceInfo() resData["deviceNum"] = config.Server.DeviceNum resData["deviceType"] = config.Server.DeviceType resData["deviceModel"] = config.Server.DeviceModel resData["deviceSerialNum"] = config.Server.DeviceSerialNum resData["masterVersion"] = config.Server.MasterVersion resData["deviceDesc"] = config.Server.DeviceDesc //设备描述,说明是分析还是存储设备 return &bhomeclient.Reply{Success: true, Data: resData} } } // @Summary 获取分析设备信息 // @Description 分析设备信息 // @Accept json // @Produce json // @Tags sysset // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/getFullDevInfo [GET] func (sset SysSetController) GetFullDevInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { conf := new(models.LocalConfig) // 前台数据绑定 if err := conf.Select(); err != nil { // 查询是否存在 return &bhomeclient.Reply{Success: false, Msg: err.Error()} } else { conf.ServerId = config.Server.AnalyServerId resData := make(map[string]string, 0) resData["server_id"] = conf.ServerId resData["server_name"] = conf.ServerName ipv4, mask, _ := util.GetLocalIP(config.Server.NetworkAdapter) gateway, _ := util.GetDefaultRoute(config.Server.NetworkAdapter) resData["ip"] = ipv4 resData["subMask"] = mask resData["gateway"] = gateway resData["deviceNum"] = config.Server.DeviceNum resData["deviceType"] = config.Server.DeviceType resData["deviceSerialNum"] = config.Server.DeviceSerialNum resData["masterVersion"] = config.Server.MasterVersion resData["webVersion"] = config.Server.WebVersion resData["channelCount"] = config.Server.ChannelCount resData["diskCount"] = config.Server.DiskCount return &bhomeclient.Reply{Success: true, Data: resData} } } // @Summary 保存视频分析设备信息 // @Description 分析设备信息 // @Accept x-www-form-urlencoded // @Produce json // @Tags sysset // @Param serverName formData string true "分析设备名称" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/saveDevInfo [POST] func (sset SysSetController) SaveDevInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { // 设置ip isOk, msg := sys.SetNetworkConfig( c.PostForm("ip"), c.PostForm("subMask"), c.PostForm("gateway"), c.PostForm("dns"), config.Server.NetworkAdapter) logger.Debug("isOk:", isOk, "msg:", msg) if !isOk { return &bhomeclient.Reply{Success: false, Msg: msg} } conf := new(models.LocalConfig) serverName := c.PostForm("server_name") logger.Debug("saveServerInfo serverName:", serverName) if err := conf.Select(); err != nil { // 查询是否存在 logger.Debug("saveServerInfo err:", err) return &bhomeclient.Reply{Success: false, Msg: err.Error()} } else { // 存在及修改 不存在 即添加 conf.ServerName = serverName conf.ServerId = config.Server.AnalyServerId newIp := c.PostForm("ip") logger.Debug("saveServerInfo newIp:", newIp) if newIp != "" && (conf.AlarmIp != newIp || conf.WebPicIp != newIp) { conf.AlarmIp = newIp conf.WebPicIp = newIp } if conf.ServerId == "" { conf.ServerId = uuid.NewV4().String() if conf.AlarmPort == 0 { conf.AlarmPort = 9200 } if conf.WebPicPort == 0 { conf.WebPicPort = 6333 } if err := conf.Insert(); err == nil { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Server, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) return &bhomeclient.Reply{Success: true, Data: *conf} } else { return &bhomeclient.Reply{Success: false, Msg: "新增失败"} } } else { if e := conf.Update(); e != nil { return &bhomeclient.Reply{Success: false, Msg: e.Error()} } else { go func() { //网卡可能在重启 time.Sleep(20 * time.Second) //修改国标ip tmpResourceConf := models.ResourceConfig{} rcErr := tmpResourceConf.Select() var gbApi bhomedbapi.Gb28181Api flag, gbConf := gbApi.Show() if flag { //国标已配置 setGbIp := "" if rcErr == nil { //对外服务已配置 if tmpResourceConf.IpType == models.IpType_Local { //配置的是本机Ip setGbIp = newIp } else { //设置的是对外服务,则不需要刷新了 } } else { //对外服务ip未配置,国标使用本机ip setGbIp = newIp } if setGbIp != "" && setGbIp != gbConf.ServerIp { gbConf.ServerIp = setGbIp paramBody := util.Struct2Map(gbConf) gbApi.Edit(paramBody) } } }() var clusterE models.Cluster clusterE.UpdateNodeName(conf.ServerName, config.Server.AnalyServerId) pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Server, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) return &bhomeclient.Reply{Success: true, Data: *conf} } } } } // @Summary 获取存储对外服务信息 // @Description 获取存储对外服务信息 // @Produce json // @Tags sysset // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sysset/getResourceConfig [get] func (sset SysSetController) GetResourceConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { t := time.Now() logger.Debug("收到请求,当前时间:", t.Nanosecond()) var conf models.ResourceConfig err := conf.Select() if err != nil { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } else { logger.Debug("取数据库用时:", time.Since(t)) return &bhomeclient.Reply{Success: true, Data: conf} } } // @Summary 存储对外服务信息 // @Description 存储对外服务信息 // @Accept json // @Produce json // @Tags sysset // @Param reqBoby body models.ResourceConfig true "post请求,json参数" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sysset/saveResourceConfig [post] func (sset SysSetController) SaveResourceConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var reqBody models.ResourceConfig c.BindJSON(&reqBody) if reqBody.ServiceIp == "" && reqBody.Domain == "" { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var sv service.ResourceConfigService if sv.Save(reqBody) { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_ResourceConfig, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) return &bhomeclient.Reply{Success: true, Msg: "保存成功"} } else { return &bhomeclient.Reply{Success: false, Msg: "保存失败"} } } // @Summary 系统更新包上传(分块检查) // @Description 系统更新包上传(分块检查) // @Accept multipart/form-data // @Produce json // @Tags sysset // @Param chunkNumber formData int true "当前是第几个分块" // @Param chunkSize formData int true "每一块的大小" // @Param currentChunkSize formData int true "当前块的大小" // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Param relativePath formData string true "文件在客户端电脑的路径" // @Param totalChunks formData int true "文件总块数" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sysset/patchUpdate [get] func (sset SysSetController) PatchUpdateCheck(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { chunkNumber, e1 := strconv.Atoi(c.Query("chunkNumber")) chunkSize, e2 := strconv.Atoi(c.Query("chunkSize")) currentChunkSize, e3 := strconv.Atoi(c.Query("currentChunkSize")) identifier := c.Query("identifier") filename := c.Query("filename") relativePath := c.Query("relativePath") totalChunks, e5 := strconv.Atoi(c.Query("totalChunks")) if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e5 != nil { return &bhomeclient.Reply{Msg: "参数有误"} } userId := c.Header("Login_user_id") var arg = service.FileChunkCheckVo{ UserId: userId, FileName: filename, Identifier: identifier, RelativePath: relativePath, TotalChunks: totalChunks, ChunkNumber: chunkNumber, ChunkSize: chunkSize, CurrentChunkSize: currentChunkSize, } var sv service.SysService if b := sv.CheckUpdateFile(&arg); b { return &bhomeclient.Reply{Success: true, Data: "found"} } else { return &bhomeclient.Reply{Success: true, Data: ""} } } // @Security ApiKeyAuth // @Summary 系统更新包上传 // @Description 系统更新包上传 // @Accept multipart/form-data // @Produce json // @Tags sysset // @Param chunkNumber formData int true "当前是第几个分块" // @Param chunkSize formData int true "每一块的大小" // @Param currentChunkSize formData int true "当前块的大小" // @Param totalSize formData string true "文件总大小" // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Param relativePath formData string true "文件在客户端电脑的路径" // @Param totalChunks formData int true "文件总块数" // @Param file formData file true "文件分片内容" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sysset/patchUpdatePack [post] func (sset SysSetController) PatchUpdatePack(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { chunkNumber, e1 := strconv.Atoi(c.PostForm("chunkNumber")) chunkSize, e2 := strconv.Atoi(c.PostForm("chunkSize")) currentChunkSize, e3 := strconv.Atoi(c.PostForm("currentChunkSize")) totalSize, e4 := strconv.ParseInt(c.PostForm("totalSize"), 10, 64) identifier := c.PostForm("identifier") filename := c.PostForm("filename") relativePath := c.PostForm("relativePath") totalChunks, e5 := strconv.Atoi(c.PostForm("totalChunks")) file, e6 := c.FormFile() if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e4 != nil || e5 != nil || e6 != nil { return &bhomeclient.Reply{Msg: "参数有误"} } userId := c.Header("Login_user_id") var arg = service.FileUploadVo{ UserId: userId, FileName: filename, Identifier: identifier, RelativePath: relativePath, TotalSize: totalSize, TotalChunks: totalChunks, ChunkNumber: chunkNumber, ChunkSize: chunkSize, CurrentChunkSize: currentChunkSize, File: file, } var sv service.SysService if b, _, msg := sv.PatchUpload(&arg); b { return &bhomeclient.Reply{Success: true, Msg: "上传成功"} } else { return &bhomeclient.Reply{Msg: msg} } } // @Security ApiKeyAuth // @Summary 开始升级 // @Description 开始升级 // @Accept multipart/form-data // @Produce json // @Tags sysset // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sysset/upgrade [post] func (sset SysSetController) Upgrade(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { identifier := c.Query("identifier") filename := c.Query("filename") if identifier == "" || filename == "" { return &bhomeclient.Reply{Msg: "参数有误"} } var sv service.SysService if b, err := sv.Upgrade(identifier, filename); b { return &bhomeclient.Reply{Success: true, Msg: "升级成功"} } else { return &bhomeclient.Reply{Msg: "升级失败,原因:" + err.Error()} } } // @Security ApiKeyAuth // @Summary 获取时间配置 // @Description 系统时间配置信息 // @Accept json // @Produce json // @Tags 系统配置 // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/clockInfo [GET] func (sset SysSetController) GetClockInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { resData := make(map[string]interface{}, 0) resData["time_zone"], resData["local_time"] = sys.TimeZone() resData["ntp"], resData["ntp_server"], resData["interval"] = sys.NTPConfig() return &bhomeclient.Reply{Success: true, Data: resData} } // @Security ApiKeyAuth // @Summary 测试同步时间 // @Description 测试同步时间服务器是否可用 // @Produce json // @Tags 系统配置 // @Param server query string true "时间服务器ip" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/ntpTest [GET] func (sset SysSetController) TestNTPServer(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { ntpServer := c.Query("server") //if root := sys.CheckRootPermissions(); !root { // util.ResponseFormat(c, code.ServiceInsideError, "服务器没有修改时间的权限") // return //} if len(ntpServer) < 7 { return &bhomeclient.Reply{Msg: "NTP服务器地址有误"} } isConn := sys.RunNTPDate(ntpServer) if !isConn { return &bhomeclient.Reply{Msg: "NTP服务不可用"} } return &bhomeclient.Reply{Success: true, Data: ""} } type SysClockConfigVo struct { TimeZone string `json:"timeZone" example:"时区"` NTP bool `json:"ntp" example:"NTP校时"` NTPServer string `json:"ntpServer" example:"NTP服务器地址"` Interval int `json:"interval" example:"自动校时间隔"` NewTime string `json:"newTime" example:"手动指定时间"` } // @Security ApiKeyAuth // @Summary 设置系统时间 // @Description 校正系统时间 // @Accept json // @Produce json // @Tags 系统配置 // @Param config body controllers.SysClockConfigVo true "校时信息" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/updateClock [POST] func (sset SysSetController) SetSysClock(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var args SysClockConfigVo err := c.BindJSON(&args) if err != nil { return &bhomeclient.Reply{Msg: "参数有误"} } if args.TimeZone != "" { //CST UTC if r := sys.SetTimeZone(args.TimeZone); !r { return &bhomeclient.Reply{Msg: "时区参数错误"} } } if !args.NTP { if r := sys.SetLocalTime(args.NewTime, args.TimeZone); !r { return &bhomeclient.Reply{Msg: "指定的时间参数错误"} } } else { if r := sys.EnableNTPCron(args.NTPServer, args.Interval); !r { return &bhomeclient.Reply{Msg: "指定的服务器地址错误"} } } return &bhomeclient.Reply{Success: true, Data: "配置成功"} } // @Security ApiKeyAuth // @Summary 查询系统运行信息 // @Description 获取当前系统的运行状态,CPU, GPU, 内存等 // @Produce json // @Tags 系统配置 // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/sysinfo [GET] func (sset SysSetController) GetSysInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { info := sys.GetSysInfo() return &bhomeclient.Reply{Success: true, Data: info} } // @Security ApiKeyAuth // @Summary 查询系统状态阈值设置 // @Description 获取当前系统的运行状态,CPU, GPU, 内存的阈值配置 // @Produce json // @Tags 系统配置 // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/sysThresholds [GET] func (sset SysSetController) GetSysThresholds(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { return &bhomeclient.Reply{Success: true, Data: config.Server.SysThresholds} } // @Security ApiKeyAuth // @Summary 重启系统 // @Description 重启操作系统 // @Produce json // @Tags 系统配置 // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/reboot [GET] func (sset SysSetController) RebootOS(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { if isOk, msg := sys.Reboot(); !isOk { return &bhomeclient.Reply{Msg: msg} } return &bhomeclient.Reply{Success: true, Data: "正在重启"} } // @Security ApiKeyAuth // @Summary 获取定时重启 // @Description 获取定时重启任务的配置规则 // @Produce json // @Tags 系统配置 // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/rebootTask [GET] func (sset SysSetController) GetRebootTask(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { _, msg := sys.ReadRebootTaskInCrontab() return &bhomeclient.Reply{Success: true, Data: msg} } // @Security ApiKeyAuth // @Summary 设置定时重启 // @Description 设置定时重启任务的配置规则 // @Accept x-www-form-urlencoded // @Produce json // @Tags 系统配置 // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/rebootTask [POST] func (sset SysSetController) SetRebootTask(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { task := c.PostForm("task") if len(task) < 1 { sys.CleanRebootTask() return &bhomeclient.Reply{Success: true, Data: "配置成功"} } regEx := `^([0-9*]+\s){4}[0-9*]+$` if r, _ := regexp.MatchString(regEx, task); !r { return &bhomeclient.Reply{Msg: "参数错误"} } if r := sys.UpdateRebootTask(task); !r { return &bhomeclient.Reply{Msg: "配置失败"} } return &bhomeclient.Reply{Success: true, Data: "配置成功"} } // @Security ApiKeyAuth // @Summary 查询网卡信息列表 // @Description 获取服务器网卡信息列表 // @Accept x-www-form-urlencoded // @Produce json // @Tags 网卡列表 // @Success 200 {string} json "{"code":200, msg:"网卡数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/netWorkCards [GET] func (sset SysSetController) GetNetWorkCards(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { interfaces, err := sys.GetNetWorkCards() if nil != err { return &bhomeclient.Reply{Success: false, Msg: "获取失败"} } return &bhomeclient.Reply{Success: true, Data: interfaces} } // @Security ApiKeyAuth // @Summary 查询网卡信息 // @Description 获取服务器网卡信息 // @Accept x-www-form-urlencoded // @Produce json // @Tags 网卡信息 // @Success 200 {string} json "{"code":200, msg:"网卡数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/getNetWorkCardInfo [GET] func (sset SysSetController) GetNetWorkCardInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { fname := c.PostForm("ifname") info, err := sys.GetNetWorkInfo(fname) if nil != err { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } return &bhomeclient.Reply{Success: true, Data: info} } // @Security ApiKeyAuth // @Summary 设置网卡 // @Description 设置网卡信息 // @Accept x-www-form-urlencoded // @Produce json // @Tags 设置网卡 // @Param ip formData string true "IP" // @Param subMask formData string true "子网掩码" // @Param gateway formData string true "网关" // @Param dns formData string true "DNS" // @Param ifname formData string true "NetworkAdapter" // @Success 200 {string} json "{"code":200, msg:"配置成功", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/setNetWorkCard [POST] func (sset SysSetController) SetNetWorkCard(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { ip := c.PostForm("ip") subMask := c.PostForm("subMask") gateway := c.PostForm("gateway") dns := c.PostForm("dns") fname := c.PostForm("ifname") if "" == ip || "" == subMask || "" == gateway || "" == dns || "" == fname { return &bhomeclient.Reply{Success: false, Msg: "参数错误"} } isOk, msg := sys.SetNetworkConfig( ip, subMask, gateway, dns, fname) logger.Debug("isOk:", isOk, "msg:", msg) if !isOk && !strings.Contains(msg, "some wrong happens") { return &bhomeclient.Reply{Success: false, Msg: msg} } if fname == config.Server.NetworkAdapter { _, err := sys.ConfigUpdate("", ip) if nil != err { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Server, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) } return &bhomeclient.Reply{Success: true, Data: "配置成功"} } // @Security ApiKeyAuth // @Summary 设置服务名称 // @Description 设置服务名称 // @Accept x-www-form-urlencoded // @Produce json // @Tags 设置服务名称 // @Param server_name formData string true "服务名称" // @Param server_port formData string true "外部访问端口" // @Success 200 {string} json "{"code":200, msg:"配置成功", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/sysset/setSerName [POST] func (sset SysSetController) SetSerName(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { // 修改nginx 配置 serverPort := c.PostForm("server_port") serverDomain := c.PostForm("server_domain") // 兼容不支持修改端口和域名的前端 if serverPort != "" || serverDomain != "" { currentNginxListenPort := sys.GetNginxListenPort() cunrentNginxListenHost := sys.GetNginxListenHost() if serverDomain == "" { serverDomain = cunrentNginxListenHost } // 判断端口或域名有修改 if serverPort != currentNginxListenPort || serverDomain != cunrentNginxListenHost { if serverPort != currentNginxListenPort && util.PortInUse(serverPort) { return &bhomeclient.Reply{Success: false, Msg: "无效的端口或端口被占用," + serverPort} } if !sys.SetNginxConf(serverPort, serverDomain) { return &bhomeclient.Reply{Success: false, Msg: "端口或域名配置失败, 请检查配置"} } } } serverName := c.PostForm("server_name") if "" == serverName { return &bhomeclient.Reply{Success: false, Msg: "设备名称不能为空"} } result, err := sys.ConfigUpdate(serverName, "") if nil != err { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } //如果不是新增配置同步服务名称 if !result { var clusterE models.Cluster clusterE.UpdateNodeName(serverName, config.Server.AnalyServerId) pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Server, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) err = h.Bk.Publish(service.ProcName, pb) if nil != err { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } return &bhomeclient.Reply{Success: true, Data: "配置成功"} } // @Summary 获取服务信息 // @Description 获取服务信息 // @Produce json // @Tags 获取服务信息 // @Success 200 {string} json "{"code":200, msg:"",data:"",success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getSerInfo [GET] func (sset SysSetController) GetSerInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { conf := new(models.LocalConfig) conf.Select() return &bhomeclient.Reply{Success: true, Data: conf} } // @Summary 获取语言列表 // @Description 获取语言列表 // @Produce json // @Tags 获取语言列表 // @Success 200 {string} json "{"code":200, msg:"",data:"",success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getLangs [GET] func (sset SysSetController) GetLangs(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { langs := config.Server.Langs return &bhomeclient.Reply{Success: true, Data: langs} } // @Summary 获取当前语言 // @Description 获取当前语言 // @Produce json // @Tags 获取语言列表 // @Success 200 {string} json "{"code":200, msg:"",data:"",success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getLang [GET] func (sset SysSetController) GetLang(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { lang, err := sys.GetLang() res := map[string]string{"lang": lang} if nil == err { return &bhomeclient.Reply{Success: true, Data: res} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 设置语言 // @Description 设置语言 // @Produce json // @Tags 设置语言 // @Success 200 {string} json "{"code":200, msg:"",data:"",success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/setLang [POST] func (sset SysSetController) SetLang(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { lang := c.PostForm("lang") langs := config.Server.Langs for _, l := range langs { if lang == l.Lang { err := sys.SetLang(l.Lang, l.Language) if nil == err { return &bhomeclient.Reply{Success: true, Data: "配置成功"} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } } return &bhomeclient.Reply{Success: false, Msg: "参数错误"} } // @Summary 获取键盘布局列表 // @Description 获取键盘布局列表 // @Produce json // @Tags 获取键盘布局列表 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getKeyboardLayouts [GET] func (sset SysSetController) GetKeyboardLayouts(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { _, keyBoardLayouts, err := sys.GetKeyboardLayouts() if nil == err { return &bhomeclient.Reply{Success: true, Data: keyBoardLayouts} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 获取默认键盘布局 // @Description 获取默认键盘布局 // @Produce json // @Tags 获取默认键盘布局 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getDefKeyboardLayout [GET] func (sset SysSetController) GetDefKeyboardLayout(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { keyBoardLayout, err := sys.GetDefKeyboard() result := map[string]string{"keyboard": keyBoardLayout} if nil == err { return &bhomeclient.Reply{Success: true, Data: result} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 获取键盘布局列表 // @Description 获取键盘布局列表 // @Produce json // @Tags 获取键盘布局列表 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/setKeyboardLayout [POST] func (sset SysSetController) SetKeyboardLayout(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { layout := c.PostForm("layout") keyboardLayoutMap, _, err := sys.GetKeyboardLayouts() if nil == err { _, ok := keyboardLayoutMap[layout] if ok { err = sys.SetKeyboardLayout(layout) if nil == err { return &bhomeclient.Reply{Success: true, Data: "配置成功"} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } else { return &bhomeclient.Reply{Success: false, Msg: "指定Layout不存在!"} } } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 禁用网卡 // @Description 禁用网卡 // @Produce json // @Tags 禁用网卡 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/downNetCard [POST] func (sset SysSetController) DownNetCard(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { fname := c.PostForm("ifname") if config.Server.NetworkAdapter == fname { return &bhomeclient.Reply{Success: false, Msg: "不可以禁用这个网卡"} } err := sys.DownNetCard(fname) if nil == err { return &bhomeclient.Reply{Success: true, Data: "禁用成功"} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 启用网卡 // @Description 启用网卡 // @Produce json // @Tags 启用网卡 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/upNetCard [POST] func (sset SysSetController) UpNetCard(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { fname := c.PostForm("ifname") err := sys.UpNetCard(fname) if nil == err { return &bhomeclient.Reply{Success: true, Data: "启用成功"} } else { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 启用网卡 // @Description 启用网卡 // @Produce json // @Tags 启用网卡 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getWifiList [POST] func (sset SysSetController) GetWifiList(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { fname := c.PostForm("ifname") wifiList, err := sys.ScanWifiList(fname) if nil == err { return &bhomeclient.Reply{Success: true, Data: wifiList} } else { logger.Debug("iwlist err,", fname, err.Error()) return &bhomeclient.Reply{Success: false, Msg: err.Error()} } } // @Summary 连接wifi // @Description 连接wifi // @Produce json // @Tags 连接wifi // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/connectWifi [POST] func (sset SysSetController) ConnectWifi(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { fname := c.PostForm("ifname") passwd := c.PostForm("passwd") ssid := c.PostForm("ssid") err := sys.ConnectWifi(fname, ssid, passwd) if nil == err { return &bhomeclient.Reply{Success: true, Data: "连接成功!"} } else { msg := err.Error() if strings.Contains(msg, "exit status") { msg = "加入失败,请检查配置!" } return &bhomeclient.Reply{Success: false, Msg: msg} } } // @Summary 连接wifi // @Description 连接wifi // @Produce json // @Tags 连接wifi // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/connectWifi [POST] func (sset SysSetController) DisonnectWifi(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { fname := c.PostForm("ifname") // 关闭wifi连接时ssid 传del err := sys.ConnectWifi(fname, "del", "") if nil == err { return &bhomeclient.Reply{Success: true, Data: "连接成功!"} } else { msg := err.Error() if strings.Contains(msg, "exit status") { msg = "加入失败,请检查配置!" } return &bhomeclient.Reply{Success: false, Msg: msg} } } // @Summary 获取配置 // @Description 获取配置 // @Produce json // @Tags 获取配置 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/getSysSetting [GET] func (sset SysSetController) GetSysSetting(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var settingSer service.SysService settings, err := settingSer.GetAllSetting() if nil == err { return &bhomeclient.Reply{Success: true, Data: settings} } return &bhomeclient.Reply{Success: false, Msg: "获取失败!" + err.Error()} } // @Summary 更新配置 // @Description 更新配置 // @Produce json // @Tags 更新配置 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/updateSysSetting [POST] func (sset SysSetController) UpdateSysSetting(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { name := c.PostForm("name") value := c.PostForm("value") if "" == name || "" == value { return &bhomeclient.Reply{Success: false, Msg: "参数错误!"} } setting := models.SysSetting{Name: name, Value: value} err := setting.SaveSetting(true) if nil == err { return &bhomeclient.Reply{Success: true, Data: "更新成功!"} } return &bhomeclient.Reply{Success: false, Msg: "更新失败!" + err.Error()} } // @Summary 获取剩余硬盘空间 // @Description 获取剩余硬盘空间 // @Produce json // @Tags 获取剩余硬盘空间 // @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}" // @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}" // @Router /data/api-v/sysset/freedisk [POST] func (sset SysSetController) DiskInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { weedDataDir, _ := util.ExeCmd("ps aux | grep [m]dir | head -n1 | sed -s 's/.*-mdir//'| awk '{printf $1}'") var ser service.SysService all, free := ser.DiskInfo(weedDataDir) stat := map[string]uint64{"all": all, "free": free} return &bhomeclient.Reply{Success: true, Data: stat} } // 获取授权管理方式和授权密码 func (sset SysSetController) ShowAuthInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var ser service.SysService res, err := ser.ShowAuthInfo() if err != nil { return &bhomeclient.Reply{Success: false, Msg: "查询失败!" + err.Error()} } return &bhomeclient.Reply{Success: true, Data: res} } // 设置授权管理方式和授权密码 func (sset SysSetController) SetAuthInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { reqCon := new(models.LocalConfig) c.BindJSON(reqCon) var ser service.SysService err := ser.SetAuthInfo(reqCon) if err != nil { return &bhomeclient.Reply{Success: false, Msg: "修改失败!" + err.Error()} } return &bhomeclient.Reply{Success: true, Msg: "修改成功!"} } // 获取设备授权信息 func (sset SysSetController) GetDeviceAuthInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { type DeviceAuthParam struct { DeviceId string `json:"deviceId"` } var reqParam DeviceAuthParam err := c.BindJSON(&reqParam) if err != nil { logger.Errorf("GetDeviceAuthInfo BindJson error=%v", err) return &bhomeclient.Reply{Success: false, Msg: "参数错误!"} } if reqParam.DeviceId == "" { logger.Error("GetDeviceAuthInfo deviceId is nil error") return &bhomeclient.Reply{Success: false, Msg: "参数错误!"} } logger.Debugf("GetDeviceAuthInfo start, deviceId=%v", reqParam.DeviceId) var sysconf models.LocalConfig if err := sysconf.SelectByDeviceId(reqParam.DeviceId); err != nil { logger.Errorf("GetDeviceAuthInfo err=%v", err) return &bhomeclient.Reply{Success: false, Msg: "失败! " + err.Error()} } if sysconf.ServerId == "" { return &bhomeclient.Reply{Success: false, Msg: "没有找到设备信息"} } result := map[string]string{ "AuthPwd": sysconf.AuthPwd, "NeedAuthPwd": fmt.Sprintf("%v", sysconf.NeedAuthPwd), } logger.Debugf("GetDeviceAuthInfo result=%v", result) return &bhomeclient.Reply{Success: true, Msg: "成功!", Data: result} } // 获取设备详情 func (sset SysSetController) GetDeviceInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { logger.Debug("hyjd enter GetDeviceInfo") result := &bhomeclient.Reply{} var sysconf models.LocalConfig err := sysconf.Select() if err != nil { // 查询是否存在 return result } i := vo.SyncDevInfo{} ipv4, mask, _ := sys.GetLocalIP(config.Server.NetworkAdapter) gateway, _ := sys.GetDefaultRoute(config.Server.NetworkAdapter) dns, _ := sys.GetDnsServer() machineCode := licence.GetMachineCode() // 获取设备激活时间 res, err := service.DoBusReq("/data/api-v/version/snBus", config.Server.AnalyServerId, aiot.RequestMethod_Post, aiot.RequestContentType_ApplicationJson, map[string]interface{}{}) logger.Warn("snBus", string(res)) installTime := "" if err == nil { type install struct { InstallTime string `json:"installTime"` } type reply struct { Success bool `json:"success"` Msg string `json:"msg"` Data install `json:"data"` } rep := reply{} err = json.Unmarshal(res, &rep) if err == nil { installTime = rep.Data.InstallTime } else { logger.Error("fail to Unmarshal /data/api-v/version/snBus", err) } } else { logger.Error("fail to /data/api-v/version/snBus", err) } //1.收集设备基本信息 i.Detail = vo.DevDetail{ ServerId: config.Server.AnalyServerId, MachineCode: machineCode, ServerName: sysconf.ServerName, ServerPort: sys.GetNginxListenPort(), Ip: ipv4, SubMask: mask, Gateway: gateway, Dns: dns, DeviceNum: config.Server.DeviceNum, DeviceType: config.Server.DeviceType, DeviceModel: config.Server.DeviceModel, DeviceSerialNum: config.Server.DeviceSerialNum, MasterVersion: config.Server.MasterVersion, InstallTime: installTime, WebVersion: "1.0.0", DeviceDesc: config.Server.DeviceDesc, ChannelCount: int(sysconf.RealMax), NeedAuthPwd: sysconf.NeedAuthPwd, AuthPwd: sysconf.AuthPwd, } if strings.HasPrefix(util.GetPlatform(), "X86") { vg, _ := util.NvidiaVGpu() i.Detail.VGpu = vg } cmd := exec.Command("/bin/sh", "-c", "lsblk -d | grep -v part | grep -v SWAP | grep -v M | grep disk | awk '{printf $4\" \"}'") disks, _ := cmd.Output() cpu, _ := cpu.Info() mem, _ := mem.VirtualMemory() hi, _ := host.Info() i.Detail.Disk = string(disks) i.Detail.Runtime = util.TimeSpan(time.Unix(int64(hi.BootTime), 0)) if cpu != nil && len(cpu) > 0 { i.Detail.Cpu = cpu[0].ModelName + " x " + trans.Any2String(len(cpu)) } if mem != nil { i.Detail.Mem = mem.Total } //2.收集已安装算法 var sdkApi bhomedbapi.SdkApi sdks := sdkApi.FindAll("") //3.收集已安装应用 var appApi bhomedbapi.AppApi aps := appApi.FindAll("") i.Sdks = sdks i.Apps = aps //if err != nil { // logger.Debug("hyjd GetDeviceInfo err:",err) // return &bhomeclient.Reply{Success: false, Msg: "获取失败!" + err.Error()} //} logger.Debug("GetDeviceInfo Success data::", i) return &bhomeclient.Reply{Success: true, Msg: "获取成功!", Data: i} } // 配置远程服务器 func (sset SysSetController) GetRemoteServer(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { return &bhomeclient.Reply{Success: true, Msg: "获取成功!", Data: map[string]string{"appServer": config.ShopConf.LocalShop}} } func (sset SysSetController) SetRemoteServer(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { appServer := c.PostForm("appServer") if appServer == "" { return &bhomeclient.Reply{Success: false, Msg: "无效的参数配置"} } if config.ShopConf.LocalShop == "" { _, err := addVasystemConfig("localShop", appServer, "shop:") if err != nil { logger.Warn(err) } } else { _, err := editVasystemConfig("localShop", appServer, config.ShopConf.LocalShop) if err != nil { logger.Warn(err) } } return &bhomeclient.Reply{Success: true, Msg: "设置成功!", Data: ""} } // 追加配置 func addVasystemConfig(key, value, prevLine string) ([]byte, error) { configFilePath := "/opt/vasystem/config/pro.yaml" sedCmd := "sed -i '/" + prevLine + "/a\\ " + key + ": " + value + "' " + configFilePath logger.Debug("run commond:", sedCmd) cmd := exec.Command("/bin/sh", "-c", sedCmd) return cmd.Output() } // 替换配置 func editVasystemConfig(key, dstVal, srcVal string) ([]byte, error) { configFilePath := "/opt/vasystem/config/pro.yaml" sedCmd := "sed -i 's/" + key + ": " + srcVal + "/" + key + ": " + dstVal + "/g' " + configFilePath logger.Debug("run commond:", sedCmd) cmd := exec.Command("/bin/sh", "-c", sedCmd) return cmd.Output() }