$this->registermethod("getSharedParams");
$this->registermethod("createShare");
$this->registermethod("getObjectDetails");
+ $this->registermethod("expandPool");
}
public function addPool($params, $context) {
$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:
"value":{"type":"string"}}}}
}
}');
- $objects = array();
+ global $xmlConfig;
switch ($params['type']) {
case "Filesystem":
case "Clone":
break;
}
foreach ($params['properties'] as $property) {
+ unset($objects);
+ $objects = array();
$objects[$property['property']] = $property['value'];
+ $tmp->setProperties($objects);
+ if ((strcmp($property['property'], "mountpoint") === 0) && (strcmp($params['type'], "Filesystem") === 0)) {
+ OMVModuleZFSUtil::relocateFilesystem($params['name']);
+ }
}
- $tmp->setProperties($objects);
}
public function inherit($params, $context) {
}
}');
$objects = array();
- $ds = new OMVModuleZFSDataset($params['name']);
- $mountpoint = $ds->getMountPoint();
+ //$ds = new OMVModuleZFSDataset($params['name']);
+ //$mountpoint = $ds->getMountPoint();
return array(
- "mountpoint" => $mountpoint,
+ //"mountpoint" => $mountpoint,
"name" => $params['name'],
"type" => $params['type']);
}
"mountpoint":{"type":"string"}
}
}');
-
- //Get the UUID of the Pool
- $poolname = OMVModuleZFSUtil::getPoolname($params['name']);
- $pooluuid = OMVModuleZFSUtil::getUUIDbyName($poolname);
-
- //Get the mntent object and fetch it's uuid.
- $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "']";
- $mountpoint = $xmlConfig->get($xpath);
- $mntentref = $mountpoint['uuid'];
-
+
+ // The field 'reldirpath' may not contain the characters '..'. This
+ // is because of security reasons: the given canonicalized absolute
+ // path MUST be below the given mount point.
+ if(1 == preg_match("/\.\./", $params['mountpoint'])) {
+ throw new OMVException(OMVErrorMsg::E_RPC_SERVICE_METHOD_INVALID_PARAMS,
+ sprintf(gettext("The field '%s' contains forbidden two-dot symbols"), "mountpoint"));
+ }
+
// Prepare the configuration object. Use the name of the shared
// folder as the relative directory name of the share.
switch ($params['type']) {
break;
}
+ $poolname = OMVModuleZFSUtil::getPoolname($params['name']);
+ $pooluuid = OMVModuleZFSUtil::getUUIDbyName($poolname);
+ $dir = $tmp->getMountPoint();
+
+ //Get the mntent object and fetch it's uuid.
+ $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']";
+ $mountpoint = $xmlConfig->get($xpath);
+ $mntentref = $mountpoint['uuid'];
+
$uuid = OMVUtil::uuid();
- $pathName = $tmp->getMountPoint();
- $reldirpath = OMVModuleZFSUtil::getReldirpath($pathName);
+ $pathName = $dir . "/" . trim($params['mountpoint'], "/");
+ $reldirpath = trim($params['mountpoint'], "/");
$object = array(
"uuid" => $uuid,
"name" => $params['sharename'],
- "comment" => $params['comment'],
+ "comment" => $params['comment'] . "*** ZFS share on " . $params['name'] . " ***",
"mntentref" => $mntentref,
"reldirpath" => $reldirpath
);
$object['mode'] = $params['mode'];
}
+ // Create the shared folder directory if necessary.
+ if(FALSE === file_exists($pathName)) {
+ // Create the directory. Note, the function seems to have a bug
+ // when using the mask parameter. E.g. octdec("777") does not
+ // create the correct permissions as expected, thus change the
+ // mode using chmod.
+ if(FALSE === mkdir($pathName, 0700, TRUE)) {
+ throw new OMVException(OMVErrorMsg::E_MISC_FAILURE,
+ sprintf("Failed to create the directory '%s'", $pathName));
+ }
+ // Change the directory mode.
+ if(FALSE === chmod($pathName, octdec($object['mode']))) {
+ throw new OMVException(OMVErrorMsg::E_MISC_FAILURE,
+ sprintf("Failed to set file mode to '%s' for '%s'",
+ $object['mode'], $pathName));
+ }
+ }
+
// Change group owner of directory to configured default group,
// e.g. 'users'.
if(FALSE === chgrp($pathName, $GLOBALS['OMV_USERMGMT_DEFAULT_GROUP'])) {
$output .= implode("\n\r", $out);
return array("details" => $output);
}
+
+ public function expandPool($params, $context) {
+ $this->validateMethodContext($context, array("role" => OMV_ROLE_ADMINISTRATOR));
+ // Validate the parameters of the RPC service method.
+ $this->validateMethodParams($params, '{
+ "type":"object",
+ "properties":{
+ "pool_type":{"type":"string","enum":["Basic","Mirror",' .
+ '"Raidz1","Raidz2","Raidz3"]},
+ "name":{"type":"string"},
+ "devices":{"type":"string"}
+ }
+ }');
+ $pool = new OMVModuleZFSZpool($params['name']);
+ switch ($params['pool_type']) {
+ case "Basic":
+ $pooltype = OMVModuleZFSVdevType::OMVMODULEZFSPLAIN;
+ break;
+ case "Mirror":
+ $pooltype = OMVModuleZFSVdevType::OMVMODULEZFSMIRROR;
+ break;
+ case "Raidz1":
+ $pooltype = OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ1;
+ break;
+ case "Raidz2":
+ $pooltype = OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ2;
+ break;
+ case "Raidz3":
+ $pooltype = OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ3;
+ break;
+ default:
+ throw new OMVModuleZFSException("Incorrect pool type specified");
+ break;
+ }
+ //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->addVdev($vdev);
+ //Ugly fix to solve the problem of blkid not displaying info on newly created pools
+ $pool->export();
+ $pool->import($pool->getName());
+ }
}
// Register the RPC service.