zfs_hook.go 1.2 KB

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