diff --git a/agent/app/service/image.go b/agent/app/service/image.go
index 05a4d4ae9f2c..8fbd42ffb4ee 100644
--- a/agent/app/service/image.go
+++ b/agent/app/service/image.go
@@ -7,24 +7,23 @@ import (
"encoding/json"
"errors"
"fmt"
- "github.com/1Panel-dev/1Panel/agent/app/repo"
"io"
"os"
"path"
"strings"
"time"
- "github.com/docker/docker/api/types/container"
- "github.com/docker/docker/api/types/image"
-
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/model"
+ "github.com/1Panel-dev/1Panel/agent/app/repo"
"github.com/1Panel-dev/1Panel/agent/app/task"
"github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/1Panel-dev/1Panel/agent/i18n"
"github.com/1Panel-dev/1Panel/agent/utils/docker"
"github.com/docker/docker/api/types"
+ "github.com/docker/docker/api/types/container"
+ "github.com/docker/docker/api/types/image"
"github.com/docker/docker/api/types/registry"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/homedir"
@@ -419,6 +418,9 @@ func (u *ImageService) ImageRemove(req dto.BatchDelete) (dto.ContainerPruneRepor
}
return report, buserr.WithDetail(constant.ErrInUsed, id, nil)
}
+ if strings.Contains(err.Error(), "image has dependent") {
+ return report, buserr.New(constant.ErrObjectBeDependent)
+ }
return report, err
}
report.DeletedNumber++
diff --git a/agent/constant/errs.go b/agent/constant/errs.go
index 014a3d26c863..3cde3ad933c2 100644
--- a/agent/constant/errs.go
+++ b/agent/constant/errs.go
@@ -103,10 +103,11 @@ var (
// container
var (
- ErrInUsed = "ErrInUsed"
- ErrObjectInUsed = "ErrObjectInUsed"
- ErrPortRules = "ErrPortRules"
- ErrPgImagePull = "ErrPgImagePull"
+ ErrInUsed = "ErrInUsed"
+ ErrObjectInUsed = "ErrObjectInUsed"
+ ErrObjectBeDependent = "ErrObjectBeDependent"
+ ErrPortRules = "ErrPortRules"
+ ErrPgImagePull = "ErrPgImagePull"
)
// runtime
diff --git a/agent/i18n/lang/en.yaml b/agent/i18n/lang/en.yaml
index a64ae83ea78f..7cf1e60cb232 100644
--- a/agent/i18n/lang/en.yaml
+++ b/agent/i18n/lang/en.yaml
@@ -157,6 +157,7 @@ ErrTypeOfRedis: "The recovery file type does not match the current persistence m
#container
ErrInUsed: "{{ .detail }} is in use and cannot be deleted"
ErrObjectInUsed: "This object is in use and cannot be deleted"
+ErrObjectBeDependent: "This image is dependent on other images and can't be deleted"
ErrPortRules: "The number of ports does not match, please re-enter!"
ErrPgImagePull: "Image pull timeout. Please configure image acceleration or manually pull the postgres:16.0-alpine image and try again"
diff --git a/agent/i18n/lang/zh-Hant.yaml b/agent/i18n/lang/zh-Hant.yaml
index 747fdc33e5cd..1326be9bdb2d 100644
--- a/agent/i18n/lang/zh-Hant.yaml
+++ b/agent/i18n/lang/zh-Hant.yaml
@@ -158,6 +158,7 @@ ErrTypeOfRedis: "恢復文件類型與當前持久化方式不符,請修改後
#container
ErrInUsed: "{{ .detail }} 正被使用,無法刪除"
ErrObjectInUsed: "該對象正被使用,無法刪除"
+ErrObjectBeDependent: "該鏡像依賴於其他鏡像,無法刪除"
ErrPortRules: "端口數目不匹配,請重新輸入!"
ErrPgImagePull: "鏡像拉取超時,請配置鏡像加速或手動拉取 postgres:16.0-alpine 鏡像後重試"
diff --git a/agent/i18n/lang/zh.yaml b/agent/i18n/lang/zh.yaml
index 3f94a8675a75..304105cc0b6a 100644
--- a/agent/i18n/lang/zh.yaml
+++ b/agent/i18n/lang/zh.yaml
@@ -156,8 +156,9 @@ ErrTypeOfRedis: "恢复文件类型与当前持久化方式不符,请修改后
#container
ErrInUsed: "{{ .detail }} 正被使用,无法删除"
ErrObjectInUsed: "该对象正被使用,无法删除"
+ErrObjectBeDependent: "该镜像依赖于其他镜像,无法删除"
ErrPortRules: "端口数目不匹配,请重新输入!"
-ErrPgImagePull: "镜像拉取超时,请配置镜像加速或手动拉取 postgres:16.0-alpine 镜像后重试"
+ErrPgImagePull: "镜像拉取超时,请配置镜像加速或手动拉取 {{ .name }} 镜像后重试"
#runtime
ErrDirNotFound: "build 文件夹不存在!请检查文件完整性!"
diff --git a/agent/utils/firewall/client/firewalld.go b/agent/utils/firewall/client/firewalld.go
index 88c813b5cc16..1016682f03cb 100644
--- a/agent/utils/firewall/client/firewalld.go
+++ b/agent/utils/firewall/client/firewalld.go
@@ -25,12 +25,12 @@ func (f *Firewall) Name() string {
}
func (f *Firewall) Status() (bool, error) {
- stdout, _ := cmd.Exec("firewall-cmd --state")
+ stdout, _ := cmd.Exec("LANGUAGE=en_US:en firewall-cmd --state")
return stdout == "running\n", nil
}
func (f *Firewall) Version() (string, error) {
- stdout, err := cmd.Exec("firewall-cmd --version")
+ stdout, err := cmd.Exec("LANGUAGE=en_US:en firewall-cmd --version")
if err != nil {
return "", fmt.Errorf("load the firewall version failed, err: %s", stdout)
}
diff --git a/agent/utils/firewall/client/ufw.go b/agent/utils/firewall/client/ufw.go
index ca09516be8f2..6cf77d863cb7 100644
--- a/agent/utils/firewall/client/ufw.go
+++ b/agent/utils/firewall/client/ufw.go
@@ -17,9 +17,9 @@ type Ufw struct {
func NewUfw() (*Ufw, error) {
var ufw Ufw
if cmd.HasNoPasswordSudo() {
- ufw.CmdStr = "sudo ufw"
+ ufw.CmdStr = "LANGUAGE=en_US:en sudo ufw"
} else {
- ufw.CmdStr = "ufw"
+ ufw.CmdStr = "LANGUAGE=en_US:en ufw"
}
return &ufw, nil
}
diff --git a/agent/utils/postgresql/client/remote.go b/agent/utils/postgresql/client/remote.go
index 04430a46abc4..92ae075fec94 100644
--- a/agent/utils/postgresql/client/remote.go
+++ b/agent/utils/postgresql/client/remote.go
@@ -306,7 +306,7 @@ func loadImageTag() (string, error) {
defer cancel()
if _, err := client.ImagePull(ctx, itemTag, image.PullOptions{}); err != nil {
if errors.Is(ctx.Err(), context.DeadlineExceeded) {
- return itemTag, buserr.New(constant.ErrPgImagePull)
+ return itemTag, buserr.WithName(constant.ErrPgImagePull, itemTag)
}
global.LOG.Errorf("image %s pull failed, err: %v", itemTag, err)
return itemTag, fmt.Errorf("image %s pull failed, err: %v", itemTag, err)
diff --git a/frontend/package.json b/frontend/package.json
index 3d3b84bfc35d..0d4de55c6409 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -20,10 +20,7 @@
"prettier": "prettier --write ."
},
"dependencies": {
- "@codemirror/lang-html": "^6.4.9",
- "@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-json": "^6.0.1",
- "@codemirror/lang-php": "^6.0.1",
"@codemirror/language": "^6.10.2",
"@codemirror/legacy-modes": "^6.4.0",
"@codemirror/theme-one-dark": "^6.1.2",
diff --git a/frontend/src/components/app-status/index.vue b/frontend/src/components/app-status/index.vue
index b79eec2b35c3..e15bb695eb49 100644
--- a/frontend/src/components/app-status/index.vue
+++ b/frontend/src/components/app-status/index.vue
@@ -134,7 +134,6 @@ const onCheck = async (key: any, name: any) => {
};
const onOperate = async (operation: string) => {
- em('update:maskShow', false);
operateReq.operate = operation;
ElMessageBox.confirm(
i18n.global.t('app.operatorHelper', [i18n.global.t('app.' + operation)]),
@@ -144,25 +143,21 @@ const onOperate = async (operation: string) => {
cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info',
},
- )
- .then(() => {
- em('update:maskShow', true);
- em('update:loading', true);
- em('before');
- InstalledOp(operateReq)
- .then(() => {
- em('update:loading', false);
- MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
- onCheck(key.value, name.value);
- em('after');
- })
- .catch(() => {
- em('update:loading', false);
- });
- })
- .catch(() => {
- em('update:maskShow', true);
- });
+ ).then(() => {
+ em('update:maskShow', true);
+ em('update:loading', true);
+ em('before');
+ InstalledOp(operateReq)
+ .then(() => {
+ em('update:loading', false);
+ MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
+ onCheck(key.value, name.value);
+ em('after');
+ })
+ .catch(() => {
+ em('update:loading', false);
+ });
+ });
};
onMounted(() => {
diff --git a/frontend/src/components/backup/index.vue b/frontend/src/components/backup/index.vue
index b4484cdd6ee2..75b08a7b98a1 100644
--- a/frontend/src/components/backup/index.vue
+++ b/frontend/src/components/backup/index.vue
@@ -130,7 +130,6 @@ const taskLogRef = ref();
const data = ref();
const paginationConfig = reactive({
- cacheSizeKey: 'backup-page-size',
currentPage: 1,
pageSize: 10,
total: 0,
diff --git a/frontend/src/components/codemirror-pro/index.vue b/frontend/src/components/codemirror-pro/index.vue
index 63eb3e9874ec..d12024f161fa 100644
--- a/frontend/src/components/codemirror-pro/index.vue
+++ b/frontend/src/components/codemirror-pro/index.vue
@@ -8,13 +8,13 @@
import { CSSProperties } from 'vue';
import { basicSetup, EditorView } from 'codemirror';
import { EditorState } from '@codemirror/state';
-import { javascript } from '@codemirror/lang-javascript';
import { oneDark } from '@codemirror/theme-one-dark';
import { StreamLanguage } from '@codemirror/language';
import { nginx } from './nginx';
import { yaml } from '@codemirror/legacy-modes/mode/yaml';
import { shell } from '@codemirror/legacy-modes/mode/shell';
import { dockerFile } from '@codemirror/legacy-modes/mode/dockerfile';
+import { javascript } from '@codemirror/legacy-modes/mode/javascript';
import { placeholder } from '@codemirror/view';
import { json } from '@codemirror/lang-json';
@@ -94,7 +94,7 @@ const initCodeMirror = () => {
extensions.push(StreamLanguage.define(dockerFile));
break;
case 'javascript':
- extensions.push(javascript());
+ extensions.push(StreamLanguage.define(javascript));
break;
case 'nginx':
extensions.push(StreamLanguage.define(nginx));
diff --git a/frontend/src/components/copy-button/index.vue b/frontend/src/components/copy-button/index.vue
index f7f1ad693413..633353b6d045 100644
--- a/frontend/src/components/copy-button/index.vue
+++ b/frontend/src/components/copy-button/index.vue
@@ -1,6 +1,6 @@
- {{ $t('commons.button.copy') }}
+ {{ $t('commons.button.copy') }}