mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 07:57:21 +08:00
feat: 下载回调
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"slices"
|
||||
|
||||
"github.com/expr-lang/expr"
|
||||
@@ -23,17 +24,21 @@ type appRepo struct {
|
||||
t *gotext.Locale
|
||||
conf *koanf.Koanf
|
||||
db *gorm.DB
|
||||
log *slog.Logger
|
||||
cache biz.CacheRepo
|
||||
task biz.TaskRepo
|
||||
api *api.API
|
||||
}
|
||||
|
||||
func NewAppRepo(t *gotext.Locale, conf *koanf.Koanf, db *gorm.DB, cache biz.CacheRepo, task biz.TaskRepo) biz.AppRepo {
|
||||
func NewAppRepo(t *gotext.Locale, conf *koanf.Koanf, db *gorm.DB, log *slog.Logger, cache biz.CacheRepo, task biz.TaskRepo) biz.AppRepo {
|
||||
return &appRepo{
|
||||
t: t,
|
||||
conf: conf,
|
||||
db: db,
|
||||
log: log,
|
||||
cache: cache,
|
||||
task: task,
|
||||
api: api.NewAPI(app.Version, app.Locale),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,6 +189,11 @@ func (r *appRepo) Install(channel, slug string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 下载回调
|
||||
if err = r.api.AppCallback(slug); err != nil {
|
||||
r.log.Warn("[App] download callback failed", slog.String("app", slug), slog.Any("error", err))
|
||||
}
|
||||
|
||||
if app.IsCli {
|
||||
return shell.ExecfWithOutput(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ func (r databaseServerRepo) Sync(id uint) error {
|
||||
Remark: r.t.Get("sync from server %s", server.Name),
|
||||
}
|
||||
if err = r.db.Create(newUser).Error; err != nil {
|
||||
r.log.Warn("sync database user failed", slog.Any("err", err))
|
||||
r.log.Warn("[DatabaseServer] sync database user failed", slog.Any("err", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ func (r *CertRenew) Run() {
|
||||
|
||||
var certs []biz.Cert
|
||||
if err := r.db.Preload("Website").Preload("Account").Preload("DNS").Find(&certs).Error; err != nil {
|
||||
r.log.Warn("[Cert Renew] failed to get certs", slog.Any("err", err))
|
||||
r.log.Warn("[CertRenew] failed to get certs", slog.Any("err", err))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ func (r *CertRenew) Run() {
|
||||
|
||||
_, err = r.certRepo.Renew(cert.ID)
|
||||
if err != nil {
|
||||
r.log.Warn("[Cert Renew] failed to renew cert", slog.Any("err", err))
|
||||
r.log.Warn("[CertRenew] failed to renew cert", slog.Any("err", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,29 +45,29 @@ func (r *PanelTask) Run() {
|
||||
// 优化数据库
|
||||
if err := r.db.Exec("VACUUM").Error; err != nil {
|
||||
app.Status = app.StatusFailed
|
||||
r.log.Warn("[Panel Task] failed to vacuum database", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to vacuum database", slog.Any("err", err))
|
||||
return
|
||||
}
|
||||
if err := r.db.Exec("PRAGMA journal_mode=WAL;").Error; err != nil {
|
||||
app.Status = app.StatusFailed
|
||||
r.log.Warn("[Panel Task] failed to set database journal_mode to WAL", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to set database journal_mode to WAL", slog.Any("err", err))
|
||||
return
|
||||
}
|
||||
if err := r.db.Exec("PRAGMA wal_checkpoint(TRUNCATE);").Error; err != nil {
|
||||
app.Status = app.StatusFailed
|
||||
r.log.Warn("[Panel Task] failed to wal checkpoint database", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to wal checkpoint database", slog.Any("err", err))
|
||||
return
|
||||
}
|
||||
|
||||
// 备份面板
|
||||
if err := r.backupRepo.Create(biz.BackupTypePanel, ""); err != nil {
|
||||
r.log.Warn("备份面板失败", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to backup panel", slog.Any("err", err))
|
||||
}
|
||||
|
||||
// 清理备份
|
||||
if path, err := r.backupRepo.GetPath("panel"); err == nil {
|
||||
if err = r.backupRepo.ClearExpired(path, "panel_", 10); err != nil {
|
||||
r.log.Warn("[Panel Task] failed to clear backup", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to clear backup", slog.Any("err", err))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ func (r *PanelTask) Run() {
|
||||
func (r *PanelTask) updateApps() {
|
||||
time.AfterFunc(time.Duration(rand.IntN(300))*time.Second, func() {
|
||||
if err := r.cacheRepo.UpdateApps(); err != nil {
|
||||
r.log.Warn("[Panel Task] failed to update apps cache", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to update apps cache", slog.Any("err", err))
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -100,7 +100,7 @@ func (r *PanelTask) updateApps() {
|
||||
func (r *PanelTask) updateRewrites() {
|
||||
time.AfterFunc(time.Duration(rand.IntN(300))*time.Second, func() {
|
||||
if err := r.cacheRepo.UpdateRewrites(); err != nil {
|
||||
r.log.Warn("[Panel Task] failed to update rewrites cache", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to update rewrites cache", slog.Any("err", err))
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -132,7 +132,7 @@ func (r *PanelTask) updatePanel() {
|
||||
}
|
||||
if download := collect.First(panel.Downloads); download != nil {
|
||||
if err = r.backupRepo.UpdatePanel(panel.Version, download.URL, download.Checksum); err != nil {
|
||||
r.log.Warn("[Panel Task] failed to update panel", slog.Any("err", err))
|
||||
r.log.Warn("[PanelTask] failed to update panel", slog.Any("err", err))
|
||||
_ = r.backupRepo.FixPanel()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,6 @@ func (r *ProcessTask) Handle(args ...any) error {
|
||||
}
|
||||
|
||||
func (r *ProcessTask) ErrHandle(err error) {
|
||||
r.log.Warn("background task failed", slog.Any("task_id", r.taskID), slog.Any("err", err))
|
||||
r.log.Warn("[ProcessTask] background task failed", slog.Any("task_id", r.taskID), slog.Any("err", err))
|
||||
_ = r.taskRepo.UpdateStatus(r.taskID, biz.TaskStatusFailed)
|
||||
}
|
||||
|
||||
@@ -64,3 +64,18 @@ func (r *API) AppBySlug(slug string) (*App, error) {
|
||||
|
||||
return app, nil
|
||||
}
|
||||
|
||||
// AppCallback 应用下载回调
|
||||
func (r *API) AppCallback(slug string) error {
|
||||
resp, err := r.client.R().
|
||||
SetResult(&Response{}).
|
||||
Post(fmt.Sprintf("/apps/%s/callback", slug))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !resp.IsSuccess() {
|
||||
return fmt.Errorf("failed to callback app: %s", resp.String())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -60,3 +60,16 @@ func (r *API) TemplateBySlug(slug string) (*Template, error) {
|
||||
|
||||
return template, nil
|
||||
}
|
||||
|
||||
// TemplateCallback 模版下载回调
|
||||
func (r *API) TemplateCallback(slug string) error {
|
||||
resp, err := r.client.R().SetResult(&Response{}).Post(fmt.Sprintf("/templates/%s/callback", slug))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !resp.IsSuccess() {
|
||||
return fmt.Errorf("failed to callback template: %s", resp.String())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user