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  }