github.com/dkerwin/nomad@v0.3.3-0.20160525181927-74554135514b/client/allocdir/alloc_dir_unix.go (about)

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