From 2a6db6ebfee3f221bccb44f27086771a09400eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Fri, 30 Sep 2022 10:34:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BE=B9=E7=BC=98=E8=8A=82=E7=82=B9=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E5=AE=89=E8=A3=85=E6=96=87=E4=BB=B6=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E5=8C=96=EF=BC=88=E4=BB=8E16.xM=E5=87=8F=E5=B0=91=E5=88=B02.xM?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/installer-dns-helper/main.go | 4 +- cmd/installer-helper/main.go | 5 +- internal/installers/helpers/README.md | 1 + internal/installers/helpers/unzip.go | 91 +++++++++++++++++++++++ internal/installers/helpers/unzip_test.go | 17 +++++ 5 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 internal/installers/helpers/README.md create mode 100644 internal/installers/helpers/unzip.go create mode 100644 internal/installers/helpers/unzip_test.go diff --git a/cmd/installer-dns-helper/main.go b/cmd/installer-dns-helper/main.go index ba52688f..d7472f3c 100644 --- a/cmd/installer-dns-helper/main.go +++ b/cmd/installer-dns-helper/main.go @@ -2,7 +2,7 @@ package main import ( "flag" - "github.com/TeaOSLab/EdgeAPI/internal/utils" + "github.com/TeaOSLab/EdgeAPI/internal/installers/helpers" "github.com/iwind/gosock/pkg/gosock" "os" "os/exec" @@ -51,7 +51,7 @@ func main() { return } - unzip := utils.NewUnzip(zipPath, targetPath) + unzip := helpers.NewUnzip(zipPath, targetPath) err := unzip.Run() if err != nil { stderr("ERROR: " + err.Error()) diff --git a/cmd/installer-helper/main.go b/cmd/installer-helper/main.go index f9b606d5..20e82857 100644 --- a/cmd/installer-helper/main.go +++ b/cmd/installer-helper/main.go @@ -1,8 +1,9 @@ package main +// 注意这里的依赖文件应该最小化,从而使编译后的文件最小化 import ( "flag" - "github.com/TeaOSLab/EdgeAPI/internal/utils" + "github.com/TeaOSLab/EdgeAPI/internal/installers/helpers" "github.com/iwind/gosock/pkg/gosock" "os" "os/exec" @@ -51,7 +52,7 @@ func main() { return } - unzip := utils.NewUnzip(zipPath, targetPath) + unzip := helpers.NewUnzip(zipPath, targetPath) err := unzip.Run() if err != nil { stderr("ERROR: " + err.Error()) diff --git a/internal/installers/helpers/README.md b/internal/installers/helpers/README.md new file mode 100644 index 00000000..77809703 --- /dev/null +++ b/internal/installers/helpers/README.md @@ -0,0 +1 @@ +远程安装依赖文件,单独放在一个目录防止安装包过大 \ No newline at end of file diff --git a/internal/installers/helpers/unzip.go b/internal/installers/helpers/unzip.go new file mode 100644 index 00000000..a7f54b54 --- /dev/null +++ b/internal/installers/helpers/unzip.go @@ -0,0 +1,91 @@ +package helpers + +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 { + info := file.FileInfo() + 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() + }() + + 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/installers/helpers/unzip_test.go b/internal/installers/helpers/unzip_test.go new file mode 100644 index 00000000..0f6d9921 --- /dev/null +++ b/internal/installers/helpers/unzip_test.go @@ -0,0 +1,17 @@ +package helpers_test + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/installers/helpers" + "github.com/iwind/TeaGo/Tea" + _ "github.com/iwind/TeaGo/bootstrap" + "testing" +) + +func TestUnzip_Run(t *testing.T) { + var unzip = helpers.NewUnzip(Tea.Root+"/deploy/edge-node-v0.0.1.zip", Tea.Root+"/deploy/") + err := unzip.Run() + if err != nil { + t.Fatal(err) + } + t.Log("OK") +}