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() {
$this->registermethod("inherit");
$this->registermethod("getSharedParams");
$this->registermethod("createShare");
+ $this->registermethod("getObjectDetails");
}
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;
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());
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'];
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']);
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']) {
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":
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();
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();
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.
$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'],
return $object;
}
+ public function getObjectDetails($params, $context) {
+ $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"}
+ }
+ }');
+ $output = "";
+ switch ($params['type']) {
+ case "Filesystem":
+ $output .= "Filesystem details (zfs get all):\n\r\n\r";
+ $cmd = "zfs get all {$params['name']}";
+ break;
+ case "Volume":
+ $output .= "Volume details (zfs get all):\n\r\n\r";
+ $cmd = "zfs get all {$params['name']}";
+ break;
+ case "Snapshot":
+ $output .= "Snapshot details (zfs get all):\n\r\n\r";
+ $cmd = "zfs get all {$params['name']}";
+ break;
+ case "Pool":
+ $output .= "Pool details (zpool get all):\n\r\n\r";
+ $cmd = "zpool get all {$params['name']}";
+ break;
+ default:
+ throw new OMVModuleZFSException("Incorrect type provided");
+ }
+ OMVModuleZFSUtil::exec($cmd,$out,$res);
+ $output .= implode("\n\r", $out);
+ return array("details" => $output);
+ }
}
// Register the RPC service.