<?php
+require_once('openmediavault/object.inc');
+require_once('openmediavault/module.inc');
require_once("Vdev.php");
require_once("Snapshot.php");
require_once("Dataset.php");
*/
public function __construct($vdev) {
+ $create_pool = true;
+
if (is_array($vdev)) {
$cmd = $this->getCommandString($vdev);
$name = $vdev[0]->getPool();
$type = $vdev[0]->getType();
- }
- else {
+ } else if ($vdev instanceof OMVModuleZFSVdev) {
$cmd = $this->getCommandString(array($vdev));
$name = $vdev->getPool();
$type = $vdev->getType();
+ } else {
+ // Assume we make an instance of an existing pool
+ $create_pool = false;
}
- $cmd = "zpool create $name $cmd";
- OMVUtil::exec($cmd, $output, $result);
- if ($result)
- throw new OMVModuleZFSException($output);
- else {
- $this->vdevs = array();
- $this->spare = array();
- $this->log = array();
- $this->cache = array();
- $this->features = array();
- $this->name = $name;
- $this->type = $type;
- if (is_array($vdev))
- $this->vdevs = $vdev;
- else
- array_push ($this->vdevs, $vdev);
- $this->size = $this->getAttribute("size");
- $this->mountPoint = $this->getAttribute("mountpoint");
+ $this->vdevs = array();
+ $this->spare = null;
+ $this->log = null;
+ $this->cache = null;
+ $this->features = array();
+ if ($create_pool) {
+ $cmd = "zpool create $name $cmd";
+
+ OMVUtil::exec($cmd, $output, $result);
+ if ($result)
+ throw new OMVModuleZFSException($output);
+ else {
+ $this->name = $name;
+ $this->type = $type;
+ if (is_array($vdev))
+ $this->vdevs = $vdev;
+ else
+ array_push ($this->vdevs, $vdev);
+ $this->size = $this->getAttribute("size");
+ $this->mountPoint = $this->getAttribute("mountpoint");
+ }
+ } else {
+ $this->assemblePool($vdev);
}
}
*
* @param OMVModuleZFSVdev $log
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function addLog(OMVModuleZFSVdev $log) {
* XXX
*
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function removeLog() {
*
* @param OMVModuleZFSVdev $spares
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function addSpare(OMVModuleZFSVdev $spares) {
*
* @param array $disks
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function removeSpare(array $disks = null) {
*
* @param array $features
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function setFeatures(array $features) {
'dedup', /* on | off */
'sync' /* standard | always | disabled */
);
- if (array_count_values($this->features) < 1)
- $this->features = getAllAttributes();
+ if (count($this->features) < 1)
+ $this->features = $this->getAllAttributes();
foreach ($this->features as $attr => $val) {
if (in_array($attr, $featureSet))
$attrs[$attr] = $val;
* XXX
*
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function export() {
*
* @param string $name
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function import($name = null) {
* XXX
*
* @return void
+ * @throws OMVModuleZFSException
* @access public
*/
public function scrub() {
* XXX
*
* @return string
+ * @throws OMVModuleZFSException
* @access public
*/
public function status() {
/**
* Get all attributes from pool
* @return array of attributes
+ * @throws OMVModuleZFSException
*/
private function getAllAttributes() {
$attrs = array();
OMVUtil::exec($cmd, $output, $result);
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\.]+).*/", $output, $matches, PREG_SET_ORDER);
if ($res == false || $res == 0)
throw new OMVModuleZFSException("Error return by zpool get all: $output");
foreach ($matches as $match) {
return $new_disks;
}
+
+ /**
+ * Construct existing pool
+ *
+ * @param string $name
+ * @return void
+ * @throws OMVModuleZFSException
+ */
+ private function assemblePool($name) {
+ $cmd = "zpool status -v $name";
+ $types = 'mirror|raidz1|raidz2|raidz3';
+ $dev = null;
+ $type = null;
+ $log = false;
+ $cache = false;
+ $start = true;
+
+ OMVUtil::exec($cmd, $output, $result);
+ if ($result)
+ throw new OMVModuleZFSException($output);
+
+ $this->name = $name;
+ foreach($output as $line) {
+ if (! strstr($line, PHP_EOL))
+ $line .= PHP_EOL;
+ if ($start) {
+ if (preg_match("/^\s*NAME/", $line))
+ $start = false;
+ continue;
+ } else {
+ if (preg_match("/^\s*$/", $line)) {
+ if ($dev) {
+ $this->output($part, $type, $dev);
+ }
+ break;
+ } else if (preg_match("/^\s*($name|logs|cache|spares)/", $line, $match)) {
+ if ($dev) {
+ $this->output($part, $type, $dev);
+ $dev = null;
+ $type = null;
+ }
+ $part = $match[1];
+ } else {
+ switch ($part) {
+ case $name:
+ if (preg_match("/^\s*($types)/", $line, $match)) {
+ /* new vdev */
+ if ($type) {
+ $this->output(null, $type, $dev);
+ $dev = null;
+ }
+ $type = $match[1];
+ } else if (preg_match("/^\s*([\w\d-]+)\s+/", $line, $match)) {
+ if ($dev)
+ $dev .= " $match[1]";
+ else
+ $dev = "$match[1]";
+ }
+ break;
+ case 'logs':
+ if (preg_match("/^\s*([\w\d-]+)\s+/", $line, $match)) {
+ if ($dev)
+ $dev .= " $match[1]";
+ else
+ $dev = "$match[1]";
+ }
+ break;
+ case 'cache':
+ case 'spares':
+ if (preg_match("/^\s*([\w\d-]+)\s+/", $line, $match)) {
+ if ($dev)
+ $dev .= " $match[1]";
+ else
+ $dev = "$match[1]";
+ }
+ break;
+ default:
+ throw new Exception("$part: Unknown pool part");
+ }
+ }
+ }
+ }
+ $this->size = $this->getAttribute("size");
+ $this->mountPoint = $this->getAttribute("mountpoint");
+ }
+
+ /**
+ * Create pool config from parsed input
+ *
+ * @param string $part
+ * @param string $type
+ * @param string $dev
+ * @return void
+ * @throws OMVModuleZFSException
+ */
+ private function output($part, $type, $dev) {
+ $disks = split(" ", $dev);
+ switch ($part) {
+ case 'logs':
+ if ($type && $type != 'mirror')
+ throw new Exception("$type: Logs can only be mirror or plain");
+ if ($type)
+ $this->log = new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSMIRROR, $disks);
+ else
+ $this->log = new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSPLAIN, $disks);
+ break;
+ case 'cache':
+ if ($type)
+ throw new Exception("$type: cache can only be plain");
+ $this->cache = new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSPLAIN, $disks);
+ break;
+ case 'spares':
+ if ($type)
+ throw new Exception("$type: spares can only be plain");
+ $this->spare = new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSPLAIN, $disks);
+ break;
+ default:
+ if ($type) {
+ switch ($type) {
+ case 'mirror':
+ array_push($this->vdevs, new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSMIRROR, $disks));
+ $this->type = OMVModuleZFSVdevType::OMVMODULEZFSMIRROR;
+ break;
+ case 'raidz1':
+ array_push($this->vdevs, new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ1, $disks));
+ $this->type = OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ1;
+ break;
+ case 'raidz2':
+ array_push($this->vdevs, new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ2, $disks));
+ $this->type = OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ2;
+ break;
+ case 'raidz3':
+ array_push($this->vdevs, new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ3, $disks));
+ $this->type = OMVModuleZFSVdevType::OMVMODULEZFSRAIDZ3;
+ break;
+ }
+ } else {
+ array_push($this->vdevs, new OMVModuleZFSVdev($this->name, OMVModuleZFSVdevType::OMVMODULEZFSPLAIN, $disks));
+ $this->type = OMVModuleZFSVdevType::OMVMODULEZFSPLAIN;
+ }
+ break;
+ }
+ }
+
}
?>