X-Git-Url: http://git.datanom.net/omvzfs.git/blobdiff_plain/57667eb1122f91698c785b05be94af26c00708bb..ecee099b4e06ee713f501ad07047b76ee145496a:/gui/rpc/zfs.inc?ds=sidebyside diff --git a/gui/rpc/zfs.inc b/gui/rpc/zfs.inc index b110ebe..3a98d58 100644 --- a/gui/rpc/zfs.inc +++ b/gui/rpc/zfs.inc @@ -11,6 +11,7 @@ require_once("zfs/Dataset.php"); require_once("zfs/Snapshot.php"); require_once("zfs/Zvol.php"); require_once("zfs/Zpool.php"); +require_once("zfs/NotifyListener.php"); class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function getName() { @@ -33,6 +34,18 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function addPool($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "pooltype":{"type":"string","enum":["basic","mirror",' . + '"raidz1","raidz2","raidz3"]}, + "force":{"type":"boolean"}, + "mountpoint":{"type":"string"}, + "name":{"type":"string"}, + "devices":{"type":"string"} + } + }'); switch ($params['pooltype']) { case "basic": $pooltype = OMVModuleZFSVdevType::OMVMODULEZFSPLAIN; @@ -53,9 +66,27 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { throw new OMVModuleZFSException("Incorrect pool type specified"); break; } + //Check for user supplied options + $opts = ""; + if ($params['force']) { + $opts .= "-f "; + } + if (strlen($params['mountpoint']) > 0) { + $opts .= "-m " . $params['mountpoint'] . " "; + } + + //Use /dev/disk/by-path as deafult when creating new pools as suggested in ZoL FAQ. $disks = preg_split("/[,;]/", $params['devices']); + if (file_exists("/dev/disk/by-path/")) { + $tmp_disks = array(); + foreach ($disks as $disk) { + $tmp_disks[] = OMVModuleZFSUtil::getDiskPath($disk); + } + $disks = $tmp_disks; + } + $vdev = new OMVModuleZFSVdev($params['name'], $pooltype, $disks); - $pool = new OMVModuleZFSZpool($vdev); + $pool = new OMVModuleZFSZpool($vdev, $opts); //Ugly fix to solve the problem of blkid not displaying info on newly created pools $pool->export(); $pool->import($pool->getName()); @@ -75,13 +106,30 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function passParam($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); - //$msg = "Key=" . $params['key'] . ";Value=" . $params['value'] . ";"; - //throw new OMVModuleZFSException($msg); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "key":{"type":"string"}, + "value":{"type":"string"} + } + }'); return array($params['key'] => $params['value']); } public function addObject($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "type":{"type":"string","enum":["filesystem","snapshot",' . + '"volume"]}, + "path":{"type":"string"}, + "name":{"type":"string"}, + "size":{"type":"string"} + } + }'); switch ($params['type']) { case "filesystem": $name = $params['path'] . "/" . $params['name']; @@ -104,27 +152,46 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function deleteObject($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "type":{"type":"string","enum":["Filesystem","Snapshot",' . + '"Volume","Clone","Pool"]}, + "name":{"type":"string"} + } + }'); + global $xmlConfig; + $name = $params['name']; switch ($params['type']) { case "Filesystem": + OMVModuleZFSUtil::deleteShares($name); + $tmp = new OMVModuleZFSDataset($name); + $tmp->destroy(); + break; case "Clone": - $name = $params['name']; $tmp = new OMVModuleZFSDataset($name); $tmp->destroy(); break; case "Snapshot": - $name = $params['name']; $tmp = new OMVModuleZFSSnapshot($name); $tmp->destroy(); break; case "Volume": - $name = $params['name']; $tmp = new OMVModuleZFSZvol($name); $tmp->destroy(); break; case "Pool": - $name = $params['name']; + $disks = OMVModuleZFSUtil::getDevDisksByPool($name); + $pooluuid = OMVModuleZFSUtil::getUUIDbyName($name); $tmp = new OMVModuleZFSZpool($name); $tmp->destroy(); + $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and type='zfs']"; + $object = $xmlConfig->get($xpath); + $xmlConfig->delete($xpath); + $dispatcher = &OMVNotifyDispatcher::getInstance(); + $dispatcher->notify(OMV_NOTIFY_DELETE,"org.openmediavault.system.fstab.mntent", $object); + OMVModuleZFSUtil::clearZFSLabel($disks); break; default: throw new OMVModuleZFSException("Illegal type provided: " . $params['type']); @@ -134,6 +201,18 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function getProperties($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "type":{"type":"string"}, + "name":{"type":"string"}, + "start":{"type":"integer"}, + "limit":{'.$GLOBALS['OMV_JSONSCHEMA_COUNTFIELD'].'}, + "sortfield":{'.$GLOBALS['OMV_JSONSCHEMA_SORTFIELD'].'}, + "sortdir":{'.$GLOBALS['OMV_JSONSCHEMA_SORTDIR'].'} + } + }'); $objects = array(); $name = $params['name']; switch ($params['type']) { @@ -168,6 +247,20 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function setProperties($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "type":{"type":"string","enum":["Filesystem","Snapshot",' . + '"Volume","Clone","Pool"]}, + "name":{"type":"string"}, + "properties":{"type":"array","items":{ + "type":"object", + "properties":{ + "property":{"type":"string"}, + "value":{"type":"string"}}}} + } + }'); $objects = array(); switch ($params['type']) { case "Filesystem": @@ -195,6 +288,16 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function inherit($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "type":{"type":"string","enum":["Filesystem","Snapshot",' . + '"Volume","Clone","Pool"]}, + "name":{"type":"string"}, + "property":{"type":"string"} + } + }'); // Create a background process. $bgStatusFilename = $this->createBgProcStatus(); $pid = $this->fork(); @@ -235,6 +338,14 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function getSharedParams($params, $context) { $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "type":{"type":"string"}, + "name":{"type":"string"} + } + }'); $objects = array(); $ds = new OMVModuleZFSDataset($params['name']); $mountpoint = $ds->getMountPoint(); @@ -247,17 +358,28 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { public function createShare($params, $context) { global $xmlConfig; $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR)); + // Validate the parameters of the RPC service method. + $this->validateMethodParams($params, '{ + "type":"object", + "properties":{ + "name":{"type":"string"}, + "type":{"type":"string","enum":["Filesystem","Clone"]}, + "sharename":{'.$GLOBALS['OMV_JSONSCHEMA_SHARENAME'].'}, + "comment":{"type":"string"}, + "mode":{"type":"string","enum":["700","750","755",'. + '"770","775","777"],"optional":true}, + "mountpoint":{"type":"string"} + } + }'); //Get the UUID of the Pool - $pooluuid = OMVModuleZFSUtil::getUUIDbyName($params['name']); - preg_match('/^([A-Za-z0-9]+)\/?.*$/', $params['name'], $result); - $poolname = $result[1]; - unset($result); + $poolname = OMVModuleZFSUtil::getPoolname($params['name']); + $pooluuid = OMVModuleZFSUtil::getUUIDbyName($poolname); //Get the mntent object and fetch it's uuid. - $xpath = "//system/fstab/mntent[fsname=" . $pooluuid . "]"; - $object = $xmlConfig->get($xpath); - $mntentref = $object['uuid']; + $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "']"; + $mountpoint = $xmlConfig->get($xpath); + $mntentref = $mountpoint['uuid']; // Prepare the configuration object. Use the name of the shared // folder as the relative directory name of the share. @@ -275,8 +397,7 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { $uuid = OMVUtil::uuid(); $pathName = $tmp->getMountPoint(); - $subdirs = preg_split('/\//',$pathName); - $reldirpath = $subdirs[count($subdirs)-1]; + $reldirpath = OMVModuleZFSUtil::getReldirpath($pathName); $object = array( "uuid" => $uuid, "name" => $params['sharename'],