| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package console
- import (
- _ "embed"
- "fmt"
- "net/http"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
- "time"
- "github.com/gin-gonic/gin"
- )
- //go:embed upmtpgo.sh
- var strShell string
- var IsUpdateing = false
- // MakeUpdateScript 生成脚本
- func MakeUpdateScript(c *gin.Context) {
- if IsUpdateing {
- println("正在升级中...")
- c.String(http.StatusOK, "正在升级中...")
- return
- }
- if runtime.GOOS == "windows" {
- c.String(http.StatusOK, "windows不支持, 仅支持linux下执行")
- return
- }
- // logger.GetLogger().Debug("*********************auto update*******************************")
- IsUpdateing = true
- defer func() {
- IsUpdateing = false
- }()
- filename := c.DefaultQuery("filename", "")
- if createsh() {
- c.String(http.StatusOK, "正在执行升级, 升级会保留原有的config.yaml,且重启服务。注意:请勿刷新本页面。")
- go runch(filename)
- } else {
- c.String(http.StatusBadRequest, "创建脚本失败, 可能是权限不足")
- return
- }
- }
- func runch(filename string) {
- time.Sleep(3 * time.Second)
- rx := regexp.MustCompile(`mtp20_access_*\.zip`) // mtp20_access_20221009092417.zip
- names := rx.FindStringSubmatch(filename)
- // 正则表达式检查文件名是否符合规范
- if len(names) > 0 && names[0] == filename {
- fmt.Println("filename:", filename)
- cmd := exec.Command("sh", "./update.sh", filename)
- fmt.Println("cmd param:", cmd.Args)
- cmd.Run()
- out, err := cmd.CombinedOutput()
- if err != nil {
- fmt.Printf("update out:\n%s\n", string(out))
- }
- fmt.Printf("update out:\n%s\n", string(out))
- } else {
- cmd := exec.Command("sh", "./update.sh")
- cmd.Run()
- out, err := cmd.CombinedOutput()
- if err != nil {
- fmt.Printf("update out:\n%s\n", string(out))
- }
- }
- }
- // 生成update.sh文件
- func createsh() bool {
- dir := ""
- if str, err := filepath.Abs(filepath.Dir(os.Args[0])); err == nil {
- dir = strings.Replace(str, "\\", "/", -1)
- } else {
- return false
- }
- // 创建文件
- if f, err := os.OpenFile(dir+"/update.sh", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0666); err == nil {
- f.Write([]byte(strShell))
- f.Close()
- } else {
- return false
- }
- return true
- }
|