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") +}