diff --git a/agent/app/api/v2/setting.go b/agent/app/api/v2/setting.go index f643a425c..80f574d5a 100644 --- a/agent/app/api/v2/setting.go +++ b/agent/app/api/v2/setting.go @@ -1,7 +1,6 @@ package v2 import ( - "encoding/base64" "encoding/json" "github.com/1Panel-dev/1Panel/agent/app/api/v2/helper" @@ -77,26 +76,7 @@ func (b *BaseApi) LoadBaseDir(c *gin.Context) { // @Security Timestamp // @Router /settings/ssh/conn [get] func (b *BaseApi) LoadLocalConn(c *gin.Context) { - connInfoInDB := settingService.GetSettingByKey("LocalSSHConn") - if len(connInfoInDB) == 0 { - helper.Success(c) - return - } - var data dto.SSHConnData - if err := json.Unmarshal([]byte(connInfoInDB), &data); err != nil { - helper.Success(c) - return - } - if len(data.Password) != 0 { - data.Password = base64.StdEncoding.EncodeToString([]byte(data.Password)) - } - if len(data.PrivateKey) != 0 { - data.PrivateKey = base64.StdEncoding.EncodeToString([]byte(data.PrivateKey)) - } - if len(data.PassPhrase) != 0 { - data.PassPhrase = base64.StdEncoding.EncodeToString([]byte(data.PassPhrase)) - } - helper.SuccessWithData(c, data) + helper.SuccessWithData(c, settingService.GetLocalConn()) } func (b *BaseApi) CheckLocalConn(c *gin.Context) { diff --git a/agent/app/dto/setting.go b/agent/app/dto/setting.go index 50e90c48b..e19b38f2f 100644 --- a/agent/app/dto/setting.go +++ b/agent/app/dto/setting.go @@ -69,6 +69,8 @@ type SSHConnData struct { Password string `json:"password"` PrivateKey string `json:"privateKey"` PassPhrase string `json:"passPhrase"` + + LocalSSHConnShow string `json:"localSSHConnShow"` } type SystemProxy struct { diff --git a/agent/app/service/setting.go b/agent/app/service/setting.go index a63c13155..6ed775431 100644 --- a/agent/app/service/setting.go +++ b/agent/app/service/setting.go @@ -8,7 +8,6 @@ import ( "github.com/1Panel-dev/1Panel/agent/app/dto" "github.com/1Panel-dev/1Panel/agent/app/model" "github.com/1Panel-dev/1Panel/agent/buserr" - "github.com/1Panel-dev/1Panel/agent/constant" "github.com/1Panel-dev/1Panel/agent/utils/encrypt" "github.com/1Panel-dev/1Panel/agent/utils/ssh" "github.com/jinzhu/copier" @@ -23,6 +22,7 @@ type ISettingService interface { TestConnByInfo(req dto.SSHConnData) bool SaveConnInfo(req dto.SSHConnData) error GetSystemProxy() (*dto.SystemProxy, error) + GetLocalConn() dto.SSHConnData GetSettingByKey(key string) string } @@ -119,7 +119,6 @@ func (u *SettingService) SaveConnInfo(req dto.SSHConnData) error { localConn, _ := json.Marshal(&connItem) connAfterEncrypt, _ := encrypt.StringEncrypt(string(localConn)) _ = settingRepo.Update("LocalSSHConn", connAfterEncrypt) - _ = settingRepo.Update("LocalSSHConnShow", constant.StatusEnable) return nil } @@ -134,6 +133,29 @@ func (u *SettingService) GetSystemProxy() (*dto.SystemProxy, error) { return &systemProxy, nil } +func (u *SettingService) GetLocalConn() dto.SSHConnData { + var data dto.SSHConnData + connItem, _ := settingRepo.GetValueByKey("LocalSSHConn") + if len(connItem) == 0 { + return data + } + connInfoInDB, _ := encrypt.StringDecrypt(connItem) + data.LocalSSHConnShow, _ = settingRepo.GetValueByKey("LocalSSHConnShow") + if err := json.Unmarshal([]byte(connInfoInDB), &data); err != nil { + return data + } + if len(data.Password) != 0 { + data.Password = base64.StdEncoding.EncodeToString([]byte(data.Password)) + } + if len(data.PrivateKey) != 0 { + data.PrivateKey = base64.StdEncoding.EncodeToString([]byte(data.PrivateKey)) + } + if len(data.PassPhrase) != 0 { + data.PassPhrase = base64.StdEncoding.EncodeToString([]byte(data.PassPhrase)) + } + return data +} + func (u *SettingService) GetSettingByKey(key string) string { switch key { case "LocalSSHConn": diff --git a/agent/app/task/task.go b/agent/app/task/task.go index 520954dfe..1a6f2f408 100644 --- a/agent/app/task/task.go +++ b/agent/app/task/task.go @@ -237,6 +237,9 @@ func (s *SubTask) Execute() error { case err = <-done: if err != nil { s.RootTask.Log(i18n.GetWithNameAndErr("SubTaskFailed", subTaskName, err)) + if err.Error() == i18n.GetMsgByKey("ErrShutDown") { + return err + } } else { s.RootTask.Log(i18n.GetWithName("SubTaskSuccess", subTaskName)) return nil diff --git a/agent/utils/files/file_op.go b/agent/utils/files/file_op.go index f58315c57..56d141b06 100644 --- a/agent/utils/files/file_op.go +++ b/agent/utils/files/file_op.go @@ -754,6 +754,12 @@ func (f FileOp) Decompress(srcFile string, dst string, cType CompressType, secre if cType == TarGz && strings.Contains(err.Error(), "bad decrypt") { return buserr.New("ErrBadDecrypt") } + if cType == TarGz && cmd.Which("file") { + std, _ := cmd.RunDefaultWithStdoutBashCf("file %s", srcFile) + if strings.Contains(std, "openssl enc'd data with salted password") && len(secret) == 0 { + return buserr.New("ErrBadDecrypt") + } + } } else { if cType == Rar || cType == X7z { return err diff --git a/core/app/api/v2/command.go b/core/app/api/v2/command.go index c749b9b22..ed9b5dadd 100644 --- a/core/app/api/v2/command.go +++ b/core/app/api/v2/command.go @@ -13,12 +13,12 @@ import ( ) // @Tags Command -// @Summary Export command +// @Summary Upload command csv for list // @Success 200 {string} path // @Security ApiKeyAuth // @Security Timestamp -// @Router /core/commands/upload [post] -// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"导出快速命令","formatEN":"export quick commands"} +// @Router /core/commands/import [post] +// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"上传快速命令文件","formatEN":"upload quick commands with csv"} func (b *BaseApi) UploadCommandCsv(c *gin.Context) { form, err := c.MultipartForm() if err != nil { @@ -37,7 +37,7 @@ func (b *BaseApi) UploadCommandCsv(c *gin.Context) { return } groupRepo := repo.NewIGroupRepo() - group, _ := groupRepo.Get(groupRepo.WithByDefault(true)) + group, _ := groupRepo.Get(repo.WithByType("command"), groupRepo.WithByDefault(true)) var commands []dto.CommandInfo for { record, err := reader.Read() @@ -91,7 +91,12 @@ func (b *BaseApi) ImportCommands(c *gin.Context) { return } + groupRepo := repo.NewIGroupRepo() + group, _ := groupRepo.Get(repo.WithByType("command"), groupRepo.WithByDefault(true)) for _, item := range req.Items { + if item.GroupID == 0 { + item.GroupID = group.ID + } _ = commandService.Create(item) } helper.Success(c) diff --git a/core/app/service/script_library.go b/core/app/service/script_library.go index 99a061e58..95562d3ca 100644 --- a/core/app/service/script_library.go +++ b/core/app/service/script_library.go @@ -3,6 +3,7 @@ package service import ( "encoding/json" "fmt" + mathRand "math/rand" "net/http" "os" "path" @@ -29,6 +30,7 @@ import ( type ScriptService struct{} type IScriptService interface { + Run() Search(ctx *gin.Context, req dto.SearchPageWithGroup) (int64, interface{}, error) Create(req dto.ScriptOperate) error Update(req dto.ScriptOperate) error @@ -163,6 +165,27 @@ func (u *ScriptService) Update(req dto.ScriptOperate) error { return nil } +func StartSync() { + if global.ScriptSyncJobID != 0 { + global.Cron.Remove(global.ScriptSyncJobID) + } + service := NewIScriptService() + scriptSync, _ := repo.NewISettingRepo().GetValueByKey("ScriptSync") + if !global.CONF.Base.IsOffLine && scriptSync == constant.StatusEnable { + id, err := global.Cron.AddJob(fmt.Sprintf("%v %v * * *", mathRand.Intn(60), mathRand.Intn(3)), service) + if err != nil { + global.LOG.Errorf("[core] can not add script sync corn job: %s", err.Error()) + } + global.LOG.Info("add job for script library sync successful") + global.ScriptSyncJobID = id + } +} +func (u *ScriptService) Run() { + if err := u.Sync(dto.OperateByTaskID{}); err != nil { + global.LOG.Errorf("sync scripts from remote failed, err: %v", err) + } +} + func LoadScriptInfo(id uint) (model.ScriptLibrary, error) { return scriptRepo.Get(repo.WithByID(id)) } diff --git a/core/app/service/setting.go b/core/app/service/setting.go index 7ef7187de..9600de552 100644 --- a/core/app/service/setting.go +++ b/core/app/service/setting.go @@ -152,6 +152,12 @@ func (u *SettingService) Update(key, value string) error { } case "UpgradeBackupCopies": dropBackupCopies() + case "ScriptSync": + if value == constant.StatusEnable { + StartSync() + } else { + global.Cron.Remove(global.ScriptSyncJobID) + } } return nil diff --git a/core/global/global.go b/core/global/global.go index 838757fa8..1f861546b 100644 --- a/core/global/global.go +++ b/core/global/global.go @@ -26,6 +26,8 @@ var ( I18nForCmd *i18n.Localizer Cron *cron.Cron + + ScriptSyncJobID cron.EntryID ) type DBOption func(*gorm.DB) *gorm.DB diff --git a/core/init/cron/cron.go b/core/init/cron/cron.go index 3fac4df90..db6eb6c48 100644 --- a/core/init/cron/cron.go +++ b/core/init/cron/cron.go @@ -1,12 +1,9 @@ package cron import ( - "fmt" - mathRand "math/rand" "time" - "github.com/1Panel-dev/1Panel/core/app/repo" - "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/app/service" "github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/init/cron/job" "github.com/1Panel-dev/1Panel/core/utils/common" @@ -21,13 +18,6 @@ func Init() { global.LOG.Errorf("[core] can not add backup token refresh corn job: %s", err.Error()) } - scriptSync, _ := repo.NewISettingRepo().GetValueByKey("ScriptSync") - if !global.CONF.Base.IsOffLine && scriptSync == constant.StatusEnable { - scriptJob := job.NewScriptJob() - if _, err := global.Cron.AddJob(fmt.Sprintf("%v %v * * *", mathRand.Intn(60), mathRand.Intn(3)), scriptJob); err != nil { - global.LOG.Errorf("[core] can not add script sync corn job: %s", err.Error()) - } - } - + service.StartSync() global.Cron.Start() } diff --git a/core/init/cron/job/script.go b/core/init/cron/job/script.go deleted file mode 100644 index b4f6c6aec..000000000 --- a/core/init/cron/job/script.go +++ /dev/null @@ -1,19 +0,0 @@ -package job - -import ( - "github.com/1Panel-dev/1Panel/core/app/dto" - "github.com/1Panel-dev/1Panel/core/app/service" - "github.com/1Panel-dev/1Panel/core/global" -) - -type script struct{} - -func NewScriptJob() *script { - return &script{} -} - -func (s *script) Run() { - if err := service.NewIScriptService().Sync(dto.OperateByTaskID{}); err != nil { - global.LOG.Errorf("sync scripts from remote failed, err: %v", err) - } -} diff --git a/frontend/src/api/interface/host.ts b/frontend/src/api/interface/host.ts index 7aa35a919..32b4717b5 100644 --- a/frontend/src/api/interface/host.ts +++ b/frontend/src/api/interface/host.ts @@ -49,6 +49,8 @@ export namespace Host { privateKey: string; passPhrase: string; password: string; + + localSSHConnShow: string; } export interface GroupChange { id: number; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index e3fc85704..811b6f37b 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1196,7 +1196,10 @@ const message = { terminal: { local: 'Local', defaultConn: 'Default Connection', - defaultConnHelper: 'Whether to connect to the host by default after opening the terminal', + defaultConnHelper: + 'This operation will automatically connect to the node terminal after opening the terminal for 【{0}】. Continue?', + localConnJump: + 'Default connection information is maintained in [Terminal - Settings]. If connection fails, please edit there!', localHelper: 'The `local` name is used only for system local identification', connLocalErr: 'Unable to automatically authenticate, please fill in the local server login information.', testConn: 'Test connection', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index d87c27a4d..4df27ace8 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -1198,7 +1198,10 @@ const message = { terminal: { local: 'Local', defaultConn: 'Conexión predeterminada', - defaultConnHelper: 'Indica si se conecta al host por defecto después de abrir la terminal', + defaultConnHelper: + 'Esta operación conectará automáticamente al terminal del nodo después de abrir el terminal para 【{0}】. ¿Continuar?', + localConnJump: + 'La información de conexión predeterminada se mantiene en [Terminal - Configuración]. Si la conexión falla, ¡edite allí!', localHelper: 'El nombre `local` se utiliza solo para identificación interna del sistema', connLocalErr: 'No se puede autenticar automáticamente, por favor introduzca la información de inicio de sesión del servidor local.', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index a112601a7..4cfd63ccf 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1155,7 +1155,10 @@ const message = { terminal: { local: 'ローカル', defaultConn: 'デフォルト接続', - defaultConnHelper: 'ターミナルを開いた後にデフォルトでホストに接続するかどうか', + defaultConnHelper: + 'この操作は【{0}】のターミナルを開いた後、自動的にノードターミナルに接続します。続行しますか?', + localConnJump: + 'デフォルト接続情報は【ターミナル - 設定】で管理されています。接続に失敗した場合はこちらで編集してください!', localHelper: 'ローカル名はシステムのローカル識別にのみ使用されます。', connLocalErr: '自動的に認証できない場合は、ローカルサーバーのログイン情報を入力してください。', testConn: 'テスト接続', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 443b98440..f18df20a0 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1147,7 +1147,8 @@ const message = { terminal: { local: '로컬', defaultConn: '기본 연결', - defaultConnHelper: '터미널을 연 후 기본적으로 호스트에 연결할지 여부', + defaultConnHelper: '이 작업은 【{0}】의 터미널을 연 후 자동으로 노드 터미널에 연결됩니다. 계속하시겠습니까?', + localConnJump: '기본 연결 정보는 [터미널 - 설정]에서 관리됩니다. 연결 실패 시 해당 위치에서 편집하세요!', localHelper: '로컬 이름은 시스템 로컬 식별에만 사용됩니다.', connLocalErr: '자동 인증에 실패했습니다. 로컬 서버 로그인 정보를 입력해주세요.', testConn: '연결 테스트', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 8ff786c77..e10f722c1 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1186,7 +1186,10 @@ const message = { terminal: { local: 'Tempatan', defaultConn: 'Sambungan Lalai', - defaultConnHelper: 'Sama ada untuk menyambung ke hos secara lalai selepas membuka terminal', + defaultConnHelper: + 'Operasi ini akan menyambung secara automatik ke terminal nod selepas membuka terminal untuk 【{0}】. Teruskan?', + localConnJump: + 'Maklumat sambungan lalai dikekalkan dalam [Terminal - Tetapan]. Jika sambungan gagal, sila edit di sana!', localHelper: 'Nama tempatan hanya digunakan untuk pengenalan sistem tempatan.', connLocalErr: 'Tidak dapat mengesahkan secara automatik, sila isi maklumat log masuk pelayan tempatan.', testConn: 'Uji sambungan', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 229a984b2..6cd4bcb84 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1180,7 +1180,10 @@ const message = { terminal: { local: 'Local', defaultConn: 'Conexão Padrão', - defaultConnHelper: 'Se deve conectar ao host por padrão após abrir o terminal', + defaultConnHelper: + 'Esta operação conectará automaticamente ao terminal do nó após abrir o terminal para 【{0}】. Continuar?', + localConnJump: + 'As informações de conexão padrão são mantidas em [Terminal - Configurações]. Se a conexão falhar, edite lá!', localHelper: 'O nome local é usado apenas para identificação local do sistema.', connLocalErr: 'Невозможно автоматически аутентифицироваться, пожалуйста, заполните информацию для входа на локальный сервер.', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 9b5257fe9..78a4876a2 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1184,7 +1184,10 @@ const message = { terminal: { local: 'Локальный', defaultConn: 'Соединение по умолчанию', - defaultConnHelper: 'Подключаться ли к хосту по умолчанию после открытия терминала', + defaultConnHelper: + 'Эта операция автоматически подключится к узловому терминалу после открытия терминала для 【{0}】. Продолжить?', + localConnJump: + 'Информация о соединении по умолчанию поддерживается в [Терминал - Настройки]. Если соединение не удается, отредактируйте там!', localHelper: 'Локальное имя используется только для локальной идентификации системы.', connLocalErr: 'Невозможно выполнить автоматическую аутентификацию, пожалуйста, заполните информацию для входа на локальный сервер!', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index ef54db37e..0397a83d4 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -1210,7 +1210,10 @@ const message = { terminal: { local: 'Yerel', defaultConn: 'Varsayılan Bağlantı', - defaultConnHelper: 'Terminal açıldıktan sonra varsayılan olarak ana bilgisayara bağlanılsın mı', + defaultConnHelper: + 'Bu işlem, 【{0}】 için terminal açıldıktan sonra otomatik olarak düğüm terminaline bağlanacaktır. Devam etmek istiyor musunuz?', + localConnJump: + 'Varsayılan bağlantı bilgileri [Terminal - Ayarlar] bölümünde yönetilir. Bağlantı başarısız olursa lütfen oradan düzenleyin!', localHelper: '`local` adı sadece sistem yerel tanımlaması için kullanılır', connLocalErr: 'Otomatik kimlik doğrulama yapılamıyor, lütfen yerel sunucu giriş bilgilerini doldurun.', testConn: 'Bağlantıyı test et', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 99b395755..72b502270 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1137,7 +1137,8 @@ const message = { terminal: { local: '本機', defaultConn: '預設連接', - defaultConnHelper: '開啟終端後是否預設連線到主機', + defaultConnHelper: '該操作將【{0}】開啟終端後自動連線到所在節點終端,是否繼續?', + localConnJump: '預設連線資訊在【終端 - 設定】中維護,連線失敗可前往編輯!', localHelper: 'local 名稱僅用於系統本機標識', connLocalErr: '無法自動認證,請填寫本機伺服器的登入資訊!', testConn: '連接測試', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index c8efc34ab..5e96d9fe8 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1137,7 +1137,8 @@ const message = { terminal: { local: '本机', defaultConn: '默认连接', - defaultConnHelper: '打开终端后是否默认连接主机', + defaultConnHelper: '该操作将【{0}】打开终端后自动连接所在节点终端,是否继续?', + localConnJump: '默认连接信息在 【 终端 - 配置 】中维护,连接失败可前往编辑!', localHelper: 'local 名称仅用于系统本机标识', connLocalErr: '无法自动认证,请填写本地服务器的登录信息!', testConn: '连接测试', diff --git a/frontend/src/views/host/file-management/terminal/index.vue b/frontend/src/views/host/file-management/terminal/index.vue index 3980c5d04..ed75a880c 100644 --- a/frontend/src/views/host/file-management/terminal/index.vue +++ b/frontend/src/views/host/file-management/terminal/index.vue @@ -8,7 +8,8 @@ :fullScreen="true" >