From 0222e79afe45d9fc55aed9a7e62ca239c228ab73 Mon Sep 17 00:00:00 2001 From: 554325746@qq.com <554325746@qq.com> Date: 星期一, 23 十二月 2019 10:24:12 +0800 Subject: [PATCH] add sys comeback sh --- service/SysService.go | 153 +++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 119 insertions(+), 34 deletions(-) diff --git a/service/SysService.go b/service/SysService.go index aff3d33..1a1f14c 100644 --- a/service/SysService.go +++ b/service/SysService.go @@ -1,13 +1,15 @@ package service + import ( "basic.com/valib/logger.git" "bufio" + "errors" "fmt" "io/ioutil" "mime/multipart" "os" "os/exec" - "strconv" + "path" "strings" "webserver/extend/config" "webserver/extend/util" @@ -66,7 +68,8 @@ return true } //鍒ゆ柇鍒嗗潡鏂囦欢鏄惁瀛樺湪 - chunkFilePath := fileTmpPath+"/"+arg.Identifier+"_"+strconv.Itoa(arg.ChunkNumber) + chunkAlignNum := util.FormatNum(arg.TotalChunks, arg.ChunkNumber) + chunkFilePath := fileTmpPath+"/"+arg.Identifier+"_"+chunkAlignNum if !util.Exists(chunkFilePath) { return false } @@ -74,12 +77,8 @@ dirFiles, _ := ioutil.ReadDir(fileTmpPath) if dirFiles != nil && len(dirFiles) == arg.TotalChunks { //琛ㄧず鎵�鏈夊垎鍧楅兘涓婁紶浜嗭紝闇�瑕乵erge - if sv.MergeChunks(fileTmpPath, mergedFilePath) { - if util.ZipCheck(mergedFilePath) { - if !updatePatch(arg.Identifier, subfix) { - return false - } - } + if !sv.MergeChunks(fileTmpPath, mergedFilePath) { + return false } } } @@ -97,11 +96,9 @@ if !util.CreateDirectory(configPatchPath) { return false } - index := strings.LastIndex(arg.Header.Filename, ".") - if index < 0 { - return false - } - subfix := arg.Header.Filename[index:] + + filenameWithSuffix := path.Base(arg.Header.Filename) + subfix := path.Ext(filenameWithSuffix) MD5Str := arg.Identifier logger.Debug("Identifier:",MD5Str) fileTmpPath := configPatchPath + "/"+MD5Str @@ -110,7 +107,8 @@ return false } } - fileSavePath := fileTmpPath+"/"+MD5Str+"_"+strconv.Itoa(arg.ChunkNumber) + chunkAlignNum := util.FormatNum(arg.TotalChunks, arg.ChunkNumber) + fileSavePath := fileTmpPath+"/"+MD5Str+"_"+chunkAlignNum if util.Exists(fileSavePath) { rmErr := os.Remove(fileSavePath) if rmErr != nil { @@ -136,6 +134,9 @@ logger.Debug("write chunkData err:",err2,"nn:",nn) return false } + if err = writer.Flush(); err != nil { + logger.Debug("write flush err:",err) + } isComplete := false dirFiles, _ := ioutil.ReadDir(fileTmpPath) if dirFiles != nil && len(dirFiles) == arg.TotalChunks { @@ -144,12 +145,70 @@ if isComplete { if sv.MergeChunks(fileTmpPath,fileTmpPath + subfix) { logger.Debug("merge all chunks success,identifier:",MD5Str,"fileName:",arg.FileName) - if util.ZipCheck(fileTmpPath + subfix) { - if !updatePatch(arg.Identifier, subfix) { - return false - } - } + } else { + return false } + } + return true +} + +//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 + } else { + configPatchPath = "/opt/vasystem/patch" + } + + filenameWithSuffix := path.Base(filename) + ext := path.Ext(filenameWithSuffix) + + zipFilePath := configPatchPath + "/"+identifier+ext + if util.Exists(zipFilePath) { + //鏍¢獙md5 + strMd5, e := util.FileMd5(zipFilePath) + if e !=nil || strMd5 == "" { + return false,errors.New("鑾峰彇鍗囩骇鍘嬬缉鍖卪d5澶辫触") + } + if strMd5 == identifier { + if !updatePatch(identifier, ext) { + return false,errors.New("鎵ц鍗囩骇杩囩▼寮傚父,璇风‘瀹氫笂浼犵殑琛ヤ竵鏄痶ar.gz鏍煎紡") + } + return true,nil + + } else { + logger.Debug("strMd5 is", strMd5,"identifier is",identifier,"not equal") + return false,errors.New("鏍¢獙鍗囩骇鏂囦欢澶辫触") + } + } 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 } @@ -163,27 +222,47 @@ configPatchPath = "/opt/vasystem/patch" } //1.瑙e帇缂╂洿鏂板寘 - unZipPath := configPatchPath+"/"+identifier+"_basic/" - if util.Exists(unZipPath) { + unPackPath := configPatchPath+"/"+identifier+"_basic/" + if util.Exists(unPackPath) { //姝ょ増鏈凡缁忔洿鏂拌繃 - return true - } else { - if !util.CreateDirectory(unZipPath) { + rmErr := os.RemoveAll(unPackPath) + 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(unPackPath) { return false } - //2.鏇存柊绯荤粺 - var cmd *exec.Cmd - cmd = exec.Command("/bin/sh","-c",fmt.Sprintf("./updatePatch.sh %s",unZipPath)) - logger.Debug("called sh updatePatch.sh ", unZipPath) - if b, err := cmd.Output(); err != nil { - logger.Debug("updatePatch err:",err,"result:",string(b)) + + unPackFilePath := configPatchPath+"/"+identifier+ext + err := util.UnTarGz(unPackFilePath, unPackPath) + if err !=nil { + logger.Debug("UnPack err:",err,"unPackFile:",unPackFilePath) return false + } + + //濡傛灉閫氱敤鑴氭湰鏈夋洿鏂帮紝鍒欐洿鏂伴�氱敤鑴氭湰 + if util.Exists(unPackPath+"updatePatch.sh") { + cpStr := fmt.Sprintf("cp %s /opt/vasystem/bin",unPackPath+"updatePatch.sh") + b, err := ExecCmd(cpStr) + if err != nil { + logger.Debug("cp updatePatch.sh to bin err:",err,"result:",string(b)) + return false + } + } + + //鍒ゆ柇鏇存柊鍖呴噷鏄惁鏈夎ˉ涓佽剼鏈紝濡傛灉鏈夊垯鎵ц锛屽惁鍒欐墽琛寀pdatePatch.sh + updateCmd := fmt.Sprintf("./updatePatch.sh %s %s %s &",unPackPath,unPackFilePath,configPatchPath+"/"+identifier) + if util.Exists(unPackPath+"upgrade.sh") { + updateCmd = fmt.Sprintf("%supgrade.sh %s %s %s &",unPackPath,unPackPath,unPackFilePath,configPatchPath+"/"+identifier) + } + //2.鏇存柊绯荤粺 + b,err := ExecCmd(updateCmd) + if err != nil { + logger.Debug("upgrade err:",err,"result:",string(b),"cmd:",updateCmd) + return false + } else { + logger.Debug("upgrade result:",string(b),"cmd:",updateCmd) } return true } @@ -191,11 +270,17 @@ func (sv SysService) MergeChunks(chunkPath string, storePath string) bool { var cmd *exec.Cmd cmd = exec.Command("/bin/sh", "-c", fmt.Sprintf("./mergeAll.sh %s %s", chunkPath, storePath)) - logger.Debug("called sh mergeAll.sh ", chunkPath, storePath) if b, err := cmd.Output(); err != nil { logger.Debug("mergeChunks err:", err, "result:", string(b)) return false } else { + 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() } \ No newline at end of file -- Gitblit v1.8.0