feat: sync script library on startup (#13376)

This commit is contained in:
ssongliu
2026-07-27 15:10:09 +08:00
committed by GitHub
parent 748f5f070a
commit c04848a92a
2 changed files with 59 additions and 15 deletions

View File

@@ -191,8 +191,35 @@ func StartSync() {
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() {
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)
}
}
@@ -205,6 +232,10 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
if global.CONF.Base.IsOffline {
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)
if err != nil {
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) {
versionUrl := fmt.Sprintf("%s/scripts/version.txt", global.ResourceURL())
_, versionRes, err := req_helper.HandleRequestWithProxy(versionUrl, http.MethodGet, constant.TimeOut20s)
if err != nil {
return fmt.Errorf("load scripts version from remote failed, err: %v", err)
}
var scriptSetting model.Setting
_ = global.DB.Where("key = ?", "ScriptVersion").First(&scriptSetting).Error
localVersion := strings.ReplaceAll(string(versionRes), "\n", "")
remoteVersion := strings.ReplaceAll(scriptSetting.Value, "\n", "")
if localVersion == remoteVersion {
syncTask.Log(i18n.GetMsgByKey("ScriptSyncSkip"))
return nil
if versionRes == nil {
var isLatest bool
versionRes, isLatest, err = loadRemoteScriptVersion()
if err != nil {
return err
}
if isLatest {
syncTask.Log(i18n.GetMsgByKey("ScriptSyncSkip"))
return nil
}
}
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)
}
_ = 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)
}
if err := xpack.MultiNodeProvider.Sync(constant.SyncScripts); err != nil {
@@ -288,6 +316,20 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
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 {
Scripts ScriptDetail `json:"scripts"`
}

View File

@@ -12,6 +12,7 @@ import (
"strings"
"time"
"github.com/1Panel-dev/1Panel/core/app/service"
"github.com/1Panel-dev/1Panel/core/init/auth"
"github.com/1Panel-dev/1Panel/core/init/db"
"github.com/1Panel-dev/1Panel/core/init/geo"
@@ -49,6 +50,7 @@ func Start() {
InitOthersBeforeHook()
hook.Init()
InitOthersAfterHook()
service.SyncScriptLibraryOnStartup()
proxy.Init()