X-Git-Url: http://git.datanom.net/omvzfs.git/blobdiff_plain/c6117b32379445101780af97836973ba9151cac7..ecee099b4e06ee713f501ad07047b76ee145496a:/gui/rpc/zfs.inc diff --git a/gui/rpc/zfs.inc b/gui/rpc/zfs.inc index 16b5a13..3a98d58 100644 --- a/gui/rpc/zfs.inc +++ b/gui/rpc/zfs.inc @@ -34,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; @@ -63,7 +75,16 @@ class OMVRpcServiceZFS extends OMVRpcServiceAbstract { $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, $opts); //Ugly fix to solve the problem of blkid not displaying info on newly created pools @@ -85,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']; @@ -114,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']); @@ -144,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']) { @@ -178,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": @@ -205,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(); @@ -245,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(); @@ -257,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. @@ -285,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'],