//上报Mac信息,生成Pxe文件 func ReportMacInfo(ctx context.Context, w rest.ResponseWriter, r *rest.Request) { w.Header().Add("Content-type", "application/json; charset=utf-8") repo, ok := middleware.RepoFromContext(ctx) if !ok { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "内部服务器错误"}) return } conf, ok := middleware.ConfigFromContext(ctx) if !ok { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "内部服务器错误"}) return } if conf.OsInstall.PxeConfigDir == "" { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "Pxe配置文件目录没有指定"}) return } var info struct { Sn string Mac string } if err := r.DecodeJSONPayload(&info); err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "参数错误"}) return } info.Sn = strings.TrimSpace(info.Sn) info.Mac = strings.TrimSpace(info.Mac) if info.Sn == "" || info.Mac == "" { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "SN和Mac参数不能为空!"}) return } //mac 大写转为 小写 info.Mac = strings.ToLower(info.Mac) deviceId, err := repo.GetDeviceIdBySn(info.Sn) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "该设备不存在!"}) return } device, err := repo.GetDeviceById(deviceId) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": err.Error()}) return } osConfig, err := repo.GetOsConfigById(device.OsID) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "PXE信息没有配置" + err.Error()}) return } //录入Mac信息 count, err := repo.CountMacByMacAndDeviceID(info.Mac, device.ID) if count <= 0 { count, err := repo.CountMacByMac(info.Mac) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": err.Error()}) return } if count > 0 { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "该MAC地址已被其他机器录入"}) return } _, errAddMac := repo.AddMac(device.ID, info.Mac) if errAddMac != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": errAddMac.Error()}) return } } //替换占位符 osConfig.Pxe = strings.Replace(osConfig.Pxe, "{sn}", info.Sn, -1) pxeFileName := util.GetPxeFileNameByMac(info.Mac) errCreatePxeFile := util.CreatePxeFile(conf.OsInstall.PxeConfigDir, pxeFileName, osConfig.Pxe) if errCreatePxeFile != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "配置文件生成失败" + err.Error()}) return } result := make(map[string]string) result["Result"] = "true" w.WriteJSON(map[string]interface{}{"Status": "success", "Message": "操作成功", "Content": result}) }
//上报安装进度 func ReportInstallInfo(ctx context.Context, w rest.ResponseWriter, r *rest.Request) { w.Header().Add("Content-type", "application/json; charset=utf-8") repo, ok := middleware.RepoFromContext(ctx) if !ok { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "内部服务器错误"}) return } conf, ok := middleware.ConfigFromContext(ctx) if !ok { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "内部服务器错误"}) return } if conf.OsInstall.PxeConfigDir == "" { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "Pxe配置文件目录没有指定"}) return } var info struct { Sn string Title string InstallProgress float64 InstallLog string } if err := r.DecodeJSONPayload(&info); err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "参数错误"}) return } info.Sn = strings.TrimSpace(info.Sn) info.Title = strings.TrimSpace(info.Title) if info.Sn == "" { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "SN参数不能为空!"}) return } deviceId, err := repo.GetDeviceIdBySn(info.Sn) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "该设备不存在!"}) return } device, err := repo.GetDeviceById(deviceId) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": err.Error()}) return } var status string var logTitle string if info.InstallProgress == -1 { status = "failure" info.InstallProgress = 0 logTitle = info.Title } else if info.InstallProgress >= 0 && info.InstallProgress < 1 { status = "installing" logTitle = info.Title + "(" + fmt.Sprintf("安装进度 %.1f", info.InstallProgress*100) + "%)" } else if info.InstallProgress == 1 { status = "success" logTitle = info.Title + "(" + fmt.Sprintf("安装进度 %.1f", info.InstallProgress*100) + "%)" //logTitle = "安装成功" } else { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": "安装进度参数不正确!"}) return } /* if device.InstallLog != "" { info.InstallLog = device.InstallLog + "\n" + info.InstallLog } */ _, errUpdate := repo.UpdateInstallInfoById(device.ID, status, info.InstallProgress) if errUpdate != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": errUpdate.Error()}) return } //删除PXE配置文件 if info.InstallProgress == 1 { macs, err := repo.GetMacListByDeviceID(device.ID) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": err.Error()}) return } for _, mac := range macs { pxeFileName := util.GetPxeFileNameByMac(mac.Mac) confDir := conf.OsInstall.PxeConfigDir if util.FileExist(confDir + "/" + pxeFileName) { err := os.Remove(confDir + "/" + pxeFileName) if err != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": err.Error()}) return } } } } var installLog string byteDecode, err := base64.StdEncoding.DecodeString(info.InstallLog) if err != nil { installLog = "" } else { installLog = string(byteDecode) } _, errAddLog := repo.AddDeviceLog(device.ID, logTitle, "install", installLog) if errAddLog != nil { w.WriteJSON(map[string]interface{}{"Status": "error", "Message": errAddLog.Error()}) return } result := make(map[string]string) result["Result"] = "true" w.WriteJSON(map[string]interface{}{"Status": "success", "Message": "操作成功", "Content": result}) }