]>
git.datanom.net - omvzfs.git/blob - src/Utils.php
2 require_once("Exception.php");
3 require_once("openmediavault/util.inc");
4 require_once("Dataset.php");
5 require_once("Zvol.php");
6 require_once("Vdev.php");
7 require_once("Zpool.php");
10 * Helper class for ZFS module
12 class OMVModuleZFSUtil
{
15 * Manages relocation of ZFS filesystem mountpoints in the OMV backend.
16 * Needed when the user changes mountpoint of a filesystem in the GUI.
19 public static function relocateFilesystem($name) {
21 $poolname = OMVModuleZFSUtil
::getPoolname($name);
22 $pooluuid = OMVModuleZFSUtil
::getUUIDbyName($poolname);
23 $ds = new OMVModuleZFSDataset($name);
24 $dir = $ds->getMountPoint();
25 $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']";
26 $object = $xmlConfig->get($xpath);
27 $object['dir'] = $property['value'];
28 $xmlConfig->replace($xpath, $object);
33 * Clears all ZFS labels on specified devices.
34 * Needed for blkid to display proper data.
37 public static function clearZFSLabel($disks) {
38 foreach ($disks as $disk) {
39 $cmd = "zpool labelclear /dev/" . $disk . "1";
40 OMVModuleZFSUtil
::exec($cmd,$out,$res);
46 * Return all disks in /dev/sdXX used by the pool
48 * @return array An array with all the disks
50 public static function getDevDisksByPool($name) {
51 $pool = new OMVModuleZFSZpool($name);
53 $vdevs = $pool->getVdevs();
54 foreach ($vdevs as $vdev) {
55 $vdisks = $vdev->getDisks();
56 foreach ($vdisks as $vdisk) {
57 if (preg_match('/^[a-z0-9]+$/', $vdisk)) {
61 $cmd = "ls -la /dev/disk/by-path/" . $vdisk;
63 OMVModuleZFSUtil
::exec($cmd,$out,$res);
64 if (count($out) === 1) {
65 if (preg_match('/^.*\/([a-z0-9]+)$/', $out[0], $match)) {
75 * Deletes all shared folders pointing to the specifc path
78 public static function deleteShares($name) {
80 $poolname = OMVModuleZFSUtil
::getPoolname($name);
81 $pooluuid = OMVModuleZFSUtil
::getUUIDbyName($poolname);
82 $ds = new OMVModuleZFSDataset($name);
83 $dir = $ds->getMountPoint();
84 $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']";
85 $mountpoint = $xmlConfig->get($xpath);
86 $mntentuuid = $mountpoint['uuid'];
87 $xpath = "//system/shares/sharedfolder[mntentref='" . $mntentuuid . "']";
88 $objects = $xmlConfig->getList($xpath);
89 foreach ($objects as $object) {
90 $tmpxpath = sprintf("//*[contains(name(),'sharedfolderref')]".
91 "[contains(.,'%s')]", $object['uuid']);
92 if ($xmlConfig->exists($tmpxpath)) {
93 throw new OMVModuleZFSException("The Filesystem is shared and in use. Please delete all references and try again.");
96 $xmlConfig->delete($xpath);
97 $dispatcher = &OMVNotifyDispatcher
::getInstance();
98 $dispatcher->notify(OMV_NOTIFY_DELETE
,"org.openmediavault.system.shares.sharedfolder",$object);
102 * Get the relative path by complete path
104 * @return string Relative path of the complet path
106 public static function getReldirpath($path) {
107 $subdirs = preg_split('/\//',$path);
109 for ($i=2;$i<count($subdirs);$i++
) {
110 $reldirpath .= $subdirs[$i] . "/";
112 return(rtrim($reldirpath, "/"));
117 * Get /dev/disk/by-path from /dev/sdX
119 * @return string Disk identifier
121 public static function getDiskPath($disk) {
122 preg_match("/^.*\/([A-Za-z0-9]+)$/", $disk, $identifier);
123 $cmd = "ls -la /dev/disk/by-path | grep '$identifier[1]$'";
124 OMVModuleZFSUtil
::exec($cmd, $out, $res);
125 if (is_array($out)) {
126 $cols = preg_split('/[\s]+/', $out[0]);
127 return($cols[count($cols)-3]);
133 * Get poolname from name of dataset/volume etc.
135 * @return string Name of the pool
137 public static function getPoolname($name) {
138 $tmp = preg_split('/[\/]+/', $name);
143 * Get UUID of ZFS pool by name
145 * @return string UUID of the pool
147 public static function getUUIDbyName($poolname) {
148 $cmd = "zpool get guid " . $poolname . " 2>&1";
149 OMVModuleZFSUtil
::exec($cmd, $out, $res);
151 $headers = preg_split('/[\s]+/', $out[0]);
152 for ($i=0; $i<count($headers); $i++
) {
153 if (strcmp($headers[$i], "VALUE") === 0) {
158 $line = preg_split('/[\s]+/', $out[1]);
159 return $line[$valuecol];
165 * Add any missing ZFS filesystems to the OMV backend
168 public static function addMissingOMVMntEnt() {
170 $cmd = "zfs list -H -o name -t filesystem";
171 OMVModuleZFSUtil
::exec($cmd, $out, $res);
172 foreach($out as $name) {
173 if (preg_match('/[\/]+/', $name)) {
174 $poolname = OMVModuleZFSUtil
::getPoolname($name);
175 $pooluuid = OMVModuleZFSUtil
::getUUIDbyName($poolname);
176 $ds = new OMVModuleZFSDataset($name);
177 $dir = $ds->getMountPoint();
178 $xpath = "//system/fstab/mntent[fsname='" . $pooluuid . "' and dir='" . $dir . "' and type='zfs']";
179 if (!($xmlConfig->exists($xpath))) {
180 $uuid = OMVUtil
::uuid();
183 "fsname" => $pooluuid,
186 "opts" => "rw,relatime,xattr,noacl",
191 $xmlConfig->set("//system/fstab",array("mntent" => $object));
199 * Get an array with all ZFS objects
201 * @return An array with all ZFS objects
203 public static function getZFSFlatArray() {
204 $prefix = "root/pool-";
206 $cmd = "zfs list -H -t all -o name,type 2>&1";
208 OMVModuleZFSUtil
::exec($cmd,$out,$res);
209 foreach ($out as $line) {
210 $parts = preg_split('/\t/',$line);
213 $subdirs = preg_split('/\//',$path);
219 if (strpos($path,'/') === false) {
221 $tmp = array('id'=>$prefix . $path,
225 'icon'=>'images/raid.png',
226 'expanded'=>$expanded,
228 $pool = new OMVModuleZFSZpool($path);
229 $tmp['origin'] = "n/a";
230 $tmp['size'] = $pool->getSize();
231 $tmp['used'] = $pool->getAttribute("allocated");
232 $tmp['available'] = $pool->getAttribute("free");
233 $tmp['mountpoint'] = $pool->getMountPoint();
234 array_push($objects,$tmp);
236 //This is a Filesystem
237 preg_match('/(.*)\/(.*)$/', $path, $result);
238 $tmp = array('id'=>$prefix . $path,
239 'parentid'=>$prefix . $result[1],
241 'icon'=>"images/filesystem.png",
243 'expanded'=>$expanded);
244 $ds = new OMVModuleZFSDataset($path);
245 if ($ds->isClone()) {
246 //This is a cloned Filesystem
247 $tmp['origin'] = $ds->getOrigin();
249 //This is a standard Filesystem.
250 $tmp['origin'] = "n/a";
252 $tmp['type']= ucfirst($type);
253 $tmp['size'] = "n/a";
254 $used = $ds->getProperty("used");
255 $tmp['used'] = $used['value'];
256 $available = $ds->getProperty("available");
257 $tmp['available'] = $available['value'];
258 $tmp['mountpoint'] = $ds->getMountPoint();
259 array_push($objects,$tmp);
264 preg_match('/(.*)\/(.*)$/', $path, $result);
265 $tmp = array('id'=>$prefix . $path,
266 'parentid'=>$prefix . $result[1],
268 'type'=>ucfirst($type),
269 'icon'=>"images/save.png",
271 'expanded'=>$expanded);
272 $vol = new OMVModuleZFSZvol($path);
273 if ($vol->isClone()) {
274 //This is a cloned Volume
275 $tmp['origin'] = $vol->getOrigin();
277 //This is a standard Volume
278 $tmp['origin'] = "n/a";
280 $tmp['type']= ucfirst($type);
281 $tmp['size'] = $vol->getSize();
282 $tmp['used'] = "n/a";
283 $tmp['available'] = "n/a";
284 $tmp['mountpoint'] = "n/a";
285 array_push($objects,$tmp);
289 preg_match('/(.*)\@(.*)$/', $path, $result);
290 $subdirs = preg_split('/\//',$result[1]);
292 $tmp = array('id'=>$prefix . $path,
293 'parentid'=>$prefix . $result[1],
295 'type'=>ucfirst($type),
296 'icon'=>'images/zfs_snap.png',
298 'expanded'=>$expanded);
299 $tmp['origin'] = "n/a";
300 $tmp['size'] = "n/a";
301 $tmp['used'] = "n/a";
302 $tmp['available'] = "n/a";
303 $tmp['mountpoint'] = "n/a";
304 array_push($objects,$tmp);
315 * Create a tree structured array
317 * @param &$list The flat array to convert to a tree structure
318 * @param $parent Root node of the tree to create
319 * @return Tree structured array
322 public static function createTree(&$list, $parent){
324 foreach ($parent as $k=>$l){
325 if(isset($list[$l['id']])){
327 $l['children'] = OMVModuleZFSUtil
::createTree($list, $list[$l['id']]);
337 * Get all Datasets as objects
339 * @return An array with all the Datasets
341 public static function getAllDatasets() {
343 $cmd = "zfs list -H -t filesystem -o name 2>&1";
344 OMVModuleZFSUtil
::exec($cmd, $out, $res);
345 foreach ($out as $name) {
346 $ds = new OMVModuleZFSDataset($name);
347 array_push($datasets, $ds);
353 * Helper function to execute a command and throw an exception on error
354 * (requires stderr redirected to stdout for proper exception message).
356 * @param string $cmd Command to execute
357 * @param array &$out If provided will contain output in an array
358 * @param int &$res If provided will contain Exit status of the command
359 * @return string Last line of output when executing the command
360 * @throws OMVModuleZFSException
363 public static function exec($cmd, &$out = null, &$res = null) {
364 $tmp = OMVUtil
::exec($cmd, $out, $res);
366 throw new OMVModuleZFSException(implode("\n", $out));
This page took 0.216819 seconds and 6 git commands to generate.