@@ -33,6 +33,11 @@ import (
3333 "github.com/spf13/afero"
3434)
3535
36+ const (
37+ cmdDefaultTimeout = 10 * time .Second
38+ cmdRecursiveTimeout = 5 * time .Minute
39+ )
40+
3641var protectedPaths = []string {
3742 "/" ,
3843 "/bin" ,
@@ -222,7 +227,11 @@ func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error {
222227 if sub {
223228 cmdStr = fmt .Sprintf (`chown -R %s:%s "%s"` , uid , gid , dst )
224229 }
225- cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (10 * time .Second ))
230+ timeout := cmdDefaultTimeout
231+ if sub {
232+ timeout = cmdRecursiveTimeout
233+ }
234+ cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (timeout ))
226235 if err := cmdMgr .RunBashC (cmdStr ); err != nil {
227236 return err
228237 }
@@ -234,7 +243,11 @@ func (f FileOp) ChmodR(dst string, mode int64, sub bool) error {
234243 if sub {
235244 cmdStr = fmt .Sprintf (`%s chmod -R %v "%s"` , cmd .SudoHandleCmd (), fmt .Sprintf ("%04o" , mode ), dst )
236245 }
237- cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (10 * time .Second ))
246+ timeout := cmdDefaultTimeout
247+ if sub {
248+ timeout = cmdRecursiveTimeout
249+ }
250+ cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (timeout ))
238251 if err := cmdMgr .RunBashC (cmdStr ); err != nil {
239252 return err
240253 }
@@ -246,7 +259,70 @@ func (f FileOp) ChmodRWithMode(dst string, mode fs.FileMode, sub bool) error {
246259 if sub {
247260 cmdStr = fmt .Sprintf (`%s chmod -R %v "%s"` , cmd .SudoHandleCmd (), fmt .Sprintf ("%o" , mode .Perm ()), dst )
248261 }
249- cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (10 * time .Second ))
262+ timeout := cmdDefaultTimeout
263+ if sub {
264+ timeout = cmdRecursiveTimeout
265+ }
266+ cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (timeout ))
267+ if err := cmdMgr .RunBashC (cmdStr ); err != nil {
268+ return err
269+ }
270+ return nil
271+ }
272+
273+ func (f FileOp ) ChownRPaths (paths []string , uid string , gid string , sub bool ) error {
274+ if len (paths ) == 0 {
275+ return nil
276+ }
277+ if len (paths ) == 1 {
278+ return f .ChownR (paths [0 ], uid , gid , sub )
279+ }
280+ quoted := make ([]string , len (paths ))
281+ for i , p := range paths {
282+ quoted [i ] = fmt .Sprintf (`"%s"` , p )
283+ }
284+ args := strings .Join (quoted , " " )
285+ var cmdStr string
286+ if sub {
287+ cmdStr = fmt .Sprintf (`chown -R %s:%s %s` , uid , gid , args )
288+ } else {
289+ cmdStr = fmt .Sprintf (`%s chown %s:%s %s` , cmd .SudoHandleCmd (), uid , gid , args )
290+ }
291+ timeout := cmdDefaultTimeout
292+ if sub {
293+ timeout = cmdRecursiveTimeout
294+ }
295+ cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (timeout ))
296+ if err := cmdMgr .RunBashC (cmdStr ); err != nil {
297+ return err
298+ }
299+ return nil
300+ }
301+
302+ func (f FileOp ) ChmodRPaths (paths []string , mode int64 , sub bool ) error {
303+ if len (paths ) == 0 {
304+ return nil
305+ }
306+ if len (paths ) == 1 {
307+ return f .ChmodR (paths [0 ], mode , sub )
308+ }
309+ quoted := make ([]string , len (paths ))
310+ for i , p := range paths {
311+ quoted [i ] = fmt .Sprintf (`"%s"` , p )
312+ }
313+ args := strings .Join (quoted , " " )
314+ modeStr := fmt .Sprintf ("%04o" , mode )
315+ var cmdStr string
316+ if sub {
317+ cmdStr = fmt .Sprintf (`%s chmod -R %s %s` , cmd .SudoHandleCmd (), modeStr , args )
318+ } else {
319+ cmdStr = fmt .Sprintf (`%s chmod %s %s` , cmd .SudoHandleCmd (), modeStr , args )
320+ }
321+ timeout := cmdDefaultTimeout
322+ if sub {
323+ timeout = cmdRecursiveTimeout
324+ }
325+ cmdMgr := cmd .NewCommandMgr (cmd .WithTimeout (timeout ))
250326 if err := cmdMgr .RunBashC (cmdStr ); err != nil {
251327 return err
252328 }
0 commit comments