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') }} +