X-Git-Url: http://git.datanom.net/omvzfs.git/blobdiff_plain/97e4887b3864cc11f131c51eb337e7bb4c025e27..HEAD:/src/Utils.php?ds=sidebyside diff --git a/src/Utils.php b/src/Utils.php index 5356223..43a83b1 100644 --- a/src/Utils.php +++ b/src/Utils.php @@ -2,6 +2,7 @@ require_once("Exception.php"); require_once("openmediavault/util.inc"); require_once("Dataset.php"); +require_once("Zvol.php"); require_once("Vdev.php"); require_once("Zpool.php"); @@ -10,6 +11,34 @@ require_once("Zpool.php"); */ class OMVModuleZFSUtil { + /** + * Sets a GPT label on a disk to prevent the zpool command from generating + * errors. + * + */ + public static function setGPTLabel($disk) { + $cmd = "parted -s " . $disk . " mklabel gpt 2>&1"; + OMVModuleZFSUtil::exec($cmd,$out,$res); + } + + /** + * Manages relocation of ZFS filesystem mountpoints in the OMV backend. + * Needed when the user changes mountpoint of a filesystem in the GUI. + * + */ + public static function relocateFilesystem($name) { + global $xmlConfig; + $poolname = OMVModuleZFSUtil::getPoolname($name); + $pooluuid = OMVModuleZFSUtil::getUUIDbyName($poolname); + $ds = new OMVModuleZFSDataset($name); + $dir = $ds->getMountPoint(); + $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']"; + $object = $xmlConfig->get($xpath); + $object['dir'] = $property['value']; + $xmlConfig->replace($xpath, $object); + return null; + } + /** * Clears all ZFS labels on specified devices. * Needed for blkid to display proper data. @@ -20,6 +49,7 @@ class OMVModuleZFSUtil { $cmd = "zpool labelclear /dev/" . $disk . "1"; OMVModuleZFSUtil::exec($cmd,$out,$res); } + return null; } /** @@ -57,15 +87,22 @@ class OMVModuleZFSUtil { */ public static function deleteShares($name) { global $xmlConfig; - $tmp = new OMVModuleZFSDataset($name); - $reldirpath = OMVModuleZFSUtil::getReldirpath($tmp->getMountPoint()); $poolname = OMVModuleZFSUtil::getPoolname($name); $pooluuid = OMVModuleZFSUtil::getUUIDbyName($poolname); - $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "']"; + $ds = new OMVModuleZFSDataset($name); + $dir = $ds->getMountPoint(); + $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']"; $mountpoint = $xmlConfig->get($xpath); $mntentuuid = $mountpoint['uuid']; - $xpath = "//system/shares/sharedfolder[mntentref='" . $mntentuuid . "' and reldirpath='" . $reldirpath . "']"; - $object = $xmlConfig->get($xpath); + $xpath = "//system/shares/sharedfolder[mntentref='" . $mntentuuid . "']"; + $objects = $xmlConfig->getList($xpath); + foreach ($objects as $object) { + $tmpxpath = sprintf("//*[contains(name(),'sharedfolderref')]". + "[contains(.,'%s')]", $object['uuid']); + if ($xmlConfig->exists($tmpxpath)) { + throw new OMVModuleZFSException("The Filesystem is shared and in use. Please delete all references and try again."); + } + } $xmlConfig->delete($xpath); $dispatcher = &OMVNotifyDispatcher::getInstance(); $dispatcher->notify(OMV_NOTIFY_DELETE,"org.openmediavault.system.shares.sharedfolder",$object); @@ -135,33 +172,34 @@ class OMVModuleZFSUtil { } /** - * Add any missing ZFS pool to the OMV backend + * Add any missing ZFS filesystems to the OMV backend * */ public static function addMissingOMVMntEnt() { global $xmlConfig; - $cmd = "zpool list -H -o name"; + $cmd = "zfs list -H -o name -t filesystem"; OMVModuleZFSUtil::exec($cmd, $out, $res); foreach($out as $name) { - $pooluuid = OMVModuleZFSUtil::getUUIDbyName($name); - $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "']"; - $mountpoint = $xmlConfig->get($xpath); - if (is_null($mountpoint)) { - $uuid = OMVUtil::uuid(); - $pool = new OMVModuleZFSZpool($name); - $dir = $pool->getMountPoint(); - $object = array( - "uuid" => $uuid, - "fsname" => $pooluuid, - "dir" => $dir, - "type" => "zfs", - "opts" => "rw,relatime,xattr,noacl", - "freq" => "0", - "passno" => "0" - ); - $xmlConfig->set("//system/fstab",array("mntent" => $object)); - $dispatcher = &OMVNotifyDispatcher::getInstance(); - $dispatcher->notify(OMV_NOTIFY_CREATE,"org.openmediavault.system.fstab.mntent", $object); + if (preg_match('/[\/]+/', $name)) { + $poolname = OMVModuleZFSUtil::getPoolname($name); + $pooluuid = OMVModuleZFSUtil::getUUIDbyName($poolname); + $ds = new OMVModuleZFSDataset($name); + $dir = $ds->getMountPoint(); + $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']"; + if (!($xmlConfig->exists($xpath))) { + $uuid = OMVUtil::uuid(); + $object = array( + "uuid" => $uuid, + "fsname" => $pooluuid, + "dir" => $dir, + "type" => "zfs", + "opts" => "rw,relatime,xattr,noacl", + "freq" => "0", + "passno" => "0", + "hidden" => "1" + ); + $xmlConfig->set("//system/fstab",array("mntent" => $object)); + } } } return null; @@ -197,6 +235,12 @@ class OMVModuleZFSUtil { 'icon'=>'images/raid.png', 'expanded'=>$expanded, 'path'=>$path); + $pool = new OMVModuleZFSZpool($path); + $tmp['origin'] = "n/a"; + $tmp['size'] = $pool->getSize(); + $tmp['used'] = $pool->getAttribute("allocated"); + $tmp['available'] = $pool->getAttribute("free"); + $tmp['mountpoint'] = $pool->getMountPoint(); array_push($objects,$tmp); } else { //This is a Filesystem @@ -210,12 +254,18 @@ class OMVModuleZFSUtil { $ds = new OMVModuleZFSDataset($path); if ($ds->isClone()) { //This is a cloned Filesystem - $tmp['type'] = "Clone"; $tmp['origin'] = $ds->getOrigin(); } else { //This is a standard Filesystem. - $tmp['type']= ucfirst($type); + $tmp['origin'] = "n/a"; } + $tmp['type']= ucfirst($type); + $tmp['size'] = "n/a"; + $used = $ds->getProperty("used"); + $tmp['used'] = $used['value']; + $available = $ds->getProperty("available"); + $tmp['available'] = $available['value']; + $tmp['mountpoint'] = $ds->getMountPoint(); array_push($objects,$tmp); } break; @@ -229,6 +279,19 @@ class OMVModuleZFSUtil { 'icon'=>"images/save.png", 'path'=>$path, 'expanded'=>$expanded); + $vol = new OMVModuleZFSZvol($path); + if ($vol->isClone()) { + //This is a cloned Volume + $tmp['origin'] = $vol->getOrigin(); + } else { + //This is a standard Volume + $tmp['origin'] = "n/a"; + } + $tmp['type']= ucfirst($type); + $tmp['size'] = $vol->getSize(); + $tmp['used'] = "n/a"; + $tmp['available'] = "n/a"; + $tmp['mountpoint'] = "n/a"; array_push($objects,$tmp); break; @@ -243,6 +306,11 @@ class OMVModuleZFSUtil { 'icon'=>'images/zfs_snap.png', 'path'=>$path, 'expanded'=>$expanded); + $tmp['origin'] = "n/a"; + $tmp['size'] = "n/a"; + $tmp['used'] = "n/a"; + $tmp['available'] = "n/a"; + $tmp['mountpoint'] = "n/a"; array_push($objects,$tmp); break;