From 680f48dcbac48b8920abcad2e2bfac59c76c7fb2 Mon Sep 17 00:00:00 2001
From: zhengkunwang223 <31820853+zhengkunwang223@users.noreply.github.com>
Date: Thu, 27 Apr 2023 13:54:15 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E6=9D=83=E9=99=90?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9=E5=AD=90=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=20(#811)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/app/dto/request/file.go | 1 +
backend/app/service/file.go | 6 +++++-
backend/utils/cmd/cmd.go | 5 -----
backend/utils/files/file_op.go | 11 +++++++----
frontend/src/api/interface/file.ts | 1 +
.../views/host/file-management/change-role/index.vue | 4 ++++
6 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/backend/app/dto/request/file.go b/backend/app/dto/request/file.go
index f4468fd93..8c887212d 100644
--- a/backend/app/dto/request/file.go
+++ b/backend/app/dto/request/file.go
@@ -22,6 +22,7 @@ type FileCreate struct {
IsLink bool `json:"isLink"`
IsSymlink bool `json:"isSymlink"`
LinkPath string `json:"linkPath"`
+ Sub bool `json:"sub"`
}
type FileDelete struct {
diff --git a/backend/app/service/file.go b/backend/app/service/file.go
index 8bc371aa2..4214364a4 100644
--- a/backend/app/service/file.go
+++ b/backend/app/service/file.go
@@ -160,7 +160,11 @@ func (f *FileService) BatchDelete(op request.FileBatchDelete) error {
func (f *FileService) ChangeMode(op request.FileCreate) error {
fo := files.NewFileOp()
- return fo.Chmod(op.Path, fs.FileMode(op.Mode))
+ if op.Sub {
+ return fo.ChmodR(op.Path, op.Mode)
+ } else {
+ return fo.Chmod(op.Path, fs.FileMode(op.Mode))
+ }
}
func (f *FileService) ChangeOwner(req request.FileRoleUpdate) error {
diff --git a/backend/utils/cmd/cmd.go b/backend/utils/cmd/cmd.go
index 9425d4851..83f2857fd 100644
--- a/backend/utils/cmd/cmd.go
+++ b/backend/utils/cmd/cmd.go
@@ -91,11 +91,6 @@ func Execf(cmdStr string, a ...interface{}) (string, error) {
}
func HasNoPasswordSudo() bool {
- cmd := exec.Command("sudo", "-v")
- err := cmd.Run()
- if err != nil {
- return false
- }
cmd2 := exec.Command("sudo", "-n", "ls")
err2 := cmd2.Run()
return err2 == nil
diff --git a/backend/utils/files/file_op.go b/backend/utils/files/file_op.go
index 2ee8b5b7b..91482f614 100644
--- a/backend/utils/files/file_op.go
+++ b/backend/utils/files/file_op.go
@@ -121,9 +121,12 @@ func (f FileOp) Chown(dst string, uid int, gid int) error {
}
func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error {
- cmdStr := fmt.Sprintf("sudo chown %s:%s %s", uid, gid, dst)
+ cmdStr := fmt.Sprintf("chown %s:%s %s", uid, gid, dst)
if sub {
- cmdStr = fmt.Sprintf("sudo chown -R %s:%s %s", uid, gid, dst)
+ cmdStr = fmt.Sprintf("chown -R %s:%s %s", uid, gid, dst)
+ }
+ if cmd.HasNoPasswordSudo() {
+ cmdStr = fmt.Sprintf("sudo %s", cmdStr)
}
if msg, err := cmd.ExecWithTimeOut(cmdStr, 2*time.Second); err != nil {
if msg != "" {
@@ -134,8 +137,8 @@ func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error {
return nil
}
-func (f FileOp) ChmodR(dst string, mode fs.FileMode) error {
- cmdStr := fmt.Sprintf("chmod -R %v %s", mode, dst)
+func (f FileOp) ChmodR(dst string, mode int64) error {
+ cmdStr := fmt.Sprintf("chmod -R %v %s", fmt.Sprintf("%04o", mode), dst)
if cmd.HasNoPasswordSudo() {
cmdStr = fmt.Sprintf("sudo %s", cmdStr)
}
diff --git a/frontend/src/api/interface/file.ts b/frontend/src/api/interface/file.ts
index 12b28dee5..2d15d6201 100644
--- a/frontend/src/api/interface/file.ts
+++ b/frontend/src/api/interface/file.ts
@@ -54,6 +54,7 @@ export namespace File {
isLink?: boolean;
isSymlink?: boolean;
linkPath?: boolean;
+ sub?: boolean;
}
export interface FileDelete {
diff --git a/frontend/src/views/host/file-management/change-role/index.vue b/frontend/src/views/host/file-management/change-role/index.vue
index 6619fd9f5..2174b6be7 100644
--- a/frontend/src/views/host/file-management/change-role/index.vue
+++ b/frontend/src/views/host/file-management/change-role/index.vue
@@ -7,6 +7,9 @@
+
+ {{ $t('file.containSub') }}
+
@@ -43,6 +46,7 @@ const acceptParams = (create: File.FileCreate) => {
form.value.isDir = create.isDir;
form.value.path = create.path;
form.value.isLink = false;
+ form.value.sub = false;
mode.value = String(create.mode);
};