Compare commits

...
32 Commits
Author SHA1 Message Date
ssongliu 3d6a97e5a6 fix: 解决操作日志打印错误的问题 (#6899) 2024-10-30 17:06:31 +08:00
ssongliu c2bb422b66 fix: 解决远程数据库无法切换的问题 (#6893)
Refs #6883
2024-10-30 17:06:28 +08:00
ssongliu cdb0f8e85c fix: 解决全屏切换直接关闭后菜单不显示的问题 (#6894)
Refs #6889
2024-10-30 17:06:25 +08:00
ssongliu 31576138bf fix: 解决容器编排路径为空时无法删除的问题 (#6862) 2024-10-30 17:06:20 +08:00
ssongliu bb6d4635a1 fix: 解决容器镜像仓库编辑失败的问题 (#6845)
Refs #6839
2024-10-30 17:06:17 +08:00
ssongliu 22a61886c7 fix: 补全进程守护 watch 引用 (#6836) 2024-10-24 17:13:28 +08:00
zhengkunwang 376ec86c57 feat: 创建运行环境网站增加默认网络创建 (#6807) 2024-10-24 14:37:48 +08:00
ssongliu 57120d7fa8 fix: 解决低版本 dockerd 命令不兼容的问题 (#6824) 2024-10-24 14:25:30 +08:00
ssongliu 8da5891490 style: 容器样式调整 (#6822)
Refs #6819
2024-10-24 14:25:27 +08:00
zhengkunwang 6f3acd47e2 feat: 启动运行环境增加默认网络检测 (#6820) 2024-10-24 14:25:24 +08:00
zhengkunwang 1519615ea3 feat: 创建运行环境网站增加 Python 选项 (#6815) 2024-10-24 14:25:07 +08:00
ssongliu 26b47bae69 fix: 解决快照列表排序的问题 (#6816)
Refs #6810
2024-10-24 14:25:02 +08:00
ssongliu 8a6ba5c007 fix: 解决 Docker 重启失败的问题 (#6805) 2024-10-24 14:24:56 +08:00
zhengkunwang 73c594081b fix: 解决 Python 运行环境编辑报错的问题 (#6801) 2024-10-24 14:24:52 +08:00
蘭 5d0a4c597b fix: 文件夹选择控件,选择文件时不默认选择当前目录 (#6799)
Refs #6012
2024-10-24 14:24:49 +08:00
zhengkunwang ab0e777501 fix: 解决 Mysql 特定版本忽略升级失效的问题 (#6800)
Refs https://github.com/1Panel-dev/1Panel/issues/6796
2024-10-24 14:24:40 +08:00
ssongliu ca38780da8 feat: 修改容器操作超时时间 (#6798)
Refs #6747
2024-10-24 14:24:33 +08:00
Ludovic Fernandez 68347d79d6 fix: otel dependencies (#6793) 2024-10-24 14:24:29 +08:00
ssongliu e615f3d0fb feat: SSL 配置增加重启选项 (#6792) 2024-10-24 14:24:26 +08:00
Ludovic Fernandez 21cdd05d24 fix: huawei cloud (#6791) 2024-10-24 14:24:17 +08:00
zhengkunwang 2ad30db698 fix: 解决创建运行环境报名称存在的问题 (#6785) 2024-10-24 14:24:12 +08:00
zhengkunwang 2076a8a8f3 fix: 解决证书自动续签日志报错的问题 (#6784) 2024-10-24 14:24:08 +08:00
zhengkunwang 3027ae4a50 fix: 解决网站开启 HTTPS 之后 404 配置丢失的问题 (#6775) 2024-10-24 14:24:04 +08:00
zhengkunwang facea38ab7 style: 日志样式调整 (#6774) 2024-10-24 14:23:59 +08:00
ssongliu 0243a4c255 fix: 解决容器编排跳转路径错误的问题 (#6773) 2024-10-24 14:23:45 +08:00
蘭 1486bf3f69 fix: 解决移动端主机文件批量删除错误 (#6765) 2024-10-24 14:23:41 +08:00
ssongliu ac2c20bd81 feat: postgresql 远程数据库支持 17.x 版本 (#6759) 2024-10-24 14:23:24 +08:00
ssongliu fcce6fec44 feat: 优化数据库切换效果 (#6757)
Refs #6755
2024-10-24 14:23:13 +08:00
John Bro a6ab6d6aba fix: 容器部分操作动态修改执行命令 (#6750)
Refs #3242
2024-10-24 14:23:09 +08:00
zhengkunwang cad50320eb feat: PHP 镜像 build 增加超时时间 (#6744) 2024-10-24 14:22:34 +08:00
zhengkunwang 0a6a1f11c7 style: 优化一些样式 (#6740) 2024-10-24 14:22:14 +08:00
ssongliu fcb8a9c860 feat: 移除多余代码 2024-10-16 14:27:19 +08:00
83 changed files with 1152 additions and 1907 deletions
+2 -1
View File
@@ -2,6 +2,7 @@ package v1
import ( import (
"errors" "errors"
"github.com/1Panel-dev/1Panel/backend/app/dto" "github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper" "github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
@@ -56,7 +57,7 @@ func (b *BaseApi) LoadDashboardBaseInfo(c *gin.Context) {
// @Tags Dashboard // @Tags Dashboard
// @Summary Load dashboard current info // @Summary Load dashboard current info
// @Description 获取首页实时数据 // @Description 获取首页实时数据
// @Accept json、 // @Accept json
// @Param request body dto.DashboardReq true "request" // @Param request body dto.DashboardReq true "request"
// @Success 200 {object} dto.DashboardCurrent // @Success 200 {object} dto.DashboardCurrent
// @Security ApiKeyAuth // @Security ApiKeyAuth
+1 -1
View File
@@ -62,7 +62,7 @@ func (b *BaseApi) CreateRuntime(c *gin.Context) {
// @Success 200 // @Success 200
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Router /runtimes/del [post] // @Router /runtimes/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除网站 [name]","formatEN":"Delete website [name]"} // @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除运行环境 [name]","formatEN":"Delete runtime [name]"}
func (b *BaseApi) DeleteRuntime(c *gin.Context) { func (b *BaseApi) DeleteRuntime(c *gin.Context) {
var req request.RuntimeDelete var req request.RuntimeDelete
if err := helper.CheckBindAndValidate(&req, c); err != nil { if err := helper.CheckBindAndValidate(&req, c); err != nil {
-20
View File
@@ -1,20 +0,0 @@
package dto
type CreateOrUpdateAlert struct {
AlertTitle string `json:"alertTitle"`
AlertType string `json:"alertType"`
AlertCount uint `json:"alertCount"`
EntryID uint `json:"entryID"`
}
type AlertBase struct {
AlertType string `json:"alertType"`
EntryID uint `json:"entryID"`
}
type PushAlert struct {
TaskName string `json:"taskName"`
AlertType string `json:"alertType"`
EntryID uint `json:"entryID"`
Param string `json:"param"`
}
-3
View File
@@ -33,7 +33,6 @@ type ClamInfo struct {
LastHandleDate string `json:"lastHandleDate"` LastHandleDate string `json:"lastHandleDate"`
Spec string `json:"spec"` Spec string `json:"spec"`
Description string `json:"description"` Description string `json:"description"`
AlertCount uint `json:"alertCount"`
} }
type ClamLogSearch struct { type ClamLogSearch struct {
@@ -72,8 +71,6 @@ type ClamCreate struct {
InfectedDir string `json:"infectedDir"` InfectedDir string `json:"infectedDir"`
Spec string `json:"spec"` Spec string `json:"spec"`
Description string `json:"description"` Description string `json:"description"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
} }
type ClamUpdate struct { type ClamUpdate struct {
+1 -1
View File
@@ -218,7 +218,7 @@ type ComposeCreate struct {
} }
type ComposeOperation struct { type ComposeOperation struct {
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
Path string `json:"path" validate:"required"` Path string `json:"path"`
Operation string `json:"operation" validate:"required,oneof=up start stop down delete"` Operation string `json:"operation" validate:"required,oneof=up start stop down delete"`
WithFile bool `json:"withFile"` WithFile bool `json:"withFile"`
} }
-6
View File
@@ -31,13 +31,10 @@ type CronjobCreate struct {
DefaultDownload string `json:"defaultDownload"` DefaultDownload string `json:"defaultDownload"`
RetainCopies int `json:"retainCopies" validate:"number,min=1"` RetainCopies int `json:"retainCopies" validate:"number,min=1"`
Secret string `json:"secret"` Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
} }
type CronjobUpdate struct { type CronjobUpdate struct {
ID uint `json:"id" validate:"required"` ID uint `json:"id" validate:"required"`
Type string `json:"type" validate:"required"`
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
Spec string `json:"spec" validate:"required"` Spec string `json:"spec" validate:"required"`
@@ -56,8 +53,6 @@ type CronjobUpdate struct {
DefaultDownload string `json:"defaultDownload"` DefaultDownload string `json:"defaultDownload"`
RetainCopies int `json:"retainCopies" validate:"number,min=1"` RetainCopies int `json:"retainCopies" validate:"number,min=1"`
Secret string `json:"secret"` Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
} }
type CronjobUpdateStatus struct { type CronjobUpdateStatus struct {
@@ -104,7 +99,6 @@ type CronjobInfo struct {
LastRecordTime string `json:"lastRecordTime"` LastRecordTime string `json:"lastRecordTime"`
Status string `json:"status"` Status string `json:"status"`
Secret string `json:"secret"` Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
} }
type SearchRecord struct { type SearchRecord struct {
+1
View File
@@ -41,6 +41,7 @@ type WebsiteSSLApply struct {
ID uint `json:"ID" validate:"required"` ID uint `json:"ID" validate:"required"`
SkipDNSCheck bool `json:"skipDNSCheck"` SkipDNSCheck bool `json:"skipDNSCheck"`
Nameservers []string `json:"nameservers"` Nameservers []string `json:"nameservers"`
DisableLog bool `json:"disableLog"`
} }
type WebsiteAcmeAccountCreate struct { type WebsiteAcmeAccountCreate struct {
+9 -7
View File
@@ -30,6 +30,7 @@ type SettingInfo struct {
ServerPort string `json:"serverPort"` ServerPort string `json:"serverPort"`
SSL string `json:"ssl"` SSL string `json:"ssl"`
SSLType string `json:"sslType"` SSLType string `json:"sslType"`
AutoRestart string `json:"autoRestart"`
BindDomain string `json:"bindDomain"` BindDomain string `json:"bindDomain"`
AllowIPs string `json:"allowIPs"` AllowIPs string `json:"allowIPs"`
SecurityEntrance string `json:"securityEntrance"` SecurityEntrance string `json:"securityEntrance"`
@@ -73,12 +74,13 @@ type SettingUpdate struct {
} }
type SSLUpdate struct { type SSLUpdate struct {
SSLType string `json:"sslType" validate:"required,oneof=self select import import-paste import-local"` SSLType string `json:"sslType" validate:"required,oneof=self select import import-paste import-local"`
Domain string `json:"domain"` Domain string `json:"domain"`
SSL string `json:"ssl" validate:"required,oneof=enable disable"` SSL string `json:"ssl" validate:"required,oneof=enable disable"`
Cert string `json:"cert"` Cert string `json:"cert"`
Key string `json:"key"` Key string `json:"key"`
SSLID uint `json:"sslID"` SSLID uint `json:"sslID"`
AutoRestart string `json:"autoRestart"`
} }
type SSLInfo struct { type SSLInfo struct {
Domain string `json:"domain"` Domain string `json:"domain"`
@@ -147,7 +149,7 @@ type SnapshotInfo struct {
DefaultDownload string `json:"defaultDownload"` DefaultDownload string `json:"defaultDownload"`
Status string `json:"status"` Status string `json:"status"`
Message string `json:"message"` Message string `json:"message"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"created_at"`
Version string `json:"version"` Version string `json:"version"`
InterruptStep string `json:"interruptStep"` InterruptStep string `json:"interruptStep"`
+12
View File
@@ -1342,6 +1342,18 @@ func handleInstalled(appInstallList []model.AppInstall, updated bool, sync bool)
continue continue
} }
lastVersion := versions[0] lastVersion := versions[0]
if app.Key == constant.AppMysql {
for _, version := range versions {
majorVersion := getMajorVersion(installed.Version)
if !strings.HasPrefix(version, majorVersion) {
continue
} else {
lastVersion = version
break
}
}
}
if common.IsCrossVersion(installed.Version, lastVersion) { if common.IsCrossVersion(installed.Version, lastVersion) {
installDTO.CanUpdate = app.CrossVersionUpdate installDTO.CanUpdate = app.CrossVersionUpdate
} else { } else {
-69
View File
@@ -8,7 +8,6 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"sort" "sort"
"strconv"
"strings" "strings"
"time" "time"
@@ -21,7 +20,6 @@ import (
"github.com/1Panel-dev/1Panel/backend/utils/common" "github.com/1Panel-dev/1Panel/backend/utils/common"
"github.com/1Panel-dev/1Panel/backend/utils/systemctl" "github.com/1Panel-dev/1Panel/backend/utils/systemctl"
"github.com/1Panel-dev/1Panel/backend/utils/xpack" "github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/1Panel-dev/1Panel/backend/xpack/utils/alert"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"github.com/robfig/cron/v3" "github.com/robfig/cron/v3"
@@ -156,16 +154,6 @@ func (c *ClamService) SearchWithPage(req dto.SearchClamWithPage) (int64, interfa
} }
datas[i].LastHandleDate = t1.Format(constant.DateTimeLayout) datas[i].LastHandleDate = t1.Format(constant.DateTimeLayout)
} }
alertBase := dto.AlertBase{
AlertType: "clams",
EntryID: datas[i].ID,
}
alertCount := xpack.GetAlert(alertBase)
if alertCount != 0 {
datas[i].AlertCount = alertCount
} else {
datas[i].AlertCount = 0
}
} }
return total, datas, err return total, datas, err
} }
@@ -192,19 +180,6 @@ func (c *ClamService) Create(req dto.ClamCreate) error {
if err := clamRepo.Create(&clam); err != nil { if err := clamRepo.Create(&clam); err != nil {
return err return err
} }
if req.AlertCount != 0 {
createAlert := dto.CreateOrUpdateAlert{
AlertTitle: req.AlertTitle,
AlertCount: req.AlertCount,
AlertType: "clams",
EntryID: clam.ID,
}
err := xpack.CreateAlert(createAlert)
if err != nil {
return err
}
}
return nil return nil
} }
@@ -250,16 +225,6 @@ func (c *ClamService) Update(req dto.ClamUpdate) error {
if err := clamRepo.Update(req.ID, upMap); err != nil { if err := clamRepo.Update(req.ID, upMap); err != nil {
return err return err
} }
updateAlert := dto.CreateOrUpdateAlert{
AlertTitle: req.AlertTitle,
AlertType: "clams",
AlertCount: req.AlertCount,
EntryID: clam.ID,
}
err := xpack.UpdateAlert(updateAlert)
if err != nil {
return err
}
return nil return nil
} }
@@ -300,14 +265,6 @@ func (c *ClamService) Delete(req dto.ClamDelete) error {
if err := clamRepo.Delete(commonRepo.WithByID(id)); err != nil { if err := clamRepo.Delete(commonRepo.WithByID(id)); err != nil {
return err return err
} }
alertBase := dto.AlertBase{
AlertType: "clams",
EntryID: clam.ID,
}
err := xpack.DeleteAlert(alertBase)
if err != nil {
return err
}
} }
return nil return nil
} }
@@ -348,7 +305,6 @@ func (c *ClamService) HandleOnce(req dto.OperateByID) error {
} }
global.LOG.Debugf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile) global.LOG.Debugf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile)
stdout, err := cmd.Execf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile) stdout, err := cmd.Execf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile)
handleAlert(stdout, clam.Name, clam.ID)
if err != nil { if err != nil {
global.LOG.Errorf("clamdscan failed, stdout: %v, err: %v", stdout, err) global.LOG.Errorf("clamdscan failed, stdout: %v, err: %v", stdout, err)
} }
@@ -629,28 +585,3 @@ func (c *ClamService) loadLogPath(name string) string {
return "" return ""
} }
func handleAlert(stdout, clamName string, clamId uint) {
if strings.Contains(stdout, "- SCAN SUMMARY -") {
lines := strings.Split(stdout, "\n")
for _, line := range lines {
if strings.HasPrefix(line, "Infected files:") {
var infectedFiles = 0
infectedFiles, _ = strconv.Atoi(strings.TrimPrefix(line, "Infected files:"))
if infectedFiles > 0 {
pushAlert := dto.PushAlert{
TaskName: clamName,
AlertType: "clams",
EntryID: clamId,
Param: strconv.Itoa(infectedFiles),
}
err := alert.PushAlert(pushAlert)
if err != nil {
global.LOG.Errorf("clamdscan push failed, err: %v", err)
}
break
}
}
}
}
}
+4
View File
@@ -252,6 +252,10 @@ func (u *ContainerService) CreateCompose(req dto.ComposeCreate) (string, error)
} }
func (u *ContainerService) ComposeOperation(req dto.ComposeOperation) error { func (u *ContainerService) ComposeOperation(req dto.ComposeOperation) error {
if len(req.Path) == 0 && req.Operation == "delete" {
_ = composeRepo.DeleteRecord(commonRepo.WithByName(req.Name))
return nil
}
if cmd.CheckIllegal(req.Path, req.Operation) { if cmd.CheckIllegal(req.Path, req.Operation) {
return buserr.New(constant.ErrCmdIllegal) return buserr.New(constant.ErrCmdIllegal)
} }
+1 -47
View File
@@ -13,7 +13,6 @@ import (
"github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/robfig/cron/v3" "github.com/robfig/cron/v3"
@@ -54,16 +53,6 @@ func (u *CronjobService) SearchWithPage(search dto.PageCronjob) (int64, interfac
} else { } else {
item.LastRecordTime = "-" item.LastRecordTime = "-"
} }
alertBase := dto.AlertBase{
AlertType: cronjob.Type,
EntryID: cronjob.ID,
}
alertCount := xpack.GetAlert(alertBase)
if alertCount != 0 {
item.AlertCount = alertCount
} else {
item.AlertCount = 0
}
dtoCronjobs = append(dtoCronjobs, item) dtoCronjobs = append(dtoCronjobs, item)
} }
return total, dtoCronjobs, err return total, dtoCronjobs, err
@@ -201,18 +190,6 @@ func (u *CronjobService) Create(cronjobDto dto.CronjobCreate) error {
if err := cronjobRepo.Create(&cronjob); err != nil { if err := cronjobRepo.Create(&cronjob); err != nil {
return err return err
} }
if cronjobDto.AlertCount != 0 {
createAlert := dto.CreateOrUpdateAlert{
AlertTitle: cronjobDto.AlertTitle,
AlertCount: cronjobDto.AlertCount,
AlertType: cronjob.Type,
EntryID: cronjob.ID,
}
err := xpack.CreateAlert(createAlert)
if err != nil {
return err
}
}
return nil return nil
} }
@@ -255,14 +232,6 @@ func (u *CronjobService) Delete(req dto.CronjobBatchDelete) error {
if err := cronjobRepo.Delete(commonRepo.WithByID(id)); err != nil { if err := cronjobRepo.Delete(commonRepo.WithByID(id)); err != nil {
return err return err
} }
alertBase := dto.AlertBase{
AlertType: cronjob.Type,
EntryID: cronjob.ID,
}
err := xpack.DeleteAlert(alertBase)
if err != nil {
return err
}
} }
return nil return nil
@@ -312,21 +281,7 @@ func (u *CronjobService) Update(id uint, req dto.CronjobUpdate) error {
upMap["default_download"] = req.DefaultDownload upMap["default_download"] = req.DefaultDownload
upMap["retain_copies"] = req.RetainCopies upMap["retain_copies"] = req.RetainCopies
upMap["secret"] = req.Secret upMap["secret"] = req.Secret
err = cronjobRepo.Update(id, upMap) return cronjobRepo.Update(id, upMap)
if err != nil {
return err
}
updateAlert := dto.CreateOrUpdateAlert{
AlertTitle: req.AlertTitle,
AlertType: cronModel.Type,
AlertCount: req.AlertCount,
EntryID: cronModel.ID,
}
err = xpack.UpdateAlert(updateAlert)
if err != nil {
return err
}
return nil
} }
func (u *CronjobService) UpdateStatus(id uint, status string) error { func (u *CronjobService) UpdateStatus(id uint, status string) error {
@@ -338,7 +293,6 @@ func (u *CronjobService) UpdateStatus(id uint, status string) error {
entryIDs string entryIDs string
err error err error
) )
if status == constant.StatusEnable { if status == constant.StatusEnable {
entryIDs, err = u.StartJob(&cronjob, false) entryIDs, err = u.StartJob(&cronjob, false)
if err != nil { if err != nil {
+10
View File
@@ -1,6 +1,7 @@
package service package service
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
"path" "path"
@@ -30,6 +31,9 @@ func (u *CronjobService) handleApp(cronjob model.Cronjob, startTime time.Time) e
if err != nil { if err != nil {
return err return err
} }
if len(appItems) == 0 {
return errors.New("no such app in database!")
}
apps = appItems apps = appItems
} }
accountMap, err := loadClientMap(cronjob.BackupAccounts) accountMap, err := loadClientMap(cronjob.BackupAccounts)
@@ -65,6 +69,9 @@ func (u *CronjobService) handleApp(cronjob model.Cronjob, startTime time.Time) e
func (u *CronjobService) handleWebsite(cronjob model.Cronjob, startTime time.Time) error { func (u *CronjobService) handleWebsite(cronjob model.Cronjob, startTime time.Time) error {
webs := loadWebsForJob(cronjob) webs := loadWebsForJob(cronjob)
if len(webs) == 0 {
return errors.New("no such website in database!")
}
accountMap, err := loadClientMap(cronjob.BackupAccounts) accountMap, err := loadClientMap(cronjob.BackupAccounts)
if err != nil { if err != nil {
return err return err
@@ -98,6 +105,9 @@ func (u *CronjobService) handleWebsite(cronjob model.Cronjob, startTime time.Tim
func (u *CronjobService) handleDatabase(cronjob model.Cronjob, startTime time.Time) error { func (u *CronjobService) handleDatabase(cronjob model.Cronjob, startTime time.Time) error {
dbs := loadDbsForJob(cronjob) dbs := loadDbsForJob(cronjob)
if len(dbs) == 0 {
return errors.New("no such db in database!")
}
accountMap, err := loadClientMap(cronjob.BackupAccounts) accountMap, err := loadClientMap(cronjob.BackupAccounts)
if err != nil { if err != nil {
return err return err
-21
View File
@@ -12,7 +12,6 @@ import (
"github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/i18n" "github.com/1Panel-dev/1Panel/backend/i18n"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/app/repo" "github.com/1Panel-dev/1Panel/backend/app/repo"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
@@ -21,12 +20,9 @@ import (
"github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/cmd"
"github.com/1Panel-dev/1Panel/backend/utils/files" "github.com/1Panel-dev/1Panel/backend/utils/files"
"github.com/1Panel-dev/1Panel/backend/utils/ntp" "github.com/1Panel-dev/1Panel/backend/utils/ntp"
"github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
var alertTypes = map[string]bool{"app": true, "website": true, "database": true, "directory": true, "log": true, "snapshot": true}
func (u *CronjobService) HandleJob(cronjob *model.Cronjob) { func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
var ( var (
message []byte message []byte
@@ -94,7 +90,6 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
record.Records, _ = mkdirAndWriteFile(cronjob, record.StartTime, message) record.Records, _ = mkdirAndWriteFile(cronjob, record.StartTime, message)
} }
cronjobRepo.EndRecords(record, constant.StatusFailed, err.Error(), record.Records) cronjobRepo.EndRecords(record, constant.StatusFailed, err.Error(), record.Records)
handleCronJobAlert(cronjob)
return return
} }
if len(message) != 0 { if len(message) != 0 {
@@ -396,19 +391,3 @@ func (u *CronjobService) generateLogsPath(cronjob model.Cronjob, startTime time.
func hasBackup(cronjobType string) bool { func hasBackup(cronjobType string) bool {
return cronjobType == "app" || cronjobType == "database" || cronjobType == "website" || cronjobType == "directory" || cronjobType == "snapshot" || cronjobType == "log" return cronjobType == "app" || cronjobType == "database" || cronjobType == "website" || cronjobType == "directory" || cronjobType == "snapshot" || cronjobType == "log"
} }
func handleCronJobAlert(cronjob *model.Cronjob) {
if alertTypes[cronjob.Type] {
pushAlert := dto.PushAlert{
TaskName: cronjob.Name,
AlertType: cronjob.Type,
EntryID: cronjob.ID,
Param: cronjob.Type,
}
err := xpack.PushAlert(pushAlert)
if err != nil {
global.LOG.Errorf("cronjob alert push failed, err: %v", err)
return
}
}
}
+48 -20
View File
@@ -201,9 +201,8 @@ func (u *DockerService) UpdateConf(req dto.SettingUpdate) error {
} }
if len(daemonMap) == 0 { if len(daemonMap) == 0 {
_ = os.Remove(constant.DaemonJsonPath) _ = os.Remove(constant.DaemonJsonPath)
stdout, err := cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
if err != nil { return err
return errors.New(string(stdout))
} }
return nil return nil
} }
@@ -218,9 +217,8 @@ func (u *DockerService) UpdateConf(req dto.SettingUpdate) error {
return err return err
} }
stdout, err := cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
if err != nil { return err
return errors.New(string(stdout))
} }
return nil return nil
} }
@@ -268,9 +266,8 @@ func (u *DockerService) UpdateLogOption(req dto.LogOption) error {
return err return err
} }
stdout, err := cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
if err != nil { return err
return errors.New(string(stdout))
} }
return nil return nil
} }
@@ -312,9 +309,8 @@ func (u *DockerService) UpdateIpv6Option(req dto.Ipv6Option) error {
return err return err
} }
stdout, err := cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
if err != nil { return err
return errors.New(string(stdout))
} }
return nil return nil
} }
@@ -322,9 +318,8 @@ func (u *DockerService) UpdateIpv6Option(req dto.Ipv6Option) error {
func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error { func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error {
if len(req.File) == 0 { if len(req.File) == 0 {
_ = os.Remove(constant.DaemonJsonPath) _ = os.Remove(constant.DaemonJsonPath)
stdout, err := cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
if err != nil { return err
return errors.New(string(stdout))
} }
return nil return nil
} }
@@ -345,9 +340,8 @@ func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error {
return err return err
} }
stdout, err := cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
if err != nil { return err
return errors.New(string(stdout))
} }
return nil return nil
} }
@@ -355,6 +349,10 @@ func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error {
func (u *DockerService) OperateDocker(req dto.DockerOperation) error { func (u *DockerService) OperateDocker(req dto.DockerOperation) error {
service := "docker" service := "docker"
sudo := cmd.SudoHandleCmd() sudo := cmd.SudoHandleCmd()
dockerCmd, err := getDockerRestartCommand()
if err != nil {
return err
}
if req.Operation == "stop" { if req.Operation == "stop" {
isSocketActive, _ := systemctl.IsActive("docker.socket") isSocketActive, _ := systemctl.IsActive("docker.socket")
if isSocketActive { if isSocketActive {
@@ -371,9 +369,9 @@ func (u *DockerService) OperateDocker(req dto.DockerOperation) error {
} }
} }
stdout, err := cmd.Execf("systemctl %s %s ", req.Operation, service) stdout, err := cmd.Execf("%s %s %s", dockerCmd, req.Operation, service)
if err != nil { if err != nil {
return errors.New(string(stdout)) return errors.New(stdout)
} }
return nil return nil
} }
@@ -428,9 +426,39 @@ func changeLogOption(daemonMap map[string]interface{}, logMaxFile, logMaxSize st
} }
func validateDockerConfig() error { func validateDockerConfig() error {
if !cmd.Which("dockerd") {
return nil
}
stdout, err := cmd.Exec("dockerd --validate") stdout, err := cmd.Exec("dockerd --validate")
if strings.Contains(stdout, "unknown flag: --validate") {
return nil
}
if err != nil || (stdout != "" && strings.TrimSpace(stdout) != "configuration OK") { if err != nil || (stdout != "" && strings.TrimSpace(stdout) != "configuration OK") {
return fmt.Errorf("Docker configuration validation failed, err: %v", stdout) return fmt.Errorf("Docker configuration validation failed, err: %v", stdout)
} }
return nil return nil
} }
func getDockerRestartCommand() (string, error) {
stdout, err := cmd.Exec("which docker")
if err != nil {
return "", fmt.Errorf("failed to find docker: %v", err)
}
dockerPath := stdout
if strings.Contains(dockerPath, "snap") {
return "snap", nil
}
return "systemctl", nil
}
func restartDocker() error {
restartCmd, err := getDockerRestartCommand()
if err != nil {
return err
}
stdout, err := cmd.Execf("%s restart docker", restartCmd)
if err != nil {
return fmt.Errorf("failed to restart Docker: %s", stdout)
}
return nil
}
+12 -7
View File
@@ -179,6 +179,7 @@ func (u *FirewallService) OperateFirewall(operation string) error {
if err != nil { if err != nil {
return err return err
} }
needRestartDocker := false
switch operation { switch operation {
case "start": case "start":
if err := client.Start(); err != nil { if err := client.Start(); err != nil {
@@ -188,26 +189,30 @@ func (u *FirewallService) OperateFirewall(operation string) error {
_ = client.Stop() _ = client.Stop()
return err return err
} }
_, _ = cmd.Exec("systemctl restart docker") needRestartDocker = true
return nil
case "stop": case "stop":
if err := client.Stop(); err != nil { if err := client.Stop(); err != nil {
return err return err
} }
_, _ = cmd.Exec("systemctl restart docker") needRestartDocker = true
return nil
case "restart": case "restart":
if err := client.Restart(); err != nil { if err := client.Restart(); err != nil {
return err return err
} }
_, _ = cmd.Exec("systemctl restart docker") needRestartDocker = true
return nil
case "disablePing": case "disablePing":
return u.updatePingStatus("0") return u.updatePingStatus("0")
case "enablePing": case "enablePing":
return u.updatePingStatus("1") return u.updatePingStatus("1")
default:
return fmt.Errorf("not supported operation: %s", operation)
} }
return fmt.Errorf("not support such operation: %s", operation) if needRestartDocker {
if err := restartDocker(); err != nil {
return err
}
}
return nil
} }
func (u *FirewallService) OperatePortRule(req dto.PortRuleOperate, reload bool) error { func (u *FirewallService) OperatePortRule(req dto.PortRuleOperate, reload bool) error {
+38 -31
View File
@@ -84,15 +84,16 @@ func (u *ImageRepoService) Create(req dto.ImageRepoCreate) error {
if imageRepo.ID != 0 { if imageRepo.ID != 0 {
return constant.ErrRecordExist return constant.ErrRecordExist
} }
if req.Protocol == "http" { if req.Protocol == "http" {
_ = u.handleRegistries(req.DownloadUrl, "", "create") if err := u.handleRegistries(req.DownloadUrl, "", "create"); err != nil {
return fmt.Errorf("create registry %s failed, err: %v", req.DownloadUrl, err)
}
if err := validateDockerConfig(); err != nil { if err := validateDockerConfig(); err != nil {
return err return err
} }
if err := restartDocker(); err != nil {
stdout, err := cmd.Exec("systemctl restart docker") return err
if err != nil {
return errors.New(string(stdout))
} }
ticker := time.NewTicker(3 * time.Second) ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop() defer ticker.Stop()
@@ -116,23 +117,18 @@ func (u *ImageRepoService) Create(req dto.ImageRepoCreate) error {
return err return err
} }
} }
if req.Auth {
if err := u.CheckConn(req.DownloadUrl, req.Username, req.Password); err != nil {
return err
}
}
if err := copier.Copy(&imageRepo, &req); err != nil { if err := copier.Copy(&imageRepo, &req); err != nil {
return errors.WithMessage(constant.ErrStructTransform, err.Error()) return errors.WithMessage(constant.ErrStructTransform, err.Error())
} }
imageRepo.Status = constant.StatusSuccess imageRepo.Status = constant.StatusSuccess
if req.Auth { return imageRepoRepo.Create(&imageRepo)
if err := u.CheckConn(req.DownloadUrl, req.Username, req.Password); err != nil {
imageRepo.Status = constant.StatusFailed
imageRepo.Message = err.Error()
}
}
if err := imageRepoRepo.Create(&imageRepo); err != nil {
return err
}
return nil
} }
func (u *ImageRepoService) BatchDelete(req dto.ImageRepoDelete) error { func (u *ImageRepoService) BatchDelete(req dto.ImageRepoDelete) error {
@@ -158,19 +154,37 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error {
if err != nil { if err != nil {
return err return err
} }
if repo.DownloadUrl != req.DownloadUrl || (!repo.Auth && req.Auth) { if repo.Protocol == "http" && req.Protocol == "https" {
_ = u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update") if err := u.handleRegistries("", repo.DownloadUrl, "delete"); err != nil {
return fmt.Errorf("delete registry %s failed, err: %v", repo.DownloadUrl, err)
}
}
if repo.Protocol == "http" && req.Protocol == "http" {
if err := u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update"); err != nil {
return fmt.Errorf("update registry %s => %s failed, err: %v", repo.DownloadUrl, req.DownloadUrl, err)
}
}
if repo.Protocol == "https" && req.Protocol == "http" {
if err := u.handleRegistries(req.DownloadUrl, "", "create"); err != nil {
return fmt.Errorf("create registry %s failed, err: %v", req.DownloadUrl, err)
}
}
if repo.Auth != req.Auth || repo.DownloadUrl != req.DownloadUrl {
if repo.Auth { if repo.Auth {
_, _ = cmd.ExecWithCheck("docker", "logout", repo.DownloadUrl) _, _ = cmd.ExecWithCheck("docker", "logout", repo.DownloadUrl)
} }
if err := validateDockerConfig(); err != nil { if req.Auth {
return err if err := u.CheckConn(req.DownloadUrl, req.Username, req.Password); err != nil {
return err
}
} }
}
stdout, err := cmd.Exec("systemctl restart docker") if err := validateDockerConfig(); err != nil {
if err != nil { return err
return errors.New(string(stdout)) }
} if err := restartDocker(); err != nil {
return err
} }
upMap := make(map[string]interface{}) upMap := make(map[string]interface{})
@@ -179,15 +193,8 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error {
upMap["username"] = req.Username upMap["username"] = req.Username
upMap["password"] = req.Password upMap["password"] = req.Password
upMap["auth"] = req.Auth upMap["auth"] = req.Auth
upMap["status"] = constant.StatusSuccess upMap["status"] = constant.StatusSuccess
upMap["message"] = "" upMap["message"] = ""
if req.Auth {
if err := u.CheckConn(req.DownloadUrl, req.Username, req.Password); err != nil {
upMap["status"] = constant.StatusFailed
upMap["message"] = err.Error()
}
}
return imageRepoRepo.Update(req.ID, upMap) return imageRepoRepo.Update(req.ID, upMap)
} }
+5 -2
View File
@@ -56,7 +56,7 @@ func (r *RuntimeService) Create(create request.RuntimeCreate) (*model.Runtime, e
opts []repo.DBOption opts []repo.DBOption
) )
if create.Name != "" { if create.Name != "" {
opts = append(opts, commonRepo.WithLikeName(create.Name)) opts = append(opts, commonRepo.WithByName(create.Name))
} }
if create.Type != "" { if create.Type != "" {
opts = append(opts, commonRepo.WithByType(create.Type)) opts = append(opts, commonRepo.WithByType(create.Type))
@@ -308,7 +308,7 @@ func (r *RuntimeService) Get(id uint) (*response.RuntimeDTO, error) {
} }
for k, v := range envs { for k, v := range envs {
switch k { switch k {
case "NODE_APP_PORT", "PANEL_APP_PORT_HTTP", "JAVA_APP_PORT", "GO_APP_PORT": case "NODE_APP_PORT", "PANEL_APP_PORT_HTTP", "JAVA_APP_PORT", "GO_APP_PORT", "APP_PORT":
port, err := strconv.Atoi(v) port, err := strconv.Atoi(v)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -495,6 +495,9 @@ func (r *RuntimeService) OperateRuntime(req request.RuntimeOperate) error {
_ = runtimeRepo.Save(runtime) _ = runtimeRepo.Save(runtime)
} }
}() }()
go func() {
_ = docker.CreateDefaultDockerNetwork()
}()
switch req.Operate { switch req.Operate {
case constant.RuntimeUp: case constant.RuntimeUp:
if err = runComposeCmdWithLog(req.Operate, runtime.GetComposePath(), runtime.GetLogPath()); err != nil { if err = runComposeCmdWithLog(req.Operate, runtime.GetComposePath(), runtime.GetLogPath()); err != nil {
+10 -2
View File
@@ -2,6 +2,7 @@ package service
import ( import (
"bytes" "bytes"
"context"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
@@ -218,7 +219,10 @@ func buildRuntime(runtime *model.Runtime, oldImageID string, rebuild bool) {
_ = logFile.Close() _ = logFile.Close()
}() }()
cmd := exec.Command("docker-compose", "-f", composePath, "build") ctx, cancel := context.WithTimeout(context.Background(), 1*time.Hour)
defer cancel()
cmd := exec.CommandContext(ctx, "docker-compose", "-f", composePath, "build")
multiWriterStdout := io.MultiWriter(os.Stdout, logFile) multiWriterStdout := io.MultiWriter(os.Stdout, logFile)
cmd.Stdout = multiWriterStdout cmd.Stdout = multiWriterStdout
var stderrBuf bytes.Buffer var stderrBuf bytes.Buffer
@@ -228,7 +232,11 @@ func buildRuntime(runtime *model.Runtime, oldImageID string, rebuild bool) {
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
runtime.Status = constant.RuntimeError runtime.Status = constant.RuntimeError
runtime.Message = buserr.New(constant.ErrImageBuildErr).Error() + ":" + stderrBuf.String() if errors.Is(ctx.Err(), context.DeadlineExceeded) {
runtime.Message = buserr.New(constant.ErrImageBuildErr).Error() + ":" + buserr.New("ErrCmdTimeout").Error()
} else {
runtime.Message = buserr.New(constant.ErrImageBuildErr).Error() + ":" + stderrBuf.String()
}
} else { } else {
runtime.Status = constant.RuntimeNormal runtime.Status = constant.RuntimeNormal
runtime.Message = "" runtime.Message = ""
+3
View File
@@ -322,6 +322,9 @@ func (u *SettingService) UpdateSSL(c *gin.Context, req dto.SSLUpdate) error {
if err := settingRepo.Update("SSL", req.SSL); err != nil { if err := settingRepo.Update("SSL", req.SSL); err != nil {
return err return err
} }
if err := settingRepo.Update("AutoRestart", req.AutoRestart); err != nil {
return err
}
sID, _ := c.Cookie(constant.SessionName) sID, _ := c.Cookie(constant.SessionName)
c.SetCookie(constant.SessionName, sID, 0, "", "", true, true) c.SetCookie(constant.SessionName, sID, 0, "", "", true, true)
+3 -1
View File
@@ -231,7 +231,9 @@ func recoverDaemonJson(src string, fileOp files.FileOp) error {
} }
} }
_, _ = cmd.Exec("systemctl restart docker") if err := restartDocker(); err != nil {
return err
}
return nil return nil
} }
+4
View File
@@ -309,6 +309,10 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error)
if err != nil { if err != nil {
return err return err
} }
if err = docker.CreateDefaultDockerNetwork(); err != nil {
err = buserr.WithDetail(constant.Err1PanelNetworkFailed, err.Error(), nil)
return
}
website.RuntimeID = runtime.ID website.RuntimeID = runtime.ID
switch runtime.Type { switch runtime.Type {
case constant.RuntimePHP: case constant.RuntimePHP:
+21 -12
View File
@@ -181,6 +181,13 @@ func (w WebsiteSSLService) Create(create request.WebsiteSSLCreate) (request.Webs
return create, nil return create, nil
} }
func printSSLLog(logger *log.Logger, msgKey string, params map[string]interface{}, disableLog bool) {
if disableLog {
return
}
logger.Println(i18n.GetMsgWithMap(msgKey, params))
}
func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error { func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error {
var ( var (
err error err error
@@ -272,11 +279,13 @@ func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error {
defer logFile.Close() defer logFile.Close()
logger := log.New(logFile, "", log.LstdFlags) logger := log.New(logFile, "", log.LstdFlags)
legoLogger.Logger = logger legoLogger.Logger = logger
startMsg := i18n.GetMsgWithMap("ApplySSLStart", map[string]interface{}{"domain": strings.Join(domains, ","), "type": i18n.GetMsgByKey(websiteSSL.Provider)}) if !apply.DisableLog {
if websiteSSL.Provider == constant.DNSAccount { startMsg := i18n.GetMsgWithMap("ApplySSLStart", map[string]interface{}{"domain": strings.Join(domains, ","), "type": i18n.GetMsgByKey(websiteSSL.Provider)})
startMsg = startMsg + i18n.GetMsgWithMap("DNSAccountName", map[string]interface{}{"name": dnsAccount.Name, "type": dnsAccount.Type}) if websiteSSL.Provider == constant.DNSAccount {
startMsg = startMsg + i18n.GetMsgWithMap("DNSAccountName", map[string]interface{}{"name": dnsAccount.Name, "type": dnsAccount.Type})
}
legoLogger.Logger.Println(startMsg)
} }
legoLogger.Logger.Println(startMsg)
resource, err := client.ObtainSSL(domains, privateKey) resource, err := client.ObtainSSL(domains, privateKey)
if err != nil { if err != nil {
handleError(websiteSSL, err) handleError(websiteSSL, err)
@@ -296,7 +305,7 @@ func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error {
websiteSSL.Type = cert.Issuer.CommonName websiteSSL.Type = cert.Issuer.CommonName
websiteSSL.Organization = cert.Issuer.Organization[0] websiteSSL.Organization = cert.Issuer.Organization[0]
websiteSSL.Status = constant.SSLReady websiteSSL.Status = constant.SSLReady
legoLogger.Logger.Println(i18n.GetMsgWithMap("ApplySSLSuccess", map[string]interface{}{"domain": strings.Join(domains, ",")})) printSSLLog(logger, "ApplySSLSuccess", map[string]interface{}{"domain": strings.Join(domains, ",")}, apply.DisableLog)
saveCertificateFile(websiteSSL, logger) saveCertificateFile(websiteSSL, logger)
if websiteSSL.ExecShell { if websiteSSL.ExecShell {
@@ -304,11 +313,11 @@ func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error {
if websiteSSL.PushDir { if websiteSSL.PushDir {
workDir = websiteSSL.Dir workDir = websiteSSL.Dir
} }
legoLogger.Logger.Println(i18n.GetMsgByKey("ExecShellStart")) printSSLLog(logger, "ExecShellStart", nil, apply.DisableLog)
if err = cmd.ExecShellWithTimeOut(websiteSSL.Shell, workDir, logger, 30*time.Minute); err != nil { if err = cmd.ExecShellWithTimeOut(websiteSSL.Shell, workDir, logger, 30*time.Minute); err != nil {
legoLogger.Logger.Println(i18n.GetMsgWithMap("ErrExecShell", map[string]interface{}{"err": err.Error()})) printSSLLog(logger, "ErrExecShell", map[string]interface{}{"err": err.Error()}, apply.DisableLog)
} else { } else {
legoLogger.Logger.Println(i18n.GetMsgByKey("ExecShellSuccess")) printSSLLog(logger, "ExecShellSuccess", nil, apply.DisableLog)
} }
} }
@@ -320,9 +329,9 @@ func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error {
websites, _ := websiteRepo.GetBy(websiteRepo.WithWebsiteSSLID(websiteSSL.ID)) websites, _ := websiteRepo.GetBy(websiteRepo.WithWebsiteSSLID(websiteSSL.ID))
if len(websites) > 0 { if len(websites) > 0 {
for _, website := range websites { for _, website := range websites {
legoLogger.Logger.Println(i18n.GetMsgWithMap("ApplyWebSiteSSLLog", map[string]interface{}{"name": website.PrimaryDomain})) printSSLLog(logger, "ApplyWebSiteSSLLog", map[string]interface{}{"name": website.PrimaryDomain}, apply.DisableLog)
if err := createPemFile(website, *websiteSSL); err != nil { if err := createPemFile(website, *websiteSSL); err != nil {
legoLogger.Logger.Println(i18n.GetMsgWithMap("ErrUpdateWebsiteSSL", map[string]interface{}{"name": website.PrimaryDomain, "err": err.Error()})) printSSLLog(logger, "ErrUpdateWebsiteSSL", map[string]interface{}{"name": website.PrimaryDomain, "err": err.Error()}, apply.DisableLog)
} }
} }
nginxInstall, err := getAppInstallByKey(constant.AppOpenresty) nginxInstall, err := getAppInstallByKey(constant.AppOpenresty)
@@ -330,10 +339,10 @@ func (w WebsiteSSLService) ObtainSSL(apply request.WebsiteSSLApply) error {
return return
} }
if err := opNginx(nginxInstall.ContainerName, constant.NginxReload); err != nil { if err := opNginx(nginxInstall.ContainerName, constant.NginxReload); err != nil {
legoLogger.Logger.Println(i18n.GetMsgByKey(constant.ErrSSLApply)) printSSLLog(logger, constant.ErrSSLApply, nil, apply.DisableLog)
return return
} }
legoLogger.Logger.Println(i18n.GetMsgByKey("ApplyWebSiteSSLSuccess")) printSSLLog(logger, "ApplyWebSiteSSLSuccess", nil, apply.DisableLog)
} }
}() }()
+14 -7
View File
@@ -3,7 +3,6 @@ package service
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/1Panel-dev/1Panel/backend/utils/xpack"
"log" "log"
"os" "os"
"path" "path"
@@ -13,6 +12,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/i18n" "github.com/1Panel-dev/1Panel/backend/i18n"
@@ -1001,20 +1002,23 @@ func saveCertificateFile(websiteSSL *model.WebsiteSSL, logger *log.Logger) {
} }
} }
func GetSystemSSL() (bool, uint) { func GetSystemSSL() (bool, bool, uint) {
sslSetting, err := settingRepo.Get(settingRepo.WithByKey("SSL")) sslSetting, err := settingRepo.Get(settingRepo.WithByKey("SSL"))
if err != nil { if err != nil {
global.LOG.Errorf("load service ssl from setting failed, err: %v", err) global.LOG.Errorf("load service ssl from setting failed, err: %v", err)
return false, 0 return false, false, 0
} }
if sslSetting.Value == "enable" { if sslSetting.Value == "enable" {
sslID, _ := settingRepo.Get(settingRepo.WithByKey("SSLID")) sslID, _ := settingRepo.Get(settingRepo.WithByKey("SSLID"))
idValue, _ := strconv.Atoi(sslID.Value) idValue, _ := strconv.Atoi(sslID.Value)
if idValue > 0 { if idValue <= 0 {
return true, uint(idValue) return false, false, 0
} }
auto, _ := settingRepo.Get(settingRepo.WithByKey("AutoRestart"))
return true, auto.Value == "enable", uint(idValue)
} }
return false, 0 return false, false, 0
} }
func UpdateSSLConfig(websiteSSL model.WebsiteSSL) error { func UpdateSSLConfig(websiteSSL model.WebsiteSSL) error {
@@ -1033,7 +1037,7 @@ func UpdateSSLConfig(websiteSSL model.WebsiteSSL) error {
return buserr.WithErr(constant.ErrSSLApply, err) return buserr.WithErr(constant.ErrSSLApply, err)
} }
} }
enable, sslID := GetSystemSSL() enable, auto, sslID := GetSystemSSL()
if enable && sslID == websiteSSL.ID { if enable && sslID == websiteSSL.ID {
fileOp := files.NewFileOp() fileOp := files.NewFileOp()
secretDir := path.Join(global.CONF.System.BaseDir, "1panel/secret") secretDir := path.Join(global.CONF.System.BaseDir, "1panel/secret")
@@ -1045,6 +1049,9 @@ func UpdateSSLConfig(websiteSSL model.WebsiteSSL) error {
global.LOG.Errorf("Failed to update the SSL certificate for 1Panel System domain [%s] , err:%s", websiteSSL.PrimaryDomain, err.Error()) global.LOG.Errorf("Failed to update the SSL certificate for 1Panel System domain [%s] , err:%s", websiteSSL.PrimaryDomain, err.Error())
return err return err
} }
if auto {
_, _ = cmd.Exec("systemctl restart 1panel.service")
}
} }
return nil return nil
} }
+7 -2
View File
@@ -10,6 +10,7 @@ import (
"github.com/1Panel-dev/1Panel/backend/app/service" "github.com/1Panel-dev/1Panel/backend/app/service"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
"github.com/1Panel-dev/1Panel/backend/utils/common" "github.com/1Panel-dev/1Panel/backend/utils/common"
"github.com/1Panel-dev/1Panel/backend/utils/files" "github.com/1Panel-dev/1Panel/backend/utils/files"
) )
@@ -22,7 +23,7 @@ func NewSSLJob() *ssl {
} }
func (ssl *ssl) Run() { func (ssl *ssl) Run() {
systemSSLEnable, sslID := service.GetSystemSSL() systemSSLEnable, auto, sslID := service.GetSystemSSL()
sslRepo := repo.NewISSLRepo() sslRepo := repo.NewISSLRepo()
sslService := service.NewIWebsiteSSLService() sslService := service.NewIWebsiteSSLService()
sslList, _ := sslRepo.List() sslList, _ := sslRepo.List()
@@ -51,7 +52,8 @@ func (ssl *ssl) Run() {
} }
} else { } else {
if err := sslService.ObtainSSL(request.WebsiteSSLApply{ if err := sslService.ObtainSSL(request.WebsiteSSLApply{
ID: s.ID, ID: s.ID,
DisableLog: true,
}); err != nil { }); err != nil {
global.LOG.Errorf("Failed to update the SSL certificate for the [%s] domain , err:%s", s.PrimaryDomain, err.Error()) global.LOG.Errorf("Failed to update the SSL certificate for the [%s] domain , err:%s", s.PrimaryDomain, err.Error())
continue continue
@@ -69,6 +71,9 @@ func (ssl *ssl) Run() {
global.LOG.Errorf("Failed to update the SSL certificate for 1Panel System domain [%s] , err:%s", s.PrimaryDomain, err.Error()) global.LOG.Errorf("Failed to update the SSL certificate for 1Panel System domain [%s] , err:%s", s.PrimaryDomain, err.Error())
continue continue
} }
if auto {
_, _ = cmd.Exec("systemctl restart 1panel.service")
}
} }
global.LOG.Infof("The SSL certificate for the [%s] domain has been successfully updated", s.PrimaryDomain) global.LOG.Infof("The SSL certificate for the [%s] domain has been successfully updated", s.PrimaryDomain)
} }
+2
View File
@@ -178,6 +178,8 @@ func handleUserInfo(tags string, settingRepo repo.ISettingRepo) {
if err := settingRepo.Update("SecurityEntrance", common.RandStrAndNum(10)); err != nil { if err := settingRepo.Update("SecurityEntrance", common.RandStrAndNum(10)); err != nil {
global.LOG.Fatalf("init entrance before start failed, err: %v", err) global.LOG.Fatalf("init entrance before start failed, err: %v", err)
} }
sudo := cmd.SudoHandleCmd()
_, _ = cmd.Execf("%s sed -i '/CHANGE_USER_INFO=%v/d' /usr/local/bin/1pctl", sudo, global.CONF.System.ChangeUserInfo)
return return
} }
if strings.Contains(global.CONF.System.ChangeUserInfo, "username") { if strings.Contains(global.CONF.System.ChangeUserInfo, "username") {
+2
View File
@@ -95,6 +95,8 @@ func Init() {
migrations.AddClamStatus, migrations.AddClamStatus,
migrations.AddAlertMenu, migrations.AddAlertMenu,
migrations.AddComposeColumn, migrations.AddComposeColumn,
migrations.AddAutoRestart,
}) })
if err := m.Migrate(); err != nil { if err := m.Migrate(); err != nil {
global.LOG.Error(err) global.LOG.Error(err)
@@ -324,3 +324,13 @@ var AddComposeColumn = &gormigrate.Migration{
return nil return nil
}, },
} }
var AddAutoRestart = &gormigrate.Migration{
ID: "20241021-add-auto-restart",
Migrate: func(tx *gorm.DB) error {
if err := tx.Create(&model.Setting{Key: "AutoRestart", Value: "enable"}).Error; err != nil {
return err
}
return nil
},
}
+1 -1
View File
@@ -204,7 +204,7 @@ func SudoHandleCmd() string {
func Which(name string) bool { func Which(name string) bool {
stdout, err := Execf("which %s", name) stdout, err := Execf("which %s", name)
if err != nil || (len(strings.ReplaceAll(stdout, "\n", "")) == 0 && strings.HasPrefix(stdout, "/")) { if err != nil || (len(strings.ReplaceAll(stdout, "\n", "")) == 0) {
return false return false
} }
return true return true
+1
View File
@@ -35,6 +35,7 @@ var repeatKeys = map[string]struct {
"include": {}, "include": {},
"sub_filter": {}, "sub_filter": {},
"add_header": {}, "add_header": {},
"error_page": {},
} }
func IsRepeatKey(key string) bool { func IsRepeatKey(key string) bool {
+2 -2
View File
@@ -3,7 +3,6 @@ package ssl
import ( import (
"crypto" "crypto"
"encoding/json" "encoding/json"
"github.com/1Panel-dev/1Panel/backend/utils/ssl/huaweicloud"
"os" "os"
"strings" "strings"
"time" "time"
@@ -19,6 +18,7 @@ import (
"github.com/go-acme/lego/v4/providers/dns/cloudflare" "github.com/go-acme/lego/v4/providers/dns/cloudflare"
"github.com/go-acme/lego/v4/providers/dns/dnspod" "github.com/go-acme/lego/v4/providers/dns/dnspod"
"github.com/go-acme/lego/v4/providers/dns/godaddy" "github.com/go-acme/lego/v4/providers/dns/godaddy"
"github.com/go-acme/lego/v4/providers/dns/huaweicloud"
"github.com/go-acme/lego/v4/providers/dns/namecheap" "github.com/go-acme/lego/v4/providers/dns/namecheap"
"github.com/go-acme/lego/v4/providers/dns/namedotcom" "github.com/go-acme/lego/v4/providers/dns/namedotcom"
"github.com/go-acme/lego/v4/providers/dns/namesilo" "github.com/go-acme/lego/v4/providers/dns/namesilo"
@@ -199,7 +199,7 @@ func (c *AcmeClient) UseDns(dnsType DnsType, params string, websiteSSL model.Web
dns01.CondOption(len(nameservers) > 0, dns01.CondOption(len(nameservers) > 0,
dns01.AddRecursiveNameservers(nameservers)), dns01.AddRecursiveNameservers(nameservers)),
dns01.CondOption(websiteSSL.SkipDNS, dns01.CondOption(websiteSSL.SkipDNS,
dns01.DisableCompletePropagationRequirement()), dns01.DisableAuthoritativeNssPropagationRequirement()),
dns01.AddDNSTimeout(10*time.Minute), dns01.AddDNSTimeout(10*time.Minute),
) )
} }
@@ -1,288 +0,0 @@
// Package huaweicloud implements a DNS provider for solving the DNS-01 challenge using Huawei Cloud.
package huaweicloud
import (
"errors"
"fmt"
"strconv"
"strings"
"sync"
"time"
"github.com/go-acme/lego/v4/challenge/dns01"
"github.com/go-acme/lego/v4/platform/config/env"
"github.com/go-acme/lego/v4/platform/wait"
hwauthbasic "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
hwconfig "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"
hwdns "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2"
hwmodel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2/model"
hwregion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2/region"
)
// Environment variables names.
const (
envNamespace = "HUAWEICLOUD_"
EnvAccessKeyID = envNamespace + "ACCESS_KEY_ID"
EnvSecretAccessKey = envNamespace + "SECRET_ACCESS_KEY"
EnvRegion = envNamespace + "REGION"
EnvTTL = envNamespace + "TTL"
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
)
// Config is used to configure the creation of the DNSProvider.
type Config struct {
AccessKeyID string
SecretAccessKey string
Region string
PropagationTimeout time.Duration
PollingInterval time.Duration
TTL int32
HTTPTimeout time.Duration
}
// NewDefaultConfig returns a default configuration for the DNSProvider.
func NewDefaultConfig() *Config {
return &Config{
TTL: int32(env.GetOrDefaultInt(EnvTTL, 300)),
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout),
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
HTTPTimeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
}
}
// DNSProvider implements the challenge.Provider interface.
type DNSProvider struct {
config *Config
client *hwdns.DnsClient
recordIDs map[string]string
recordIDsMu sync.Mutex
}
// NewDNSProvider returns a DNSProvider instance configured for Huawei Cloud.
// Credentials must be passed in the environment variables:
// HUAWEICLOUD_ACCESS_KEY_ID, HUAWEICLOUD_SECRET_ACCESS_KEY, and HUAWEICLOUD_REGION.
func NewDNSProvider() (*DNSProvider, error) {
values, err := env.Get(EnvAccessKeyID, EnvSecretAccessKey, EnvRegion)
if err != nil {
return nil, fmt.Errorf("huaweicloud: %w", err)
}
config := NewDefaultConfig()
config.AccessKeyID = values[EnvAccessKeyID]
config.SecretAccessKey = values[EnvSecretAccessKey]
config.Region = values[EnvRegion]
return NewDNSProviderConfig(config)
}
// NewDNSProviderConfig return a DNSProvider instance configured for Huawei Cloud.
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
if config == nil {
return nil, errors.New("huaweicloud: the configuration of the DNS provider is nil")
}
if config.AccessKeyID == "" || config.SecretAccessKey == "" || config.Region == "" {
return nil, errors.New("huaweicloud: credentials missing")
}
auth, err := hwauthbasic.NewCredentialsBuilder().
WithAk(config.AccessKeyID).
WithSk(config.SecretAccessKey).
SafeBuild()
if err != nil {
return nil, fmt.Errorf("huaweicloud: crendential build: %w", err)
}
region, err := hwregion.SafeValueOf(config.Region)
if err != nil {
return nil, fmt.Errorf("huaweicloud: safe region: %w", err)
}
client, err := hwdns.DnsClientBuilder().
WithHttpConfig(hwconfig.DefaultHttpConfig().WithTimeout(config.HTTPTimeout)).
WithRegion(region).
WithCredential(auth).
SafeBuild()
if err != nil {
return nil, fmt.Errorf("huaweicloud: client build: %w", err)
}
return &DNSProvider{
config: config,
client: hwdns.NewDnsClient(client),
recordIDs: map[string]string{},
}, nil
}
// Present creates a TXT record using the specified parameters.
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
info := dns01.GetChallengeInfo(domain, keyAuth)
authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("huaweicloud: could not find zone for domain %q: %w", domain, err)
}
zoneID, err := d.getZoneID(authZone)
if err != nil {
return fmt.Errorf("huaweicloud: %w", err)
}
recordSetID, err := d.getOrCreateRecordSetID(domain, zoneID, info)
if err != nil {
return fmt.Errorf("huaweicloud: %w", err)
}
d.recordIDsMu.Lock()
d.recordIDs[token] = recordSetID
d.recordIDsMu.Unlock()
err = wait.For("record set sync on "+domain, d.config.PropagationTimeout, d.config.PollingInterval, func() (bool, error) {
rs, errShow := d.client.ShowRecordSet(&hwmodel.ShowRecordSetRequest{
ZoneId: zoneID,
RecordsetId: recordSetID,
})
if errShow != nil {
return false, fmt.Errorf("show record set: %w", errShow)
}
return !strings.HasSuffix(deref(rs.Status), "PENDING_"), nil
})
if err != nil {
return fmt.Errorf("huaweicloud: %w", err)
}
return nil
}
// CleanUp removes the TXT record matching the specified parameters.
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
info := dns01.GetChallengeInfo(domain, keyAuth)
// gets the record's unique ID from when we created it
d.recordIDsMu.Lock()
recordID, ok := d.recordIDs[token]
d.recordIDsMu.Unlock()
if !ok {
return fmt.Errorf("huaweicloud: unknown record ID for '%s' '%s'", info.EffectiveFQDN, token)
}
authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("huaweicloud: could not find zone for domain %q: %w", domain, err)
}
zoneID, err := d.getZoneID(authZone)
if err != nil {
return fmt.Errorf("huaweicloud: %w", err)
}
request := &hwmodel.DeleteRecordSetRequest{
ZoneId: zoneID,
RecordsetId: recordID,
}
_, err = d.client.DeleteRecordSet(request)
if err != nil {
return fmt.Errorf("huaweicloud: delete record: %w", err)
}
return nil
}
// Timeout returns the timeout and interval to use when checking for DNS propagation.
// Adjusting here to cope with spikes in propagation times.
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
return d.config.PropagationTimeout, d.config.PollingInterval
}
func (d *DNSProvider) getOrCreateRecordSetID(domain, zoneID string, info dns01.ChallengeInfo) (string, error) {
records, err := d.client.ListRecordSetsByZone(&hwmodel.ListRecordSetsByZoneRequest{
ZoneId: zoneID,
Name: pointer(info.EffectiveFQDN),
})
if err != nil {
return "", fmt.Errorf("record list: unable to get record %s for zone %s: %w", info.EffectiveFQDN, domain, err)
}
var existingRecordSet *hwmodel.ListRecordSets
for _, record := range deref(records.Recordsets) {
if deref(record.Type) == "TXT" && deref(record.Name) == info.EffectiveFQDN {
existingRecordSet = &record
}
}
value := strconv.Quote(info.Value)
if existingRecordSet == nil {
request := &hwmodel.CreateRecordSetRequest{
ZoneId: zoneID,
Body: &hwmodel.CreateRecordSetRequestBody{
Name: info.EffectiveFQDN,
Description: pointer("Added TXT record for ACME dns-01 challenge using lego client"),
Type: "TXT",
Ttl: pointer(d.config.TTL),
Records: []string{value},
},
}
resp, errCreate := d.client.CreateRecordSet(request)
if errCreate != nil {
return "", fmt.Errorf("create record set: %w", errCreate)
}
return deref(resp.Id), nil
}
updateRequest := &hwmodel.UpdateRecordSetRequest{
ZoneId: zoneID,
RecordsetId: deref(existingRecordSet.Id),
Body: &hwmodel.UpdateRecordSetReq{
Name: existingRecordSet.Name,
Description: existingRecordSet.Description,
Type: existingRecordSet.Type,
Ttl: existingRecordSet.Ttl,
Records: pointer(append(deref(existingRecordSet.Records), value)),
},
}
resp, err := d.client.UpdateRecordSet(updateRequest)
if err != nil {
return "", fmt.Errorf("update record set: %w", err)
}
return deref(resp.Id), nil
}
func (d *DNSProvider) getZoneID(authZone string) (string, error) {
zones, err := d.client.ListPublicZones(&hwmodel.ListPublicZonesRequest{})
if err != nil {
return "", fmt.Errorf("unable to get zone: %w", err)
}
for _, zone := range deref(zones.Zones) {
if deref(zone.Name) == authZone {
return deref(zone.Id), nil
}
}
return "", fmt.Errorf("zone %q not found", authZone)
}
func pointer[T any](v T) *T { return &v }
func deref[T any](v *T) T {
if v == nil {
var zero T
return zero
}
return *v
}
@@ -1,29 +0,0 @@
Name = "Huawei Cloud"
Description = ''''''
URL = "https://huaweicloud.com"
Code = "huaweicloud"
Since = "v4.19"
Example = '''
HUAWEICLOUD_ACCESS_KEY_ID=your-access-key-id \
HUAWEICLOUD_SECRET_ACCESS_KEY=your-secret-access-key \
HUAWEICLOUD_REGION=cn-south-1 \
lego --email you@example.com --dns huaweicloud --domains my.example.org run
'''
[Configuration]
[Configuration.Credentials]
HUAWEICLOUD_ACCESS_KEY_ID = "Access key ID"
HUAWEICLOUD_SECRET_ACCESS_KEY = "Access Key secret"
HUAWEICLOUD_REGION = "Region"
[Configuration.Additional]
HUAWEICLOUD_POLLING_INTERVAL = "Time between DNS propagation check"
HUAWEICLOUD_PROPAGATION_TIMEOUT = "Maximum waiting time for DNS propagation"
HUAWEICLOUD_TTL = "The TTL of the TXT record used for the DNS challenge"
HUAWEICLOUD_HTTP_TIMEOUT = "API request timeout"
[Links]
API = "https://console-intl.huaweicloud.com/apiexplorer/#/openapi/DNS/doc?locale=en-us"
CN_API = "https://support.huaweicloud.com/api-dns/zh-cn_topic_0132421999.html"
GoClient = "https://github.com/huaweicloud/huaweicloud-sdk-go-v3"
@@ -1,183 +0,0 @@
package huaweicloud
import (
"testing"
"time"
"github.com/go-acme/lego/v4/platform/tester"
hwregion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2/region"
"github.com/stretchr/testify/require"
)
const envDomain = envNamespace + "DOMAIN"
var envTest = tester.NewEnvTest(EnvAccessKeyID, EnvSecretAccessKey, EnvRegion).
WithDomain(envDomain)
func TestNewDNSProvider(t *testing.T) {
testCases := []struct {
desc string
envVars map[string]string
expected string
}{
{
desc: "success",
envVars: map[string]string{
EnvAccessKeyID: "123",
EnvSecretAccessKey: "456",
EnvRegion: hwregion.CN_EAST_2.Id,
},
// The "success" cannot be tested because there is an API call that require a valid authentication.
// Also, there is a bug during the error message creation:
// https://github.com/huaweicloud/huaweicloud-sdk-go-v3/pull/81
expected: "huaweicloud: client build: runtime error: invalid memory address or nil pointer dereference",
},
{
desc: "missing credentials",
envVars: map[string]string{
EnvAccessKeyID: "",
EnvSecretAccessKey: "",
EnvRegion: "",
},
expected: "huaweicloud: some credentials information are missing: HUAWEICLOUD_ACCESS_KEY_ID,HUAWEICLOUD_SECRET_ACCESS_KEY,HUAWEICLOUD_REGION",
},
{
desc: "missing access id",
envVars: map[string]string{
EnvAccessKeyID: "",
EnvSecretAccessKey: "456",
EnvRegion: hwregion.CN_EAST_2.Id,
},
expected: "huaweicloud: some credentials information are missing: HUAWEICLOUD_ACCESS_KEY_ID",
},
{
desc: "missing secret key",
envVars: map[string]string{
EnvAccessKeyID: "123",
EnvSecretAccessKey: "",
EnvRegion: hwregion.CN_EAST_2.Id,
},
expected: "huaweicloud: some credentials information are missing: HUAWEICLOUD_SECRET_ACCESS_KEY",
},
{
desc: "missing secret key",
envVars: map[string]string{
EnvAccessKeyID: "123",
EnvSecretAccessKey: "456",
EnvRegion: "",
},
expected: "huaweicloud: some credentials information are missing: HUAWEICLOUD_REGION",
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {
defer envTest.RestoreEnv()
envTest.ClearEnv()
envTest.Apply(test.envVars)
p, err := NewDNSProvider()
if test.expected == "" {
require.NoError(t, err)
require.NotNil(t, p)
require.NotNil(t, p.config)
require.NotNil(t, p.client)
} else {
require.EqualError(t, err, test.expected)
}
})
}
}
func TestNewDNSProviderConfig(t *testing.T) {
testCases := []struct {
desc string
accessKeyID string
secretAccessKey string
region string
expected string
}{
{
desc: "success",
accessKeyID: "123",
secretAccessKey: "456",
region: hwregion.CN_EAST_2.Id,
// The "success" cannot be tested because there is an API call that require a valid authentication.
// Also, there is a bug during the error message creation:
// https://github.com/huaweicloud/huaweicloud-sdk-go-v3/pull/81
expected: "huaweicloud: client build: runtime error: invalid memory address or nil pointer dereference",
},
{
desc: "missing credentials",
expected: "huaweicloud: credentials missing",
},
{
desc: "missing secret id",
secretAccessKey: "456",
region: hwregion.CN_EAST_2.Id,
expected: "huaweicloud: credentials missing",
},
{
desc: "missing secret key",
accessKeyID: "123",
region: hwregion.CN_EAST_2.Id,
expected: "huaweicloud: credentials missing",
},
{
desc: "missing region",
accessKeyID: "123",
secretAccessKey: "456",
expected: "huaweicloud: credentials missing",
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {
config := NewDefaultConfig()
config.AccessKeyID = test.accessKeyID
config.SecretAccessKey = test.secretAccessKey
config.Region = test.region
p, err := NewDNSProviderConfig(config)
if test.expected == "" {
require.NoError(t, err)
require.NotNil(t, p)
require.NotNil(t, p.config)
require.NotNil(t, p.client)
} else {
require.EqualError(t, err, test.expected)
}
})
}
}
func TestLivePresent(t *testing.T) {
if !envTest.IsLiveTest() {
t.Skip("skipping live test")
}
envTest.RestoreEnv()
provider, err := NewDNSProvider()
require.NoError(t, err)
err = provider.Present(envTest.GetDomain(), "", "123d==")
require.NoError(t, err)
}
func TestLiveCleanUp(t *testing.T) {
if !envTest.IsLiveTest() {
t.Skip("skipping live test")
}
envTest.RestoreEnv()
provider, err := NewDNSProvider()
require.NoError(t, err)
time.Sleep(1 * time.Second)
err = provider.CleanUp(envTest.GetDomain(), "", "123d==")
require.NoError(t, err)
}
-21
View File
@@ -8,7 +8,6 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
@@ -40,23 +39,3 @@ func LoadXpuInfo() []interface{} {
func StartClam(startClam model.Clam, isUpdate bool) (int, error) { func StartClam(startClam model.Clam, isUpdate bool) (int, error) {
return 0, buserr.New(constant.ErrXpackNotFound) return 0, buserr.New(constant.ErrXpackNotFound)
} }
func CreateAlert(createAlert dto.CreateOrUpdateAlert) error {
return nil
}
func UpdateAlert(updateAlert dto.CreateOrUpdateAlert) error {
return nil
}
func DeleteAlert(alertBase dto.AlertBase) error {
return nil
}
func GetAlert(alertBase dto.AlertBase) uint {
return 0
}
func PushAlert(pushAlert dto.PushAlert) error {
return nil
}
+1 -1
View File
@@ -2,7 +2,7 @@ system:
db_file: 1Panel.db db_file: 1Panel.db
base_dir: /opt base_dir: /opt
mode: dev mode: dev
repo_url: https://resource.fit2cloud.com/1panel/package repo_url: https://resource.fit2cloud.com/1panel/package/aliyun
app_repo: https://apps-assets.fit2cloud.com app_repo: https://apps-assets.fit2cloud.com
is_demo: false is_demo: false
port: 9999 port: 9999
+192 -20
View File
@@ -3872,8 +3872,8 @@ const docTemplate = `{
} }
} }
}, },
"/dashboard/current/:ioOption/:netOption": { "/dashboard/current": {
"get": { "post": {
"security": [ "security": [
{ {
"ApiKeyAuth": [] "ApiKeyAuth": []
@@ -3889,18 +3889,13 @@ const docTemplate = `{
"summary": "Load dashboard current info", "summary": "Load dashboard current info",
"parameters": [ "parameters": [
{ {
"type": "string",
"description": "request", "description": "request",
"name": "ioOption", "name": "request",
"in": "path", "in": "body",
"required": true "required": true,
}, "schema": {
{ "$ref": "#/definitions/dto.DashboardReq"
"type": "string", }
"description": "request",
"name": "netOption",
"in": "path",
"required": true
} }
], ],
"responses": { "responses": {
@@ -9130,8 +9125,8 @@ const docTemplate = `{
"bodyKeys": [ "bodyKeys": [
"id" "id"
], ],
"formatEN": "Delete website [name]", "formatEN": "Delete runtime [name]",
"formatZH": "删除网站 [name]", "formatZH": "删除运行环境 [name]",
"paramKeys": [] "paramKeys": []
} }
} }
@@ -10808,7 +10803,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/dto.SearchWithPage" "$ref": "#/definitions/dto.PageSnapshot"
} }
} }
], ],
@@ -10822,6 +10817,39 @@ const docTemplate = `{
} }
} }
}, },
"/settings/snapshot/size": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取系统快照大小",
"consumes": [
"application/json"
],
"tags": [
"System Setting"
],
"summary": "Load system snapshot size",
"parameters": [
{
"description": "request",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dto.PageSnapshot"
}
}
],
"responses": {
"200": {
"description": "OK"
}
}
}
},
"/settings/snapshot/status": { "/settings/snapshot/status": {
"post": { "post": {
"security": [ "security": [
@@ -15591,6 +15619,12 @@ const docTemplate = `{
"dto.ClamCreate": { "dto.ClamCreate": {
"type": "object", "type": "object",
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"description": { "description": {
"type": "string" "type": "string"
}, },
@@ -15689,6 +15723,12 @@ const docTemplate = `{
"dto.ClamUpdate": { "dto.ClamUpdate": {
"type": "object", "type": "object",
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"description": { "description": {
"type": "string" "type": "string"
}, },
@@ -15805,6 +15845,9 @@ const docTemplate = `{
"detailName": { "detailName": {
"type": "string" "type": "string"
}, },
"fileName": {
"type": "string"
},
"name": { "name": {
"type": "string" "type": "string"
}, },
@@ -15876,6 +15919,12 @@ const docTemplate = `{
"from" "from"
], ],
"properties": { "properties": {
"env": {
"type": "array",
"items": {
"type": "string"
}
},
"file": { "file": {
"type": "string" "type": "string"
}, },
@@ -15902,8 +15951,7 @@ const docTemplate = `{
"type": "object", "type": "object",
"required": [ "required": [
"name", "name",
"operation", "operation"
"path"
], ],
"properties": { "properties": {
"name": { "name": {
@@ -15912,9 +15960,11 @@ const docTemplate = `{
"operation": { "operation": {
"type": "string", "type": "string",
"enum": [ "enum": [
"up",
"start", "start",
"stop", "stop",
"down" "down",
"delete"
] ]
}, },
"path": { "path": {
@@ -15987,6 +16037,12 @@ const docTemplate = `{
"content": { "content": {
"type": "string" "type": "string"
}, },
"env": {
"type": "array",
"items": {
"type": "string"
}
},
"name": { "name": {
"type": "string" "type": "string"
}, },
@@ -16162,6 +16218,7 @@ const docTemplate = `{
"operation": { "operation": {
"type": "string", "type": "string",
"enum": [ "enum": [
"up",
"start", "start",
"stop", "stop",
"restart", "restart",
@@ -16309,6 +16366,12 @@ const docTemplate = `{
"type" "type"
], ],
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"appID": { "appID": {
"type": "string" "type": "string"
}, },
@@ -16383,9 +16446,16 @@ const docTemplate = `{
"required": [ "required": [
"id", "id",
"name", "name",
"spec" "spec",
"type"
], ],
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"appID": { "appID": {
"type": "string" "type": "string"
}, },
@@ -16432,6 +16502,9 @@ const docTemplate = `{
"spec": { "spec": {
"type": "string" "type": "string"
}, },
"type": {
"type": "string"
},
"url": { "url": {
"type": "string" "type": "string"
}, },
@@ -16557,6 +16630,9 @@ const docTemplate = `{
"dto.DashboardBase": { "dto.DashboardBase": {
"type": "object", "type": "object",
"properties": { "properties": {
"SystemProxy": {
"type": "string"
},
"appInstalledNumber": { "appInstalledNumber": {
"type": "integer" "type": "integer"
}, },
@@ -16581,6 +16657,9 @@ const docTemplate = `{
"hostname": { "hostname": {
"type": "string" "type": "string"
}, },
"ipv4Addr": {
"type": "string"
},
"kernelArch": { "kernelArch": {
"type": "string" "type": "string"
}, },
@@ -16705,6 +16784,26 @@ const docTemplate = `{
}, },
"uptime": { "uptime": {
"type": "integer" "type": "integer"
},
"xpuData": {
"type": "array",
"items": {
"$ref": "#/definitions/dto.XPUInfo"
}
}
}
},
"dto.DashboardReq": {
"type": "object",
"properties": {
"ioOption": {
"type": "string"
},
"netOption": {
"type": "string"
},
"scope": {
"type": "string"
} }
} }
}, },
@@ -18608,6 +18707,41 @@ const docTemplate = `{
} }
} }
}, },
"dto.PageSnapshot": {
"type": "object",
"required": [
"order",
"orderBy",
"page",
"pageSize"
],
"properties": {
"info": {
"type": "string"
},
"order": {
"type": "string",
"enum": [
"null",
"ascending",
"descending"
]
},
"orderBy": {
"type": "string",
"enum": [
"name",
"created_at"
]
},
"page": {
"type": "integer"
},
"pageSize": {
"type": "integer"
}
}
},
"dto.PasswordUpdate": { "dto.PasswordUpdate": {
"type": "object", "type": "object",
"required": [ "required": [
@@ -19273,6 +19407,9 @@ const docTemplate = `{
"sslType" "sslType"
], ],
"properties": { "properties": {
"autoRestart": {
"type": "string"
},
"cert": { "cert": {
"type": "string" "type": "string"
}, },
@@ -19501,6 +19638,9 @@ const docTemplate = `{
"appStoreVersion": { "appStoreVersion": {
"type": "string" "type": "string"
}, },
"autoRestart": {
"type": "string"
},
"bindAddress": { "bindAddress": {
"type": "string" "type": "string"
}, },
@@ -19925,6 +20065,32 @@ const docTemplate = `{
} }
} }
}, },
"dto.XPUInfo": {
"type": "object",
"properties": {
"deviceID": {
"type": "integer"
},
"deviceName": {
"type": "string"
},
"memory": {
"type": "string"
},
"memoryUsed": {
"type": "string"
},
"memoryUtil": {
"type": "string"
},
"power": {
"type": "string"
},
"temperature": {
"type": "string"
}
}
},
"files.FileInfo": { "files.FileInfo": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -22434,6 +22600,9 @@ const docTemplate = `{
"proxyPass": { "proxyPass": {
"type": "string" "type": "string"
}, },
"proxySSLName": {
"type": "string"
},
"replaces": { "replaces": {
"type": "object", "type": "object",
"additionalProperties": { "additionalProperties": {
@@ -22476,6 +22645,9 @@ const docTemplate = `{
"ID": { "ID": {
"type": "integer" "type": "integer"
}, },
"disableLog": {
"type": "boolean"
},
"nameservers": { "nameservers": {
"type": "array", "type": "array",
"items": { "items": {
+192 -20
View File
@@ -3866,8 +3866,8 @@
} }
} }
}, },
"/dashboard/current/:ioOption/:netOption": { "/dashboard/current": {
"get": { "post": {
"security": [ "security": [
{ {
"ApiKeyAuth": [] "ApiKeyAuth": []
@@ -3883,18 +3883,13 @@
"summary": "Load dashboard current info", "summary": "Load dashboard current info",
"parameters": [ "parameters": [
{ {
"type": "string",
"description": "request", "description": "request",
"name": "ioOption", "name": "request",
"in": "path", "in": "body",
"required": true "required": true,
}, "schema": {
{ "$ref": "#/definitions/dto.DashboardReq"
"type": "string", }
"description": "request",
"name": "netOption",
"in": "path",
"required": true
} }
], ],
"responses": { "responses": {
@@ -9124,8 +9119,8 @@
"bodyKeys": [ "bodyKeys": [
"id" "id"
], ],
"formatEN": "Delete website [name]", "formatEN": "Delete runtime [name]",
"formatZH": "删除网站 [name]", "formatZH": "删除运行环境 [name]",
"paramKeys": [] "paramKeys": []
} }
} }
@@ -10802,7 +10797,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/dto.SearchWithPage" "$ref": "#/definitions/dto.PageSnapshot"
} }
} }
], ],
@@ -10816,6 +10811,39 @@
} }
} }
}, },
"/settings/snapshot/size": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取系统快照大小",
"consumes": [
"application/json"
],
"tags": [
"System Setting"
],
"summary": "Load system snapshot size",
"parameters": [
{
"description": "request",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dto.PageSnapshot"
}
}
],
"responses": {
"200": {
"description": "OK"
}
}
}
},
"/settings/snapshot/status": { "/settings/snapshot/status": {
"post": { "post": {
"security": [ "security": [
@@ -15585,6 +15613,12 @@
"dto.ClamCreate": { "dto.ClamCreate": {
"type": "object", "type": "object",
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"description": { "description": {
"type": "string" "type": "string"
}, },
@@ -15683,6 +15717,12 @@
"dto.ClamUpdate": { "dto.ClamUpdate": {
"type": "object", "type": "object",
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"description": { "description": {
"type": "string" "type": "string"
}, },
@@ -15799,6 +15839,9 @@
"detailName": { "detailName": {
"type": "string" "type": "string"
}, },
"fileName": {
"type": "string"
},
"name": { "name": {
"type": "string" "type": "string"
}, },
@@ -15870,6 +15913,12 @@
"from" "from"
], ],
"properties": { "properties": {
"env": {
"type": "array",
"items": {
"type": "string"
}
},
"file": { "file": {
"type": "string" "type": "string"
}, },
@@ -15896,8 +15945,7 @@
"type": "object", "type": "object",
"required": [ "required": [
"name", "name",
"operation", "operation"
"path"
], ],
"properties": { "properties": {
"name": { "name": {
@@ -15906,9 +15954,11 @@
"operation": { "operation": {
"type": "string", "type": "string",
"enum": [ "enum": [
"up",
"start", "start",
"stop", "stop",
"down" "down",
"delete"
] ]
}, },
"path": { "path": {
@@ -15981,6 +16031,12 @@
"content": { "content": {
"type": "string" "type": "string"
}, },
"env": {
"type": "array",
"items": {
"type": "string"
}
},
"name": { "name": {
"type": "string" "type": "string"
}, },
@@ -16156,6 +16212,7 @@
"operation": { "operation": {
"type": "string", "type": "string",
"enum": [ "enum": [
"up",
"start", "start",
"stop", "stop",
"restart", "restart",
@@ -16303,6 +16360,12 @@
"type" "type"
], ],
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"appID": { "appID": {
"type": "string" "type": "string"
}, },
@@ -16377,9 +16440,16 @@
"required": [ "required": [
"id", "id",
"name", "name",
"spec" "spec",
"type"
], ],
"properties": { "properties": {
"alertCount": {
"type": "integer"
},
"alertTitle": {
"type": "string"
},
"appID": { "appID": {
"type": "string" "type": "string"
}, },
@@ -16426,6 +16496,9 @@
"spec": { "spec": {
"type": "string" "type": "string"
}, },
"type": {
"type": "string"
},
"url": { "url": {
"type": "string" "type": "string"
}, },
@@ -16551,6 +16624,9 @@
"dto.DashboardBase": { "dto.DashboardBase": {
"type": "object", "type": "object",
"properties": { "properties": {
"SystemProxy": {
"type": "string"
},
"appInstalledNumber": { "appInstalledNumber": {
"type": "integer" "type": "integer"
}, },
@@ -16575,6 +16651,9 @@
"hostname": { "hostname": {
"type": "string" "type": "string"
}, },
"ipv4Addr": {
"type": "string"
},
"kernelArch": { "kernelArch": {
"type": "string" "type": "string"
}, },
@@ -16699,6 +16778,26 @@
}, },
"uptime": { "uptime": {
"type": "integer" "type": "integer"
},
"xpuData": {
"type": "array",
"items": {
"$ref": "#/definitions/dto.XPUInfo"
}
}
}
},
"dto.DashboardReq": {
"type": "object",
"properties": {
"ioOption": {
"type": "string"
},
"netOption": {
"type": "string"
},
"scope": {
"type": "string"
} }
} }
}, },
@@ -18602,6 +18701,41 @@
} }
} }
}, },
"dto.PageSnapshot": {
"type": "object",
"required": [
"order",
"orderBy",
"page",
"pageSize"
],
"properties": {
"info": {
"type": "string"
},
"order": {
"type": "string",
"enum": [
"null",
"ascending",
"descending"
]
},
"orderBy": {
"type": "string",
"enum": [
"name",
"created_at"
]
},
"page": {
"type": "integer"
},
"pageSize": {
"type": "integer"
}
}
},
"dto.PasswordUpdate": { "dto.PasswordUpdate": {
"type": "object", "type": "object",
"required": [ "required": [
@@ -19267,6 +19401,9 @@
"sslType" "sslType"
], ],
"properties": { "properties": {
"autoRestart": {
"type": "string"
},
"cert": { "cert": {
"type": "string" "type": "string"
}, },
@@ -19495,6 +19632,9 @@
"appStoreVersion": { "appStoreVersion": {
"type": "string" "type": "string"
}, },
"autoRestart": {
"type": "string"
},
"bindAddress": { "bindAddress": {
"type": "string" "type": "string"
}, },
@@ -19919,6 +20059,32 @@
} }
} }
}, },
"dto.XPUInfo": {
"type": "object",
"properties": {
"deviceID": {
"type": "integer"
},
"deviceName": {
"type": "string"
},
"memory": {
"type": "string"
},
"memoryUsed": {
"type": "string"
},
"memoryUtil": {
"type": "string"
},
"power": {
"type": "string"
},
"temperature": {
"type": "string"
}
}
},
"files.FileInfo": { "files.FileInfo": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -22428,6 +22594,9 @@
"proxyPass": { "proxyPass": {
"type": "string" "type": "string"
}, },
"proxySSLName": {
"type": "string"
},
"replaces": { "replaces": {
"type": "object", "type": "object",
"additionalProperties": { "additionalProperties": {
@@ -22470,6 +22639,9 @@
"ID": { "ID": {
"type": "integer" "type": "integer"
}, },
"disableLog": {
"type": "boolean"
},
"nameservers": { "nameservers": {
"type": "array", "type": "array",
"items": { "items": {
+128 -14
View File
@@ -233,6 +233,10 @@ definitions:
type: object type: object
dto.ClamCreate: dto.ClamCreate:
properties: properties:
alertCount:
type: integer
alertTitle:
type: string
description: description:
type: string type: string
infectedDir: infectedDir:
@@ -297,6 +301,10 @@ definitions:
type: object type: object
dto.ClamUpdate: dto.ClamUpdate:
properties: properties:
alertCount:
type: integer
alertTitle:
type: string
description: description:
type: string type: string
id: id:
@@ -371,6 +379,8 @@ definitions:
properties: properties:
detailName: detailName:
type: string type: string
fileName:
type: string
name: name:
type: string type: string
secret: secret:
@@ -424,6 +434,10 @@ definitions:
type: object type: object
dto.ComposeCreate: dto.ComposeCreate:
properties: properties:
env:
items:
type: string
type: array
file: file:
type: string type: string
from: from:
@@ -447,9 +461,11 @@ definitions:
type: string type: string
operation: operation:
enum: enum:
- up
- start - start
- stop - stop
- down - down
- delete
type: string type: string
path: path:
type: string type: string
@@ -458,7 +474,6 @@ definitions:
required: required:
- name - name
- operation - operation
- path
type: object type: object
dto.ComposeTemplateCreate: dto.ComposeTemplateCreate:
properties: properties:
@@ -497,6 +512,10 @@ definitions:
properties: properties:
content: content:
type: string type: string
env:
items:
type: string
type: array
name: name:
type: string type: string
path: path:
@@ -614,6 +633,7 @@ definitions:
type: array type: array
operation: operation:
enum: enum:
- up
- start - start
- stop - stop
- restart - restart
@@ -713,6 +733,10 @@ definitions:
type: object type: object
dto.CronjobCreate: dto.CronjobCreate:
properties: properties:
alertCount:
type: integer
alertTitle:
type: string
appID: appID:
type: string type: string
backupAccounts: backupAccounts:
@@ -765,6 +789,10 @@ definitions:
type: object type: object
dto.CronjobUpdate: dto.CronjobUpdate:
properties: properties:
alertCount:
type: integer
alertTitle:
type: string
appID: appID:
type: string type: string
backupAccounts: backupAccounts:
@@ -796,6 +824,8 @@ definitions:
type: string type: string
spec: spec:
type: string type: string
type:
type: string
url: url:
type: string type: string
website: website:
@@ -804,6 +834,7 @@ definitions:
- id - id
- name - name
- spec - spec
- type
type: object type: object
dto.CronjobUpdateStatus: dto.CronjobUpdateStatus:
properties: properties:
@@ -883,6 +914,8 @@ definitions:
type: object type: object
dto.DashboardBase: dto.DashboardBase:
properties: properties:
SystemProxy:
type: string
appInstalledNumber: appInstalledNumber:
type: integer type: integer
cpuCores: cpuCores:
@@ -899,6 +932,8 @@ definitions:
type: integer type: integer
hostname: hostname:
type: string type: string
ipv4Addr:
type: string
kernelArch: kernelArch:
type: string type: string
kernelVersion: kernelVersion:
@@ -982,6 +1017,19 @@ definitions:
type: string type: string
uptime: uptime:
type: integer type: integer
xpuData:
items:
$ref: '#/definitions/dto.XPUInfo'
type: array
type: object
dto.DashboardReq:
properties:
ioOption:
type: string
netOption:
type: string
scope:
type: string
type: object type: object
dto.DatabaseCreate: dto.DatabaseCreate:
properties: properties:
@@ -2278,6 +2326,31 @@ definitions:
total: total:
type: integer type: integer
type: object type: object
dto.PageSnapshot:
properties:
info:
type: string
order:
enum:
- "null"
- ascending
- descending
type: string
orderBy:
enum:
- name
- created_at
type: string
page:
type: integer
pageSize:
type: integer
required:
- order
- orderBy
- page
- pageSize
type: object
dto.PasswordUpdate: dto.PasswordUpdate:
properties: properties:
newPassword: newPassword:
@@ -2723,6 +2796,8 @@ definitions:
type: object type: object
dto.SSLUpdate: dto.SSLUpdate:
properties: properties:
autoRestart:
type: string
cert: cert:
type: string type: string
domain: domain:
@@ -2882,6 +2957,8 @@ definitions:
type: string type: string
appStoreVersion: appStoreVersion:
type: string type: string
autoRestart:
type: string
bindAddress: bindAddress:
type: string type: string
bindDomain: bindDomain:
@@ -3161,6 +3238,23 @@ definitions:
type: type:
type: string type: string
type: object type: object
dto.XPUInfo:
properties:
deviceID:
type: integer
deviceName:
type: string
memory:
type: string
memoryUsed:
type: string
memoryUtil:
type: string
power:
type: string
temperature:
type: string
type: object
files.FileInfo: files.FileInfo:
properties: properties:
content: content:
@@ -4836,6 +4930,8 @@ definitions:
type: string type: string
proxyPass: proxyPass:
type: string type: string
proxySSLName:
type: string
replaces: replaces:
additionalProperties: additionalProperties:
type: string type: string
@@ -4868,6 +4964,8 @@ definitions:
properties: properties:
ID: ID:
type: integer type: integer
disableLog:
type: boolean
nameservers: nameservers:
items: items:
type: string type: string
@@ -7981,22 +8079,18 @@ paths:
summary: Load os info summary: Load os info
tags: tags:
- Dashboard - Dashboard
/dashboard/current/:ioOption/:netOption: /dashboard/current:
get: post:
consumes: consumes:
- application/json - application/json
description: 获取首页实时数据 description: 获取首页实时数据
parameters: parameters:
- description: request - description: request
in: path in: body
name: ioOption name: request
required: true required: true
type: string schema:
- description: request $ref: '#/definitions/dto.DashboardReq'
in: path
name: netOption
required: true
type: string
responses: responses:
"200": "200":
description: OK description: OK
@@ -11310,8 +11404,8 @@ paths:
BeforeFunctions: [] BeforeFunctions: []
bodyKeys: bodyKeys:
- id - id
formatEN: Delete website [name] formatEN: Delete runtime [name]
formatZH: 删除网站 [name] formatZH: 删除运行环境 [name]
paramKeys: [] paramKeys: []
/runtimes/node/modules: /runtimes/node/modules:
post: post:
@@ -12368,7 +12462,7 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/dto.SearchWithPage' $ref: '#/definitions/dto.PageSnapshot'
responses: responses:
"200": "200":
description: OK description: OK
@@ -12379,6 +12473,26 @@ paths:
summary: Page system snapshot summary: Page system snapshot
tags: tags:
- System Setting - System Setting
/settings/snapshot/size:
post:
consumes:
- application/json
description: 获取系统快照大小
parameters:
- description: request
in: body
name: request
required: true
schema:
$ref: '#/definitions/dto.PageSnapshot'
responses:
"200":
description: OK
security:
- ApiKeyAuth: []
summary: Load system snapshot size
tags:
- System Setting
/settings/snapshot/status: /settings/snapshot/status:
post: post:
consumes: consumes:
-3
View File
@@ -30,9 +30,6 @@ export namespace Cronjob {
retainCopies: number; retainCopies: number;
status: string; status: string;
secret: string; secret: string;
hasAlert: boolean;
alertCount: number;
alertTitle: string;
} }
export interface CronjobCreate { export interface CronjobCreate {
name: string; name: string;
+2 -1
View File
@@ -29,6 +29,7 @@ export namespace Setting {
bindAddress: string; bindAddress: string;
ssl: string; ssl: string;
sslType: string; sslType: string;
autoRestart: string;
allowIPs: string; allowIPs: string;
bindDomain: string; bindDomain: string;
securityEntrance: string; securityEntrance: string;
@@ -134,7 +135,7 @@ export namespace Setting {
description: string; description: string;
status: string; status: string;
message: string; message: string;
createdAt: DateTimeFormats; created_at: DateTimeFormats;
version: string; version: string;
interruptStep: string; interruptStep: string;
recoverStatus: string; recoverStatus: string;
-3
View File
@@ -139,9 +139,6 @@ export namespace Toolbox {
spec: string; spec: string;
specObj: Cronjob.SpecObj; specObj: Cronjob.SpecObj;
description: string; description: string;
hasAlert: boolean;
alertCount: number;
alertTitle: string;
} }
export interface ClamCreate { export interface ClamCreate {
name: string; name: string;
+1 -1
View File
@@ -43,7 +43,7 @@ export const containerRename = (params: Container.ContainerRename) => {
return http.post(`/containers/rename`, params); return http.post(`/containers/rename`, params);
}; };
export const containerOperator = (params: Container.ContainerOperate) => { export const containerOperator = (params: Container.ContainerOperate) => {
return http.post(`/containers/operate`, params); return http.post(`/containers/operate`, params, TimeoutEnum.T_60S);
}; };
export const containerPrune = (params: Container.ContainerPrune) => { export const containerPrune = (params: Container.ContainerPrune) => {
return http.post<Container.ContainerPruneReport>(`/containers/prune`, params); return http.post<Container.ContainerPruneReport>(`/containers/prune`, params);
+5 -16
View File
@@ -107,7 +107,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { CheckAppInstalled, InstalledOp } from '@/api/modules/app'; import { CheckAppInstalled, InstalledOp } from '@/api/modules/app';
import router from '@/routers'; import router from '@/routers';
import { onMounted, reactive, ref, watch } from 'vue'; import { onMounted, reactive, ref } from 'vue';
import Status from '@/components/status/index.vue'; import Status from '@/components/status/index.vue';
import { ElMessageBox } from 'element-plus'; import { ElMessageBox } from 'element-plus';
import i18n from '@/lang'; import i18n from '@/lang';
@@ -125,21 +125,6 @@ const props = defineProps({
}, },
}); });
watch(
() => props.appKey,
(val) => {
key.value = val;
onCheck();
},
);
watch(
() => props.appName,
(val) => {
name.value = val;
onCheck();
},
);
let key = ref(''); let key = ref('');
let name = ref(''); let name = ref('');
@@ -250,4 +235,8 @@ onMounted(() => {
name.value = props.appName; name.value = props.appName;
onCheck(); onCheck();
}); });
defineExpose({
onCheck,
});
</script> </script>
+4 -4
View File
@@ -188,7 +188,7 @@ const closePage = () => {
const openPage = () => { const openPage = () => {
popoverVisible.value = true; popoverVisible.value = true;
selectRow.value.path = props.path || '/'; selectRow.value.path = props.dir ? props.path || '/' : '';
rowName.value = ''; rowName.value = '';
}; };
@@ -216,7 +216,7 @@ const open = async (row: File.File) => {
} }
await search(req); await search(req);
} }
selectRow.value.path = req.path; selectRow.value.path = props.dir ? req.path : '';
rowName.value = ''; rowName.value = '';
}; };
@@ -230,7 +230,7 @@ const jump = async (index: number) => {
} }
path = path || '/'; path = path || '/';
req.path = path; req.path = path;
selectRow.value.path = req.path; selectRow.value.path = props.dir ? req.path : '';
rowName.value = ''; rowName.value = '';
await search(req); await search(req);
popoverVisible.value = true; popoverVisible.value = true;
@@ -286,7 +286,7 @@ const cancelFolder = (row: any) => {
data.value.shift(); data.value.shift();
row.isCreate = false; row.isCreate = false;
disBtn.value = false; disBtn.value = false;
selectRow.value.path = req.path; selectRow.value.path = props.dir ? req.path : '';
rowName.value = ''; rowName.value = '';
newFolder.value = ''; newFolder.value = '';
}; };
@@ -1,119 +0,0 @@
<template>
<div>
<el-dialog class="level-up-pro" v-model="open" :close-on-click-modal="false" @close="handleClose">
<div style="text-align: center" v-loading="loading">
<span class="text-3xl font-medium title">{{ $t('license.levelUpPro') }}</span>
<el-row type="flex" justify="center" class="mt-6">
<el-col :span="22">
<el-upload
action="#"
:auto-upload="false"
ref="uploadRef"
class="upload-demo"
drag
:limit="1"
:on-change="fileOnChange"
:on-exceed="handleExceed"
v-model:file-list="uploaderFiles"
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">
{{ $t('license.importHelper') }}
</div>
</el-upload>
</el-col>
</el-row>
<el-button
type="primary"
class="mt-3 w-52"
:disabled="loading || uploaderFiles.length == 0"
plain
@click="submit"
>
{{ $t('license.power') }}
</el-button>
<div class="mt-3 mb-5">
<el-button text type="primary" @click="toHalo">{{ $t('license.knowMorePro') }}</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import i18n from '@/lang';
import { ref } from 'vue';
import { MsgSuccess } from '@/utils/message';
import { UploadFileData } from '@/api/modules/setting';
import { GlobalStore } from '@/store';
import { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadRawFile, genFileId } from 'element-plus';
import { useTheme } from '@/hooks/use-theme';
import { getXpackSetting } from '@/utils/xpack';
const globalStore = GlobalStore();
const { switchTheme } = useTheme();
const loading = ref(false);
const open = ref(false);
const uploadRef = ref<UploadInstance>();
const uploaderFiles = ref<UploadFiles>([]);
const handleClose = () => {
open.value = false;
uploadRef.value!.clearFiles();
};
const fileOnChange = (_uploadFile: UploadFile, uploadFiles: UploadFiles) => {
uploaderFiles.value = uploadFiles;
};
const handleExceed: UploadProps['onExceed'] = (files) => {
uploadRef.value!.clearFiles();
const file = files[0] as UploadRawFile;
file.uid = genFileId();
uploadRef.value!.handleStart(file);
};
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
const submit = async () => {
if (uploaderFiles.value.length !== 1) {
return;
}
const file = uploaderFiles.value[0];
const formData = new FormData();
formData.append('file', file.raw);
loading.value = true;
await UploadFileData(formData)
.then(async () => {
globalStore.isProductPro = true;
const xpackRes = await getXpackSetting();
if (xpackRes) {
globalStore.themeConfig.isGold = xpackRes.data.theme === 'dark-gold';
}
loading.value = false;
switchTheme();
uploadRef.value!.clearFiles();
uploaderFiles.value = [];
open.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
window.location.reload();
})
.catch(() => {
loading.value = false;
uploadRef.value!.clearFiles();
uploaderFiles.value = [];
});
};
const acceptParams = () => {
uploaderFiles.value = [];
uploadRef.value?.clearFiles();
open.value = true;
};
defineExpose({
acceptParams,
});
</script>
+12 -8
View File
@@ -4,6 +4,7 @@
:destroy-on-close="true" :destroy-on-close="true"
:close-on-click-modal="false" :close-on-click-modal="false"
:close-on-press-escape="false" :close-on-press-escape="false"
:before-close="handleClose"
:size="globalStore.isFullScreen ? '100%' : '50%'" :size="globalStore.isFullScreen ? '100%' : '50%'"
> >
<template #header> <template #header>
@@ -21,10 +22,10 @@
</el-drawer> </el-drawer>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref } from 'vue'; import { computed, ref, watch } from 'vue';
import LogFile from '@/components/log-file/index.vue'; import LogFile from '@/components/log-file/index.vue';
import { GlobalStore } from '@/store';
import screenfull from 'screenfull'; import screenfull from 'screenfull';
import { GlobalStore } from '@/store';
import i18n from '@/lang'; import i18n from '@/lang';
const globalStore = GlobalStore(); const globalStore = GlobalStore();
@@ -45,19 +46,22 @@ const open = ref(false);
const config = ref(); const config = ref();
const em = defineEmits(['close']); const em = defineEmits(['close']);
const handleClose = (search: boolean) => { const handleClose = () => {
open.value = false; open.value = false;
em('close', search); em('close', false);
globalStore.isFullScreen = false;
}; };
watch(open, (val) => {
if (screenfull.isEnabled && !val && !mobile.value) screenfull.exit();
});
function toggleFullscreen() { function toggleFullscreen() {
if (screenfull.isEnabled) { globalStore.isFullScreen = !globalStore.isFullScreen;
screenfull.toggle();
}
} }
const loadTooltip = () => { const loadTooltip = () => {
return i18n.global.t('commons.button.' + (screenfull.isFullscreen ? 'quitFullscreen' : 'fullscreen')); return i18n.global.t('commons.button.' + (globalStore.isFullScreen ? 'quitFullscreen' : 'fullscreen'));
}; };
const acceptParams = (props: LogProps) => { const acceptParams = (props: LogProps) => {
+7 -1
View File
@@ -290,7 +290,7 @@ defineExpose({ changeTail, onDownload, clearLog });
overflow-y: auto; overflow-y: auto;
overflow-x: auto; overflow-x: auto;
position: relative; position: relative;
background-color: #121212; background-color: #1e1e1e;
margin-top: 10px; margin-top: 10px;
} }
@@ -307,4 +307,10 @@ defineExpose({ changeTail, onDownload, clearLog });
box-sizing: border-box; box-sizing: border-box;
white-space: nowrap; white-space: nowrap;
} }
.log-item span {
font-size: 14px;
font-weight: 300;
color: #cccccc;
}
</style> </style>
@@ -16,11 +16,6 @@
<el-divider v-if="!mobile" direction="vertical" /> <el-divider v-if="!mobile" direction="vertical" />
</div> </div>
<div class="flex flex-wrap"> <div class="flex flex-wrap">
<el-button type="primary" link @click="toHalo">
<span class="font-normal">
{{ isProductPro ? $t('license.pro') : $t('license.community') }}
</span>
</el-button>
<span class="version" @click="copyText(version)">{{ version }}</span> <span class="version" @click="copyText(version)">{{ version }}</span>
<el-badge is-dot style="margin-top: -3px" v-if="version !== 'Waiting' && globalStore.hasNewVersion"> <el-badge is-dot style="margin-top: -3px" v-if="version !== 'Waiting' && globalStore.hasNewVersion">
<el-button type="primary" link @click="onLoadUpgradeInfo"> <el-button type="primary" link @click="onLoadUpgradeInfo">
@@ -126,10 +121,6 @@ const handleClose = () => {
drawerVisible.value = false; drawerVisible.value = false;
}; };
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
const toDoc = () => { const toDoc = () => {
window.open('https://1panel.cn/docs/', '_blank', 'noopener,noreferrer'); window.open('https://1panel.cn/docs/', '_blank', 'noopener,noreferrer');
}; };
+16 -50
View File
@@ -575,8 +575,13 @@ const message = {
container: { container: {
create: 'Create', create: 'Create',
edit: 'Edit container', edit: 'Edit container',
updateContainerHelper: updateHelper1: 'Detected that this container comes from the app store. Please note the following two points:',
'Container editing requires rebuilding the container. Any data that has not been persisted will be lost. Do you want to continue?', updateHelper2:
'1. The current modifications will not be synchronized to the installed applications in the app store.',
updateHelper3:
'2. If you modify the application on the installed page, the currently edited content will become invalid.',
updateHelper4:
'Editing the container requires rebuilding, and any non-persistent data will be lost. Do you want to continue?',
containerList: 'Container list', containerList: 'Container list',
operatorHelper: '{0} will be performed on the following container, Do you want to continue?', operatorHelper: '{0} will be performed on the following container, Do you want to continue?',
operatorAppHelper: operatorAppHelper:
@@ -643,7 +648,7 @@ const message = {
containerFromAppHelper: containerFromAppHelper:
'Detected that this container originates from the app store. App operations may cause current edits to be invalidated.', 'Detected that this container originates from the app store. App operations may cause current edits to be invalidated.',
containerFromAppHelper1: containerFromAppHelper1:
'Click the `Settings` button in the installed applications list to enter the editing page and modify the container name.', 'Click the [Param] button in the installed applications list to enter the editing page and modify the container name.',
command: 'Command', command: 'Command',
console: 'Console Interaction', console: 'Console Interaction',
tty: 'TTY (-t)', tty: 'TTY (-t)',
@@ -731,6 +736,8 @@ const message = {
urlWarning: 'The URL prefix does not need to include http:// or https://. Please modify.', urlWarning: 'The URL prefix does not need to include http:// or https://. Please modify.',
network: 'Network', network: 'Network',
networkHelper:
'Deleting the 1panel-network container network will affect the normal use of some applications and runtime environments. Do you want to continue?',
createNetwork: 'Create', createNetwork: 'Create',
networkName: 'Name', networkName: 'Name',
driver: 'Driver', driver: 'Driver',
@@ -1094,7 +1101,6 @@ const message = {
clam: { clam: {
clam: 'Virus Scan', clam: 'Virus Scan',
cron: 'Scheduled scan', cron: 'Scheduled scan',
cronHelper: 'Professional version supports scheduled scan feature',
specErr: 'Execution schedule format error, please check and retry!', specErr: 'Execution schedule format error, please check and retry!',
disableMsg: disableMsg:
'Stopping scheduled execution will prevent this scan task from running automatically. Do you want to continue?', 'Stopping scheduled execution will prevent this scan task from running automatically. Do you want to continue?',
@@ -1518,8 +1524,11 @@ const message = {
bindDomain: 'Bind Domain', bindDomain: 'Bind Domain',
unBindDomain: 'Unbind domain', unBindDomain: 'Unbind domain',
panelSSL: 'Panel SSL', panelSSL: 'Panel SSL',
panelSSLHelper: sslAutoRestart: 'Restart 1Panel service after certificate auto-renewal',
'After the automatic renewal of the panel SSL, you need to manually restart the 1Panel service for the changes to take effect.', sslChangeHelper1:
'Currently, automatic restart of 1Panel service is not selected. The certificate auto-renewal will not take effect immediately and will still require a manual restart of 1Panel.',
sslChangeHelper2:
'The 1Panel service will automatically restart after setting the panel SSL. Do you want to continue?',
unBindDomainHelper: unBindDomainHelper:
'The action of unbinding a domain name may cause system insecurity. Do you want to continue?', 'The action of unbinding a domain name may cause system insecurity. Do you want to continue?',
bindDomainHelper: bindDomainHelper:
@@ -1655,49 +1664,6 @@ const message = {
compressPassword: 'Compression Password', compressPassword: 'Compression Password',
backupRecoverMessage: 'Please enter the compression or decompression password (leave blank to not set)', backupRecoverMessage: 'Please enter the compression or decompression password (leave blank to not set)',
}, },
license: {
community: 'Community Edition: ',
community2: 'Community Edition',
pro: 'Professional Edition: ',
trial: 'Trial Edition',
office: 'Official Edition',
trialInfo: 'Version',
authorizationId: 'Subscription Authorization ID',
authorizedUser: 'Authorized User',
expiresAt: 'Expiry Date',
productName: 'Product Name',
productStatus: 'Product Status',
Lost01: 'Lost * 1',
Lost02: 'Lost * 2',
Lost03: 'Lost',
Enable: 'Enabled',
Disable: 'Disabled',
lostHelper:
'The License needs to be periodically synchronized for availability. Please ensure normal external network access. After three losses of connection, the License binding will be released.',
quickUpdate: 'Quick Update',
import: 'Import',
power: 'Authorize',
unbind: 'Unbind License',
unbindHelper: 'All Pro related Settings will be cleared after unbinding. Do you want to continue? ',
importLicense: 'Import License',
importHelper: 'Please click or drag the license file here',
technicalAdvice: 'Technical Advice',
advice: 'Consultation',
indefinitePeriod: 'Indefinite Period',
levelUpPro: 'Upgrade to Professional Edition',
licenseSync: 'License Sync',
knowMorePro: 'Learn More',
closeAlert: 'The current page can be closed in the panel settings',
introduce: 'Feature Introduction',
waf: 'Upgrading to the professional version can provide features such as interception map, logs, block records, geographical location blocking, custom rules, custom interception pages, etc.',
tamper: 'Upgrading to the professional version can protect websites from unauthorized modifications or tampering.',
gpu: 'Upgrading to the professional version can help users visually monitor important parameters of GPU such as workload, temperature, memory usage in real time.',
setting:
'Upgrading to the professional version allows customization of panel logo, welcome message, and other information.',
monitor:
'Upgrade to the professional version to view the real-time status of the website, visitor trends, visitor sources, request logs and other information. ',
alert: 'Upgrade to the professional version to receive alarm information via SMS and view alarm logs, fully control various key events, and ensure worry-free system operation',
},
clean: { clean: {
scan: 'Start Scanning', scan: 'Start Scanning',
scanHelper: 'Easily tidy up junk files accumulated during 1Panel runtime', scanHelper: 'Easily tidy up junk files accumulated during 1Panel runtime',
@@ -1918,7 +1884,7 @@ const message = {
applySSL: 'Certificate Application', applySSL: 'Certificate Application',
SSLList: 'Certificate List', SSLList: 'Certificate List',
createDnsAccount: 'DNS Account', createDnsAccount: 'DNS Account',
aliyun: 'Aliyun DNS', aliyun: 'Aliyun',
manual: 'Manual parsing', manual: 'Manual parsing',
key: 'Key', key: 'Key',
check: 'View', check: 'View',
+12 -47
View File
@@ -557,7 +557,10 @@ const message = {
container: { container: {
create: '創建容器', create: '創建容器',
edit: '編輯容器', edit: '編輯容器',
updateContainerHelper: '容器編輯需要重建容器,任何未持久化的數據將會丟失,是否繼續?', updateHelper1: '檢測到該容器來源於應用商店,請注意以下兩點:',
updateHelper2: '1. 當前修改內容不會同步到應用商店的已安裝應用。',
updateHelper3: '2. 如果在已安裝頁面修改應用,當前編輯的部分內容將失效。',
updateHelper4: '編輯容器需要重建,任何未持久化的數據將丟失,是否繼續?',
containerList: '容器列表', containerList: '容器列表',
operatorHelper: '將對以下容器進行 {0} 操作,是否繼續?', operatorHelper: '將對以下容器進行 {0} 操作,是否繼續?',
operatorAppHelper: operatorAppHelper:
@@ -619,7 +622,7 @@ const message = {
inputIpv6: '請輸入 IPv6 地址', inputIpv6: '請輸入 IPv6 地址',
containerFromAppHelper: '檢測到該容器來源於應用商店,應用操作可能會導致當前編輯失效', containerFromAppHelper: '檢測到該容器來源於應用商店,應用操作可能會導致當前編輯失效',
containerFromAppHelper1: '在已安裝應用程式列表點擊 `參數` 按鈕,進入編輯頁面即可修改容器名稱。', containerFromAppHelper1: '在已安裝應用程式列表點擊 [參數] 按鈕,進入編輯頁面即可修改容器名稱。',
command: '命令', command: '命令',
console: '控製臺交互', console: '控製臺交互',
tty: '偽終端 ( -t )', tty: '偽終端 ( -t )',
@@ -707,6 +710,7 @@ const message = {
urlWarning: '路徑前綴不需要添加 http:// 或 https://,請修改', urlWarning: '路徑前綴不需要添加 http:// 或 https://,請修改',
network: '網絡', network: '網絡',
networkHelper: '刪除 1panel-network 容器網絡將影響部分應用和運行環境的正常使用,是否繼續?',
createNetwork: '創建網絡', createNetwork: '創建網絡',
networkName: '網絡名', networkName: '網絡名',
driver: '模式', driver: '模式',
@@ -1034,7 +1038,6 @@ const message = {
clam: { clam: {
clam: '病毒掃描', clam: '病毒掃描',
cron: '定時掃描', cron: '定時掃描',
cronHelper: '專業版支持定時掃描功能',
specErr: '執行周期格式錯誤,請檢查後重試!', specErr: '執行周期格式錯誤,請檢查後重試!',
disableMsg: '停止定時執行會導致該掃描任務不再自動執行。是否繼續?', disableMsg: '停止定時執行會導致該掃描任務不再自動執行。是否繼續?',
enableMsg: '啟用定時執行會讓該掃描任務定期自動執行。是否繼續?', enableMsg: '啟用定時執行會讓該掃描任務定期自動執行。是否繼續?',
@@ -1308,8 +1311,8 @@ const message = {
systemIP: '伺服器地址', systemIP: '伺服器地址',
proxy: '代理伺服器', proxy: '代理伺服器',
proxyHelper: '設置代理伺服器後,將在以下場景中生效:', proxyHelper: '設置代理伺服器後,將在以下場景中生效:',
proxyHelper1: '應用商店的安裝包下載和同步(專業版功能)', proxyHelper1: '應用商店的安裝包下載和同步',
proxyHelper2: '系統版本升級及獲取更新說明(專業版功能)', proxyHelper2: '系統版本升級及獲取更新說明',
proxyHelper3: '系統許可證的驗證和同步', proxyHelper3: '系統許可證的驗證和同步',
proxyType: '代理類型', proxyType: '代理類型',
proxyUrl: '代理地址', proxyUrl: '代理地址',
@@ -1468,7 +1471,9 @@ const message = {
bindDomain: '域名綁定', bindDomain: '域名綁定',
unBindDomain: '域名解綁', unBindDomain: '域名解綁',
panelSSL: '面板 SSL', panelSSL: '面板 SSL',
panelSSLHelper: '面板 SSL 自动续期后需要手动重启 1Panel 服务才可生效', sslAutoRestart: '證書自動續期後重啟 1Panel 服務',
sslChangeHelper1: '當前未勾選自動重啟 1Panel 服務,證書自動續期後不會立即生效,仍需手動重啟 1Panel。',
sslChangeHelper2: '設置面板 SSL 後將自動重啟 1Panel 服務,是否繼續?',
unBindDomainHelper: '解除域名綁定可能造成系統不安全,是否繼續?', unBindDomainHelper: '解除域名綁定可能造成系統不安全,是否繼續?',
bindDomainHelper: '設置域名綁定後,僅能通過設置中域名訪問 1Panel 服務', bindDomainHelper: '設置域名綁定後,僅能通過設置中域名訪問 1Panel 服務',
bindDomainHelper1: '綁定域名為空時,則取消域名綁定', bindDomainHelper1: '綁定域名為空時,則取消域名綁定',
@@ -1538,46 +1543,6 @@ const message = {
compressPassword: '壓縮密碼', compressPassword: '壓縮密碼',
backupRecoverMessage: '請輸入壓縮或解壓縮密碼(留空則不設定)', backupRecoverMessage: '請輸入壓縮或解壓縮密碼(留空則不設定)',
}, },
license: {
community: '社區版:',
community2: '社區版',
pro: '專業版:',
trial: '試用版',
office: '正式版',
trialInfo: '版本',
authorizationId: '訂閱授權 ID',
authorizedUser: '被授權方',
expiresAt: '到期時間',
productName: '產品名稱',
productStatus: '產品狀態',
Lost01: '失聯 * 1',
Lost02: '失聯 * 2',
Lost03: '已失聯',
Enable: '已啟用',
Disable: '未啟用',
lostHelper: '許可證需要定時同步是否可用,請保證正常外網訪問,失聯三次後將解除許可證綁定',
quickUpdate: '快速更新',
import: '導入',
power: '授 權',
unbind: '解除綁定',
unbindHelper: '解除綁定後將清除所有專業版相關設置,是否繼續?',
importLicense: '導入許可證',
importHelper: '請點擊或拖動許可文件到此處',
technicalAdvice: '技術諮詢',
advice: '諮詢',
indefinitePeriod: '無限期',
levelUpPro: '升級專業版',
licenseSync: '許可證同步',
knowMorePro: '了解更多',
closeAlert: '當前頁面可在面板設置中關閉顯示',
introduce: '功能介紹',
waf: '升級專業版可以獲得攔截地圖、日誌、封鎖記錄、地理位置封禁、自定義規則、自定義攔截頁面等功能。',
tamper: '升級專業版可以保護網站免受未經授權的修改或篡改。',
gpu: '升級專業版可以幫助用戶實時直觀查看到 GPU 的工作負載、溫度、顯存等重要參數。',
setting: '升級專業版可以自定義面板 Logo、歡迎簡介等信息。',
monitor: '升級專業版可以查看網站的即時狀態、訪客趨勢、訪客來源、請求日誌等資訊。 ',
alert: '陞級專業版可通過簡訊接收告警資訊,並查看告警日誌,全面掌控各類關鍵事件,確保系統運行無憂。',
},
clean: { clean: {
scan: '開始掃描', scan: '開始掃描',
scanHelper: '輕鬆梳理 1Panel 運行期間積累的垃圾文件', scanHelper: '輕鬆梳理 1Panel 運行期間積累的垃圾文件',
@@ -1781,7 +1746,7 @@ const message = {
applySSL: '證書申請', applySSL: '證書申請',
SSLList: '證書列表', SSLList: '證書列表',
createDnsAccount: 'DNS賬戶', createDnsAccount: 'DNS賬戶',
aliyun: '阿裏雲DNS', aliyun: '阿裏雲',
manual: '手動解析', manual: '手動解析',
key: '密鑰', key: '密鑰',
check: '查看', check: '查看',
+12 -48
View File
@@ -559,7 +559,10 @@ const message = {
container: { container: {
create: '创建容器', create: '创建容器',
edit: '编辑容器', edit: '编辑容器',
updateContainerHelper: '容器编辑需要重建容器,任何未持久化的数据将会丢失,是否继续?', updateHelper1: '检测到该容器来源于应用商店,请注意以下两点:',
updateHelper2: '1. 当前修改内容不会同步到应用商店的已安装应用。',
updateHelper3: '2. 如果在已安装页面修改应用,当前编辑的部分内容将失效。',
updateHelper4: '编辑容器需要重建,任何未持久化的数据将丢失,是否继续?',
containerList: '容器列表', containerList: '容器列表',
operatorHelper: '将对以下容器进行 {0} 操作,是否继续?', operatorHelper: '将对以下容器进行 {0} 操作,是否继续?',
operatorAppHelper: operatorAppHelper:
@@ -622,7 +625,7 @@ const message = {
inputIpv6: '请输入 ipv6 地址', inputIpv6: '请输入 ipv6 地址',
containerFromAppHelper: '检测到该容器来源于应用商店,应用操作可能会导致当前编辑失效', containerFromAppHelper: '检测到该容器来源于应用商店,应用操作可能会导致当前编辑失效',
containerFromAppHelper1: '在已安装应用列表点击 `参数` 按钮,进入编辑页面即可修改容器名称。', containerFromAppHelper1: '在应用商店的已安装页面,点击 [参数] 按钮,进入编辑页面修改容器名称。',
command: '命令', command: '命令',
console: '控制台交互', console: '控制台交互',
tty: '伪终端 ( -t )', tty: '伪终端 ( -t )',
@@ -709,6 +712,7 @@ const message = {
urlWarning: '路径前缀不需要添加 http:// 或 https://, 请修改', urlWarning: '路径前缀不需要添加 http:// 或 https://, 请修改',
network: '网络', network: '网络',
networkHelper: '删除 1panel-network 容器网络将影响部分应用和运行环境的正常使用,是否继续?',
createNetwork: '创建网络', createNetwork: '创建网络',
networkName: '网络名', networkName: '网络名',
driver: '模式', driver: '模式',
@@ -1035,7 +1039,6 @@ const message = {
clam: { clam: {
clam: '病毒扫描', clam: '病毒扫描',
cron: '定时扫描', cron: '定时扫描',
cronHelper: '专业版支持定时扫描功能 ',
specErr: '执行周期格式错误,请检查后重试!', specErr: '执行周期格式错误,请检查后重试!',
disableMsg: '停止定时执行会导致该扫描任务不再自动执行。是否继续?', disableMsg: '停止定时执行会导致该扫描任务不再自动执行。是否继续?',
enableMsg: '启用定时执行会让该扫描任务定期自动执行。是否继续?', enableMsg: '启用定时执行会让该扫描任务定期自动执行。是否继续?',
@@ -1310,8 +1313,8 @@ const message = {
systemIP: '服务器地址', systemIP: '服务器地址',
proxy: '代理服务器', proxy: '代理服务器',
proxyHelper: '设置代理服务器后,将在以下场景中生效:', proxyHelper: '设置代理服务器后,将在以下场景中生效:',
proxyHelper1: '应用商店的安装包下载和同步(专业版功能)', proxyHelper1: '应用商店的安装包下载和同步',
proxyHelper2: '系统版本升级及获取更新说明(专业版功能)', proxyHelper2: '系统版本升级及获取更新说明',
proxyHelper3: '系统许可证的验证和同步', proxyHelper3: '系统许可证的验证和同步',
proxyType: '代理类型', proxyType: '代理类型',
proxyUrl: '代理地址', proxyUrl: '代理地址',
@@ -1470,7 +1473,9 @@ const message = {
bindDomain: '域名绑定', bindDomain: '域名绑定',
unBindDomain: '域名解绑', unBindDomain: '域名解绑',
panelSSL: '面板 SSL', panelSSL: '面板 SSL',
panelSSLHelper: '面板 SSL 自动续期后需要手动重启 1Panel 服务才可生效', sslAutoRestart: '证书自动续期后重启 1Panel 服务',
sslChangeHelper1: '当前未勾选自动重启 1Panel 服务,证书自动续期后不会立即生效,仍需手动重启 1Panel。',
sslChangeHelper2: '设置面板 SSL 后将自动重启 1Panel 服务,是否继续?',
unBindDomainHelper: '解除域名绑定可能造成系统不安全,是否继续?', unBindDomainHelper: '解除域名绑定可能造成系统不安全,是否继续?',
bindDomainHelper: '设置域名绑定后,仅能通过设置中域名访问 1Panel 服务', bindDomainHelper: '设置域名绑定后,仅能通过设置中域名访问 1Panel 服务',
bindDomainHelper1: '绑定域名为空时,则取消域名绑定', bindDomainHelper1: '绑定域名为空时,则取消域名绑定',
@@ -1494,7 +1499,6 @@ const message = {
mfaInterval: '刷新时间(秒)', mfaInterval: '刷新时间(秒)',
mfaTitleHelper: '用于区分不同 1Panel 主机,修改后请重新扫描或手动添加密钥信息!', mfaTitleHelper: '用于区分不同 1Panel 主机,修改后请重新扫描或手动添加密钥信息!',
mfaIntervalHelper: '修改刷新时间后,请重新扫描或手动添加密钥信息!', mfaIntervalHelper: '修改刷新时间后,请重新扫描或手动添加密钥信息!',
sslChangeHelper: 'https 设置修改需要重启服务,是否继续?',
sslDisable: '禁用', sslDisable: '禁用',
sslDisableHelper: '禁用 https 服务,需要重启面板才能生效,是否继续?', sslDisableHelper: '禁用 https 服务,需要重启面板才能生效,是否继续?',
noAuthSetting: '未认证设置', noAuthSetting: '未认证设置',
@@ -1540,46 +1544,6 @@ const message = {
compressPassword: '压缩密码', compressPassword: '压缩密码',
backupRecoverMessage: '请输入压缩或解压缩密码(留空则不设置)', backupRecoverMessage: '请输入压缩或解压缩密码(留空则不设置)',
}, },
license: {
community: '社区版:',
community2: '社区版',
pro: '专业版:',
trial: '试用版',
office: '正式版',
trialInfo: '版本',
authorizationId: '订阅授权 ID',
authorizedUser: '被授权方',
expiresAt: '到期时间',
productName: '产品名称',
productStatus: '产品状态',
Lost01: '失联 * 1',
Lost02: '失联 * 2',
Lost03: '已失联',
Enable: '已激活',
Disable: '未激活',
lostHelper: '许可证需要定时同步是否可用,请保证正常外网访问,失联三次后将解除许可证绑定',
quickUpdate: '快速更新',
import: '导入',
power: '授 权',
unbind: '解除绑定',
unbindHelper: '解除绑定后将清除所有专业版相关设置,是否继续?',
importLicense: '导入许可证',
importHelper: '请点击或拖动许可文件到此处',
technicalAdvice: '技术咨询',
advice: '咨询',
indefinitePeriod: '无限期',
levelUpPro: '升级专业版',
licenseSync: '许可证同步',
knowMorePro: '了解更多',
closeAlert: '当前页面可在面板设置中关闭显示',
introduce: '功能介绍',
waf: '升级专业版可以获得拦截地图、日志、封锁记录、地理位置封禁、自定义规则、自定义拦截页面等功能。',
tamper: '升级专业版可以保护网站免受未经授权的修改或篡改。',
gpu: '升级专业版可以帮助用户实时直观查看到 GPU 的工作负载、温度、显存等重要参数。',
setting: '升级专业版可以自定义面板 Logo、欢迎简介等信息。',
monitor: '升级专业版可以查看网站的实时状态、访客趋势、访客来源、请求日志等信息。',
alert: '升级专业版可通过短信接收告警信息,并查看告警日志,全面掌控各类关键事件,确保系统运行无忧。',
},
clean: { clean: {
scan: '开始扫描', scan: '开始扫描',
scanHelper: '轻松梳理 1Panel 运行期间积累的垃圾文件', scanHelper: '轻松梳理 1Panel 运行期间积累的垃圾文件',
@@ -1783,7 +1747,7 @@ const message = {
applySSL: '证书申请', applySSL: '证书申请',
SSLList: '证书列表', SSLList: '证书列表',
createDnsAccount: 'DNS账户', createDnsAccount: 'DNS账户',
aliyun: '阿里云DNS', aliyun: '阿里云',
manual: '手动解析', manual: '手动解析',
key: '密钥', key: '密钥',
check: '查看', check: '查看',
+1 -1
View File
@@ -100,7 +100,7 @@ onMounted(() => {
loadStatus(); loadStatus();
loadProductProFromDB(); loadProductProFromDB();
globalStore.isFullScreen = false;
const mqList = window.matchMedia('(prefers-color-scheme: dark)'); const mqList = window.matchMedia('(prefers-color-scheme: dark)');
if (mqList.addEventListener) { if (mqList.addEventListener) {
mqList.addEventListener('change', () => { mqList.addEventListener('change', () => {
-10
View File
@@ -37,16 +37,6 @@ const settingRouter = {
activeMenu: 'Setting', activeMenu: 'Setting',
}, },
}, },
{
path: 'license',
name: 'License',
component: () => import('@/views/setting/license/index.vue'),
hidden: true,
meta: {
requiresAuth: true,
activeMenu: 'Setting',
},
},
{ {
path: 'about', path: 'about',
name: 'About', name: 'About',
+3 -3
View File
@@ -64,7 +64,7 @@ const webSiteRouter = {
hidden: true, hidden: true,
component: () => import('@/views/website/runtime/java/index.vue'), component: () => import('@/views/website/runtime/java/index.vue'),
meta: { meta: {
activeMenu: '/websites/runtimes/java', activeMenu: '/websites/runtimes/php',
requiresAuth: false, requiresAuth: false,
}, },
}, },
@@ -74,7 +74,7 @@ const webSiteRouter = {
hidden: true, hidden: true,
component: () => import('@/views/website/runtime/go/index.vue'), component: () => import('@/views/website/runtime/go/index.vue'),
meta: { meta: {
activeMenu: '/websites/runtimes/go', activeMenu: '/websites/runtimes/php',
requiresAuth: false, requiresAuth: false,
}, },
}, },
@@ -84,7 +84,7 @@ const webSiteRouter = {
hidden: true, hidden: true,
component: () => import('@/views/website/runtime/python/index.vue'), component: () => import('@/views/website/runtime/python/index.vue'),
meta: { meta: {
activeMenu: '/websites/runtimes/python', activeMenu: '/websites/runtimes/php',
requiresAuth: false, requiresAuth: false,
}, },
}, },
+1 -6
View File
@@ -22,9 +22,4 @@ body,
.el-switch--small,.is-checked .el-switch__core::after { .el-switch--small,.is-checked .el-switch__core::after {
margin-left: 12px !important; margin-left: 12px !important;
} }
.el-alert__title {
display: flex;
align-items: center;
}
@@ -94,7 +94,6 @@ import ComposeDetail from '@/views/container/compose/detail/index.vue';
import { loadContainerLog, loadDockerStatus, searchCompose } from '@/api/modules/container'; import { loadContainerLog, loadDockerStatus, searchCompose } from '@/api/modules/container';
import i18n from '@/lang'; import i18n from '@/lang';
import { Container } from '@/api/interface/container'; import { Container } from '@/api/interface/container';
import { loadBaseDir } from '@/api/modules/setting';
import router from '@/routers'; import router from '@/routers';
const data = ref(); const data = ref();
@@ -102,7 +101,6 @@ const selects = ref<any>([]);
const loading = ref(false); const loading = ref(false);
const isOnDetail = ref(false); const isOnDetail = ref(false);
const baseDir = ref();
const paginationConfig = reactive({ const paginationConfig = reactive({
cacheSizeKey: 'container-compose-page-size', cacheSizeKey: 'container-compose-page-size',
@@ -133,12 +131,7 @@ const goSetting = async () => {
}; };
const toComposeFolder = async (row: Container.ComposeInfo) => { const toComposeFolder = async (row: Container.ComposeInfo) => {
router.push({ path: '/hosts/files', query: { path: baseDir.value + '/docker/compose/' + row.name } }); router.push({ path: '/hosts/files', query: { path: row.workdir } });
};
const loadPath = async () => {
const pathRes = await loadBaseDir();
baseDir.value = pathRes.data;
}; };
const search = async () => { const search = async () => {
@@ -230,7 +223,6 @@ const buttons = [
}, },
]; ];
onMounted(() => { onMounted(() => {
loadPath();
loadStatus(); loadStatus();
}); });
</script> </script>
@@ -25,12 +25,6 @@
> >
<el-row type="flex" justify="center"> <el-row type="flex" justify="center">
<el-col :span="22"> <el-col :span="22">
<el-alert
v-if="dialogData.title === 'edit' && isFromApp(dialogData.rowData!)"
:title="$t('container.containerFromAppHelper')"
:closable="false"
type="error"
/>
<el-form-item class="mt-5" :label="$t('commons.table.name')" prop="name"> <el-form-item class="mt-5" :label="$t('commons.table.name')" prop="name">
<el-input <el-input
:disabled="isFromApp(dialogData.rowData!)" :disabled="isFromApp(dialogData.rowData!)"
@@ -296,13 +290,39 @@
</span> </span>
</template> </template>
</el-drawer> </el-drawer>
<el-dialog v-model="dialogVisible" width="30%" :title="$t('commons.button.edit')">
<div v-if="dialogData.title === 'edit' && isFromApp(dialogData.rowData!)" class="leading-6">
<div>
<span>{{ $t('container.updateHelper1') }}</span>
</div>
<br />
<div>
<span>{{ $t('container.updateHelper2') }}</span>
</div>
<div>
<span>{{ $t('container.updateHelper3') }}</span>
</div>
<br />
</div>
<div>
<span>{{ $t('container.updateHelper4') }}</span>
</div>
<template #footer>
<el-button :disabled="loading" @click="dialogVisible = false">
{{ $t('commons.button.cancel') }}
</el-button>
<el-button :disabled="loading" type="primary" @click="submit()">
{{ $t('commons.button.confirm') }}
</el-button>
</template>
</el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { Rules, checkFloatNumberRange, checkNumberRange } from '@/global/form-rules'; import { Rules, checkFloatNumberRange, checkNumberRange } from '@/global/form-rules';
import i18n from '@/lang'; import i18n from '@/lang';
import { ElForm, ElMessageBox } from 'element-plus'; import { ElForm } from 'element-plus';
import DrawerHeader from '@/components/drawer-header/index.vue'; import DrawerHeader from '@/components/drawer-header/index.vue';
import { import {
listImage, listImage,
@@ -327,6 +347,7 @@ interface DialogProps {
const title = ref<string>(''); const title = ref<string>('');
const drawerVisible = ref(false); const drawerVisible = ref(false);
const dialogVisible = ref(false);
const dialogData = ref<DialogProps>({ const dialogData = ref<DialogProps>({
title: '', title: '',
@@ -386,6 +407,7 @@ const limits = ref<Container.ResourceLimit>({
const handleClose = () => { const handleClose = () => {
emit('search'); emit('search');
drawerVisible.value = false; drawerVisible.value = false;
dialogVisible.value = false;
}; };
const rules = reactive({ const rules = reactive({
@@ -448,6 +470,7 @@ const loadNetworkOptions = async () => {
const res = await listNetwork(); const res = await listNetwork();
networks.value = res.data; networks.value = res.data;
}; };
const onSubmit = async (formEl: FormInstance | undefined) => { const onSubmit = async (formEl: FormInstance | undefined) => {
if (dialogData.value.rowData!.volumes.length !== 0) { if (dialogData.value.rowData!.volumes.length !== 0) {
for (const item of dialogData.value.rowData!.volumes) { for (const item of dialogData.value.rowData!.volumes) {
@@ -460,93 +483,87 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
if (!formEl) return; if (!formEl) return;
formEl.validate(async (valid) => { formEl.validate(async (valid) => {
if (!valid) return; if (!valid) return;
if (dialogData.value.rowData?.envStr) { dialogVisible.value = true;
dialogData.value.rowData.env = dialogData.value.rowData!.envStr.split('\n'); });
} };
if (dialogData.value.rowData?.labelsStr) {
dialogData.value.rowData!.labels = dialogData.value.rowData!.labelsStr.split('\n'); const submit = async () => {
} dialogVisible.value = false;
dialogData.value.rowData!.cmd = []; if (dialogData.value.rowData?.envStr) {
if (dialogData.value.rowData?.cmdStr) { dialogData.value.rowData.env = dialogData.value.rowData!.envStr.split('\n');
if (dialogData.value.rowData?.cmdStr.indexOf(`'`) !== -1) { }
let itemCmd = dialogData.value.rowData!.cmdStr.split(`'`); if (dialogData.value.rowData?.labelsStr) {
for (const cmd of itemCmd) { dialogData.value.rowData!.labels = dialogData.value.rowData!.labelsStr.split('\n');
if (cmd && cmd !== ' ') { }
dialogData.value.rowData!.cmd.push(cmd); dialogData.value.rowData!.cmd = [];
} if (dialogData.value.rowData?.cmdStr) {
} if (dialogData.value.rowData?.cmdStr.indexOf(`'`) !== -1) {
} else { let itemCmd = dialogData.value.rowData!.cmdStr.split(`'`);
let itemCmd = dialogData.value.rowData!.cmdStr.split(` `); for (const cmd of itemCmd) {
for (const cmd of itemCmd) { if (cmd && cmd !== ' ') {
dialogData.value.rowData!.cmd.push(cmd); dialogData.value.rowData!.cmd.push(cmd);
} }
} }
} else {
let itemCmd = dialogData.value.rowData!.cmdStr.split(` `);
for (const cmd of itemCmd) {
dialogData.value.rowData!.cmd.push(cmd);
}
} }
dialogData.value.rowData!.entrypoint = []; }
if (dialogData.value.rowData?.entrypointStr) { dialogData.value.rowData!.entrypoint = [];
if (dialogData.value.rowData?.entrypointStr.indexOf(`'`) !== -1) { if (dialogData.value.rowData?.entrypointStr) {
let itemEntrypoint = dialogData.value.rowData!.entrypointStr.split(`'`); if (dialogData.value.rowData?.entrypointStr.indexOf(`'`) !== -1) {
for (const entry of itemEntrypoint) { let itemEntrypoint = dialogData.value.rowData!.entrypointStr.split(`'`);
if (entry && entry !== ' ') { for (const entry of itemEntrypoint) {
dialogData.value.rowData!.entrypoint.push(entry); if (entry && entry !== ' ') {
}
}
} else {
let itemEntrypoint = dialogData.value.rowData!.entrypointStr.split(` `);
for (const entry of itemEntrypoint) {
dialogData.value.rowData!.entrypoint.push(entry); dialogData.value.rowData!.entrypoint.push(entry);
} }
} }
}
if (dialogData.value.rowData!.publishAllPorts) {
dialogData.value.rowData!.exposedPorts = [];
} else { } else {
if (!checkPortValid()) { let itemEntrypoint = dialogData.value.rowData!.entrypointStr.split(` `);
return; for (const entry of itemEntrypoint) {
dialogData.value.rowData!.entrypoint.push(entry);
} }
} }
dialogData.value.rowData!.memory = Number(dialogData.value.rowData!.memory); }
dialogData.value.rowData!.nanoCPUs = Number(dialogData.value.rowData!.nanoCPUs); if (dialogData.value.rowData!.publishAllPorts) {
dialogData.value.rowData!.exposedPorts = [];
loading.value = true; } else {
if (dialogData.value.title === 'create') { if (!checkPortValid()) {
await createContainer(dialogData.value.rowData!) return;
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
drawerVisible.value = false;
})
.catch(() => {
loading.value = false;
});
} else {
ElMessageBox.confirm(
i18n.global.t('container.updateContainerHelper'),
i18n.global.t('commons.button.edit'),
{
confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
},
)
.then(async () => {
await updateContainer(dialogData.value.rowData!)
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
drawerVisible.value = false;
})
.catch(() => {
updateContainerID();
loading.value = false;
});
})
.catch(() => {
loading.value = false;
});
} }
}); }
dialogData.value.rowData!.memory = Number(dialogData.value.rowData!.memory);
dialogData.value.rowData!.nanoCPUs = Number(dialogData.value.rowData!.nanoCPUs);
loading.value = true;
if (dialogData.value.title === 'create') {
await createContainer(dialogData.value.rowData!)
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
drawerVisible.value = false;
dialogVisible.value = false;
})
.catch(() => {
loading.value = false;
});
return;
}
await updateContainer(dialogData.value.rowData!)
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
drawerVisible.value = false;
dialogVisible.value = false;
})
.catch(() => {
updateContainerID();
loading.value = false;
});
}; };
const updateContainerID = async () => { const updateContainerID = async () => {
+13 -4
View File
@@ -198,20 +198,29 @@ const search = async () => {
const batchDelete = async (row: Container.NetworkInfo | null) => { const batchDelete = async (row: Container.NetworkInfo | null) => {
let names: Array<string> = []; let names: Array<string> = [];
let hasPanelNetwork;
if (row === null) { if (row === null) {
selects.value.forEach((item: Container.NetworkInfo) => { selects.value.forEach((item: Container.NetworkInfo) => {
if (item.name === '1panel-network') {
hasPanelNetwork = true;
}
names.push(item.name); names.push(item.name);
}); });
} else { } else {
if (row.name === '1panel-network') {
hasPanelNetwork = true;
}
names.push(row.name); names.push(row.name);
} }
opRef.value.acceptParams({ opRef.value.acceptParams({
title: i18n.global.t('commons.button.delete'), title: i18n.global.t('commons.button.delete'),
names: names, names: names,
msg: i18n.global.t('commons.msg.operatorHelper', [ msg: hasPanelNetwork
i18n.global.t('container.network'), ? i18n.global.t('container.networkHelper')
i18n.global.t('commons.button.delete'), : i18n.global.t('commons.msg.operatorHelper', [
]), i18n.global.t('container.network'),
i18n.global.t('commons.button.delete'),
]),
api: deleteNetwork, api: deleteNetwork,
params: { names: names }, params: { names: names },
}); });
@@ -336,31 +336,6 @@
<el-input clearable v-model.trim="dialogData.rowData!.url" /> <el-input clearable v-model.trim="dialogData.rowData!.url" />
</el-form-item> </el-form-item>
<el-form-item prop="hasAlert" v-if="alertTypes.includes(dialogData.rowData!.type)">
<el-checkbox v-model="dialogData.rowData!.hasAlert" :label="$t('alert.isAlert')" />
<span class="input-help">{{ $t('alert.cronJobHelper') }}</span>
</el-form-item>
<el-form-item
prop="alertCount"
v-if="dialogData.rowData!.hasAlert && isProductPro"
:label="$t('alert.alertCount')"
>
<el-input-number
style="width: 200px"
:min="1"
step-strictly
:step="1"
v-model.number="dialogData.rowData!.alertCount"
></el-input-number>
<span class="input-help">{{ $t('alert.alertCountHelper') }}</span>
</el-form-item>
<el-form-item v-if="dialogData.rowData!.hasAlert && !isProductPro">
<span>{{ $t('alert.licenseHelper') }}</span>
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</el-form-item>
<el-form-item <el-form-item
v-if="hasExclusionRules()" v-if="hasExclusionRules()"
:label="$t('cronjob.exclusionRules')" :label="$t('cronjob.exclusionRules')"
@@ -386,7 +361,6 @@
</el-button> </el-button>
</span> </span>
</template> </template>
<LicenseImport ref="licenseRef" />
</el-drawer> </el-drawer>
</template> </template>
@@ -408,9 +382,6 @@ import { listContainer } from '@/api/modules/container';
import { Database } from '@/api/interface/database'; import { Database } from '@/api/interface/database';
import { ListAppInstalled } from '@/api/modules/app'; import { ListAppInstalled } from '@/api/modules/app';
import { loadDefaultSpec, specOptions, transObjToSpec, transSpecToObj, weekOptions } from './../helper'; import { loadDefaultSpec, specOptions, transObjToSpec, transSpecToObj, weekOptions } from './../helper';
import { storeToRefs } from 'pinia';
import { GlobalStore } from '@/store';
import LicenseImport from '@/components/license-import/index.vue';
const router = useRouter(); const router = useRouter();
@@ -426,11 +397,6 @@ const dialogData = ref<DialogProps>({
title: '', title: '',
}); });
const globalStore = GlobalStore();
const licenseRef = ref();
const { isProductPro } = storeToRefs(globalStore);
const alertTypes = ['app', 'website', 'database', 'directory', 'log', 'snapshot'];
const acceptParams = (params: DialogProps): void => { const acceptParams = (params: DialogProps): void => {
dialogData.value = params; dialogData.value = params;
if (dialogData.value.rowData?.spec) { if (dialogData.value.rowData?.spec) {
@@ -457,8 +423,6 @@ const acceptParams = (params: DialogProps): void => {
if (dialogData.value.rowData.dbName) { if (dialogData.value.rowData.dbName) {
dialogData.value.rowData.dbNameList = dialogData.value.rowData.dbName.split(','); dialogData.value.rowData.dbNameList = dialogData.value.rowData.dbName.split(',');
} }
dialogData.value.rowData.hasAlert = dialogData.value.rowData!.alertCount > 0;
dialogData.value.rowData!.alertCount = dialogData.value.rowData!.alertCount || 3;
dialogData.value.rowData!.command = dialogData.value.rowData!.command || 'sh'; dialogData.value.rowData!.command = dialogData.value.rowData!.command || 'sh';
dialogData.value.rowData!.isCustom = dialogData.value.rowData!.isCustom =
dialogData.value.rowData!.command !== 'sh' && dialogData.value.rowData!.command !== 'sh' &&
@@ -596,18 +560,6 @@ const verifySpec = (rule: any, value: any, callback: any) => {
callback(); callback();
}; };
function checkSendCount(rule: any, value: any, callback: any) {
if (value === '') {
callback();
}
const regex = /^(?:[1-9]|[12][0-9]|30)$/;
if (!regex.test(value)) {
return callback(new Error(i18n.global.t('commons.rule.numberRange', [1, 30])));
}
callback();
}
const rules = reactive({ const rules = reactive({
name: [Rules.requiredInput, Rules.noSpace], name: [Rules.requiredInput, Rules.noSpace],
type: [Rules.requiredSelect], type: [Rules.requiredSelect],
@@ -626,7 +578,6 @@ const rules = reactive({
backupAccounts: [Rules.requiredSelect], backupAccounts: [Rules.requiredSelect],
defaultDownload: [Rules.requiredSelect], defaultDownload: [Rules.requiredSelect],
retainCopies: [Rules.number], retainCopies: [Rules.number],
alertCount: [Rules.integerNumber, { validator: checkSendCount, trigger: 'blur' }],
}); });
type FormInstance = InstanceType<typeof ElForm>; type FormInstance = InstanceType<typeof ElForm>;
@@ -805,17 +756,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
if (dialogData.value?.rowData?.exclusionRules) { if (dialogData.value?.rowData?.exclusionRules) {
dialogData.value.rowData.exclusionRules = dialogData.value.rowData.exclusionRules.replaceAll('\n', ','); dialogData.value.rowData.exclusionRules = dialogData.value.rowData.exclusionRules.replaceAll('\n', ',');
} }
if (alertTypes.includes(dialogData.value.rowData.type)) {
dialogData.value.rowData.alertCount =
dialogData.value.rowData!.hasAlert && isProductPro.value ? dialogData.value.rowData.alertCount : 0;
dialogData.value.rowData.alertTitle =
dialogData.value.rowData!.hasAlert && isProductPro.value
? i18n.global.t('cronjob.alertTitle', [
i18n.global.t('cronjob.' + dialogData.value.rowData.type),
dialogData.value.rowData.name,
])
: '';
}
if (!dialogData.value.rowData) return; if (!dialogData.value.rowData) return;
if (dialogData.value.title === 'create') { if (dialogData.value.title === 'create') {
await addCronjob(dialogData.value.rowData); await addCronjob(dialogData.value.rowData);
@@ -830,10 +770,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
}); });
}; };
const toUpload = () => {
licenseRef.value.acceptParams();
};
defineExpose({ defineExpose({
acceptParams, acceptParams,
}); });
@@ -21,6 +21,7 @@
v-model:mask-show="maskShow" v-model:mask-show="maskShow"
@setting="onSetting" @setting="onSetting"
@is-exist="checkExist" @is-exist="checkExist"
ref="appStatusRef"
></AppStatus> ></AppStatus>
</template> </template>
@@ -327,6 +328,8 @@ const dashboardName = ref();
const dashboardKey = ref(); const dashboardKey = ref();
const dashboardVisible = ref(false); const dashboardVisible = ref(false);
const appStatusRef = ref();
const dialogPortJumpRef = ref(); const dialogPortJumpRef = ref();
const data = ref(); const data = ref();
@@ -384,6 +387,9 @@ const onSetting = async () => {
}; };
const changeDatabase = async () => { const changeDatabase = async () => {
if (currentDB.value.from === 'local') {
appStatusRef.value.onCheck();
}
for (const item of dbOptionsLocal.value) { for (const item of dbOptionsLocal.value) {
if (item.database == currentDBName.value) { if (item.database == currentDBName.value) {
currentDB.value = item; currentDB.value = item;
@@ -19,6 +19,7 @@
v-model:mask-show="maskShow" v-model:mask-show="maskShow"
@setting="onSetting" @setting="onSetting"
@is-exist="checkExist" @is-exist="checkExist"
ref="appStatusRef"
></AppStatus> ></AppStatus>
</template> </template>
@@ -305,6 +306,7 @@ const postgresqlContainer = ref();
const postgresqlStatus = ref(); const postgresqlStatus = ref();
const postgresqlVersion = ref(); const postgresqlVersion = ref();
const appStatusRef = ref();
const dialogRef = ref(); const dialogRef = ref();
const onOpenDialog = async () => { const onOpenDialog = async () => {
let params = { let params = {
@@ -348,6 +350,9 @@ const onSetting = async () => {
}; };
const changeDatabase = async () => { const changeDatabase = async () => {
if (currentDB.value.from === 'local') {
appStatusRef.value.onCheck();
}
for (const item of dbOptionsLocal.value) { for (const item of dbOptionsLocal.value) {
if (item.database == currentDBName.value) { if (item.database == currentDBName.value) {
currentDB.value = item; currentDB.value = item;
@@ -128,7 +128,7 @@ const onOpenDialog = async (
rowData: Partial<Database.DatabaseInfo> = { rowData: Partial<Database.DatabaseInfo> = {
name: '', name: '',
type: 'postgresql', type: 'postgresql',
version: '16.x', version: '17.x',
address: '', address: '',
port: 5432, port: 5432,
username: '', username: '',
@@ -27,6 +27,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="$t('database.version')" prop="version"> <el-form-item :label="$t('database.version')" prop="version">
<el-radio-group v-model="dialogData.rowData!.version" @change="isOK = false"> <el-radio-group v-model="dialogData.rowData!.version" @change="isOK = false">
<el-radio label="17.x" value="17.x" />
<el-radio label="16.x" value="16.x" /> <el-radio label="16.x" value="16.x" />
<el-radio label="15.x" value="15.x" /> <el-radio label="15.x" value="15.x" />
<el-radio label="14.x" value="14.x" /> <el-radio label="14.x" value="14.x" />
@@ -19,6 +19,7 @@
@before="onBefore" @before="onBefore"
@after="onAfter" @after="onAfter"
@setting="onSetting" @setting="onSetting"
ref="appStatusRef"
></AppStatus> ></AppStatus>
</template> </template>
<template #search v-if="!isOnSetting && currentDB"> <template #search v-if="!isOnSetting && currentDB">
@@ -164,6 +165,7 @@ const redisIsExist = ref(false);
const redisStatus = ref(); const redisStatus = ref();
const terminalShow = ref(false); const terminalShow = ref(false);
const appStatusRef = ref();
const commandVisible = ref(false); const commandVisible = ref(false);
const redisCliExist = ref(); const redisCliExist = ref();
@@ -220,6 +222,9 @@ const goRouter = async (target: string) => {
}; };
const changeDatabase = async () => { const changeDatabase = async () => {
if (currentDB.value.from === 'local') {
appStatusRef.value.onCheck();
}
for (const item of dbOptionsLocal.value) { for (const item of dbOptionsLocal.value) {
if (item.database == currentDBName.value) { if (item.database == currentDBName.value) {
currentDB.value = item; currentDB.value = item;
+1 -22
View File
@@ -7,17 +7,7 @@
path: '/', path: '/',
}, },
]" ]"
> />
<template #route-button>
<div class="router-button">
<template v-if="!isProductPro">
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</template>
</div>
</template>
</RouterButton>
<el-alert <el-alert
v-if="!isSafety && globalStore.showEntranceWarn" v-if="!isSafety && globalStore.showEntranceWarn"
@@ -259,8 +249,6 @@
</CardWithHeader> </CardWithHeader>
</el-col> </el-col>
</el-row> </el-row>
<LicenseImport ref="licenseRef" />
</div> </div>
</template> </template>
@@ -269,7 +257,6 @@ import { onMounted, onBeforeUnmount, ref, reactive } from 'vue';
import Status from '@/views/home/status/index.vue'; import Status from '@/views/home/status/index.vue';
import App from '@/views/home/app/index.vue'; import App from '@/views/home/app/index.vue';
import VCharts from '@/components/v-charts/index.vue'; import VCharts from '@/components/v-charts/index.vue';
import LicenseImport from '@/components/license-import/index.vue';
import CardWithHeader from '@/components/card-with-header/index.vue'; import CardWithHeader from '@/components/card-with-header/index.vue';
import i18n from '@/lang'; import i18n from '@/lang';
import { Dashboard } from '@/api/interface/dashboard'; import { Dashboard } from '@/api/interface/dashboard';
@@ -303,9 +290,6 @@ const timeNetDatas = ref<Array<string>>([]);
const ioOptions = ref(); const ioOptions = ref();
const netOptions = ref(); const netOptions = ref();
const licenseRef = ref();
const isProductPro = ref();
const searchInfo = reactive({ const searchInfo = reactive({
ioOption: 'all', ioOption: 'all',
netOption: 'all', netOption: 'all',
@@ -659,12 +643,7 @@ const onBlur = () => {
isActive.value = false; isActive.value = false;
}; };
const toUpload = () => {
licenseRef.value.acceptParams();
};
onMounted(() => { onMounted(() => {
isProductPro.value = globalStore.isProductPro;
window.addEventListener('focus', onFocus); window.addEventListener('focus', onFocus);
window.addEventListener('blur', onBlur); window.addEventListener('blur', onBlur);
loadSafeStatus(); loadSafeStatus();
@@ -478,11 +478,10 @@ import {
SearchFavorite, SearchFavorite,
} from '@/api/modules/files'; } from '@/api/modules/files';
import { computeSize, copyText, dateFormat, downloadFile, getFileType, getIcon, getRandomStr } from '@/utils/util'; import { computeSize, copyText, dateFormat, downloadFile, getFileType, getIcon, getRandomStr } from '@/utils/util';
import { StarFilled, Star, Top, Right, Close } from '@element-plus/icons-vue';
import { File } from '@/api/interface/file'; import { File } from '@/api/interface/file';
import { Mimetypes, Languages } from '@/global/mimetype'; import { Mimetypes, Languages } from '@/global/mimetype';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { Back, Refresh } from '@element-plus/icons-vue'; import { Back, Refresh, StarFilled, Star, Top, Right, Close } from '@element-plus/icons-vue';
import { MsgWarning } from '@/utils/message'; import { MsgWarning } from '@/utils/message';
import { useSearchable } from './hooks/searchable'; import { useSearchable } from './hooks/searchable';
import { ResultData } from '@/api/interface'; import { ResultData } from '@/api/interface';
@@ -612,7 +611,7 @@ const handleFilePatch = (command: string) => {
openBatchRole(selects.value); openBatchRole(selects.value);
break; break;
case 'batchDelFiles': case 'batchDelFiles':
openDetail(selects.value); batchDelFiles();
break; break;
default: default:
break; break;
-4
View File
@@ -27,10 +27,6 @@ const buttons = [
label: i18n.global.t('setting.snapshot'), label: i18n.global.t('setting.snapshot'),
path: '/settings/snapshot', path: '/settings/snapshot',
}, },
{
label: i18n.global.t('setting.license'),
path: '/settings/license',
},
{ {
label: i18n.global.t('setting.about'), label: i18n.global.t('setting.about'),
path: '/settings/about', path: '/settings/about',
@@ -1,261 +0,0 @@
<template>
<div>
<LayoutContent v-loading="loading" :title="$t('setting.license')" :divider="true">
<template #main>
<el-row :gutter="20" class="mt-5; mb-10">
<el-col :xs="24" :sm="24" :md="15" :lg="15" :xl="15">
<div class="descriptions" v-if="hasLicense">
<el-descriptions :column="1" direction="horizontal" size="large" border>
<el-descriptions-item :label="$t('license.authorizationId')">
{{ license.licenseName || '-' }}
<el-button
type="primary"
class="ml-3"
plain
@click="onSync"
size="small"
v-if="showSync()"
>
{{ $t('commons.button.sync') }}
</el-button>
<el-button
v-if="!license.offline"
type="primary"
class="ml-3"
plain
@click="onUnBind()"
size="small"
>
{{ $t('license.unbind') }}
</el-button>
</el-descriptions-item>
<el-descriptions-item :label="$t('license.authorizedUser')">
{{ license.assigneeName || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.productName')">
{{ license.productName || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.trialInfo')">
{{ license.trial ? $t('license.trial') : $t('license.office') }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.expiresAt')">
{{ license.expiresAt || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.productStatus')">
<div v-if="license.status">
<el-tooltip
v-if="license.status.indexOf('Lost') !== -1"
:content="$t('license.lostHelper')"
>
<el-tag type="info">
{{ $t('license.' + license.status) }}
</el-tag>
</el-tooltip>
<el-tag v-else>{{ $t('license.' + license.status) }}</el-tag>
</div>
<span v-else>-</span>
</el-descriptions-item>
<el-descriptions-item class="descriptions" :label="$t('commons.table.message')">
{{ license.message }}
</el-descriptions-item>
</el-descriptions>
</div>
<CardWithHeader :header="$t('home.overview')" height="160px" v-if="!hasLicense">
<template #body>
<div class="h-app-card">
<el-row>
<el-col :span="6">
<span>{{ $t('setting.license') }}</span>
</el-col>
<el-col :span="6">
<span>{{ $t('license.community2') }}</span>
</el-col>
</el-row>
</div>
</template>
</CardWithHeader>
</el-col>
<el-col :xs="24" :sm="24" :md="9" :lg="9" :xl="9">
<CardWithHeader :header="$t('license.quickUpdate')" height="160px">
<template #body>
<div class="h-app-card">
<el-row>
<el-col :span="15">
<div class="h-app-content">{{ $t('license.importLicense') }}:</div>
</el-col>
<el-col :span="5">
<el-button type="primary" plain round size="small" @click="toUpload">
{{ $t('license.import') }}
</el-button>
</el-col>
</el-row>
</div>
<div class="h-app-card">
<el-row>
<el-col :span="15">
<div class="h-app-content">{{ $t('license.technicalAdvice') }}:</div>
</el-col>
<el-col :span="5">
<el-button type="primary" plain round size="small" @click="toHalo()">
{{ $t('license.advice') }}
</el-button>
</el-col>
</el-row>
</div>
</template>
</CardWithHeader>
</el-col>
</el-row>
</template>
</LayoutContent>
<LicenseImport ref="licenseRef" />
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue';
import { getLicense, syncLicense, unbindLicense } from '@/api/modules/setting';
import CardWithHeader from '@/components/card-with-header/index.vue';
import LicenseImport from '@/components/license-import/index.vue';
import i18n from '@/lang';
import { MsgSuccess } from '@/utils/message';
import { GlobalStore } from '@/store';
const loading = ref();
const licenseRef = ref();
const globalStore = GlobalStore();
const hasLicense = ref();
const license = reactive({
licenseName: '',
trial: true,
offline: true,
expiresAt: '',
assigneeName: '',
productName: '',
status: '',
message: '',
});
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
const onSync = async () => {
loading.value = true;
await syncLicense()
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
window.location.reload();
})
.catch(() => {
loading.value = false;
});
};
const onUnBind = async () => {
ElMessageBox.confirm(i18n.global.t('license.unbindHelper'), i18n.global.t('license.unbind'), {
confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info',
}).then(async () => {
loading.value = true;
await unbindLicense()
.then(() => {
loading.value = false;
globalStore.isProductPro = false;
globalStore.themeConfig.isGold = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
window.location.reload();
})
.catch(() => {
loading.value = false;
});
});
};
const timestampToDate = (timestamp: number) => {
const date = new Date(timestamp * 1000);
const y = date.getFullYear();
let m: string | number = date.getMonth() + 1;
m = m < 10 ? `0${String(m)}` : m;
let d: string | number = date.getDate();
d = d < 10 ? `0${String(d)}` : d;
let h: string | number = date.getHours();
h = h < 10 ? `0${String(h)}` : h;
let minute: string | number = date.getMinutes();
minute = minute < 10 ? `0${String(minute)}` : minute;
let second: string | number = date.getSeconds();
second = second < 10 ? `0${String(second)}` : second;
return `${y}-${m}-${d} ${h}:${minute}:${second}`;
};
const search = async () => {
loading.value = true;
await getLicense()
.then((res) => {
loading.value = false;
license.status = res.data.status;
globalStore.isProductPro =
res.data.status === 'Enable' || res.data.status === 'Lost01' || res.data.status === 'Lost02';
if (res.data.status === '') {
hasLicense.value = false;
return;
}
hasLicense.value = true;
if (globalStore.isProductPro) {
globalStore.productProExpires = Number(res.data.productPro);
globalStore.isTrial = res.data.trial;
}
license.licenseName = res.data.licenseName;
license.message = res.data.message;
license.assigneeName = res.data.assigneeName;
license.trial = res.data.trial;
license.offline = res.data.offline;
if (res.data.productPro) {
license.productName = 'product-1panel-pro';
license.expiresAt =
res.data.productPro === '0'
? i18n.global.t('license.indefinitePeriod')
: timestampToDate(Number(res.data.productPro));
}
})
.catch(() => {
loading.value = false;
});
};
const showSync = () => {
return (license.status.indexOf('Lost') !== -1 || license.status === 'Disable') && !license.offline;
};
const toUpload = () => {
licenseRef.value.acceptParams();
};
onMounted(() => {
search();
});
</script>
<style scoped lang="scss">
.h-app-card {
padding: 10px 15px;
margin-right: 10px;
line-height: 18px;
&:hover {
background-color: rgba(0, 94, 235, 0.03);
}
}
:deep(.el-descriptions__content) {
max-width: 300px;
}
.descriptions {
word-break: break-all;
word-wrap: break-word;
}
</style>
@@ -126,21 +126,6 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('setting.developerMode')" prop="developerMode">
<el-radio-group
@change="onSave('DeveloperMode', form.developerMode)"
v-model="form.developerMode"
>
<el-radio-button value="enable">
<span>{{ $t('commons.button.enable') }}</span>
</el-radio-button>
<el-radio-button value="disable">
<span>{{ $t('commons.button.disable') }}</span>
</el-radio-button>
</el-radio-group>
<span class="input-help">{{ $t('setting.developerModeHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('setting.advancedMenuHide')"> <el-form-item :label="$t('setting.advancedMenuHide')">
<el-input disabled v-model="form.proHideMenus"> <el-input disabled v-model="form.proHideMenus">
<template #append> <template #append>
@@ -266,7 +251,6 @@ const search = async () => {
form.defaultNetworkVal = res.data.defaultNetwork === 'all' ? i18n.t('commons.table.all') : res.data.defaultNetwork; form.defaultNetworkVal = res.data.defaultNetwork === 'all' ? i18n.t('commons.table.all') : res.data.defaultNetwork;
form.proHideMenus = res.data.xpackHideMenu; form.proHideMenus = res.data.xpackHideMenu;
form.hideMenuList = res.data.xpackHideMenu; form.hideMenuList = res.data.xpackHideMenu;
form.developerMode = res.data.developerMode;
form.proxyUrl = res.data.proxyUrl; form.proxyUrl = res.data.proxyUrl;
form.proxyType = res.data.proxyType; form.proxyType = res.data.proxyType;
@@ -19,7 +19,6 @@
<ul style="margin-left: -20px"> <ul style="margin-left: -20px">
<li v-if="isProductPro">{{ $t('setting.proxyHelper1') }}</li> <li v-if="isProductPro">{{ $t('setting.proxyHelper1') }}</li>
<li v-if="isProductPro">{{ $t('setting.proxyHelper2') }}</li> <li v-if="isProductPro">{{ $t('setting.proxyHelper2') }}</li>
<li>{{ $t('setting.proxyHelper3') }}</li>
</ul> </ul>
</template> </template>
</el-alert> </el-alert>
+5 -1
View File
@@ -114,7 +114,7 @@
<div v-if="form.ssl === 'enable' && sslInfo"> <div v-if="form.ssl === 'enable' && sslInfo">
<el-tag>{{ $t('setting.domainOrIP') }} {{ sslInfo.domain }}</el-tag> <el-tag>{{ $t('setting.domainOrIP') }} {{ sslInfo.domain }}</el-tag>
<el-tag style="margin-left: 5px"> <el-tag style="margin-left: 5px">
{{ $t('setting.timeOut') }} {{ sslInfo.timeout }} {{ $t('setting.timeOut') }} {{ dateFormat('', '', sslInfo.timeout) }}
</el-tag> </el-tag>
<div> <div>
<el-button link type="primary" @click="handleSSL"> <el-button link type="primary" @click="handleSSL">
@@ -194,6 +194,7 @@ import TimeoutSetting from '@/views/setting/safe/timeout/index.vue';
import EntranceSetting from '@/views/setting/safe/entrance/index.vue'; import EntranceSetting from '@/views/setting/safe/entrance/index.vue';
import DomainSetting from '@/views/setting/safe/domain/index.vue'; import DomainSetting from '@/views/setting/safe/domain/index.vue';
import AllowIPsSetting from '@/views/setting/safe/allowips/index.vue'; import AllowIPsSetting from '@/views/setting/safe/allowips/index.vue';
import { dateFormat } from '@/utils/util';
import { updateSetting, getSettingInfo, getSystemAvailable, updateSSL, loadSSLInfo } from '@/api/modules/setting'; import { updateSetting, getSettingInfo, getSystemAvailable, updateSSL, loadSSLInfo } from '@/api/modules/setting';
import i18n from '@/lang'; import i18n from '@/lang';
import { MsgSuccess } from '@/utils/message'; import { MsgSuccess } from '@/utils/message';
@@ -224,6 +225,7 @@ const form = reactive({
bindAddress: '', bindAddress: '',
ssl: 'disable', ssl: 'disable',
sslType: 'self', sslType: 'self',
autoRestart: 'disable',
securityEntrance: '', securityEntrance: '',
expirationDays: 0, expirationDays: 0,
expirationTime: '', expirationTime: '',
@@ -248,6 +250,7 @@ const search = async () => {
if (form.ssl === 'enable') { if (form.ssl === 'enable') {
loadInfo(); loadInfo();
} }
form.autoRestart = res.data.autoRestart;
form.securityEntrance = res.data.securityEntrance; form.securityEntrance = res.data.securityEntrance;
form.expirationDays = Number(res.data.expirationDays); form.expirationDays = Number(res.data.expirationDays);
form.expirationTime = res.data.expirationTime; form.expirationTime = res.data.expirationTime;
@@ -327,6 +330,7 @@ const handleSSL = async () => {
ssl: form.ssl, ssl: form.ssl,
sslType: form.sslType, sslType: form.sslType,
sslInfo: sslInfo.value, sslInfo: sslInfo.value,
autoRestart: form.autoRestart,
}; };
sslRef.value!.acceptParams(params); sslRef.value!.acceptParams(params);
return; return;
+20 -10
View File
@@ -11,13 +11,6 @@
<template #header> <template #header>
<DrawerHeader :header="$t('setting.panelSSL')" :back="handleClose" /> <DrawerHeader :header="$t('setting.panelSSL')" :back="handleClose" />
</template> </template>
<el-alert class="common-prompt" :closable="false" type="error">
<template #default>
<span>
<span>{{ $t('setting.panelSSLHelper') }}</span>
</span>
</template>
</el-alert>
<el-form ref="formRef" label-position="top" :model="form" :rules="rules" v-loading="loading"> <el-form ref="formRef" label-position="top" :model="form" :rules="rules" v-loading="loading">
<el-row type="flex" justify="center"> <el-row type="flex" justify="center">
<el-col :span="22"> <el-col :span="22">
@@ -40,7 +33,9 @@
<el-form-item v-if="form.timeout"> <el-form-item v-if="form.timeout">
<el-tag>{{ $t('setting.domainOrIP') }} {{ form.domain }}</el-tag> <el-tag>{{ $t('setting.domainOrIP') }} {{ form.domain }}</el-tag>
<el-tag style="margin-left: 5px">{{ $t('setting.timeOut') }} {{ form.timeout }}</el-tag> <el-tag style="margin-left: 5px">
{{ $t('setting.timeOut') }} {{ dateFormat('', '', form.timeout) }}
</el-tag>
<el-button <el-button
@click="onDownload" @click="onDownload"
style="margin-left: 5px" style="margin-left: 5px"
@@ -117,6 +112,14 @@
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</div> </div>
<el-form-item v-if="form.sslType !== 'import'">
<el-checkbox true-value="enable" false-value="disable" v-model="form.autoRestart">
{{ $t('setting.sslAutoRestart') }}
</el-checkbox>
<span v-if="form.autoRestart === 'disable'" class="input-help">
{{ $t('setting.sslChangeHelper1') }}
</span>
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
@@ -133,7 +136,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { Website } from '@/api/interface/website'; import { Website } from '@/api/interface/website';
import { dateFormatSimple, getProvider } from '@/utils/util'; import { dateFormatSimple, dateFormat, getProvider } from '@/utils/util';
import { ListSSL } from '@/api/modules/website'; import { ListSSL } from '@/api/modules/website';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import i18n from '@/lang'; import i18n from '@/lang';
@@ -159,6 +162,7 @@ const form = reactive({
key: '', key: '',
rootPath: '', rootPath: '',
timeout: '', timeout: '',
autoRestart: 'disable',
}); });
const rules = reactive({ const rules = reactive({
@@ -175,6 +179,7 @@ const itemSSL = ref();
interface DialogProps { interface DialogProps {
sslType: string; sslType: string;
sslInfo?: Setting.SSLInfo; sslInfo?: Setting.SSLInfo;
autoRestart: string;
} }
const acceptParams = async (params: DialogProps): Promise<void> => { const acceptParams = async (params: DialogProps): Promise<void> => {
if (params.sslType.indexOf('-') !== -1) { if (params.sslType.indexOf('-') !== -1) {
@@ -197,6 +202,7 @@ const acceptParams = async (params: DialogProps): Promise<void> => {
} else { } else {
loadSSLs(); loadSSLs();
} }
form.autoRestart = params.autoRestart;
drawerVisible.value = true; drawerVisible.value = true;
}; };
const emit = defineEmits<{ (e: 'search'): void }>(); const emit = defineEmits<{ (e: 'search'): void }>();
@@ -237,7 +243,10 @@ const onSaveSSL = async (formEl: FormInstance | undefined) => {
if (!formEl) return; if (!formEl) return;
formEl.validate(async (valid) => { formEl.validate(async (valid) => {
if (!valid) return; if (!valid) return;
ElMessageBox.confirm(i18n.global.t('setting.sslChangeHelper'), 'https', { let msg = !form.autoRestart
? i18n.global.t('setting.sslChangeHelper1') + '\n\n\n' + 'qwdqwdqwd'
: i18n.global.t('setting.sslChangeHelper2');
ElMessageBox.confirm(msg, i18n.global.t('setting.panelSSL'), {
confirmButtonText: i18n.global.t('commons.button.confirm'), confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'), cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info', type: 'info',
@@ -253,6 +262,7 @@ const onSaveSSL = async (formEl: FormInstance | undefined) => {
sslID: form.sslID, sslID: form.sslID,
cert: form.cert, cert: form.cert,
key: form.key, key: form.key,
autoRestart: form.autoRestart,
}; };
let href = window.location.href; let href = window.location.href;
param.domain = href.split('//')[1].split(':')[0]; param.domain = href.split('//')[1].split(':')[0];
@@ -110,7 +110,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="createdAt" prop="created_at"
sortable sortable
:label="$t('commons.table.date')" :label="$t('commons.table.date')"
:formatter="dateFormat" :formatter="dateFormat"
@@ -53,12 +53,6 @@
<el-form-item prop="hasSpec"> <el-form-item prop="hasSpec">
<el-checkbox v-model="dialogData.rowData!.hasSpec" :label="$t('toolbox.clam.cron')" /> <el-checkbox v-model="dialogData.rowData!.hasSpec" :label="$t('toolbox.clam.cron')" />
</el-form-item> </el-form-item>
<el-form-item v-if="dialogData.rowData!.hasSpec && !isProductPro">
<span>{{ $t('toolbox.clam.cronHelper') }}</span>
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</el-form-item>
<el-form-item prop="spec" v-if="dialogData.rowData!.hasSpec && isProductPro"> <el-form-item prop="spec" v-if="dialogData.rowData!.hasSpec && isProductPro">
<el-select <el-select
class="specTypeClass" class="specTypeClass"
@@ -121,30 +115,6 @@
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="hasAlert">
<el-checkbox v-model="dialogData.rowData!.hasAlert" :label="$t('alert.isAlert')" />
<span class="input-help">{{ $t('alert.clamHelper') }}</span>
</el-form-item>
<el-form-item v-if="dialogData.rowData!.hasAlert && !isProductPro">
<span>{{ $t('toolbox.clam.alertHelper') }}</span>
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</el-form-item>
<el-form-item
prop="alertCount"
v-if="dialogData.rowData!.hasAlert && isProductPro"
:label="$t('alert.alertCount')"
>
<el-input-number
style="width: 200px"
:min="1"
step-strictly
:step="1"
v-model.number="dialogData.rowData!.alertCount"
></el-input-number>
<span class="input-help">{{ $t('alert.alertCountHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description"> <el-form-item :label="$t('commons.table.description')" prop="description">
<el-input type="textarea" :rows="3" clearable v-model="dialogData.rowData!.description" /> <el-input type="textarea" :rows="3" clearable v-model="dialogData.rowData!.description" />
</el-form-item> </el-form-item>
@@ -159,7 +129,6 @@
</el-button> </el-button>
</span> </span>
</template> </template>
<LicenseImport ref="licenseRef" />
</el-drawer> </el-drawer>
</template> </template>
@@ -169,7 +138,6 @@ import { Rules } from '@/global/form-rules';
import FileList from '@/components/file-list/index.vue'; import FileList from '@/components/file-list/index.vue';
import i18n from '@/lang'; import i18n from '@/lang';
import { ElForm } from 'element-plus'; import { ElForm } from 'element-plus';
import LicenseImport from '@/components/license-import/index.vue';
import DrawerHeader from '@/components/drawer-header/index.vue'; import DrawerHeader from '@/components/drawer-header/index.vue';
import { MsgError, MsgSuccess } from '@/utils/message'; import { MsgError, MsgSuccess } from '@/utils/message';
import { Toolbox } from '@/api/interface/toolbox'; import { Toolbox } from '@/api/interface/toolbox';
@@ -179,7 +147,6 @@ import { storeToRefs } from 'pinia';
import { GlobalStore } from '@/store'; import { GlobalStore } from '@/store';
const globalStore = GlobalStore(); const globalStore = GlobalStore();
const licenseRef = ref();
const { isProductPro } = storeToRefs(globalStore); const { isProductPro } = storeToRefs(globalStore);
interface DialogProps { interface DialogProps {
title: string; title: string;
@@ -208,8 +175,6 @@ const acceptParams = (params: DialogProps): void => {
second: 30, second: 30,
}; };
} }
dialogData.value.rowData.hasAlert = dialogData.value.rowData!.alertCount > 0;
dialogData.value.rowData!.alertCount = dialogData.value.rowData!.alertCount || 3;
title.value = i18n.global.t('commons.button.' + dialogData.value.title); title.value = i18n.global.t('commons.button.' + dialogData.value.title);
drawerVisible.value = true; drawerVisible.value = true;
}; };
@@ -303,19 +268,6 @@ const verifySpec = (rule: any, value: any, callback: any) => {
} }
callback(); callback();
}; };
function checkSendCount(rule: any, value: any, callback: any) {
if (value === '') {
callback();
}
const regex = /^(?:[1-9]|[12][0-9]|30)$/;
if (!regex.test(value)) {
return callback(new Error(i18n.global.t('commons.rule.numberRange', [1, 30])));
}
callback();
}
const rules = reactive({ const rules = reactive({
name: [Rules.simpleName], name: [Rules.simpleName],
path: [Rules.requiredInput, Rules.noSpace], path: [Rules.requiredInput, Rules.noSpace],
@@ -323,7 +275,6 @@ const rules = reactive({
{ validator: verifySpec, trigger: 'blur', required: true }, { validator: verifySpec, trigger: 'blur', required: true },
{ validator: verifySpec, trigger: 'change', required: true }, { validator: verifySpec, trigger: 'change', required: true },
], ],
alertCount: [Rules.integerNumber, { validator: checkSendCount, trigger: 'blur' }],
}); });
type FormInstance = InstanceType<typeof ElForm>; type FormInstance = InstanceType<typeof ElForm>;
@@ -347,10 +298,6 @@ const hasHour = (item: any) => {
return item.specType !== 'perHour' && item.specType !== 'perNMinute' && item.specType !== 'perNSecond'; return item.specType !== 'perHour' && item.specType !== 'perNMinute' && item.specType !== 'perNSecond';
}; };
const toUpload = () => {
licenseRef.value.acceptParams();
};
const changeSpecType = () => { const changeSpecType = () => {
let item = dialogData.value.rowData!.specObj; let item = dialogData.value.rowData!.specObj;
switch (item.specType) { switch (item.specType) {
@@ -393,16 +340,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
MsgError(i18n.global.t('cronjob.cronSpecHelper')); MsgError(i18n.global.t('cronjob.cronSpecHelper'));
return; return;
} }
dialogData.value.rowData.alertCount = dialogData.value.rowData!.hasAlert
? dialogData.value.rowData.alertCount
: 0;
dialogData.value.rowData.alertTitle = i18n.global.t('toolbox.clam.alertTitle', [
dialogData.value.rowData.name,
]);
} else {
dialogData.value.rowData.alertTitle = '';
dialogData.value.rowData.alertCount = 0;
dialogData.value.rowData.hasAlert = false;
} }
dialogData.value.rowData.spec = spec; dialogData.value.rowData.spec = spec;
@@ -61,7 +61,7 @@
import { Codemirror } from 'vue-codemirror'; import { Codemirror } from 'vue-codemirror';
import { javascript } from '@codemirror/lang-javascript'; import { javascript } from '@codemirror/lang-javascript';
import { oneDark } from '@codemirror/theme-one-dark'; import { oneDark } from '@codemirror/theme-one-dark';
import { computed, onUnmounted, reactive, ref, shallowRef } from 'vue'; import { computed, onUnmounted, reactive, ref, shallowRef, watch } from 'vue';
import { OperateSupervisorProcessFile } from '@/api/modules/host-tool'; import { OperateSupervisorProcessFile } from '@/api/modules/host-tool';
import i18n from '@/lang'; import i18n from '@/lang';
import { TabsPaneContext } from 'element-plus'; import { TabsPaneContext } from 'element-plus';
@@ -92,6 +92,10 @@ let timer: NodeJS.Timer | null = null;
const em = defineEmits(['search']); const em = defineEmits(['search']);
watch(open, (val) => {
if (screenfull.isEnabled && !val && !mobile.value) screenfull.exit();
});
const mobile = computed(() => { const mobile = computed(() => {
return globalStore.isMobile(); return globalStore.isMobile();
}); });
@@ -76,16 +76,12 @@
{{ $t('runtime.goDirHelper') }} {{ $t('runtime.goDirHelper') }}
</span> </span>
</el-form-item> </el-form-item>
<el-row :gutter="20"> <el-form-item :label="$t('runtime.runScript')" prop="params.EXEC_SCRIPT">
<el-col :span="18"> <el-input v-model="runtime.params['EXEC_SCRIPT']"></el-input>
<el-form-item :label="$t('runtime.runScript')" prop="params.EXEC_SCRIPT"> <span class="input-help">
<el-input v-model="runtime.params['EXEC_SCRIPT']"></el-input> {{ $t('runtime.goHelper') }}
<span class="input-help"> </span>
{{ $t('runtime.goHelper') }} </el-form-item>
</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="7"> <el-col :span="7">
<el-form-item :label="$t('runtime.appPort')" prop="params.GO_APP_PORT"> <el-form-item :label="$t('runtime.appPort')" prop="params.GO_APP_PORT">
@@ -76,16 +76,12 @@
{{ $t('runtime.javaDirHelper') }} {{ $t('runtime.javaDirHelper') }}
</span> </span>
</el-form-item> </el-form-item>
<el-row :gutter="20"> <el-form-item :label="$t('runtime.runScript')" prop="params.EXEC_SCRIPT">
<el-col :span="18"> <el-input v-model="runtime.params['EXEC_SCRIPT']"></el-input>
<el-form-item :label="$t('runtime.runScript')" prop="params.EXEC_SCRIPT"> <span class="input-help">
<el-input v-model="runtime.params['EXEC_SCRIPT']"></el-input> {{ $t('runtime.javaScriptHelper') }}
<span class="input-help"> </span>
{{ $t('runtime.javaScriptHelper') }} </el-form-item>
</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="7"> <el-col :span="7">
<el-form-item :label="$t('runtime.appPort')" prop="params.JAVA_APP_PORT"> <el-form-item :label="$t('runtime.appPort')" prop="params.JAVA_APP_PORT">
@@ -73,16 +73,12 @@
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-row :gutter="20"> <el-form-item :label="$t('runtime.runScript')" prop="params.EXEC_SCRIPT">
<el-col :span="18"> <el-input v-model="runtime.params['EXEC_SCRIPT']"></el-input>
<el-form-item :label="$t('runtime.runScript')" prop="params.EXEC_SCRIPT"> <span class="input-help">
<el-input v-model="runtime.params['EXEC_SCRIPT']"></el-input> {{ $t('runtime.pythonHelper') }}
<span class="input-help"> </span>
{{ $t('runtime.pythonHelper') }} </el-form-item>
</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="7"> <el-col :span="7">
<el-form-item :label="$t('runtime.appPort')" prop="params.APP_PORT"> <el-form-item :label="$t('runtime.appPort')" prop="params.APP_PORT">
@@ -158,7 +158,7 @@ const resetForm = () => {
account.value = { account.value = {
id: 0, id: 0,
name: '', name: '',
type: 'DnsPod', type: 'AliYun',
authorization: {}, authorization: {},
}; };
accountForm.value?.resetFields(); accountForm.value?.resetFields();
@@ -165,6 +165,7 @@
<el-option label="Node.js" value="node"></el-option> <el-option label="Node.js" value="node"></el-option>
<el-option label="Java" value="java"></el-option> <el-option label="Java" value="java"></el-option>
<el-option label="Go" value="go"></el-option> <el-option label="Go" value="go"></el-option>
<el-option label="Python" value="python"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
+49 -51
View File
@@ -15,7 +15,7 @@ require (
github.com/gin-contrib/gzip v0.0.6 github.com/gin-contrib/gzip v0.0.6
github.com/gin-gonic/gin v1.9.1 github.com/gin-gonic/gin v1.9.1
github.com/glebarez/sqlite v1.10.0 github.com/glebarez/sqlite v1.10.0
github.com/go-acme/lego/v4 v4.17.4 github.com/go-acme/lego/v4 v4.19.2
github.com/go-gormigrate/gormigrate/v2 v2.1.1 github.com/go-gormigrate/gormigrate/v2 v2.1.1
github.com/go-playground/validator/v10 v10.18.0 github.com/go-playground/validator/v10 v10.18.0
github.com/go-redis/redis v6.15.9+incompatible github.com/go-redis/redis v6.15.9+incompatible
@@ -24,7 +24,6 @@ require (
github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang-jwt/jwt/v4 v4.5.0
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.1 github.com/gorilla/websocket v1.5.1
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.113
github.com/jackc/pgx/v5 v5.5.4 github.com/jackc/pgx/v5 v5.5.4
github.com/jinzhu/copier v0.4.0 github.com/jinzhu/copier v0.4.0
github.com/jinzhu/gorm v1.9.16 github.com/jinzhu/gorm v1.9.16
@@ -52,12 +51,12 @@ require (
github.com/swaggo/swag v1.16.3 github.com/swaggo/swag v1.16.3
github.com/tencentyun/cos-go-sdk-v5 v0.7.46 github.com/tencentyun/cos-go-sdk-v5 v0.7.46
github.com/xlzd/gotp v0.1.0 github.com/xlzd/gotp v0.1.0
golang.org/x/crypto v0.24.0 golang.org/x/crypto v0.27.0
golang.org/x/net v0.26.0 golang.org/x/net v0.29.0
golang.org/x/oauth2 v0.21.0 golang.org/x/oauth2 v0.23.0
golang.org/x/sys v0.21.0 golang.org/x/sys v0.25.0
golang.org/x/term v0.21.0 golang.org/x/term v0.24.0
golang.org/x/text v0.16.0 golang.org/x/text v0.18.0
gopkg.in/ini.v1 v1.67.0 gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
gorm.io/gorm v1.25.7 gorm.io/gorm v1.25.7
@@ -69,32 +68,32 @@ require (
github.com/KyleBanks/depth v1.2.1 // indirect github.com/KyleBanks/depth v1.2.1 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect
github.com/aliyun/alibaba-cloud-sdk-go v1.62.712 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.63.15 // indirect
github.com/andybalholm/brotli v1.1.0 // indirect github.com/andybalholm/brotli v1.1.0 // indirect
github.com/aws/aws-sdk-go-v2 v1.27.2 // indirect github.com/aws/aws-sdk-go-v2 v1.30.5 // indirect
github.com/aws/aws-sdk-go-v2/config v1.27.18 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.33 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.18 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect
github.com/aws/smithy-go v1.20.2 // indirect github.com/aws/smithy-go v1.20.4 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/bodgit/plumbing v1.3.0 // indirect github.com/bodgit/plumbing v1.3.0 // indirect
github.com/bodgit/sevenzip v1.5.0 // indirect github.com/bodgit/sevenzip v1.5.0 // indirect
github.com/bodgit/windows v1.0.1 // indirect github.com/bodgit/windows v1.0.1 // indirect
github.com/bytedance/sonic v1.11.0 // indirect github.com/bytedance/sonic v1.11.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect
github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 // indirect github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 // indirect
github.com/cloudflare/cloudflare-go v0.97.0 // indirect github.com/cloudflare/cloudflare-go v0.104.0 // indirect
github.com/containerd/console v1.0.4 // indirect github.com/containerd/console v1.0.4 // indirect
github.com/containerd/containerd v1.7.13 // indirect github.com/containerd/containerd v1.7.13 // indirect
github.com/containerd/continuity v0.4.3 // indirect github.com/containerd/continuity v0.4.3 // indirect
@@ -118,8 +117,8 @@ require (
github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect
github.com/glebarez/go-sqlite v1.22.0 // indirect github.com/glebarez/go-sqlite v1.22.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.2 // indirect github.com/go-jose/go-jose/v4 v4.0.4 // indirect
github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect
@@ -129,11 +128,11 @@ require (
github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-json v0.10.3 // indirect
github.com/gofrs/flock v0.8.1 // indirect github.com/gofrs/flock v0.12.1 // indirect
github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/glog v1.2.0 // indirect github.com/golang/glog v1.2.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect github.com/golang/snappy v0.0.4 // indirect
@@ -144,14 +143,13 @@ require (
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/mux v1.8.1 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
github.com/h2non/filetype v1.1.3 // indirect github.com/h2non/filetype v1.1.3 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.114 // indirect
github.com/imdario/mergo v0.3.16 // indirect github.com/imdario/mergo v0.3.16 // indirect
github.com/in-toto/in-toto-golang v0.9.0 // indirect github.com/in-toto/in-toto-golang v0.9.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
@@ -172,7 +170,7 @@ require (
github.com/mailru/easyjson v0.7.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/miekg/dns v1.1.59 // indirect github.com/miekg/dns v1.1.62 // indirect
github.com/miekg/pkcs11 v1.1.1 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect
github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect github.com/minio/sha256-simd v1.0.1 // indirect
@@ -218,8 +216,8 @@ require (
github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.9.0 // indirect github.com/stretchr/testify v1.9.0 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.898 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1002 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.898 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1002 // indirect
github.com/therootcompany/xz v1.0.1 // indirect github.com/therootcompany/xz v1.0.1 // indirect
github.com/theupdateframework/notary v0.7.0 // indirect github.com/theupdateframework/notary v0.7.0 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect
@@ -239,29 +237,29 @@ require (
go.opencensus.io v0.24.0 // indirect go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.48.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.48.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel v1.29.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.29.0 // indirect
go.opentelemetry.io/otel/sdk v1.23.1 // indirect go.opentelemetry.io/otel/sdk v1.29.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.29.0 // indirect
go.opentelemetry.io/proto/otlp v1.1.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/atomic v1.11.0 // indirect go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/arch v0.7.0 // indirect golang.org/x/arch v0.7.0 // indirect
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect
golang.org/x/image v0.18.0 // indirect golang.org/x/image v0.18.0 // indirect
golang.org/x/mod v0.18.0 // indirect golang.org/x/mod v0.21.0 // indirect
golang.org/x/sync v0.7.0 // indirect golang.org/x/sync v0.8.0 // indirect
golang.org/x/time v0.5.0 // indirect golang.org/x/time v0.6.0 // indirect
golang.org/x/tools v0.22.0 // indirect golang.org/x/tools v0.25.0 // indirect
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/grpc v1.63.1 // indirect google.golang.org/grpc v1.66.1 // indirect
google.golang.org/protobuf v1.33.0 // indirect google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/apimachinery v0.29.2 // indirect k8s.io/apimachinery v0.29.2 // indirect
+104 -112
View File
@@ -13,16 +13,16 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= cloud.google.com/go/compute v1.28.0 h1:OPtBxMcheSS+DWfci803qvPly3d4w7Eu5ztKBcFfzwk=
cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.5.1 h1:NM6oZeZNlYjiwYje+sYFjEpP0Q0zCan1bmQW/KmIrGs=
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.5.1/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
@@ -62,8 +62,8 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:H
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/aliyun/alibaba-cloud-sdk-go v1.62.712 h1:lM7JnA9dEdDFH9XOgRNQMDTQnOjlLkDTNA7c0aWTQ30= github.com/aliyun/alibaba-cloud-sdk-go v1.63.15 h1:r2uwBUQhLhcPzaWz9tRJqc8MjYwHb+oF2+Q6467BF14=
github.com/aliyun/alibaba-cloud-sdk-go v1.62.712/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/aliyun/alibaba-cloud-sdk-go v1.63.15/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ=
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g= github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc= github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc=
@@ -73,32 +73,32 @@ github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer5
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/aws/aws-sdk-go v1.50.20 h1:xfAnSDVf/azIWTVQXQODp89bubvCS85r70O3nuQ4dnE= github.com/aws/aws-sdk-go v1.50.20 h1:xfAnSDVf/azIWTVQXQODp89bubvCS85r70O3nuQ4dnE=
github.com/aws/aws-sdk-go v1.50.20/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go v1.50.20/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
github.com/aws/aws-sdk-go-v2 v1.27.2 h1:pLsTXqX93rimAOZG2FIYraDQstZaaGVVN4tNw65v0h8= github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g=
github.com/aws/aws-sdk-go-v2 v1.27.2/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
github.com/aws/aws-sdk-go-v2/config v1.27.18 h1:wFvAnwOKKe7QAyIxziwSKjmer9JBMH1vzIL6W+fYuKk= github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU=
github.com/aws/aws-sdk-go-v2/config v1.27.18/go.mod h1:0xz6cgdX55+kmppvPm2IaKzIXOheGJhAufacPJaXZ7c= github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks=
github.com/aws/aws-sdk-go-v2/credentials v1.17.18 h1:D/ALDWqK4JdY3OFgA2thcPO1c9aYTT5STS/CvnkqY1c= github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I=
github.com/aws/aws-sdk-go-v2/credentials v1.17.18/go.mod h1:JuitCWq+F5QGUrmMPsk945rop6bB57jdscu+Glozdnc= github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 h1:dDgptDO9dxeFkXy+tEgVkzSClHZje/6JkPW5aZyEvrQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5/go.mod h1:gjvE2KBUgUQhcv89jqxrIxH9GaKs1JbZzWejj/DaHGA= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 h1:cy8ahBJuhtM8GTTSyOkfy6WVPV1IE+SS5/wfXUYuulw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9/go.mod h1:CZBXGLaJnEZI6EVNcPd7a6B5IC5cA/GkRWtu9fp3S6Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 h1:A4SYk07ef04+vxZToz9LWvAXl9LW0NClpPpMsi31cz0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9/go.mod h1:5jJcHuwDagxN+ErjQ3PU3ocf6Ylc/p9x+BLO/+X4iXw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 h1:o4T+fKxA3gTMcluBNZZXE9DNaMkJuUL1O3mffCUjoJo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11/go.mod h1:84oZdJ+VjuJKs9v1UTC9NaodRZRseOXCTgku+vQJWR8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE=
github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 h1:gEYM2GSpr4YNWc6hCd5nod4+d4kd9vWIAWrmGuLdlMw= github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc=
github.com/aws/aws-sdk-go-v2/service/sso v1.20.11/go.mod h1:gVvwPdPNYehHSP9Rs7q27U1EU+3Or2ZpXvzAYJNh63w= github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 h1:iXjh3uaH3vsVcnyZX7MqCoCfcyxIrVE9iOQruRaWPrQ= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5/go.mod h1:5ZXesEuy/QcO0WUnt+4sDkxhdXRHTu2yG0uCSH8B6os= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA=
github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 h1:M/1u4HBpwLuMtjlxuI2y6HoVLzF5e2mfxHCg7ZVMYmk= github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE=
github.com/aws/aws-sdk-go-v2/service/sts v1.28.12/go.mod h1:kcfd+eTdEi/40FIbLq4Hif3XMXnl5b/+t/KTfLt9xIk= github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o=
github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -128,8 +128,8 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
@@ -146,11 +146,11 @@ github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28/go.mod h1:BVjHeAH+
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ=
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=
github.com/cloudflare/cloudflare-go v0.97.0 h1:feZRGiRF1EbljnNIYdt8014FnOLtC3CCvgkLXu915ks= github.com/cloudflare/cloudflare-go v0.104.0 h1:R/lB0dZupaZbOgibAH/BRrkFbZ6Acn/WsKg2iX2xXuY=
github.com/cloudflare/cloudflare-go v0.97.0/go.mod h1:JXRwuTfHpe5xFg8xytc2w0XC6LcrFsBVMS4WlVaiGg8= github.com/cloudflare/cloudflare-go v0.104.0/go.mod h1:pfUQ4PIG4ISI0/Mmc21Bp86UnFU0ktmPf3iTgbSL+cM=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw=
github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4=
github.com/compose-spec/compose-go/v2 v2.0.2 h1:zhXMV7VWI00Su0LdKt8/sxeXxcjLWhmGmpEyw+ZYznI= github.com/compose-spec/compose-go/v2 v2.0.2 h1:zhXMV7VWI00Su0LdKt8/sxeXxcjLWhmGmpEyw+ZYznI=
@@ -240,8 +240,6 @@ github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU
github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
@@ -265,23 +263,23 @@ github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
github.com/glebarez/sqlite v1.10.0 h1:u4gt8y7OND/cCei/NMHmfbLxF6xP2wgKcT/BJf2pYkc= github.com/glebarez/sqlite v1.10.0 h1:u4gt8y7OND/cCei/NMHmfbLxF6xP2wgKcT/BJf2pYkc=
github.com/glebarez/sqlite v1.10.0/go.mod h1:IJ+lfSOmiekhQsFTJRx/lHtGYmCdtAiTaf5wI9u5uHA= github.com/glebarez/sqlite v1.10.0/go.mod h1:IJ+lfSOmiekhQsFTJRx/lHtGYmCdtAiTaf5wI9u5uHA=
github.com/go-acme/lego/v4 v4.17.4 h1:h0nePd3ObP6o7kAkndtpTzCw8shOZuWckNYeUQwo36Q= github.com/go-acme/lego/v4 v4.19.2 h1:Y8hrmMvWETdqzzkRly7m98xtPJJivWFsgWi8fcvZo+Y=
github.com/go-acme/lego/v4 v4.17.4/go.mod h1:dU94SvPNqimEeb7EVilGGSnS0nU1O5Exir0pQ4QFL4U= github.com/go-acme/lego/v4 v4.19.2/go.mod h1:wtDe3dDkmV4/oI2nydpNXSJpvV10J9RCyZ6MbYxNtlQ=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY= github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY=
github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc=
github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E=
github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
@@ -320,8 +318,8 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -338,8 +336,8 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=
github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -428,8 +426,8 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
@@ -440,12 +438,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
@@ -454,8 +448,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.113 h1:odui9Ua0u1hPfpkutN/tGvtt0ms55I+gQqIdU8K1rlo= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.114 h1:X3E16S6AUZsQKhJIQ5kNnylnp0GtSy2YhIbxfvDavtU=
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.113/go.mod h1:JWz2ujO9X3oU5wb6kXp+DpR2UuDj2SldDbX8T0FSuhI= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.114/go.mod h1:JWz2ujO9X3oU5wb6kXp+DpR2UuDj2SldDbX8T0FSuhI=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
@@ -543,8 +537,6 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@@ -557,8 +549,8 @@ github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mholt/archiver/v4 v4.0.0-alpha.8 h1:tRGQuDVPh66WCOelqe6LIGh0gwmfwxUrSSDunscGsRM= github.com/mholt/archiver/v4 v4.0.0-alpha.8 h1:tRGQuDVPh66WCOelqe6LIGh0gwmfwxUrSSDunscGsRM=
github.com/mholt/archiver/v4 v4.0.0-alpha.8/go.mod h1:5f7FUYGXdJWUjESffJaYR4R60VhnHxb2X3T1teMyv5A= github.com/mholt/archiver/v4 v4.0.0-alpha.8/go.mod h1:5f7FUYGXdJWUjESffJaYR4R60VhnHxb2X3T1teMyv5A=
github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
@@ -699,8 +691,8 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -774,10 +766,10 @@ github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRd
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.898 h1:ERwcXqhc94L9cFxtiI0pvt7IJtlHl/p/Jayl3mLw+ms= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1002 h1:RE84sHFFx6t24DJvSnF9fS1DzBNv9OpctzHK3t7AY+I=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.898/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1002/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.898 h1:LoYv5u+gUoFpU/AmIuTRG/2KiEkdm9gCC0dTvk8WITQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1002 h1:QwE0dRkAAbdf+eACnkNULgDn9ZKUJpPWRyXdqJolP5E=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.898/go.mod h1:c1j6YQ+vCbeA8kJ59Im4UnMd1GxovlpPBDhGZoewfn8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1002/go.mod h1:WdC0FYbqYhJwQ3kbqri6hVP5HAEp+rzX9FToItTAzUg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
github.com/tencentyun/cos-go-sdk-v5 v0.7.46 h1:IeTiMR8qZ7iQWhAGb1niw5vt0T1TfAwPeB8Gn/oTkuk= github.com/tencentyun/cos-go-sdk-v5 v0.7.46 h1:IeTiMR8qZ7iQWhAGb1niw5vt0T1TfAwPeB8Gn/oTkuk=
github.com/tencentyun/cos-go-sdk-v5 v0.7.46/go.mod h1:DH9US8nB+AJXqwu/AMOrCFN1COv3dpytXuJWHgdg7kE= github.com/tencentyun/cos-go-sdk-v5 v0.7.46/go.mod h1:DH9US8nB+AJXqwu/AMOrCFN1COv3dpytXuJWHgdg7kE=
@@ -848,22 +840,22 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.48.0 h1:ZeW4++xt1VrFSdnd0pFXz0PkrjLb89/VPOUOyPDJG/g= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.48.0 h1:ZeW4++xt1VrFSdnd0pFXz0PkrjLb89/VPOUOyPDJG/g=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.48.0/go.mod h1:ZdzuQW6m/OEtOLWWJs+k5ddZXsUq9xs2vx+ZT9G9eJ0= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.48.0/go.mod h1:ZdzuQW6m/OEtOLWWJs+k5ddZXsUq9xs2vx+ZT9G9eJ0=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 h1:o8iWeVFa1BcLtVEV0LzrCxV2/55tB3xLxADr6Kyoey4= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1/go.mod h1:SEVfdK4IoBnbT2FXNM/k8yC08MrfbhWk3U4ljM8B3HE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 h1:cfuy3bXmLJS7M1RZmAL6SuhGtKUp2KEsrm00OlAXkq4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 h1:JAv0Jwtl01UFiyWZEMiJZBiTlv5A50zNs8lsthXqIio=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1/go.mod h1:22jr92C6KwlwItJmQzfixzQM3oyyuYLCfHiMY+rpsPU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0/go.mod h1:QNKLmUEAq2QUbPQUfvw4fmv0bgbK7UlOSFCnXyfvSNc=
go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
go.opentelemetry.io/otel/sdk v1.23.1 h1:O7JmZw0h76if63LQdsBMKQDWNb5oEcOThG9IrxscV+E= go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo=
go.opentelemetry.io/otel/sdk v1.23.1/go.mod h1:LzdEVR5am1uKOOwfBWFef2DCi1nu3SA8XQxx2IerWFk= go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok=
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -893,8 +885,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -936,8 +928,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -946,8 +938,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -959,8 +951,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1011,15 +1003,15 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1033,13 +1025,13 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1087,8 +1079,8 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1149,12 +1141,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU=
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4=
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 h1:rIo7ocm2roD9DcFIX67Ym8icoGCKSARAiPljFhh5suQ= google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0=
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -1169,8 +1161,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.63.1 h1:pNClQmvdlyNUiwFETOux/PYqfhmA7BrswEdGRnib1fA= google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM=
google.golang.org/grpc v1.63.1/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1184,8 +1176,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII=