mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/1Panel-dev/1Panel.git
synced 2026-09-20 08:03:55 +08:00
feat: sync script library on startup (#13376)
This commit is contained in:
@@ -191,8 +191,35 @@ func StartSync() {
|
|||||||
global.ScriptSyncJobID = id
|
global.ScriptSyncJobID = id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SyncScriptLibraryOnStartup() {
|
||||||
|
if global.CONF.Base.IsOffline {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
scriptSync, err := repo.NewISettingRepo().GetValueByKey("ScriptSync")
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Errorf("load script library sync setting failed, err: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if scriptSync != constant.StatusEnable {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go NewIScriptService().Run()
|
||||||
|
}
|
||||||
|
|
||||||
func (u *ScriptService) Run() {
|
func (u *ScriptService) Run() {
|
||||||
if err := u.Sync(dto.OperateByTaskID{}); err != nil {
|
if global.CONF.Base.IsOffline {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
versionRes, isLatest, err := loadRemoteScriptVersion()
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Errorf("sync scripts from remote failed, err: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if isLatest {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := u.sync(dto.OperateByTaskID{}, versionRes); err != nil {
|
||||||
global.LOG.Errorf("sync scripts from remote failed, err: %v", err)
|
global.LOG.Errorf("sync scripts from remote failed, err: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,6 +232,10 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
|
|||||||
if global.CONF.Base.IsOffline {
|
if global.CONF.Base.IsOffline {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
return u.sync(req, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *ScriptService) sync(req dto.OperateByTaskID, versionRes []byte) error {
|
||||||
syncTask, err := task.NewTaskWithOps(i18n.GetMsgByKey("RemoteScriptLibrary"), task.TaskSync, task.TaskScopeScript, req.TaskID, 0)
|
syncTask, err := task.NewTaskWithOps(i18n.GetMsgByKey("RemoteScriptLibrary"), task.TaskSync, task.TaskScopeScript, req.TaskID, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.LOG.Errorf("create sync task failed %v", err)
|
global.LOG.Errorf("create sync task failed %v", err)
|
||||||
@@ -212,19 +243,16 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
syncTask.AddSubTask(task.GetTaskName(i18n.GetMsgByKey("RemoteScriptLibrary"), task.TaskSync, task.TaskScopeScript), func(t *task.Task) (err error) {
|
syncTask.AddSubTask(task.GetTaskName(i18n.GetMsgByKey("RemoteScriptLibrary"), task.TaskSync, task.TaskScopeScript), func(t *task.Task) (err error) {
|
||||||
versionUrl := fmt.Sprintf("%s/scripts/version.txt", global.ResourceURL())
|
if versionRes == nil {
|
||||||
_, versionRes, err := req_helper.HandleRequestWithProxy(versionUrl, http.MethodGet, constant.TimeOut20s)
|
var isLatest bool
|
||||||
if err != nil {
|
versionRes, isLatest, err = loadRemoteScriptVersion()
|
||||||
return fmt.Errorf("load scripts version from remote failed, err: %v", err)
|
if err != nil {
|
||||||
}
|
return err
|
||||||
var scriptSetting model.Setting
|
}
|
||||||
_ = global.DB.Where("key = ?", "ScriptVersion").First(&scriptSetting).Error
|
if isLatest {
|
||||||
localVersion := strings.ReplaceAll(string(versionRes), "\n", "")
|
syncTask.Log(i18n.GetMsgByKey("ScriptSyncSkip"))
|
||||||
remoteVersion := strings.ReplaceAll(scriptSetting.Value, "\n", "")
|
return nil
|
||||||
|
}
|
||||||
if localVersion == remoteVersion {
|
|
||||||
syncTask.Log(i18n.GetMsgByKey("ScriptSyncSkip"))
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dataUrl := fmt.Sprintf("%s/scripts/data.yaml", global.ResourceURL())
|
dataUrl := fmt.Sprintf("%s/scripts/data.yaml", global.ResourceURL())
|
||||||
@@ -273,7 +301,7 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
|
|||||||
return fmt.Errorf("sync script with db failed, err: %v", err)
|
return fmt.Errorf("sync script with db failed, err: %v", err)
|
||||||
}
|
}
|
||||||
_ = os.RemoveAll(tmpDir)
|
_ = os.RemoveAll(tmpDir)
|
||||||
if err := global.DB.Model(&model.Setting{}).Where("key = ?", "ScriptVersion").Updates(map[string]interface{}{"value": string(versionRes)}).Error; err != nil {
|
if err := settingRepo.Update("ScriptVersion", string(versionRes)); err != nil {
|
||||||
return fmt.Errorf("update script version in db failed, err: %v", err)
|
return fmt.Errorf("update script version in db failed, err: %v", err)
|
||||||
}
|
}
|
||||||
if err := xpack.MultiNodeProvider.Sync(constant.SyncScripts); err != nil {
|
if err := xpack.MultiNodeProvider.Sync(constant.SyncScripts); err != nil {
|
||||||
@@ -288,6 +316,20 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func loadRemoteScriptVersion() ([]byte, bool, error) {
|
||||||
|
versionURL := fmt.Sprintf("%s/scripts/version.txt", global.ResourceURL())
|
||||||
|
_, remoteVersion, err := req_helper.HandleRequestWithProxy(versionURL, http.MethodGet, constant.TimeOut20s)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, fmt.Errorf("load scripts version from remote failed, err: %v", err)
|
||||||
|
}
|
||||||
|
localVersion, err := settingRepo.GetValueByKey("ScriptVersion")
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, fmt.Errorf("load local scripts version failed, err: %v", err)
|
||||||
|
}
|
||||||
|
isLatest := strings.TrimSpace(localVersion) == strings.TrimSpace(string(remoteVersion))
|
||||||
|
return remoteVersion, isLatest, nil
|
||||||
|
}
|
||||||
|
|
||||||
type Scripts struct {
|
type Scripts struct {
|
||||||
Scripts ScriptDetail `json:"scripts"`
|
Scripts ScriptDetail `json:"scripts"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/1Panel-dev/1Panel/core/app/service"
|
||||||
"github.com/1Panel-dev/1Panel/core/init/auth"
|
"github.com/1Panel-dev/1Panel/core/init/auth"
|
||||||
"github.com/1Panel-dev/1Panel/core/init/db"
|
"github.com/1Panel-dev/1Panel/core/init/db"
|
||||||
"github.com/1Panel-dev/1Panel/core/init/geo"
|
"github.com/1Panel-dev/1Panel/core/init/geo"
|
||||||
@@ -49,6 +50,7 @@ func Start() {
|
|||||||
InitOthersBeforeHook()
|
InitOthersBeforeHook()
|
||||||
hook.Init()
|
hook.Init()
|
||||||
InitOthersAfterHook()
|
InitOthersAfterHook()
|
||||||
|
service.SyncScriptLibraryOnStartup()
|
||||||
|
|
||||||
proxy.Init()
|
proxy.Init()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user