From e88b8753502f7432d6915a7ae2dda0a0a4b9069a Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Mon, 9 Oct 2023 17:30:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=97=B6=E5=A6=82=E6=9E=9Cun?= =?UTF-8?q?zip=E5=91=BD=E4=BB=A4=E4=B8=8D=E5=AD=98=E5=9C=A8=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E4=BD=BF=E7=94=A8=E8=87=AA=E5=AE=9A=E4=B9=89=E8=A7=A3?= =?UTF-8?q?=E5=8E=8B=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/utils/unzip.go | 95 +++++++++++++++++++++++++++++++ internal/utils/upgrade_manager.go | 28 +++++---- 2 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 internal/utils/unzip.go diff --git a/internal/utils/unzip.go b/internal/utils/unzip.go new file mode 100644 index 00000000..ddddb242 --- /dev/null +++ b/internal/utils/unzip.go @@ -0,0 +1,95 @@ +package utils + +import ( + "archive/zip" + "errors" + "io" + "os" +) + +type Unzip struct { + zipFile string + targetDir string +} + +func NewUnzip(zipFile string, targetDir string) *Unzip { + return &Unzip{ + zipFile: zipFile, + targetDir: targetDir, + } +} + +func (this *Unzip) Run() error { + if len(this.zipFile) == 0 { + return errors.New("zip file should not be empty") + } + if len(this.targetDir) == 0 { + return errors.New("target dir should not be empty") + } + + reader, err := zip.OpenReader(this.zipFile) + if err != nil { + return err + } + + defer func() { + _ = reader.Close() + }() + + for _, file := range reader.File { + var info = file.FileInfo() + var target = this.targetDir + "/" + file.Name + + // 目录 + if info.IsDir() { + stat, err := os.Stat(target) + if err != nil { + if !os.IsNotExist(err) { + return err + } else { + err = os.MkdirAll(target, info.Mode()) + if err != nil { + return err + } + } + } else if !stat.IsDir() { + err = os.MkdirAll(target, info.Mode()) + if err != nil { + return err + } + } + continue + } + + // 文件 + err = func(file *zip.File, target string) error { + fileReader, err := file.Open() + if err != nil { + return err + } + defer func() { + _ = fileReader.Close() + }() + + // remove old + _ = os.Remove(target) + + // create new + fileWriter, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, file.FileInfo().Mode()) + if err != nil { + return err + } + defer func() { + _ = fileWriter.Close() + }() + + _, err = io.Copy(fileWriter, fileReader) + return err + }(file, target) + if err != nil { + return err + } + } + + return nil +} diff --git a/internal/utils/upgrade_manager.go b/internal/utils/upgrade_manager.go index 1dfef983..1504520a 100644 --- a/internal/utils/upgrade_manager.go +++ b/internal/utils/upgrade_manager.go @@ -88,10 +88,6 @@ func (this *UpgradeManager) Start() error { // 检查unzip unzipExe, _ := exec.LookPath("unzip") - if len(unzipExe) == 0 { - // TODO install unzip automatically or pack with a static 'unzip' file - return errors.New("can not find 'unzip' command") - } // 检查cp cpExe, _ := exec.LookPath("cp") @@ -232,12 +228,24 @@ func (this *UpgradeManager) Start() error { return fmt.Errorf("remove old dir '%s' failed: %w", unzipDir, err) } } - var unzipCmd = exec.Command(unzipExe, "-q", "-o", destFile, "-d", unzipDir) - var unzipStderr = &bytes.Buffer{} - unzipCmd.Stderr = unzipStderr - err = unzipCmd.Run() - if err != nil { - return fmt.Errorf("unzip installation file failed: %w: %s", err, unzipStderr.String()) + + if len(unzipExe) > 0 { + var unzipCmd = exec.Command(unzipExe, "-q", "-o", destFile, "-d", unzipDir) + var unzipStderr = &bytes.Buffer{} + unzipCmd.Stderr = unzipStderr + err = unzipCmd.Run() + if err != nil { + return fmt.Errorf("unzip installation file failed: %w: %s", err, unzipStderr.String()) + } + } else { + var unzipCmd = &Unzip{ + zipFile: destFile, + targetDir: unzipDir, + } + err = unzipCmd.Run() + if err != nil { + return fmt.Errorf("unzip installation file failed: %w", err) + } } installationFiles, err := filepath.Glob(unzipDir + "/edge-" + this.component + "/*")