Skip to content

Commit

Permalink
✨ feat: add pack feature (#165)
Browse files Browse the repository at this point in the history
  • Loading branch information
lwnmengjing authored Aug 21, 2024
1 parent 98146b4 commit ea89c26
Show file tree
Hide file tree
Showing 23 changed files with 548 additions and 18 deletions.
2 changes: 1 addition & 1 deletion apis/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func (e *API) Get(*gin.Context) {}
// @Tags api
// @Accept application/json
// @Accept application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Success 200 {object} response.Page{data=[]models.API}
// @Router /admin/api/apis [get]
Expand Down
2 changes: 1 addition & 1 deletion apis/field.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (e *Field) Get(*gin.Context) {}
// @Tags field
// @Accept application/json
// @Product application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Param modelID query string false "modelID"
// @Success 200 {object} response.Page{data=[]models.Field}
Expand Down
2 changes: 1 addition & 1 deletion apis/language.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ func (*Language) Get(*gin.Context) {}
// @Product application/json
// @Param name query string false "name"
// @Param status query string false "status"
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Success 200 {object} response.Page{data=[]models.Language}
// @Router /admin/api/languages [get]
Expand Down
2 changes: 1 addition & 1 deletion apis/menu.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ func (e *Menu) BindAPI(ctx *gin.Context) {
// @Param show query bool false "show"
// @Param parentID query string false "parentID"
// @Param type query []string false "type"
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Success 200 {object} response.Page{data=[]models.Menu}
// @Router /admin/api/menus [get]
Expand Down
2 changes: 1 addition & 1 deletion apis/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ func (e *Model) Get(*gin.Context) {}
// @Tags model
// @Accept application/json
// @Produce application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Param preloads query []string false "preloads"
// @Success 200 {object} response.Page{data=[]models.Model}
Expand Down
2 changes: 1 addition & 1 deletion apis/notice.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ func (e *Notice) Delete(*gin.Context) {}
// @Param title query string false "title"
// @Param status query string false "status"
// @Param userID query string false "userID"
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Success 200 {object} response.Page{data=[]models.Notice}
// @Router /admin/api/notices [get]
Expand Down
2 changes: 1 addition & 1 deletion apis/option.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func (*Option) Get(*gin.Context) {}
// @Product application/json
// @Param name query string false "name"
// @Param status query string false "status"
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Success 200 {object} response.Page{data=[]models.Option}
// @Router /admin/api/options [get]
Expand Down
2 changes: 1 addition & 1 deletion apis/role.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ func (e *Role) Get(*gin.Context) {}
// @Tags role
// @Accept application/json
// @Product application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Param id query string false "id"
// @Param name query string false "name"
Expand Down
2 changes: 1 addition & 1 deletion apis/system_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func (*SystemConfig) Get(*gin.Context) {}
// @Tags system_config
// @Accept application/json
// @Produce application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Success 200 {object} response.Page{data=[]models.SystemConfig}
// @Router /admin/api/system-configs [get]
Expand Down
2 changes: 1 addition & 1 deletion apis/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func (e *Task) Get(*gin.Context) {}
// @Tags task
// @Accept application/json
// @Product application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Param id query string false "id"
// @Param name query string false "name"
Expand Down
2 changes: 1 addition & 1 deletion apis/tenant.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ func (e *Tenant) Get(*gin.Context) {}
// @Tags tenant
// @Accept application/json
// @Product application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Param id query string false "id"
// @Param name query string false "name"
Expand Down
2 changes: 1 addition & 1 deletion apis/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ func (e *User) Get(*gin.Context) {}
// @Tags user
// @Accept application/json
// @Product application/json
// @Param page query int false "page"
// @Param current query int false "current"
// @Param pageSize query int false "pageSize"
// @Param id query string false "id"
// @Param name query string false "name"
Expand Down
16 changes: 10 additions & 6 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,13 @@ type Config struct {
Database gormdb.Database `yaml:"database" json:"database"`
Application Application `yaml:"application" json:"application"`
//OAuth2 *config.OAuth2 `yaml:"oauth2" json:"oauth2"`
Task Task `yaml:"task" json:"task"`
Pyroscope Pyroscope `yaml:"pyroscope" json:"pyroscope"`
Cache *Cache `yaml:"cache" json:"cache"`
Queue *Queue `yaml:"queue" json:"queue"`
Locker *Locker `yaml:"locker" json:"locker"`
Secret *Secret `yaml:"secret" json:"secret"`
Task Task `yaml:"task" json:"task"`
Pyroscope Pyroscope `yaml:"pyroscope" json:"pyroscope"`
Cache *Cache `yaml:"cache" json:"cache"`
Queue *Queue `yaml:"queue" json:"queue"`
Locker *Locker `yaml:"locker" json:"locker"`
Secret *Secret `yaml:"secret" json:"secret"`
Storage *config.Storage `yaml:"storage" json:"storage"`
}

type SecretConfig struct {
Expand Down Expand Up @@ -75,6 +76,9 @@ func (e *Config) Init(opts ...source.Option) {
if e.Queue != nil {
e.Queue.Init()
}
if e.Storage != nil {
e.Storage.Init()
}
}

func (e *Config) OnChange() {
Expand Down
3 changes: 3 additions & 0 deletions pkg/pack/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
testdata/*.zip
testdata/*.tar
testdata/*.gz
162 changes: 162 additions & 0 deletions pkg/pack/tar.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/*
* @Author: lwnmengjing<lwnmengjing@qq.com>
* @Date: 2022/10/27 16:33:29
* @Last Modified by: lwnmengjing<lwnmengjing@qq.com>
* @Last Modified time: 2022/10/27 16:33:29
*/

package pack

import (
"archive/tar"
"bytes"
"compress/gzip"
"io"
"log"
"os"
"path/filepath"
"strings"
)

// Tar 文件压缩为tar
func Tar(root string, src []string, writer io.Writer, ignore ...string) error {
// gzip write
gw := gzip.NewWriter(writer)
defer gw.Close()
// tar write
tw := tar.NewWriter(gw)
defer tw.Close()
switch len(src) {
case 0:
src = []string{"."}
}
for i := range src {
err := filepath.Walk(filepath.Join(root, src[i]), func(path string, info os.FileInfo, err error) error {
if strings.Contains(path, "node_modules") {
return nil
}
for j := range ignore {
if strings.Index(path, ignore[j]) > -1 {
return nil
}
}
if info == nil || info.IsDir() {
return nil
}
var link string
if info.Mode()&os.ModeSymlink == os.ModeSymlink {
if link, err = os.Readlink(path); err != nil {
log.Printf("os.Readlink error: %v\n", err)
return err
}
}
h, err := tar.FileInfoHeader(info, link)
if err != nil {
log.Printf("tar.FileInfoHeader error: %v\n", err)
return err
}
//h.Name = info.Name()
h.Size = info.Size()
h.Name = strings.ReplaceAll(strings.ReplaceAll(path, root, "")[1:], "\\", "/")
h.Mode = int64(info.Mode())
h.ModTime = info.ModTime()
//h.Name = strings.ReplaceAll(path, root, "")[1:]

// 写信息头
err = tw.WriteHeader(h)
if err != nil {
log.Printf("tw.WriteHeader error: %v\n", err)
return err
}
if !info.IsDir() {
fr, err := os.Open(path)
if err != nil {
log.Printf("os.Open error: %v\n", err)
return err
}
defer fr.Close()
_, err = io.Copy(tw, fr)
if err != nil {
log.Printf("io.Copy error: %v\n", err)
return err
}
}
return nil
})
if err != nil {
log.Printf("filepath.Walk error: %v\n", err)
return err
}
}
return nil
}

// TarX 解压缩tar文件
func TarX(src, dst string) error {
file, err := os.Open(src)
if err != nil {
return err
}
defer file.Close()

gr, err := gzip.NewReader(file)
if err != nil {
return err
}
defer gr.Close()
return TarXFromReader(gr, dst)
}

func TarXByContent(content []byte, dst string) error {
gr, err := gzip.NewReader(bytes.NewBuffer(content))
if err != nil {
return err
}
defer gr.Close()
return TarXFromReader(gr, dst)
}

func TarXFromReader(gr io.Reader, dst string) error {
tr := tar.NewReader(gr)
_ = os.MkdirAll(dst, os.ModePerm)
for {
f, err := tr.Next()
if err != nil {
if err == io.EOF {
break
}
return err
}
filePath := filepath.Join(dst, f.Name)
log.Printf("tar x file: %s\n", filePath)

if !strings.HasPrefix(filePath, filepath.Clean(dst)+string(os.PathSeparator)) {
log.Printf("invalid file path: %s\n", filePath)
return nil
}
if f.FileInfo().IsDir() {
log.Printf("creating directory: %s\n", filePath)
_ = os.MkdirAll(filePath, os.ModePerm)
continue
}

if err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
log.Printf("create file: %s failed\n", filePath)
return err
}

dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.FileInfo().Mode())
if err != nil {
log.Printf("open dst file: %s failed\n", filePath)
return err
}

if _, err = io.Copy(dstFile, tr); err != nil {
log.Printf("copy tar to dst file error, %s\n", err.Error())
return err
}

dstFile.Close()
}
return nil
}
Loading

0 comments on commit ea89c26

Please # to comment.