$docroot ??= ($_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp');
require_once "$docroot/webGui/include/Helpers.php";
// add translations
$_SERVER['REQUEST_URI'] = 'shares';
require_once "$docroot/webGui/include/Translations.php";
$compute = rawurldecode(_var($_POST,'compute'));
$path = rawurldecode(_var($_POST,'path'));
$all = _var($_POST,'all');
$shares = parse_ini_file('state/shares.ini',true);
$disks = parse_ini_file('state/disks.ini',true);
$var = parse_ini_file('state/var.ini');
$sec = parse_ini_file('state/sec.ini',true);
$sec_nfs = parse_ini_file('state/sec_nfs.ini',true);
/* Get the pools from the disks.ini. */
$pools_check = pools_filter(cache_filter($disks));
$pools = implode(',', $pools_check);
/* If the configuration is pools only, then no array disks are available. */
$poolsOnly = ((int)$var['SYS_ARRAY_SLOTS'] <= 2) ? true : false;
// exit when no mountable array disks
$nodisks = "
| "._('There are no mounted array or pool disks - cannot add shares').". |
";
if (!checkDisks($disks)) die($nodisks);
// No shared disks
$nodisks = "| "._('There are no exportable disk shares')." |
";
// GUI settings
extract(parse_plugin_cfg('dynamix',true));
/* Function to test if any Mouned volumes exist. */
function checkDisks(&$disks) {
$rc = false;
foreach ($disks as $disk) {
if ($disk['name']!=='flash' && _var($disk,'fsStatus',"")==='Mounted') {
$rc = true;
break;
}
}
return $rc;
}
// Display export settings
function disk_share_settings($protocol,$share) {
if (empty($share)) return;
if ($protocol!='yes' || _var($share,'export')=='-') return "-";
return (_var($share,'export')=='e') ? _(ucfirst(_var($share,'security'))) : ''._(ucfirst(_var($share,'security'))).'';
}
function globalInclude($name) {
global $var;
return substr($name,0,4)!='disk' || !_var($var,'shareUserInclude') || strpos(_var($var,'shareUserInclude').",","$name,")!==false;
}
function shareInclude($name) {
global $include;
return !$include || substr($name,0,4)!='disk' || strpos("$include,", "$name,")!==false;
}
function sharesOnly($disk) {
return in_array(_var($disk,'type'),['Data','Cache']) && _var($disk,'exportable')=='yes';
}
// filter disk shares
$disks = array_filter($disks,'sharesOnly');
// Compute disk shares & check encryption
$crypto = false;
foreach ($disks as $name => $disk) {
if ($all!=0 && (!$compute || $compute==$name)) exec("/$docroot/webGui/scripts/disk_size ".escapeshellarg($name)." ssz2");
$crypto |= strpos(_var($disk,'fsType'),'luks:')!==false;
}
// global shares include/exclude
$myDisks = array_filter(array_diff(array_keys($disks), explode(',',_var($var,'shareUserExclude'))), 'globalInclude');
// Share size per disk
$ssz2 = [];
if ($all==0)
exec("rm -f /var/local/emhttp/*.ssz2");
else
foreach (glob("state/*.ssz2",GLOB_NOSORT) as $entry) $ssz2[basename($entry,'.ssz2')] = file($entry,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
// Build table
$row = 0;
foreach ($disks as $name => $disk) {
$color = _var($disk,'fsColor');
$row++;
switch ($color) {
case 'green-on' : $orb = 'circle'; $color = 'green'; $help = _('All files protected'); break;
case 'yellow-on': $orb = 'warning'; $color = 'yellow'; $help = _('All files unprotected'); break;
}
if ($crypto) switch (_var($disk,'luksState',0)) {
case 0: $luks = ""; break;
case 1: $luks = ""._('All files encrypted').""; break;
case 2: $luks = ""._('Some or all files unencrypted').""; break;
default: $luks = ""._('Unknown encryption state').""; break;
} else $luks = "";
echo "| ";
echo "$help$luks$name | ";
echo "",htmlspecialchars(_var($disk,'comment'))," | ";
echo "",disk_share_settings(_var($var,'shareSMBEnabled'), $sec[$name])," | ";
echo "",disk_share_settings(_var($var,'shareNFSEnabled'), $sec_nfs[$name])," | ";
$cmd="/webGui/scripts/disk_size&arg1=$name&arg2=ssz2";
$type = _var($disk,'rotational') ? _('HDD') : _('SSD');
if (array_key_exists($name,$ssz2)) {
echo "$type | ";
echo "",my_scale(_var($disk,'fsSize',0)*1024, $unit)," $unit | ";
echo "",my_scale(_var($disk,'fsFree',0)*1024, $unit)," $unit | ";
echo "
";
foreach ($ssz2[$name] as $entry) {
[$sharename,$sharesize] = my_explode('=',$entry);
if ($sharename=='share.total') continue;
$inside = in_array(_var($disk,'name'), array_filter(array_diff($myDisks, explode(',',_var($shares[$sharename],'exclude'))), 'shareInclude'));
echo "" : "warning'>");
echo "| $sharename | ";
echo "",($inside ? "" : ""._('Share is outside the list of designated disks')."")," | ";
echo " | ";
echo " | ";
echo " | ";
echo "",my_scale($sharesize, $unit)," $unit | ";
echo "",my_scale(_var($disk,'fsFree',0)*1024, $unit)," $unit | ";
echo "
";
}
} else {
echo "$type | ";
echo "",_('Compute'),"... | ";
echo "",my_scale(_var($disk,'fsFree',0)*1024, $unit)," $unit | ";
echo "";
}
}
if ($row==0) echo $nodisks;
?>