github.com/yasker/longhorn-engine@v0.0.0-20160621014712-6ed6cfca0729/agent/replica/rest/backuptarget.go (about) 1 package rest 2 3 import ( 4 "fmt" 5 "net/http" 6 "os" 7 "os/exec" 8 "strconv" 9 10 "github.com/Sirupsen/logrus" 11 12 "github.com/rancher/go-rancher/api" 13 ) 14 15 func (s *server) ConfigureBackupTarget(rw http.ResponseWriter, req *http.Request) error { 16 apiContext := api.GetApiContext(req) 17 target := &BackupTarget{} 18 if err := apiContext.Read(target); err != nil { 19 return err 20 } 21 22 if err := s.createNFSMount(target); err != nil { 23 return fmt.Errorf("Unable to create nfs mount for %#v. Error %v", target, err) 24 } 25 26 return nil 27 } 28 29 func (s *server) createNFSMount(target *BackupTarget) error { 30 mountDir := constructMountDir(target) 31 32 grep := exec.Command("grep", mountDir, "/proc/mounts") 33 if err := grep.Run(); err == nil { 34 logrus.Infof("Found mount %v.", mountDir) 35 return nil 36 } 37 38 if err := os.MkdirAll(mountDir, 0770); err != nil { 39 return err 40 } 41 42 remoteTarget := fmt.Sprintf("%v:%v", target.NFSConfig.Server, target.NFSConfig.Share) 43 parentPid := strconv.Itoa(os.Getppid()) 44 45 var mount *exec.Cmd 46 if target.NFSConfig.MountOptions == "" { 47 mount = exec.Command("nsenter", "-t", parentPid, "-n", "mount", "-t", "nfs", remoteTarget, mountDir) 48 } else { 49 mount = exec.Command("nsenter", "-t", parentPid, "-n", "mount", "-t", "nfs", "-o", target.NFSConfig.MountOptions, remoteTarget, mountDir) 50 } 51 52 mount.Stdout = os.Stdout 53 mount.Stderr = os.Stderr 54 55 logrus.Infof("Running %v", mount.Args) 56 return mount.Run() 57 } 58 59 func constructMountDir(target *BackupTarget) string { 60 return fmt.Sprintf("/var/lib/rancher/longhorn/backups/%s/%s", target.Name, target.UUID) 61 }