123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package worker
- import (
- "fmt"
- "os"
- "os/user"
- "strings"
- "github.com/codeskyblue/go-sh"
- )
- type zfsHook struct {
- emptyHook
- provider mirrorProvider
- zpool string
- }
- func newZfsHook(provider mirrorProvider, zpool string) *zfsHook {
- return &zfsHook{
- provider: provider,
- zpool: zpool,
- }
- }
- // create zfs dataset for a new mirror
- func (z *zfsHook) preJob() error {
- workingDir := z.provider.WorkingDir()
- if _, err := os.Stat(workingDir); os.IsNotExist(err) {
- // sudo zfs create $zfsDataset
- // sudo zfs set mountpoint=${absPath} ${zfsDataset}
- zfsDataset := fmt.Sprintf("%s/%s", z.zpool, z.provider.Name())
- // Unknown issue of ZFS:
- // dataset name should not contain upper case letters
- zfsDataset = strings.ToLower(zfsDataset)
- logger.Infof("Creating ZFS dataset %s", zfsDataset)
- if err := sh.Command("sudo", "zfs", "create", zfsDataset).Run(); err != nil {
- return err
- }
- logger.Infof("Mount ZFS dataset %s to %s", zfsDataset, workingDir)
- if err := sh.Command("sudo", "zfs", "set", "mountpoint="+workingDir, zfsDataset).Run(); err != nil {
- return err
- }
- usr, err := user.Current()
- if err != nil {
- return err
- }
- logger.Infof("Chown %s to %s(%s)", workingDir, usr.Uid, usr.Username)
- if err := sh.Command("sudo", "chown", usr.Uid, workingDir).Run(); err != nil {
- return err
- }
- }
- return nil
- }
|