From 92f84d278e5705b84e7ccf6bc252adc9bf3c5b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Fri, 7 Jul 2023 19:09:46 +0800 Subject: [PATCH] feat: panel update --- app/console/commands/panel.go | 9 +++++ packages/helpers/helpers.go | 74 +++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/app/console/commands/panel.go b/app/console/commands/panel.go index f4679e20..83b8e4c1 100644 --- a/app/console/commands/panel.go +++ b/app/console/commands/panel.go @@ -73,6 +73,15 @@ func (receiver *Panel) Handle(ctx console.Context) error { color.Greenln("初始化成功") + case "update": + err := helpers.UpdatePanel() + if err != nil { + color.Redln("更新失败: " + err.Error()) + return nil + } + + color.Greenln("更新成功") + case "getInfo": var user models.User err := facades.Orm().Query().Where("id", 1).FirstOrFail(&user) diff --git a/packages/helpers/helpers.go b/packages/helpers/helpers.go index 36749eb8..bcc3cf99 100644 --- a/packages/helpers/helpers.go +++ b/packages/helpers/helpers.go @@ -2,6 +2,9 @@ package helpers import ( + "errors" + "os" + "os/exec" "strings" "time" @@ -51,3 +54,74 @@ func GetMonitoringInfo() MonitoringInfo { return res } + +type PanelInfo struct { + Name string `json:"name"` + Version string `json:"version"` + DownloadUrl string `json:"download_url"` + Body string `json:"body"` + Date string `json:"date"` +} + +// GetLatestPanelVersion 获取最新版本 +func GetLatestPanelVersion() (PanelInfo, error) { + var info PanelInfo + + cmd := exec.Command("/bin/bash", "-c", "curl \"https://api.github.com/repos/HaoZi-Team/Panel/releases/latest\"") + output, err := cmd.Output() + if err != nil { + return info, errors.New("获取最新版本失败") + } + + file, err := os.CreateTemp("", "panel") + if err != nil { + return info, errors.New("创建临时文件失败") + } + defer os.Remove(file.Name()) + _, err = file.Write(output) + err = file.Close() + if err != nil { + return info, errors.New("关闭临时文件失败") + } + fileName := file.Name() + + name := exec.Command("/bin/bash", "-c", "jq -r '.name' "+fileName) + version := exec.Command("/bin/bash", "-c", "jq -r '.tag_name' "+fileName) + body := exec.Command("/bin/bash", "-c", "jq -r '.body' "+fileName) + date := exec.Command("/bin/bash", "-c", "jq -r '.published_at' "+fileName) + nameOutput, _ := name.Output() + versionOutput, _ := version.Output() + bodyOutput, _ := body.Output() + dateOutput, _ := date.Output() + info.Name = strings.TrimSpace(string(nameOutput)) + info.Version = strings.TrimSpace(string(versionOutput)) + info.Body = strings.TrimSpace(string(bodyOutput)) + info.Date = strings.TrimSpace(string(dateOutput)) + if IsArm() { + downloadUrl := exec.Command("/bin/bash", "-c", "jq -r '.assets[] | select(.name | contains(\"arm64\")) | .browser_download_url' "+fileName) + downloadUrlOutput, _ := downloadUrl.Output() + info.DownloadUrl = strings.TrimSpace(string(downloadUrlOutput)) + } else { + downloadUrl := exec.Command("/bin/bash", "-c", "jq -r '.assets[] | select(.name | contains(\"amd64v3\")) | .browser_download_url' "+fileName) + downloadUrlOutput, _ := downloadUrl.Output() + info.DownloadUrl = strings.TrimSpace(string(downloadUrlOutput)) + } + + return info, nil +} + +// UpdatePanel 更新面板 +func UpdatePanel() error { + panelInfo, err := GetLatestPanelVersion() + if err != nil { + return err + } + + cmd := exec.Command("/bin/bash", "-c", "wget -O panel.tar.gz "+panelInfo.DownloadUrl+" && tar -zxvf panel.tar.gz && rm -rf panel.tar.gz && chmod +x panel && ./panel artisan migrate") + _, err = cmd.Output() + if err != nil { + return errors.New("更新面板失败") + } + + return nil +}