<?php
+require_once('openmediavault/object.inc');
+require_once('openmediavault/module.inc');
require_once("Vdev.php");
require_once("Snapshot.php");
require_once("Dataset.php");
require_once("Zvol.php");
+require_once("VdevType.php");
+require_once("Utils.php");
require_once("Exception.php");
/**
* @version 0.1
* @copyright Michael Rasmussen <mir@datanom.net>
*/
-class OMVModuleZFSZpool extends OMVModuleAbstract
- implements OMVINotifyListener {
+class OMVModuleZFSZpool extends OMVModuleAbstract {
// Attributes
/**
* Name of pool
* @throws OMVModuleZFSException
*/
- public function __construct($vdev) {
+ public function __construct($vdev, $opts = "") {
$create_pool = true;
if (is_array($vdev)) {
$this->cache = null;
$this->features = array();
if ($create_pool) {
- $cmd = "zpool create $name $cmd";
+ $cmd = "zpool create $opts$name $cmd 2>&1";
OMVUtil::exec($cmd, $output, $result);
if ($result)
- throw new OMVModuleZFSException($output);
+ throw new OMVModuleZFSException(implode("\n", $output));
else {
$this->name = $name;
$this->type = $type;
* @throws OMVModuleZFSException
* @access public
*/
- public function addVdev(array $vdevs) {
- $cmd = "zpool add " . $this->name . " " . $this->getCommandString($vdevs);
+ public function addVdev(array $vdevs, $opts= "") {
+ $cmd = "zpool add " . $this->name . " " . $opts . $this->getCommandString($vdevs) . " 2>&1";
OMVUtil::exec($cmd, $output, $result);
if ($result)
- throw new OMVModuleZFSException($output);
+ throw new OMVModuleZFSException(implode("\n", $output));
else
$this->vdevs = array_merge($this->vdevs, $vdevs);
$this->size = $this->getAttribute("size");
* @return array of features
* @access public
*/
- public function getFeatures() {
+ public function getFeatures($internal = true) {
$attrs = array();
$featureSet = array(
'recordsize', /* default 131072. 512 <= n^2 <= 131072*/
'dedup', /* on | off */
'sync' /* standard | always | disabled */
);
- if (array_count_values($this->features) < 1)
- $this->features = getAllAttributes();
- foreach ($this->features as $attr => $val) {
- if (in_array($attr, $featureSet))
- $attrs[$attr] = $val;
+ if (count($this->features) < 1)
+ $this->features = $this->getAllAttributes();
+ if ($internal) {
+ foreach ($this->features as $attr => $val) {
+ if (in_array($attr, $featureSet))
+ $attrs[$attr] = $val['value'];
+ }
+ } else {
+ foreach ($this->features as $attr => $val) {
+ if (in_array($attr, $featureSet))
+ $attrs[$attr] = $val;
+ }
}
return $attrs;
throw new OMVModuleZFSException($output);
}
- public function bindListeners(OMVNotifyDispatcher $dispatcher) {
- // Update service if configuration has been modified
- $dispatcher->addListener(
- OMV_NOTIFY_MODIFY,
- "org.openmediavault.services.nfs",
- array($this, "onUpdateNFSService"));
- $dispatcher->addListener(
- OMV_NOTIFY_CREATE,
- "org.openmediavault.services.nfs.shares.share",
- array($this, "onCreateNFSShare"));
- $dispatcher->addListener(
- OMV_NOTIFY_DELETE,
- "org.openmediavault.services.nfs.shares.share",
- array($this, "onDeleteNFSShare"));
- $dispatcher->addListener(
- OMV_NOTIFY_MODIFY,
- "org.openmediavault.services.nfs.shares.share",
- array($this, "onUpdateNFSShare"));
- }
+ /**
+ * Get a single property value associated with the Dataset
+ *
+ * @param string $property Name of the property to fetch
+ * @return array The returned array with the property. The property is an associative array with
+ * two elements, <value> and <source>.
+ * @access public
+ */
+ public function getProperty($property) {
+ $attrs = $this->getFeatures(false);
+ return $attrs["$property"];
+ }
/**
- * XXX
- * org.openmediavault.services.nfs
+ * Get an associative array of all properties associated with the Snapshot
*
- * @param string event
+ * @return array $properties Each entry is an associative array with two elements
+ * <value> and <source>
* @access public
*/
- public function onUpdateNFSService($args) {
- $this->debug(sprintf("onUpdateNFSService args=%s", var_export($args, true)));
+ public function getProperties() {
+ $attrs = $this->getFeatures(false);
+ return $attrs;
}
/**
- * XXX
- * org.openmediavault.services.nfs.shares.share
+ * Sets a number of Dataset properties. If a property is already set it will be updated with the new value.
*
- * @param string event
+ * @param array $properties An associative array with properties to set
+ * @return void
* @access public
*/
- public function onCreateNFSShare($args) {
- $this->debug(sprintf("onCreateNFSShare args=%s", var_export($args, true)));
+ public function setProperties($properties) {
+ foreach ($properties as $newpropertyk => $newpropertyv) {
+ $cmd = "zfs set " . $newpropertyk . "=" . $newpropertyv . " " . $this->name . " 2>&1";
+ OMVModuleZFSUtil::exec($cmd,$out,$res);
+ $attr = $this->getAttribute($newpropertyk);
+ $this->features[$newpropertyk] = $attr;
+ }
}
/**
- * XXX
- * org.openmediavault.services.nfs.shares.share
+ * Destroy the Dataset.
*
- * @param string event
+ * @return void
* @access public
*/
- public function onDeleteNFSShare($args) {
- $this->debug(sprintf("onDeleteNFSShare args=%s", var_export($args, true)));
+ public function destroy() {
+ $cmd = "zpool destroy " . $this->name . " 2>&1";
+ $this->exec($cmd,$out,$res);
}
/**
- * XXX
- * org.openmediavault.services.nfs.shares.share
+ * Clears a previously set proporty and specifies that it should be
+ * inherited from it's parent.
*
- * @param string event
+ * @param string $property Name of the property to inherit.
+ * @return void
* @access public
*/
- public function onUpdateNFSShare($args) {
- $this->debug(sprintf("onUpdateNFSShare args=%s", var_export($args, true)));
+ public function inherit($property) {
+ $cmd = "zfs inherit " . $property . " " . $this->name . " 2>&1";
+ $this->exec($cmd,$out,$res);
+ $attr = $this->getAttribute($newpropertyk);
+ $this->features[$newpropertyk] = $attr;
}
/**
array_push ($adds, $command . $diskStr);
}
- return join(" ", $adds);
+ return implode(" ", $adds);
}
/**
* @param string $attribute
* @return string value
*/
- private function getAttribute($attribute) {
+ public function getAttribute($attribute) {
$cmd = "zpool list -H -o $attribute {$this->name}";
OMVUtil::exec($cmd, $output, $result);
if ($result) {
$attrs = array();
$cmd = "zfs get -H all {$this->name}";
- OMVUtil::exec($cmd, $output, $result);
+ try {
+ OMVUtil::exec($cmd, $output, $result);
+ } catch (OMVModuleZFSException $e) {}
if ($result)
throw new OMVModuleZFSException($output);
- $res = preg_match_all("/$pool\s+(\w+)\s+([\w\d\.]+).*/", $output, $matches, PREG_SET_ORDER);
+ $output = implode("\n", $output);
+ $res = preg_match_all("/{$this->name}\s+(\w+)\s+([\w\d\.]+)\s+(\w+).*/", $output, $matches, PREG_SET_ORDER);
if ($res == false || $res == 0)
throw new OMVModuleZFSException("Error return by zpool get all: $output");
foreach ($matches as $match) {
- $attrs[$match[1]] = $match[2];
+ $attrs[$match[1]] = array('value' => $match[2], 'source' => $match[3]);
}
return $attrs;
}
+ /**
+ * Get all Dataset properties from commandline and update object properties attribute
+ *
+ * @return void
+ * @access private
+ */
+ private function updateAllProperties() {
+ $this->features = $this->getAllAttributes();
+ }
+
/**
* Remove a disk from array
*
* @throws OMVModuleZFSException
*/
private function assemblePool($name) {
- $cmd = "zpool list -Hv $name";
+ $cmd = "zpool status -v $name";
$types = 'mirror|raidz1|raidz2|raidz3';
$dev = null;
$type = null;
OMVUtil::exec($cmd, $output, $result);
if ($result)
throw new OMVModuleZFSException($output);
- $res = preg_match("/$name\s+([\w\d]+)\s+.*/", $output, $matches);
- if ($res == false || $res == 0)
- throw new OMVModuleZFSException("Error return by zpool list: $output");
$this->name = $name;
- $lines = split("\n", $output);
- foreach($lines as $line) {
+ foreach($output as $line) {
+ if (! strstr($line, PHP_EOL))
+ $line .= PHP_EOL;
if ($start) {
- if (preg_match("/^\s*NAME/", $line))
- $start = false;
- continue;
+ if (preg_match("/^\s*NAME/", $line))
+ $start = false;
+ continue;
} else {
if (preg_match("/^\s*$/", $line)) {
if ($dev) {
- output($part, $type, $dev);
+ $this->output($part, $type, $dev);
}
break;
} else if (preg_match("/^\s*($name|logs|cache|spares)/", $line, $match)) {
if ($dev) {
- output($part, $type, $dev);
+ $this->output($part, $type, $dev);
$dev = null;
$type = null;
}
if (preg_match("/^\s*($types)/", $line, $match)) {
/* new vdev */
if ($type) {
- output(null, $type, $dev);
- $dev = null;
+ $this->output(null, $type, $dev);
+ $dev = null;
}
$type = $match[1];
- } else if (preg_match("/^\s*([\w\d]+)\s+/", $line, $match)) {
+ } else if (preg_match("/^\s*([\w\d-a-z0-9\:\.\-]+)\s+/", $line, $match)) {
if ($dev)
$dev .= " $match[1]";
else
}
break;
case 'logs':
- if (preg_match("/^\s*([\w\d]+)\s+/", $line, $match)) {
+ if (preg_match("/^\s*([\w\d-]+)\s+/", $line, $match)) {
if ($dev)
$dev .= " $match[1]";
else
break;
case 'cache':
case 'spares':
- if (preg_match("/^\s*([\w\d]+)\s+/", $line, $match)) {
+ if (preg_match("/^\s*([\w\d-]+)\s+/", $line, $match)) {
if ($dev)
$dev .= " $match[1]";
else
array_push($this->vdevs, new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSPLAIN, $disks));
$this->type = OMVModuleZFSVdevType::OMVMODULEZFSPLAIN;
}
+ break;
}
}
}
-
?>