zfs_hook.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package worker
  2. import (
  3. "fmt"
  4. "os"
  5. "os/user"
  6. "strings"
  7. "github.com/codeskyblue/go-sh"
  8. )
  9. type zfsHook struct {
  10. emptyHook
  11. provider mirrorProvider
  12. zpool string
  13. }
  14. func newZfsHook(provider mirrorProvider, zpool string) *zfsHook {
  15. return &zfsHook{
  16. provider: provider,
  17. zpool: zpool,
  18. }
  19. }
  20. func (z *zfsHook) printHelpMessage() {
  21. zfsDataset := fmt.Sprintf("%s/%s", z.zpool, z.provider.Name())
  22. zfsDataset = strings.ToLower(zfsDataset)
  23. workingDir := z.provider.WorkingDir()
  24. logger.Infof("You may create the ZFS dataset with:")
  25. logger.Infof(" zfs create '%s'", zfsDataset)
  26. logger.Infof(" zfs set mountpoint='%s' '%s'", workingDir, zfsDataset)
  27. usr, err := user.Current()
  28. if err != nil || usr.Uid == "0" {
  29. return
  30. }
  31. logger.Infof(" chown %s '%s'", usr.Uid, workingDir)
  32. }
  33. // check if working directory is a zfs dataset
  34. func (z *zfsHook) preJob() error {
  35. workingDir := z.provider.WorkingDir()
  36. if _, err := os.Stat(workingDir); os.IsNotExist(err) {
  37. logger.Errorf("Directory %s doesn't exist", workingDir);
  38. z.printHelpMessage()
  39. return err
  40. }
  41. if err := sh.Command("mountpoint", "-q", workingDir).Run(); err != nil {
  42. logger.Errorf("%s is not a mount point", workingDir);
  43. z.printHelpMessage()
  44. return err
  45. }
  46. return nil
  47. }