| | |
| | | } |
| | | defer file.Close() |
| | | writer := bufio.NewWriter(file) |
| | | chunkData := make([]byte, arg.Header.Size) |
| | | chunkData := make([]byte, arg.CurrentChunkSize) |
| | | n, err := (*arg.File).ReadAt(chunkData, 0) |
| | | if n ==0 || err !=nil { |
| | | logger.Debug("read chunkData err:",err,"n:",n) |
| | |
| | | |
| | | //upgrade |
| | | func (sv SysService) Upgrade(identifier string,filename string) (bool,error) { |
| | | if !bakBeforeUpgrade() { |
| | | return false,errors.New("更新前备份失败") |
| | | } |
| | | configPatchPath := "" |
| | | if config.Server.PatchPath != "" { |
| | | configPatchPath = config.Server.PatchPath |
| | |
| | | return false,errors.New("获取升级压缩包md5失败") |
| | | } |
| | | if strMd5 == identifier { |
| | | if util.ZipCheck(zipFilePath + ext) { |
| | | if util.ZipCheck(zipFilePath) { |
| | | if !updatePatch(identifier, ext) { |
| | | return false,errors.New("执行升级过程异常") |
| | | } |
| | | return true,nil |
| | | } else { |
| | | logger.Debug("not a valid zip file,path:",zipFilePath+ext) |
| | | logger.Debug("not a valid zip file,path:",zipFilePath) |
| | | return false,errors.New("升级程序解压失败,请确定上传的补丁是zip格式") |
| | | } |
| | | } else { |
| | |
| | | } else { |
| | | return false,errors.New("升级文件已丢失,请重新上传") |
| | | } |
| | | } |
| | | |
| | | func bakBeforeUpgrade() bool { |
| | | configBakPath := "" |
| | | if config.Server.BakPath != "" { |
| | | configBakPath = config.Server.BakPath |
| | | } else { |
| | | configBakPath = "/opt/vasystem/bak" |
| | | } |
| | | if util.Exists(configBakPath) { |
| | | //只保留最新的版本 |
| | | if err := os.RemoveAll(configBakPath);err != nil { |
| | | return false |
| | | } |
| | | } |
| | | if !util.CreateDirectory(configBakPath) { |
| | | return false |
| | | } |
| | | b, err := ExecCmd("cp -r /opt/vasystem/bin /opt/vasystem/bak") |
| | | if err != nil { |
| | | logger.Debug("bakBeforeUpgrade result:",string(b),"err:",err) |
| | | return false |
| | | } |
| | | return true |
| | | } |
| | | |
| | | //更新系统程序 |
| | |
| | | unZipPath := configPatchPath+"/"+identifier+"_basic/" |
| | | if util.Exists(unZipPath) { |
| | | //此版本已经更新过 |
| | | return true |
| | | } else { |
| | | if !util.CreateDirectory(unZipPath) { |
| | | rmErr := os.RemoveAll(unZipPath) |
| | | if rmErr !=nil { |
| | | return false |
| | | } |
| | | } |
| | | err := util.UnZip(configPatchPath+"/"+identifier+ext, unZipPath) |
| | | if err !=nil { |
| | | logger.Debug("UnZip err:",err,"zipFile:",configPatchPath+"/"+identifier+ext) |
| | | if !util.CreateDirectory(unZipPath) { |
| | | return false |
| | | } |
| | | |
| | | zipFilePath := configPatchPath+"/"+identifier+ext |
| | | err := util.UnZip(zipFilePath, unZipPath) |
| | | if err !=nil { |
| | | logger.Debug("UnZip err:",err,"zipFile:",zipFilePath) |
| | | return false |
| | | } |
| | | |
| | | //如果通用脚本有更新,则更新通用脚本 |
| | | if util.Exists(unZipPath+"updatePatch.sh") { |
| | | cpStr := fmt.Sprintf("cp %s /opt/vasystem/bin",unZipPath+"updatePatch.sh") |
| | | b, err := ExecCmd(cpStr) |
| | | if err != nil { |
| | | logger.Debug("cp updatePatch.sh to bin err:",err,"result:",string(b)) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | //判断更新包里是否有补丁脚本,如果有则执行,否则执行updatePatch.sh |
| | | updateCmd := fmt.Sprintf("./updatePatch.sh %s %s %s &",unZipPath,zipFilePath,configPatchPath+"/"+identifier) |
| | | if util.Exists(unZipPath+"upgrade.sh") { |
| | | updateCmd = fmt.Sprintf("%supgrade.sh %s %s %s &",unZipPath,unZipPath,zipFilePath,configPatchPath+"/"+identifier) |
| | | } |
| | | //2.更新系统 |
| | | var cmd *exec.Cmd |
| | | updateCmd := fmt.Sprintf("setsid ./updatePatch.sh %s %s %s",unZipPath,configPatchPath+"/"+identifier+ext,configPatchPath+"/"+identifier) |
| | | cmd = exec.Command("/bin/sh","-c", updateCmd) |
| | | if b, err := cmd.Output(); err != nil { |
| | | logger.Debug("updatePatch err:",err,"result:",string(b)) |
| | | b,err := ExecCmd(updateCmd) |
| | | if err != nil { |
| | | logger.Debug("upgrade err:",err,"result:",string(b),"cmd:",updateCmd) |
| | | return false |
| | | } else { |
| | | logger.Debug("updatePatch result:",string(b),"cmd:",updateCmd) |
| | | logger.Debug("upgrade result:",string(b),"cmd:",updateCmd) |
| | | } |
| | | return true |
| | | } |
| | |
| | | logger.Debug("mergeChunks result:",string(b),"cmd: ./mergeAll.sh ", chunkPath, storePath) |
| | | return true |
| | | } |
| | | } |
| | | |
| | | func ExecCmd(cmdStr string) ([]byte,error) { |
| | | var cmd *exec.Cmd |
| | | cmd = exec.Command("/bin/sh", "-c",cmdStr) |
| | | return cmd.Output() |
| | | } |