github.com/kardianos/nomad@v0.1.3-0.20151022182107-b13df73ee850/client/allocdir/alloc_dir_posix.go (about)

     1  // +build !windows
     2  
     3  // Functions shared between linux/darwin.
     4  package allocdir
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"os/user"
    10  	"strconv"
    11  	"syscall"
    12  )
    13  
    14  func (d *AllocDir) linkOrCopy(src, dst string, perm os.FileMode) error {
    15  	// Attempt to hardlink.
    16  	if err := os.Link(src, dst); err == nil {
    17  		return nil
    18  	}
    19  
    20  	return fileCopy(src, dst, perm)
    21  }
    22  
    23  func (d *AllocDir) dropDirPermissions(path string) error {
    24  	// Can't do anything if not root.
    25  	if syscall.Geteuid() != 0 {
    26  		return nil
    27  	}
    28  
    29  	u, err := user.Lookup("nobody")
    30  	if err != nil {
    31  		return err
    32  	}
    33  
    34  	uid, err := getUid(u)
    35  	if err != nil {
    36  		return err
    37  	}
    38  
    39  	gid, err := getGid(u)
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	if err := os.Chown(path, uid, gid); err != nil {
    45  		return fmt.Errorf("Couldn't change owner/group of %v to (uid: %v, gid: %v): %v", path, uid, gid, err)
    46  	}
    47  
    48  	if err := os.Chmod(path, 0777); err != nil {
    49  		return fmt.Errorf("Chmod(%v) failed: %v", path, err)
    50  	}
    51  
    52  	return nil
    53  }
    54  
    55  func getUid(u *user.User) (int, error) {
    56  	uid, err := strconv.Atoi(u.Uid)
    57  	if err != nil {
    58  		return 0, fmt.Errorf("Unable to convert Uid to an int: %v", err)
    59  	}
    60  
    61  	return uid, nil
    62  }
    63  
    64  func getGid(u *user.User) (int, error) {
    65  	gid, err := strconv.Atoi(u.Gid)
    66  	if err != nil {
    67  		return 0, fmt.Errorf("Unable to convert Gid to an int: %v", err)
    68  	}
    69  
    70  	return gid, nil
    71  }