Merge pull request #1276 from bergware/master

Miscellaneous updates and fixes
This commit is contained in:
tom mortensen
2023-03-05 01:02:47 -08:00
committed by GitHub
102 changed files with 2139 additions and 2053 deletions
@@ -145,7 +145,6 @@ function loadlist(init) {
$.post('/plugins/dynamix.docker.manager/include/UpdateConfig.php',{action:'wait',container:$(this).attr('container'),wait:$(this).val()});
});
if ($.cookie('docker_listview_mode')=='advanced') {$('.advanced').show(); $('.basic').hide();}
context.init({preventDoubleContext:false,left:true,above:false});
$('input[type=button]').prop('disabled',false).show('slow');
var update = false, rebuild = false;
for (var i=0,ct; ct=docker[i]; i++) {
@@ -170,7 +169,7 @@ dockerload.on('message', function(msg){
for (var i=0,row; row=data[i]; i++) {
var id = row.split(';');
var w1 = Math.round(Math.min(id[1].slice(0,-1)/<?=count($cpus)*count(preg_split('/[,-]/',$cpus[0]))?>,100)*100)/100+'%';
$('.cpu-'+id[0]).text(w1.replace('.','<?=$display['number'][0]?>'));
$('.cpu-'+id[0]).text(w1.replace('.','<?=_var($display,'number','.,')[0]?>'));
$('.mem-'+id[0]).text(id[2]);
$('#cpu-'+id[0]).css('width',w1);
}
@@ -58,9 +58,9 @@ foreach ($custom as $network) {
[$eth,$vlan] = my_explode('.',$network);
$eth = str_replace(['bond','br'],'eth',$eth);
if (!$vlan) {
$protocol[$network] = $$eth['PROTOCOL:0'] ?? 'ipv4';
$protocol[$network] = _var($$eth,'PROTOCOL:0','ipv4');
} else {
foreach ($$eth as $key => $value) if (strpos($key,'VLANID')!==false && $value==$vlan) {$protocol[$network] = $$eth[str_replace('VLANID','PROTOCOL',$key)] ?? 'ipv4'; break;}
foreach ($$eth as $key => $value) if (strpos($key,'VLANID')!==false && $value==$vlan) {$protocol[$network] = _var($$eth,str_replace('VLANID','PROTOCOL',$key),'ipv4'); break;}
}
if ($ip4 && $route4) {
$include[$network] = $route4;
@@ -137,15 +137,15 @@ span.disabled{color:#404040}
<input type="hidden" name="#arg[1]" value="cmdStatus=Apply">
<input type="hidden" name="#cleanup" value="true">
<input type="hidden" name="DOCKER_CUSTOM_NETWORKS" value="<?=implode(' ',$unset)?> ">
<input type="hidden" name="DOCKER_IMAGE_FILE" value="<?=$dockercfg['DOCKER_IMAGE_FILE']??''?>">
<input type="hidden" name="DOCKER_IMAGE_FILE" value="<?=_var($dockercfg,'DOCKER_IMAGE_FILE')?>">
_(Enable Docker)_:
: <select id="DOCKER_ENABLED" name="DOCKER_ENABLED">
<?=mk_option($dockercfg['DOCKER_ENABLED']??'', 'no', _('No'))?>
<?=mk_option($dockercfg['DOCKER_ENABLED']??'', 'yes', _('Yes'))?>
<?=mk_option(_var($dockercfg,'DOCKER_ENABLED'), 'no', _('No'))?>
<?=mk_option(_var($dockercfg,'DOCKER_ENABLED'), 'yes', _('Yes'))?>
</select>
<?if ($var['fsState'] != "Started"):?>
<span id="arraystopped"><i class="fa fa-warning icon warning"></i> <?=($dockercfg['DOCKER_ENABLED']=='yes') ? '_(Docker will be available after Array is Started)_' : '_(Apply to activate Docker after Array is Started)_'?></span>
<?elseif (!is_dir(dirname($dockercfg['DOCKER_IMAGE_FILE']??'')) || !is_dir($dockercfg['DOCKER_APP_CONFIG_PATH']??'')):?>
<?if (_var($var,'fsState')!="Started"):?>
<span id="arraystopped"><i class="fa fa-warning icon warning"></i> <?=(_var($dockercfg,'DOCKER_ENABLED')=='yes') ? '_(Docker will be available after Array is Started)_' : '_(Apply to activate Docker after Array is Started)_'?></span>
<?elseif (!is_dir(dirname(_var($dockercfg,'DOCKER_IMAGE_FILE'))) || !is_dir(_var($dockercfg,'DOCKER_APP_CONFIG_PATH'))):?>
<span class="basic"><i class="fa fa-warning icon warning"></i> _(One or more paths do not exist)_ (<a href="#" onclick="$('.advancedview').switchButton('option','checked',true); return false">_(view)_</a>)</span>
<?endif;?>
@@ -154,15 +154,15 @@ _(Enable Docker)_:
_(Enable container table readmore-js)_:
: <select id="DOCKER_READMORE" name="DOCKER_READMORE">
<?=mk_option($dockercfg['DOCKER_READMORE']??'', 'yes', _('Yes'))?>
<?=mk_option($dockercfg['DOCKER_READMORE']??'', 'no', _('No'))?>
<?=mk_option(_var($dockercfg,'DOCKER_READMORE'), 'yes', _('Yes'))?>
<?=mk_option(_var($dockercfg,'DOCKER_READMORE'), 'no', _('No'))?>
</select>
:docker_readmore_help:
_(Docker Stop Timeout)_:
: <input class='narrow' id="DOCKER_TIMEOUT" type="number" name="DOCKER_TIMEOUT" min='1' value="<?=$dockercfg['DOCKER_TIMEOUT']??''?>">_(seconds)_
: <input class='narrow' id="DOCKER_TIMEOUT" type="number" name="DOCKER_TIMEOUT" min='1' value="<?=_var($dockercfg,'DOCKER_TIMEOUT')?>">_(seconds)_
:docker_timeout_help:
@@ -170,24 +170,24 @@ _(Docker Stop Timeout)_:
_(Docker data-root)_:
: <select id="DOCKER_IMAGE_TYPE" name="DOCKER_IMAGE_TYPE" onchange="updateLocation(this.value)">
<?=mk_option($dockercfg['DOCKER_IMAGE_TYPE']??'', '', _('btrfs vDisk'))?>
<?=mk_option($dockercfg['DOCKER_IMAGE_TYPE']??'', 'xfs', _('xfs vDisk'))?>
<?=mk_option($dockercfg['DOCKER_IMAGE_TYPE']??'', 'folder', _('directory'))?>
<?=mk_option(_var($dockercfg,'DOCKER_IMAGE_TYPE'), '', _('btrfs vDisk'))?>
<?=mk_option(_var($dockercfg,'DOCKER_IMAGE_TYPE'), 'xfs', _('xfs vDisk'))?>
<?=mk_option(_var($dockercfg,'DOCKER_IMAGE_TYPE'), 'folder', _('directory'))?>
</select>
:docker_vdisk_type_help:
<div markdown="1" id="vdisk_file" style="display:none">
_(Docker vDisk size)_:
: <input id="DOCKER_IMAGE_SIZE" type="number" name="DOCKER_IMAGE_SIZE" value="<?=$dockercfg['DOCKER_IMAGE_SIZE']??''?>" class="narrow" required>GB<span id="SIZE_ERROR" class="errortext"></span>
: <input id="DOCKER_IMAGE_SIZE" type="number" name="DOCKER_IMAGE_SIZE" value="<?=_var($dockercfg,'DOCKER_IMAGE_SIZE')?>" class="narrow" required>GB<span id="SIZE_ERROR" class="errortext"></span>
:docker_vdisk_size_help:
_(Docker vDisk location)_:
: <input type="text" id="DOCKER_IMAGE_FILE1" name="DOCKER_IMAGE_FILE1" autocomplete="off" spellcheck="false" value="<?=$dockercfg['DOCKER_IMAGE_FILE']??''?>" placeholder="_(e.g.)_ /mnt/user/system/docker.img" data-pickcloseonfile="true" data-pickfilter="img" data-pickroot="/mnt" data-pickfolders="true" disabled required pattern="^[^\\]*(docker-xfs\.img|docker\.img)$">
: <input type="text" id="DOCKER_IMAGE_FILE1" name="DOCKER_IMAGE_FILE1" autocomplete="off" spellcheck="false" value="<?=_var($dockercfg,'DOCKER_IMAGE_FILE')?>" placeholder="_(e.g.)_ /mnt/user/system/docker.img" data-pickcloseonfile="true" data-pickfilter="img" data-pickroot="/mnt" data-pickfolders="true" disabled required pattern="^[^\\]*(docker-xfs\.img|docker\.img)$">
<span class="deleteLabel"><label><input type="checkbox" class="deleteCheckbox"> _(Delete vDisk file)_</label></span>
<?if ($var['fsState'] != "Started"):?><span><i class="fa fa-warning icon warning"></i> _(Modify with caution: unable to validate path until Array is Started)_</span>
<?elseif (!is_dir(dirname($dockercfg['DOCKER_IMAGE_FILE']??''))):?><span class="nonexist"><i class="fa fa-warning icon warning"></i> _(Path does not exist)_</span>
<?elseif (!is_dir(dirname(_var($dockercfg,'DOCKER_IMAGE_FILE')))):?><span class="nonexist"><i class="fa fa-warning icon warning"></i> _(Path does not exist)_</span>
<?endif;?><span id="IMAGE_ERROR1" class="errortext"></span>
:docker_vdisk_location_help:
@@ -195,20 +195,20 @@ _(Docker vDisk location)_:
</div>
<div markdown="1" id="vdisk_dir" style="display:none">
_(Docker directory)_:
: <input type="text" id="DOCKER_IMAGE_FILE2" name="DOCKER_IMAGE_FILE2" autocomplete="off" spellcheck="false" value="<?=$dockercfg['DOCKER_IMAGE_FILE']??''?>" placeholder="_(e.g.)_ /mnt/user/system/docker" data-pickcloseonfile="true" data-pickfilter="HIDE_FILES_FILTER" data-pickroot="/mnt" data-pickfolders="true" disabled required pattern="^[^\\]*/$">
: <input type="text" id="DOCKER_IMAGE_FILE2" name="DOCKER_IMAGE_FILE2" autocomplete="off" spellcheck="false" value="<?=_var($dockercfg,'DOCKER_IMAGE_FILE')?>" placeholder="_(e.g.)_ /mnt/user/system/docker" data-pickcloseonfile="true" data-pickfilter="HIDE_FILES_FILTER" data-pickroot="/mnt" data-pickfolders="true" disabled required pattern="^[^\\]*/$">
<span class="deleteLabel"><label><input type="checkbox" class="deleteCheckbox"> _(Delete directory)_</label></span>
<?if ($var['fsState'] != "Started"):?><span><i class="fa fa-warning icon warning"></i> _(Modify with caution: unable to validate path until Array is Started)_</span>
<?elseif (!is_dir(dirname($dockercfg['DOCKER_IMAGE_FILE']??''))):?><span class="nonexist"><i class="fa fa-warning icon warning"></i> _(Path does not exist)_</span>
<?elseif (!is_dir(dirname(_var($dockercfg,'DOCKER_IMAGE_FILE')))):?><span class="nonexist"><i class="fa fa-warning icon warning"></i> _(Path does not exist)_</span>
<?endif;?><span id="IMAGE_ERROR2" class="errortext"></span>
:docker_vdisk_directory_help:
</div>
_(Default appdata storage location)_:
: <input type="text" id="DOCKER_APP_CONFIG_PATH" name="DOCKER_APP_CONFIG_PATH" autocomplete="off" spellcheck="false" value="<?=$dockercfg['DOCKER_APP_CONFIG_PATH']??''?>" placeholder="_(e.g.)_ /mnt/user/appdata/" data-pickfilter="HIDE_FILES_FILTER" data-pickroot="<?=is_dir('/mnt/user')?'/mnt/user':'/mnt'?>" data-pickfolders="true" pattern="^[^\\]*/$">
: <input type="text" id="DOCKER_APP_CONFIG_PATH" name="DOCKER_APP_CONFIG_PATH" autocomplete="off" spellcheck="false" value="<?=_var($dockercfg,'DOCKER_APP_CONFIG_PATH')?>" placeholder="_(e.g.)_ /mnt/user/appdata/" data-pickfilter="HIDE_FILES_FILTER" data-pickroot="<?=is_dir('/mnt/user')?'/mnt/user':'/mnt'?>" data-pickfolders="true" pattern="^[^\\]*/$">
<?if ($var['fsState'] != "Started"):?>
<span><i class="fa fa-warning icon warning"></i> _(Modify with caution: unable to validate path until Array is Started)_</span>
<?elseif (!is_dir($dockercfg['DOCKER_APP_CONFIG_PATH']??'')):?>
<?elseif (!is_dir(_var($dockercfg,'DOCKER_APP_CONFIG_PATH'))):?>
<span class="nonexist"><i class="fa fa-warning icon warning"></i> _(Path does not exist)_</span>
<?endif;?>
@@ -217,8 +217,8 @@ _(Default appdata storage location)_:
<div markdown="1" class="advanced">
_(Docker LOG rotation)_:
: <select name="DOCKER_LOG_ROTATION" onchange="showLogOptions(this.value)">
<?=mk_option($dockercfg['DOCKER_LOG_ROTATION']??'', 'no', _('Disabled'))?>
<?=mk_option($dockercfg['DOCKER_LOG_ROTATION']??'', 'yes', _('Enabled'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_ROTATION'), 'no', _('Disabled'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_ROTATION'), 'yes', _('Enabled'))?>
</select>
:docker_log_rotation_help:
@@ -226,21 +226,21 @@ _(Docker LOG rotation)_:
<div markdown="1" id="DOCKER_LOG_OPTIONS" style="display:none">
_(Docker LOG maximum file size)_:
: <select name="DOCKER_LOG_SIZE">
<?=mk_option($dockercfg['DOCKER_LOG_SIZE']??'', '10m', '10 '._('MB'))?>
<?=mk_option($dockercfg['DOCKER_LOG_SIZE']??'', '20m', '20 '._('MB'))?>
<?=mk_option($dockercfg['DOCKER_LOG_SIZE']??'', '50m', '50 '._('MB'))?>
<?=mk_option($dockercfg['DOCKER_LOG_SIZE']??'', '100m', '100 '._('MB'))?>
<?=mk_option($dockercfg['DOCKER_LOG_SIZE']??'', '500m', '500 '._('MB'))?>
<?=mk_option($dockercfg['DOCKER_LOG_SIZE']??'', '1g', '1000 '._('MB'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_SIZE'), '10m', '10 '._('MB'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_SIZE'), '20m', '20 '._('MB'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_SIZE'), '50m', '50 '._('MB'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_SIZE'), '100m', '100 '._('MB'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_SIZE'), '500m', '500 '._('MB'))?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_SIZE'), '1g', '1000 '._('MB'))?>
</select>
:docker_log_file_size_help:
_(Docker LOG number of files)_:
: <select name="DOCKER_LOG_FILES">
<?=mk_option($dockercfg['DOCKER_LOG_FILES']??'', '1', '1')?>
<?=mk_option($dockercfg['DOCKER_LOG_FILES']??'', '2', '2')?>
<?=mk_option($dockercfg['DOCKER_LOG_FILES']??'', '3', '3')?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_FILES'), '1', '1')?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_FILES'), '2', '2')?>
<?=mk_option(_var($dockercfg,'DOCKER_LOG_FILES'), '3', '3')?>
</select>
:docker_log_file_number_help:
@@ -248,32 +248,32 @@ _(Docker LOG number of files)_:
</div>
_(Template Authoring Mode)_:
: <select id="DOCKER_AUTHORING_MODE" name="DOCKER_AUTHORING_MODE">
<?=mk_option($dockercfg['DOCKER_AUTHORING_MODE']??'', 'no', _('No'))?>
<?=mk_option($dockercfg['DOCKER_AUTHORING_MODE']??'', 'yes', _('Yes'))?>
<?=mk_option(_var($dockercfg,'DOCKER_AUTHORING_MODE'), 'no', _('No'))?>
<?=mk_option(_var($dockercfg,'DOCKER_AUTHORING_MODE'), 'yes', _('Yes'))?>
</select>
:docker_authoring_mode_help:
_(Docker custom network type)_:
: <select name="DOCKER_NETWORK_TYPE">
<?=mk_option($dockercfg['DOCKER_NETWORK_TYPE']??'', '1', _('ipvlan'))?>
<?=mk_option($dockercfg['DOCKER_NETWORK_TYPE']??'', '', _('macvlan'))?>
<?=mk_option(_var($dockercfg,'DOCKER_NETWORK_TYPE'), '1', _('ipvlan'))?>
<?=mk_option(_var($dockercfg,'DOCKER_NETWORK_TYPE'), '', _('macvlan'))?>
</select>&nbsp;_(Please read the Help carefully)_. _(Misconfiguration can cause problems)_.
:docker_custom_network_type_help:
_(Host access to custom networks)_:
: <select name="DOCKER_ALLOW_ACCESS">
<?=mk_option($dockercfg['DOCKER_ALLOW_ACCESS']??'', '', _('Disabled'))?>
<?=mk_option($dockercfg['DOCKER_ALLOW_ACCESS']??'', 'yes', _('Enabled'))?>
<?=mk_option(_var($dockercfg,'DOCKER_ALLOW_ACCESS'), '', _('Disabled'))?>
<?=mk_option(_var($dockercfg,'DOCKER_ALLOW_ACCESS'), 'yes', _('Enabled'))?>
</select>&nbsp;_(Make sure you understand what you are doing before enabling)_.
:docker_custom_network_access_help:
_(Preserve user defined networks)_:
: <select name="DOCKER_USER_NETWORKS">
<?=mk_option($dockercfg['DOCKER_USER_NETWORKS']??'', 'remove', _('No'))?>
<?=mk_option($dockercfg['DOCKER_USER_NETWORKS']??'', 'preserve', _('Yes'))?>
<?=mk_option(_var($dockercfg,'DOCKER_USER_NETWORKS'), 'remove', _('No'))?>
<?=mk_option(_var($dockercfg,'DOCKER_USER_NETWORKS'), 'preserve', _('Yes'))?>
</select>
:docker_user_defined_network_help:
@@ -285,13 +285,13 @@ $docker_auto = "DOCKER_AUTO_$net";
$docker_dhcp = "DOCKER_DHCP_$net";
?>
<input type="hidden" name="<?=$docker_auto?>" value="<?=$dockercfg[$docker_auto]??''?>">
<input type="hidden" name="<?=$docker_auto?>" value="<?=_var($dockercfg,$docker_auto)?>">
_(IPv4 custom network on interface)_ <?=$network?> (_(optional)_):
<?
$auto = ($dockercfg[$docker_auto]??'')!='no';
$auto = _var($dockercfg,$docker_auto)!='no';
$autoDisabled = $auto ? '':'disabled';
$dhcp = $dockercfg[$docker_dhcp] ?? false;
$dhcp = _var($dockercfg,$docker_dhcp);
$dhcpDisabled = ($auto && $dhcp) ? '':'disabled';
$net = base_min($route);
$max = base_max($route);
@@ -339,8 +339,8 @@ _(IPv4 custom network on interface)_ <?=$network?> (_(optional)_):
<?foreach ($unset as $network):?>
<?
$port = normalize($network);
[$subnet,$mask] = my_explode('/',$dockercfg["DOCKER_SUBNET_$port"]??'');
[$range,$size] = my_explode('/',$dockercfg["DOCKER_RANGE_$port"]??'');
[$subnet,$mask] = my_explode('/',_var($dockercfg,"DOCKER_SUBNET_$port"));
[$range,$size] = my_explode('/',_var($dockercfg,"DOCKER_RANGE_$port"));
$disabled = $subnet ? '':'disabled';
$dhcpDisabled = $range ? '':'disabled';
?>
@@ -352,7 +352,7 @@ _(IPv4 custom network on interface)_ <?=$network?> (_(optional)_):
<select id="DOCKER_CUSTOM_<?=$port?>_mask" name="DOCKER_MASK_<?=$port?>" class="mask"<?=$disabled?>>
<?for ($m=16; $m<=30; $m++) echo mk_option($mask?:24,$m,$m)?></select>
</span>
<span class="<?=$gw4class?>">**_(Gateway)_:** <input type="text" id="DOCKER_CUSTOM_<?=$port?>_gw" name="DOCKER_GATEWAY_<?=$port?>" class="ip4" value="<?=$dockercfg["DOCKER_GATEWAY_$port"]??''?>" title="_(IPv4 address A.B.C.D)_"<?=$disabled?>></span>
<span class="<?=$gw4class?>">**_(Gateway)_:** <input type="text" id="DOCKER_CUSTOM_<?=$port?>_gw" name="DOCKER_GATEWAY_<?=$port?>" class="ip4" value="<?=_var($dockercfg,"DOCKER_GATEWAY_$port")?>" title="_(IPv4 address A.B.C.D)_"<?=$disabled?>></span>
<input type="checkbox" id="DOCKER_CUSTOM_<?=$port?>_dhcp" onchange="customDHCP(this.id,4)"<?=$subnet?'checked':''?><?=$dhcpDisabled?>>
**_(DHCP pool)_:** <input type="text" id="DOCKER_CUSTOM_<?=$port?>_pool" name="DOCKER_RANGE_<?=$port?>" class="ip4" value="<?=$range?>" title="_(IPv4 address A.B.C.D)_"<?=$disabled?>>/
<select id="DOCKER_CUSTOM_<?=$port?>_size" name="DOCKER_SIZE_<?=$port?>" class="mask" onchange="changeHosts(this.id,this.value)"<?=$disabled?>>
@@ -377,9 +377,9 @@ $docker_dhcp6 = "DOCKER_DHCP6_$net";
_(IPv6 custom network on interface)_ <?=$network?> (_(optional)_):
<?
$auto6 = ($dockercfg[$docker_auto]??'')!='no';
$auto6 = _var($dockercfg,$docker_auto)!='no';
$auto6Disabled = $auto6 ? '':'disabled';
$dhcp6 = $dockercfg[$docker_dhcp6] ?? false;
$dhcp6 = _var($dockercfg,$docker_dhcp6);
$dhcp6Disabled = ($auto6 && $dhcp6) ? '':'disabled';
$net = base_net($route);
$mask = explode('/',$route)[1];
@@ -407,8 +407,8 @@ _(IPv6 custom network on interface)_ <?=$network?> (_(optional)_):
<?foreach ($unset as $network):?>
<?
$port = normalize($network);
[$subnet6,$mask6] = my_explode('/',$dockercfg["DOCKER_SUBNET6_$port"]??'');
[$range6,$size6] = my_explode('/',$dockercfg["DOCKER_RANGE6_$port"]??'');
[$subnet6,$mask6] = my_explode('/',_var($dockercfg,"DOCKER_SUBNET6_$port"));
[$range6,$size6] = my_explode('/',_var($dockercfg,"DOCKER_RANGE6_$port"));
$disabled = $subnet6 ? '':'disabled';
$dhcpDisabled = $range6 ? '':'disabled';
?>
@@ -419,7 +419,7 @@ _(IPv6 custom network on interface)_ <?=$network?> (_(optional)_):
<span class="ip6">**_(Subnet)_:**<input type="text" id="DOCKER_CUSTOM6_<?=$port?>_net" name="DOCKER_SUBNET6_<?=$port?>" class="ip6" value="<?=$subnet6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_"<?=$disabled?>>/
<select id="DOCKER_CUSTOM6_<?=$port?>_mask" name="DOCKER_MASK6_<?=$port?>" class="mask"<?=$disabled?>>
<?for ($m=64; $m<=120; $m+=8) echo mk_option($mask6?:64,$m,$m)?></select></span>
<span class="gw6">**_(Gateway)_:**<input type="text" id="DOCKER_CUSTOM6_<?=$port?>_gw" name="DOCKER_GATEWAY6_<?=$port?>" class="gw6" value="<?=$dockercfg["DOCKER_GATEWAY6_$port"]??''?>" title="_(IPv6 address nnnn:xxxx::yyyy)_"<?=$disabled?>></span>
<span class="gw6">**_(Gateway)_:**<input type="text" id="DOCKER_CUSTOM6_<?=$port?>_gw" name="DOCKER_GATEWAY6_<?=$port?>" class="gw6" value="<?=_var($dockercfg,"DOCKER_GATEWAY6_$port")?>" title="_(IPv6 address nnnn:xxxx::yyyy)_"<?=$disabled?>></span>
<input type="checkbox" id="DOCKER_CUSTOM6_<?=$port?>_dhcp" onchange="customDHCP(this.id,6)"<?=$subnet6?'checked':''?><?=$dhcpDisabled?>>
**_(DHCP pool)_:**<input type="text" id="DOCKER_CUSTOM6_<?=$port?>_pool" name="DOCKER_RANGE6_<?=$port?>" class="ip6" value="<?=$range6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_"<?=$disabled?>>/
<select id="DOCKER_CUSTOM6_<?=$port?>_size" name="DOCKER_SIZE6_<?=$port?>" class="mask"<?=$disabled?>>
@@ -439,39 +439,39 @@ _(Docker version)_:
:docker_version_help:
<?if ($dockercfg['DOCKER_IMAGE_TYPE']??''!='folder'):?>
<?if (_var($dockercfg,'DOCKER_IMAGE_TYPE')!='folder'):?>
_(Docker vDisk location)_:
: <?=$dockercfg['DOCKER_IMAGE_FILE']??''?>
: <?=_var($dockercfg,'DOCKER_IMAGE_FILE')?>
<?else:?>
_(Docker directory)_:
: <?=$dockercfg['DOCKER_IMAGE_FILE']??''?>
: <?=_var($dockercfg,'DOCKER_IMAGE_FILE')?>
<?endif;?>
:docker_vdisk_location_active_help:
_(Default appdata storage location)_:
: <?=$dockercfg['DOCKER_APP_CONFIG_PATH']??''?>
: <?=_var($dockercfg,'DOCKER_APP_CONFIG_PATH')?>
:docker_appdata_location_active_help:
<div markdown="1" class="advanced">
_(Docker LOG rotation)_:
: <?=$dockercfg['DOCKER_LOG_ROTATION']??''=='yes' ? _('Enabled') : _('Disabled')?>
: <?=_var($dockercfg,'DOCKER_LOG_ROTATION')=='yes' ? _('Enabled') : _('Disabled')?>
:docker_log_rotation_active_help:
_(Docker custom network type)_:
: <?=$dockercfg['DOCKER_NETWORK_TYPE']??''=='1' ? _('ipvlan') : _('macvlan')?>
: <?=_var($dockercfg,'DOCKER_NETWORK_TYPE')=='1' ? _('ipvlan') : _('macvlan')?>
:docker_custom_network_type_help:
_(Host access to custom networks)_:
: <?=$dockercfg['DOCKER_ALLOW_ACCESS']??''=='yes' ? _('Enabled') : _('Disabled')?>
: <?=_var($dockercfg,'DOCKER_ALLOW_ACCESS')=='yes' ? _('Enabled') : _('Disabled')?>
:docker_custom_network_access_help:
_(Preserve user defined networks)_:
: <?=$dockercfg['DOCKER_USER_NETWORKS']??''=='preserve' ? _('Yes') : _('No')?>
: <?=_var($dockercfg,'DOCKER_USER_NETWORKS')=='preserve' ? _('Yes') : _('No')?>
:docker_user_defined_network_help:
@@ -484,7 +484,7 @@ $docker_dhcp = "DOCKER_DHCP_$net";
_(IPv4 custom network on interface)_ <?=$network?>:
: <span class="<?=$gw4class?>">**_(Subnet)_:** <?=$route?></span>
<span class="<?=$gw4class?>">**_(Gateway)_:** <?=$gateway[$network]?></span>
**_(DHCP pool)_:** <?=$dockercfg[$docker_dhcp] ?? "_(not set)_"?><?if (isset($dockercfg[$docker_dhcp])):?>&nbsp;&nbsp;(<?=pow(2,32-explode('/',$dockercfg[$docker_dhcp])[1])?> _(hosts)_)<?endif;?>
**_(DHCP pool)_:** <?=_var($dockercfg,$docker_dhcp) ?: "_(not set)_"?><?if (isset($dockercfg[$docker_dhcp])):?>&nbsp;&nbsp;(<?=pow(2,32-my_explode('/',$dockercfg[$docker_dhcp])[1])?> _(hosts)_)<?endif;?>
<?endif;?>
<?endforeach;?>
@@ -494,19 +494,19 @@ $port = normalize($network);
[$eth,$vlan] = my_explode('.',$network);
$eth = str_replace(['bond','br'],'eth',$eth);
if (!$vlan) {
$protocol = $$eth['PROTOCOL:0'] ?? 'ipv4';
$protocol = _var($$eth,'PROTOCOL:0','ipv4');
} else {
foreach ($$eth as $key => $value) {
if (strpos($key,'VLANID')!==false && $value==$vlan) {$protocol = $$eth[str_replace('VLANID','PROTOCOL',$key)] ?? 'ipv4'; break;}
if (strpos($key,'VLANID')!==false && $value==$vlan) {$protocol = _var($$eth,str_replace('VLANID','PROTOCOL',$key),'ipv4'); break;}
}
}
[$subnet,$mask] = my_explode('/',$dockercfg["DOCKER_SUBNET_$port"]??'');
[$range,$size] = my_explode('/',$dockercfg["DOCKER_RANGE_$port"]??'');
[$subnet,$mask] = my_explode('/',_var($dockercfg,"DOCKER_SUBNET_$port"));
[$range,$size] = my_explode('/',_var($dockercfg,"DOCKER_RANGE_$port"));
?>
<?if ($protocol != 'ipv6' && $subnet):?>
_(IPv4 custom network on interface)_ <?=$network?>:
: <span class="<?=$gw4class?>">**_(Subnet)_:** <?=$subnet?>/<?=$mask?></span>
<span class="<?=$gw4class?>">**_(Gateway)_:** <?=$dockercfg["DOCKER_GATEWAY_$port"]??''?></span>
<span class="<?=$gw4class?>">**_(Gateway)_:** <?=_var($dockercfg,"DOCKER_GATEWAY_$port")?></span>
**_(DHCP pool)_:** <?=$range ? "$range/$size" : "_(not set)_"?><?if ($range):?>&nbsp;&nbsp;(<?=pow(2,32-($size?:25))?> _(hosts)_)<?endif;?>
<?endif;?>
@@ -520,7 +520,7 @@ if (isset($dockercfg[$docker_dhcp6]) || empty($dockercfg["DOCKER_AUTO_$net"])):?
_(IPv6 custom network on interface)_ <?=$network?>:
: <span class="gw6">**_(Subnet)_:** <?=$route?></span>
<span class="gw6">**_(Gateway)_:** <?=$gateway6[$network]?></span>
**_(DHCP pool)_:** <?=$dockercfg[$docker_dhcp6] ?? "_(not set)_"?>
**_(DHCP pool)_:** <?=_var($dockercfg,$docker_dhcp6) ?: "_(not set)_"?>
<?endif;?>
<?endforeach;?>
@@ -530,19 +530,19 @@ $port = normalize($network);
[$eth,$vlan] = my_explode('.',$network);
$eth = str_replace(['bond','br'],'eth',$eth);
if (!$vlan) {
$protocol = $$eth['PROTOCOL:0'] ?? 'ipv4';
$protocol = _var($$eth,'PROTOCOL:0','ipv4');
} else {
foreach ($$eth as $key => $value) {
if (strpos($key,'VLANID')!==false && $value==$vlan) {$protocol = $$eth[str_replace('VLANID','PROTOCOL',$key)] ?? 'ipv4'; break;}
if (strpos($key,'VLANID')!==false && $value==$vlan) {$protocol = _var($$eth,str_replace('VLANID','PROTOCOL',$key),'ipv4'); break;}
}
}
[$subnet6,$mask6] = my_explode('/',$dockercfg["DOCKER_SUBNET6_$port"]??'');
[$range6,$size6] = my_explode('/',$dockercfg["DOCKER_RANGE6_$port"]??'');
[$subnet6,$mask6] = my_explode('/',_var($dockercfg,"DOCKER_SUBNET6_$port"));
[$range6,$size6] = my_explode('/',_var($dockercfg,"DOCKER_RANGE6_$port"));
?>
<?if ($protocol != 'ipv4' && $subnet6):?>
_(IPv6 custom network on interface)_ <?=$network?>:
: <span class="gw6">**_(Subnet)_:** <?=$subnet6?>/<?=$mask6?></span>
<span class="gw6">**_(Gateway)_:** <?=$dockercfg["DOCKER_GATEWAY6_$port"]??''?></span>
<span class="gw6">**_(Gateway)_:** <?=_var($dockercfg,"DOCKER_GATEWAY6_$port")?></span>
**_(DHCP pool)_:** <?=$range6 ? "$range6/$size6" : "_(not set)_"?>
<?endif;?>
<?endforeach;?>
@@ -16,15 +16,15 @@ libxml_use_internal_errors(true); # Suppress any warnings from xml errors.
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
if (isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI']!='docker' && substr($_SERVER['REQUEST_URI'],0,7) != '/Docker') {
$_SERVER['REQUEST_URI'] = 'docker';
require_once "$docroot/webGui/include/Translations.php";
}
require_once "$docroot/plugins/dynamix.docker.manager/include/Helpers.php";
require_once "$docroot/webGui/include/Wrappers.php";
// add translations
if (_var($_SERVER,'REQUEST_URI')!='docker' && substr(_var($_SERVER,'REQUEST_URI'),0,7)!='/Docker') {
$_SERVER['REQUEST_URI'] = 'docker';
require_once "$docroot/webGui/include/Translations.php";
}
$dockerManPaths = [
'autostart-file' => "/var/lib/docker/unraid-autostart",
'update-status' => "/var/lib/docker/unraid-update-status.json",
@@ -49,7 +49,7 @@ $driver = DockerUtil::driver();
// Docker configuration file - guaranteed to exist
$docker_cfgfile = '/boot/config/docker.cfg';
$defaults = @parse_ini_file("$docroot/plugins/dynamix.docker.manager/default.cfg") ?: [];
$dockercfg = array_replace_recursive($defaults, parse_ini_file($docker_cfgfile));
$dockercfg = array_replace_recursive($defaults, @parse_ini_file($docker_cfgfile) ?: []);
function var_split($item, $i=0) {
return array_pad(explode(' ',$item),$i+1,'')[$i];
@@ -251,18 +251,18 @@ class DockerTemplates {
}
$TemplateRepository = DockerUtil::ensureImageTag($doc->getElementsByTagName('Repository')->item(0)->nodeValue??'');
if ($TemplateRepository && $TemplateRepository==$Repository) {
$TemplateField = $doc->getElementsByTagName($field)->item(0)->nodeValue ?? '';
$TemplateField = $doc->getElementsByTagName($field)->item(0)->nodeValue??'';
return trim($TemplateField);
}
}
return null;
}
public function getUserTemplate($Container) {
foreach ($this->getTemplates('user') as $file) {
$doc = new DOMDocument('1.0', 'utf-8');
$doc->load($file['path']);
$Name = $doc->getElementsByTagName('Name')->item(0)->nodeValue;
$Name = $doc->getElementsByTagName('Name')->item(0)->nodeValue??'';
if ($Name==$Container) return $file['path'];
}
return false;
@@ -271,13 +271,13 @@ class DockerTemplates {
private function getControlURL(&$ct, $myIP, $WebUI) {
global $host;
$port = &$ct['Ports'][0];
$myIP = $myIP ?: $this->getTemplateValue($ct['Image'], 'MyIP') ?: ($ct['NetworkMode']=='host'||$port['NAT'] ? $host : ($port['IP'] ?: DockerUtil::myIP($ct['Name'])));
$myIP = $myIP ?: $this->getTemplateValue($ct['Image'],'MyIP') ?: (_var($ct,'NetworkMode')=='host'||_var($port,'NAT') ? $host : (_var($port,'IP') ?: DockerUtil::myIP($ct['Name'])));
// Get the WebUI address from the templates as a fallback
$WebUI = preg_replace("%\[IP\]%", $myIP, $WebUI ?? $this->getTemplateValue($ct['Image'], 'WebUI'));
if (preg_match("%\[PORT:(\d+)\]%", $WebUI, $matches)) {
$ConfigPort = $matches[1];
$ConfigPort = $matches[1] ?? '';
foreach ($ct['Ports'] as $port) {
if ($port['NAT'] && $port['PrivatePort']==$ConfigPort) {$ConfigPort = $port['PublicPort']; break;}
if (_var($port,'NAT') && _var($port,'PrivatePort')==$ConfigPort) {$ConfigPort = _var($port,'PublicPort'); break;}
}
$WebUI = preg_replace("%\[PORT:\d+\]%", $ConfigPort, $WebUI);
}
@@ -290,14 +290,14 @@ class DockerTemplates {
$DockerUpdate = new DockerUpdate();
//$DockerUpdate->verbose = $this->verbose;
$info = DockerUtil::loadJSON($dockerManPaths['webui-info']);
$autoStart = array_map('var_split', @file($dockerManPaths['autostart-file'], FILE_IGNORE_NEW_LINES) ?: []);
$autoStart = array_map('var_split', @file($dockerManPaths['autostart-file'],FILE_IGNORE_NEW_LINES) ?: []);
foreach ($DockerClient->getDockerContainers() as $ct) {
$name = $ct['Name'];
$image = $ct['Image'];
$tmp = &$info[$name] ?? [];
$tmp['running'] = $ct['Running'];
$tmp['paused'] = $ct['Paused'];
$tmp['autostart'] = in_array($name, $autoStart);
$tmp['autostart'] = in_array($name,$autoStart);
$tmp['cpuset'] = $ct['CPUset'];
$tmp['url'] = $tmp['url'] ?? '';
// read docker label for WebUI & Icon
@@ -314,7 +314,7 @@ class DockerTemplates {
// non-templated webui, user specified
$tmp['url'] = $webui;
} else {
$ip = ($ct['NetworkMode']=='host'||($port['NAT']??false) ? $host : ($port['IP']??''));
$ip = ($ct['NetworkMode']=='host'||_var($port,'NAT')) ? $host : _var($port,'IP');
$tmp['url'] = $ip ? (strpos($tmp['url'],$ip)!==false ? $tmp['url'] : $this->getControlURL($ct, $ip, $tmp['url'])) : $tmp['url'];
}
$tmp['shell'] = $tmp['shell'] ?? $this->getTemplateValue($image, 'Shell');
@@ -347,7 +347,7 @@ class DockerTemplates {
$imageName = $contName ?: $name;
$iconRAM = sprintf('%s/%s-%s.png', $dockerManPaths['images-ram'], $contName, 'icon');
$icon = sprintf('%s/%s-%s.png', $dockerManPaths['images'], $contName, 'icon');
if (!is_dir(dirname($iconRAM))) mkdir(dirname($iconRAM), 0755, true);
if (!is_dir(dirname($icon))) mkdir(dirname($icon), 0755, true);
@@ -522,7 +522,7 @@ class DockerUpdate{
global $dockerManPaths;
$DockerClient = new DockerClient();
$updateStatus = DockerUtil::loadJSON($dockerManPaths['update-status']);
$images = $image ? [DockerUtil::ensureImageTag($image)] : array_map(function($ar){return $ar['Tags'][0];}, $DockerClient->getDockerImages());
$images = $image ? [DockerUtil::ensureImageTag($image)] : array_map(function($ar){return $ar['Tags'][0]??'';}, $DockerClient->getDockerImages());
foreach ($images as $img) {
$localVersion = null;
if (!empty($updateStatus[$img]) && array_key_exists('local', $updateStatus[$img])) {
@@ -562,7 +562,7 @@ class DockerUpdate{
public function updateUserTemplate($Container) {
// Don't update templates, but leave code in place for future reference
return;
$changed = false;
$DockerTemplates = new DockerTemplates();
$validElements = ['Support', 'Overview', 'Category', 'Project', 'Icon', 'ReadMe'];
@@ -709,7 +709,7 @@ class DockerClient {
}
public function getDockerJSON($url, $method='GET', &$code=null, $callback=null, $unchunk=false, $headers=null) {
$api = '/v1.37'; // used to force an API version. See https://docs.docker.com/develop/sdk/#api-version-matrix
$api = ''; // latest API version. See https://docs.docker.com/develop/sdk/#api-version-matrix
$fp = stream_socket_client('unix:///var/run/docker.sock', $errno, $errstr);
if ($fp === false) {
echo "Couldn't create socket: [$errno] $errstr";
@@ -747,7 +747,7 @@ class DockerClient {
public function doesImageExist($image) {
foreach ($this->getDockerImages() as $img) {
if (strpos($img['Tags'][0], $image)!==false) return true;
if (strpos($img['Tags'][0]??'', $image)!==false) return true;
}
return false;
}
@@ -781,7 +781,7 @@ class DockerClient {
public function stopContainer($id, $t=false) {
global $dockercfg;
$this->getDockerJSON("/containers/$id/stop?t=".($t?:$dockercfg['DOCKER_TIMEOUT']??10), 'POST', $code);
$this->getDockerJSON("/containers/$id/stop?t=".($t ?: _var($dockercfg,'DOCKER_TIMEOUT',10)), 'POST', $code);
$this->flushCache($this::$containersCache);
return $code;
}
@@ -867,7 +867,7 @@ class DockerClient {
}
[$ret['username'], $ret['password']] = array_pad(explode(':', base64_decode($dockerConfig['auths'][ $configKey ]['auth'])),2,'');
return $ret;
return $ret;
}
public function removeImage($id) {
@@ -928,7 +928,7 @@ class DockerClient {
$ports = (isset($ports) && is_array($ports)) ? $ports : [];
foreach ($ports as $port => $value) {
[$PrivatePort, $Type] = array_pad(explode('/', $port),2,'');
$c['Ports'][] = ['IP' => $ip, 'PrivatePort' => $PrivatePort, 'PublicPort' => $nat ? $value[0]['HostPort']:$PrivatePort, 'NAT' => $nat, 'Type' => $Type ];
$c['Ports'][] = ['IP' => $ip, 'PrivatePort' => $PrivatePort, 'PublicPort' => $nat ? $value[0]['HostPort'] : $PrivatePort, 'NAT' => $nat, 'Type' => $Type];
}
$this::$containersCache[] = $c;
}
@@ -1,7 +1,7 @@
<?PHP
/* Copyright 2005-2020, Lime Technology
* Copyright 2014-2020, Guilherme Jardim, Eric Schultz, Jon Panozzo.
* Copyright 2012-2020, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2014-2023, Guilherme Jardim, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -13,13 +13,14 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
// add translations
$_SERVER['REQUEST_URI'] = 'docker';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
require_once "$docroot/webGui/include/Helpers.php";
$DockerClient = new DockerClient();
$DockerTemplates = new DockerTemplates();
$containers = $DockerClient->getDockerContainers();
@@ -44,8 +45,8 @@ $allInfo = $DockerTemplates->getAllInfo();
$docker = [];
$null = '0.0.0.0';
$autostart = @file($autostart_file, FILE_IGNORE_NEW_LINES) ?: [];
$names = array_map('var_split', $autostart);
$autostart = @file($autostart_file,FILE_IGNORE_NEW_LINES) ?: [];
$names = array_map('var_split',$autostart);
function my_lang_time($text) {
[$number, $text] = my_explode(' ',$text,2);
@@ -75,7 +76,7 @@ foreach ($containers as $ct) {
$support = html_entity_decode($info['Support']??'');
$project = html_entity_decode($info['Project']??'');
$registry = html_entity_decode($info['registry']??'');
$donateLink = html_entity_decode($info['DonateLink']??'');
$donateLink = html_entity_decode($info['DonateLink']??'');
$readme = html_entity_decode($info['ReadMe']??'');
$menu = sprintf("onclick=\"addDockerContainerContext('%s','%s','%s',%s,%s,%s,%s,'%s','%s','%s','%s','%s','%s', '%s','%s')\"", addslashes($name), addslashes($ct['ImageId']), addslashes($template), $running, $paused, $updateStatus, $is_autostart, addslashes($webGui), $shell, $id, addslashes($support), addslashes($project),addslashes($registry),addslashes($donateLink),addslashes($readme));
$docker[] = "docker.push({name:'$name',id:'$id',state:$running,pause:$paused,update:$updateStatus});";
@@ -88,9 +89,9 @@ foreach ($containers as $ct) {
$wait = var_split($autostart[array_search($name,$names)]??'',1);
$ports = [];
foreach ($ct['Ports'] as $port) {
$intern = $running ? ($ct['NetworkMode']=='host' ? $host : $port['IP']) : $null;
$extern = $running ? ($port['NAT'] ? $host : $intern) : $null;
$ports[] = sprintf('%s:%s/%s<i class="fa fa-arrows-h" style="margin:0 6px"></i>%s:%s', $intern, $port['PrivatePort'], strtoupper($port['Type']), $extern, $port['PublicPort']);
$intern = $running ? ($ct['NetworkMode']=='host' ? $host : _var($port,'IP')) : $null;
$extern = $running ? (_var($port,'NAT') ? $host : $intern) : $null;
$ports[] = sprintf('%s:%s/%s<i class="fa fa-arrows-h" style="margin:0 6px"></i>%s:%s', $intern, _var($port,'PrivatePort'), strtoupper(_var($port,'Type')), $extern, _var($port,'PublicPort'));
}
$paths = [];
$ct['Volumes'] = is_array($ct['Volumes']) ? $ct['Volumes'] : [];
@@ -1,7 +1,7 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2014-2021, Guilherme Jardim, Eric Schultz, Jon Panozzo.
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2014-2023, Guilherme Jardim, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -13,57 +13,60 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Secure.php";
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
// add translations
$_SERVER['REQUEST_URI'] = 'docker';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Secure.php";
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
$DockerClient = new DockerClient();
$action = unscript($_REQUEST['action']??'');
$container = unbundle($_REQUEST['container']??'');
$name = unscript($_REQUEST['name']??'');
$image = unscript($_REQUEST['image']??'');
$action = unscript(_var($_REQUEST,'action'));
$container = unbundle(_var($_REQUEST,'container'));
$name = unscript(_var($_REQUEST,'name'));
$image = unscript(_var($_REQUEST,'image'));
$arrResponse = ['error' => _('Missing parameters')];
switch ($action) {
case 'start':
if ($container) $arrResponse = ['success' => $DockerClient->startContainer($container)];
break;
case 'pause':
if ($container) $arrResponse = ['success' => $DockerClient->pauseContainer($container)];
break;
case 'stop':
if ($container) $arrResponse = ['success' => $DockerClient->stopContainer($container)];
break;
case 'resume':
if ($container) $arrResponse = ['success' => $DockerClient->resumeContainer($container)];
break;
case 'restart':
if ($container) $arrResponse = ['success' => $DockerClient->restartContainer($container)];
break;
case 'remove_container':
if ($container) $arrResponse = ['success' => $DockerClient->removeContainer($name, $container, 1)];
break;
case 'remove_image':
if ($image) $arrResponse = ['success' => $DockerClient->removeImage($image)];
break;
case 'remove_all':
if ($container && $image) {
// first: try to remove container
$ret = $DockerClient->removeContainer($name, $container, 2);
if ($ret === true) {
// next: try to remove image
$arrResponse = ['success' => $DockerClient->removeImage($image)];
} else {
// error: container failed to remove
$arrResponse = ['success' => $ret];
}
case 'start':
if ($container) $arrResponse = ['success' => $DockerClient->startContainer($container)];
break;
case 'pause':
if ($container) $arrResponse = ['success' => $DockerClient->pauseContainer($container)];
break;
case 'stop':
if ($container) $arrResponse = ['success' => $DockerClient->stopContainer($container)];
break;
case 'resume':
if ($container) $arrResponse = ['success' => $DockerClient->resumeContainer($container)];
break;
case 'restart':
if ($container) $arrResponse = ['success' => $DockerClient->restartContainer($container)];
break;
case 'remove_container':
if ($container) $arrResponse = ['success' => $DockerClient->removeContainer($name, $container, 1)];
break;
case 'remove_image':
if ($image) $arrResponse = ['success' => $DockerClient->removeImage($image)];
break;
case 'remove_all':
if ($container && $image) {
// first: try to remove container
$ret = $DockerClient->removeContainer($name, $container, 2);
if ($ret === true) {
// next: try to remove image
$arrResponse = ['success' => $DockerClient->removeImage($image)];
} else {
// error: container failed to remove
$arrResponse = ['success' => $ret];
}
break;
default:
$arrResponse = ['error' => _('Unknown action')." '$action'"];
break;
}
break;
default:
$arrResponse = ['error' => _('Unknown action')." '$action'"];
break;
}
header('Content-Type: application/json');
@@ -111,14 +111,13 @@ function xmlToVar($xml) {
$c['Value'] = strlen(xml_decode($config)) ? xml_decode($config) : xml_decode($config['Default']);
foreach ($config->attributes() as $key => $value) {
$value = xml_decode($value);
$val = strtolower($value);
if ($key == 'Mode') {
switch (xml_decode($config['Type'])) {
case 'Path':
$value = ($val=='rw'||$val=='rw,slave'||$val=='rw,shared'||$val=='ro'||$val=='ro,slave'||$val=='ro,shared') ? $value : "rw";
$value = in_array(strtolower($value),['rw','rw,slave','rw,shared','ro','ro,slave','ro,shared']) ? $value : "rw";
break;
case 'Port':
$value = ($val=='tcp'||$val=='udp') ? $value : "tcp";
$value = in_array(strtolower($value),['tcp','udp']) ? $value : "tcp";
break;
}
}
@@ -2,6 +2,7 @@ var eventURL = '/plugins/dynamix.docker.manager/include/Events.php';
function addDockerContainerContext(container, image, template, started, paused, update, autostart, webui, shell, id, Support, Project, Registry, donateLink, ReadMe) {
var opts = [];
context.settings({right:false,above:false});
if (started && !paused) {
if (webui !== '' && webui != '#') opts.push({text:_('WebUI'), icon:'fa-globe', href:webui, target:'_blank'});
opts.push({text:_('Console'), icon:'fa-terminal', action:function(e){e.preventDefault(); openTerminal('docker',container,shell);}});
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -19,7 +19,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'docker';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$unit = ['B','kB','MB','GB','TB','PB','EB','ZB','YB'];
@@ -2,6 +2,7 @@
<?PHP
/* Copyright 2015-2023, Lime Technology
* Copyright 2015-2016, Guilherme Jardim, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -14,26 +15,25 @@
<?
$cfgfile = "/boot/config/docker.cfg";
$cfg_defaults = [
"DOCKER_ENABLED" => "no",
"DOCKER_IMAGE_FILE" => "/mnt/user/system/docker/docker.img",
"DOCKER_IMAGE_SIZE" => "20",
"DOCKER_APP_CONFIG_PATH" => "/mnt/user/appdata/",
"DOCKER_APP_UNRAID_PATH" => "",
"DOCKER_READMORE" => "yes"
"DOCKER_ENABLED" => "no",
"DOCKER_IMAGE_FILE" => "/mnt/user/system/docker/docker.img",
"DOCKER_IMAGE_SIZE" => "20",
"DOCKER_APP_CONFIG_PATH" => "/mnt/user/appdata/",
"DOCKER_APP_UNRAID_PATH" => "",
"DOCKER_READMORE" => "yes"
];
$cfg_new = $cfg_defaults;
if (file_exists($cfgfile)) {
$cfg_old = parse_ini_file($cfgfile);
if (!empty($cfg_old)) {
$cfg_new = array_merge($cfg_defaults, $cfg_old);
if (empty(array_diff($cfg_new, $cfg_old)))
unset($cfg_new);
}
$cfg_old = parse_ini_file($cfgfile);
if (!empty($cfg_old)) {
$cfg_new = array_merge($cfg_defaults, $cfg_old);
if (empty(array_diff($cfg_new, $cfg_old))) unset($cfg_new);
}
}
if (isset($cfg_new)) {
$tmp = '';
foreach ($cfg_new as $key => $value) $tmp .= "$key=\"$value\"\n";
file_put_contents($cfgfile, $tmp);
$tmp = '';
foreach ($cfg_new as $key => $value) $tmp .= "$key=\"$value\"\n";
file_put_contents($cfgfile, $tmp);
}
?>
@@ -1,7 +1,8 @@
#!/usr/bin/php
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2014-2022, Guilherme Jardim, Eric Schultz, Jon Panozzo.
/* Copyright 2005-2023, Lime Technology
* Copyright 2014-2023, Guilherme Jardim, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -15,18 +16,17 @@
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
$unraid = parse_plugin_cfg('dynamix', true);
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
extract(parse_plugin_cfg('dynamix', true));
// Multi-language support
$_SERVER['REQUEST_URI'] = "scripts";
$login_locale = $unraid['display']['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
exec("pgrep docker", $pid);
if (count($pid) == 1) exit(0);
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
$DockerClient = new DockerClient();
$DockerTemplates = new DockerTemplates();
@@ -44,19 +44,16 @@ if (!isset($check)) {
$DockerTemplates->getAllInfo(true);
echo " Done.";
} else {
require_once "$docroot/webGui/include/Wrappers.php";
$notify = "$docroot/webGui/scripts/notify";
$unraid = parse_plugin_cfg("dynamix",true);
$var = parse_ini_file("/var/local/emhttp/var.ini");
$server = strtoupper($var['NAME']);
$output = $unraid['notify']['docker_notify'];
$info = $DockerTemplates->getAllInfo(true);
$var = @parse_ini_file("/var/local/emhttp/var.ini") ?: [];
$server = strtoupper(_var($var,'NAME','tower'));
$output = _var($notify,'docker_notify');
$info = $DockerTemplates->getAllInfo(true);
foreach ($DockerClient->getDockerContainers() as $ct) {
$name = $ct['Name'];
$name = $ct['Name'];
$image = $ct['Image'];
if ($info[$name]['updated'] == "false") {
$updateStatus = (is_file($dockerManPaths['update-status'])) ? json_decode(file_get_contents($dockerManPaths['update-status']), TRUE) : [];
$updateStatus = is_file($dockerManPaths['update-status']) ? json_decode(file_get_contents($dockerManPaths['update-status']),true) : [];
$new = str_replace('sha256:', '', $updateStatus[$image]['remote']);
$new = substr($new, 0, 4).'..'.substr($new, -4, 4);
if ( ! isset($nonotify) ) {
@@ -1,32 +1,30 @@
#!/usr/bin/php
#!/usr/bin/php -q
<?PHP
function startsWith($haystack, $needle) {
if ( !is_string($haystack) || ! is_string($needle) ) return false;
return $needle === "" || strripos($haystack, $needle, -strlen($haystack)) !== FALSE;
if (!is_string($haystack) || !is_string($needle)) return false;
return $needle === "" || strripos($haystack, $needle, -strlen($haystack)) !== false;
}
$xmlFiles = glob("/boot/config/plugins/dockerMan/templates-user/*.xml");
foreach ($xmlFiles as $file) {
unset($changeFlag);
$xml = simplexml_load_file($file);
if ( ! $xml ) {
continue;
}
foreach ($xml->Config as $id => $config) {
if (startsWith((string)$config->attributes()->Description,"Container ".(string)$config->attributes()->Type)) {
$config->attributes()->Description = "";
$changeFlag = true;
}
}
if (isset($changeFlag)) {
copy($file,"$file.bak");
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());
file_put_contents($file,$dom->saveXML());
unset($changeFlag);
$xml = @simplexml_load_file($file);
if (!$xml) continue;
foreach ($xml->Config as $id => $config) {
if (startsWith((string)$config->attributes()->Description,"Container ".(string)$config->attributes()->Type)) {
$config->attributes()->Description = "";
$changeFlag = true;
}
}
if (isset($changeFlag)) {
copy($file,"$file.bak");
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());
file_put_contents($file,$dom->saveXML());
}
}
?>
@@ -19,7 +19,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = '';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
$var = parse_ini_file('/var/local/emhttp/var.ini');
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2020, Lime Technology
* Copyright 2012-2020, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,12 +12,15 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/webGui/include/Secure.php";
// add translations
$_SERVER['REQUEST_URI'] = 'plugins';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Secure.php";
exec("mv -f /boot/previous/* /boot");
$version = unscript($_GET['version']??'');
$version = unscript(_var($_GET,'version'));
file_put_contents("$docroot/plugins/unRAIDServer/README.md","**"._('DOWNGRADE TO VERSION')." $version**");
?>
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,18 +12,19 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'plugins';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
extract(parse_plugin_cfg('dynamix',true));
$valid = ['/var/tmp/','/tmp/plugins/'];
$good = false;
?>
<!DOCTYPE HTML>
<html <?=$display['rtl']?>lang="<?=strtok($locale,'_')?:'en'?>">
<html <?=_var($display,'rtl')?>lang="<?=strtok($locale,'_')?:'en'?>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -37,9 +38,9 @@ $good = false;
</head>
<body style="margin:14px 10px">
<?
if ($file = realpath(unscript($_GET['file']??''))) {
if ($file = realpath(unscript(_var($_GET,'file')))) {
foreach ($valid as $check) if (strncmp($file,$check,strlen($check))===0) $good = true;
if ($good && pathinfo($file)['extension']=='txt') echo Markdown(file_get_contents($file));
if ($good && pathinfo($file,PATHINFO_EXTENSION)=='txt') echo Markdown(file_get_contents($file));
} else {
echo Markdown("*"._('No release notes available')."!*");
}
@@ -12,19 +12,20 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = 'plugins';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/plugins/dynamix.plugin.manager/include/PluginHelpers.php";
$system = unscript($_GET['system']??'');
$branch = unscript($_GET['branch']??'');
$audit = unscript($_GET['audit']??'');
$check = unscript($_GET['check']??'');
$cmd = unscript($_GET['cmd']??'');
$init = unscript($_GET['init']??'');
// add translations
$_SERVER['REQUEST_URI'] = 'plugins';
require_once "$docroot/webGui/include/Translations.php";
$system = unscript(_var($_GET,'system'));
$branch = unscript(_var($_GET,'branch'));
$audit = unscript(_var($_GET,'audit'));
$check = unscript(_var($_GET,'check'));
$cmd = unscript(_var($_GET,'cmd'));
$init = unscript(_var($_GET,'init'));
$empty = true;
$install = false;
$updates = 0;
@@ -41,7 +42,7 @@ if ($cmd=='alert') {
if ($cmd=='pending') {
// prepare pending status for multi operations
foreach (explode('*',$_GET['plugin']) as $plugin) file_put_contents("/tmp/plugins/pluginPending/$plugin",'multi');
foreach (explode('*',_var($_GET,'plugin')) as $plugin) file_put_contents("/tmp/plugins/pluginPending/$plugin",'multi');
die();
}
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -15,12 +15,11 @@
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
// Get the webGui configuration preferences
extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'plugins';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$nchan = $argv[$argc-1] == 'nchan'; // console or nchan output
@@ -46,7 +45,7 @@ function write(...$messages){
}
write(_("Checking connectivity")." ...\n");
if (exec("wget --spider --no-check-certificate -nv -T10 -t1 https://www.msftncsi.com/ncsi.txt 2>&1|grep -o 'OK'")) {
if (exec("wget --spider --no-check-certificate -nv -T10 -t1 https://www.msftncsi.com/ncsi.txt 2>&1|grep -om1 'OK'")) {
$check = popen('plugin checkall','r');
while (!feof($check)) write(fgets($check));
pclose($check);
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -16,18 +16,23 @@ $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/plugins/dynamix.plugin.manager/include/PluginHelpers.php";
$var = parse_ini_file('/var/local/emhttp/var.ini');
$unraid = parse_plugin_cfg('dynamix', true);
extract(parse_plugin_cfg('dynamix', true));
// Multi-language support
$_SERVER['REQUEST_URI'] = "scripts";
$login_locale = $unraid['display']['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$var = @parse_ini_file('/var/local/emhttp/var.ini') ?: [];
function apos($text) {
// So that "&apos;" doesn't show up in email
return str_replace("&apos;","'",$text);
}
$server = strtoupper($var['NAME']);
$output = $unraid['notify']['language_notify'];
$notify = "$docroot/webGui/scripts/notify";
$output = _var($notify,'language_notify');
$script = "$docroot/webGui/scripts/notify";
$tmp = '/tmp/plugins';
$plugins = '/var/log/plugins';
@@ -37,13 +42,13 @@ foreach (glob("/$tmp/lang-*.xml", GLOB_NOSORT) as $file) {
$lang = language('LanguageLocal', $file);
$new = language('Version', $file);
$old = language('Version', "$plugins/$name");
// silently suppress bad download of XML file
if (strcmp($new, $old) > 0) {
// So that "&apos;" doesn't show up in email
$event = str_replace("&apos;","'",_("Language")." - $lang [$new]");
$subject = str_replace("&apos;","'",sprintf(_("Notice [%s] - Version update %s"),$server,$new));
$description = str_replace("&apos;","'",sprintf(_("A new version of %s is available"),$lang));
exec("$notify -e ".escapeshellarg($event)." -s ".escapeshellarg($subject)." -d ".escapeshellarg($description)." -i ".escapeshellarg("normal $output")." -l '/Apps' -x");
$event = apos(_("Language")." - $lang [$new]");
$subject = apos(sprintf(_("Notice [%s] - Version update %s"),$server,$new));
$description = apos(sprintf(_("A new version of %s is available"),$lang));
exec("$script -e ".escapeshellarg($event)." -s ".escapeshellarg($subject)." -d ".escapeshellarg($description)." -i ".escapeshellarg("normal $output")." -l '/Apps' -x");
}
}
exit(0);
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,8 +12,8 @@
*/
?>
<?
$method = $argv[1];
$plugins = explode('*',$argv[2]);
$method = $argv[1]??'';
$plugins = explode('*',$argv[2]??'');
$nchan = $argv[$argc-1] == 'nchan'; // console or nchan output
$call = ['plg' => 'plugin', 'xml' => 'language', '' => 'language'];
@@ -38,7 +38,7 @@ function write(...$messages){
}
foreach ($plugins as $plugin) {
if (!$plugin || (!$cmd = $call[pathinfo($plugin)['extension']])) continue;
if (!$plugin || (!$cmd = $call[pathinfo($plugin,PATHINFO_EXTENSION)])) continue;
$line = '';
$pluginArg = $method == "update" ? basename($plugin) : $plugin;
$run = popen("$cmd $method $pluginArg",'r');
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -17,23 +17,25 @@ $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/plugins/dynamix.plugin.manager/include/PluginHelpers.php";
$var = parse_ini_file('/var/local/emhttp/var.ini');
$unraid = parse_plugin_cfg('dynamix', true);
extract(parse_plugin_cfg('dynamix',true));
// Multi-language support
$_SERVER['REQUEST_URI'] = "scripts";
$login_locale = $unraid['display']['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$var = @parse_ini_file('/var/local/emhttp/var.ini') ?: [];
function apos($text) {
// So that "&apos;" doesn't show up in email
return str_replace("&apos;","'",$text);
}
$current = parse_ini_file('/etc/unraid-version');
$server = strtoupper($var['NAME']);
$output = $unraid['notify']['plugin'];
$server = strtoupper(_var($var,'NAME','tower'));
$output = _var($notify,'plugin');
$builtin = ['unRAIDServer','unRAIDServer-'];
$notify = "$docroot/webGui/scripts/notify";
$script = "$docroot/webGui/scripts/notify";
$tmp = '/tmp/plugins';
$plugins = '/var/log/plugins';
@@ -50,7 +52,7 @@ foreach (glob("/$tmp/*.plg", GLOB_NOSORT) as $file) {
$event = apos(_("Plugin")." - $name [$new]");
$subject = apos(sprintf(_("Notice [%s] - Version update %s"),$server,$new));
$description = apos(sprintf(_("A new version of %s is available"),$name));
exec("$notify -e ".escapeshellarg($event)." -s ".escapeshellarg($subject)." -d ".escapeshellarg($description)." -i ".escapeshellarg("normal $output")." -l '/Plugins' -x");
exec("$script -e ".escapeshellarg($event)." -s ".escapeshellarg($subject)." -d ".escapeshellarg($description)." -i ".escapeshellarg("normal $output")." -l '/Plugins' -x");
}
}
exit(0);
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -19,10 +19,10 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'plugins';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$file = realpath($argv[1] ?? '');
$file = realpath($argv[1]??'');
$valid = ['/var/tmp/','/tmp/plugins/'];
$good = false;
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2020, Lime Technology
* Copyright 2012-2020, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,32 +12,34 @@
*/
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/plugins/dynamix.plugin.manager/include/PluginHelpers.php";
// Multi-language support
if (!function_exists('_')) {
function _($text) {return $text;}
}
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/plugins/dynamix.plugin.manager/include/PluginHelpers.php";
extract(parse_plugin_cfg('dynamix', true));
$var = parse_ini_file('/var/local/emhttp/var.ini');
$current = parse_ini_file('/etc/unraid-version');
$unraid = parse_plugin_cfg('dynamix', true);
$notify = "$docroot/webGui/scripts/notify";
$server = strtoupper($var['NAME']);
$output = $unraid['notify']['plugin'];
$var = @parse_ini_file('/var/local/emhttp/var.ini') ?: [];
$script = "$docroot/webGui/scripts/notify";
$server = strtoupper(_var($var,'NAME','server'));
$output = _var($notify,'plugin');
$builtin = ['unRAIDServer'];
foreach ($builtin as $name) {
$plg = "$name.plg";
$plg = "$name.plg";
plugin('check',$plg);
$file = "/tmp/plugins/$plg";
$old = plugin('version', "/var/log/plugins/$plg");
$new = plugin('version', $file);
$old = plugin('version', "/var/log/plugins/$plg");
$new = plugin('version', $file);
// silently suppress bad download of PLG file
if (version_compare($new,$old,'>')) {
exec("$notify -e ".escapeshellarg("System - $name [$new]")." -s ".escapeshellarg("Notice [$server] - Version update $new")." -d ".escapeshellarg("A new version of $name is available")." -i ".escapeshellarg("normal $output")." -l '/Tools/Update' -x");
exec("$script -e ".escapeshellarg("System - $name [$new]")." -s ".escapeshellarg("Notice [$server] - Version update $new")." -d ".escapeshellarg("A new version of $name is available")." -i ".escapeshellarg("normal $output")." -l '/Tools/Update' -x");
}
}
exit(0);
+19 -19
View File
@@ -5,9 +5,9 @@ Cond="is_file('/var/run/libvirt/libvirtd.pid')"
Markdown="false"
---
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2015-2021, Derek Macias, Eric Schultz, Jon Panozzo.
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2015-2023, Derek Macias, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -19,6 +19,7 @@ Markdown="false"
?>
<?
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
$cpus = cpu_list();
$hover = in_array($theme,['white','azure']) ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.1)';
$bgcolor = in_array($theme,['white','azure']) ? '#f2f2f2' : '#1c1c1c';
@@ -56,10 +57,10 @@ function vsize($size,$expand=true) {
}
}
$uuid = unscript($_GET['uuid']??'');
$subaction = $_GET['subaction'] ?? false;
$uuid = unscript(_var($_GET,'uuid'));
$subaction = _var($_GET,'subaction');
if (isset($_GET['refresh'])) {
$vm = unscript($_GET['name']);
$vm = unscript(_var($_GET,'name'));
if ($lv->domain_is_active($vm)) {
echo "<meta http-equiv='refresh' content='5; url=/VMs?name=$vm&amp;refresh=true'>";
$msg = "Waiting for $vm to shutdown...";
@@ -78,7 +79,7 @@ if ($subaction) {
$msg = "Error: disk capacity has to be greater than {$_GET['oldcap']}";
}
} elseif ($subaction == 'disk-remove') {
$msg = $lv->domain_disk_remove($vm, $_GET['dev'])
$msg = $lv->domain_disk_remove($vm,_var($_GET,'dev'))
? "$vm disk has been removed"
: "Error: ".$lv->get_last_error();
} elseif ($subaction == 'snap-create') {
@@ -86,15 +87,15 @@ if ($subaction) {
? "Snapshot for $vm has been created"
: "Error: ".$lv->get_last_error();
} elseif ($subaction == 'snap-delete') {
$msg = $lv->domain_snapshot_delete($vm, $_GET['snap'])
$msg = $lv->domain_snapshot_delete($vm,_var($_GET,'snap'))
? "Snapshot for $vm has been deleted"
: "Error: ".$lv->get_last_error();
} elseif ($subaction == 'snap-revert') {
$msg = $lv->domain_snapshot_revert($vm, $_GET['snap'])
$msg = $lv->domain_snapshot_revert($vm,_var($_GET,'snap'))
? "$vm has been reverted"
: "Error: ".$lv->get_last_error();
} elseif ($subaction == 'snap-desc') {
$msg = $lv->snapshot_set_metadata($vm, $_GET['snap'], $_POST['snapdesc'])
$msg = $lv->snapshot_set_metadata($vm,_var($_GET,'snap'),_var($_POST,'snapdesc'))
? "Snapshot description for $vm has been saved"
: "Error: ".$lv->get_last_error();
}
@@ -146,7 +147,7 @@ div.template,div#dialogWindow,input#upload{display:none}
<script src="<?autov('/plugins/dynamix.vm.manager/javascript/vmmanager.js')?>"></script>
<script src="<?autov("/webGui/javascript/jquery.filetree.js")?>"></script>
<script>
<?if ($display['resize']):?>
<?if (_var($display,'resize')):?>
function resize(bind) {
var width = [];
var h = $('#kvm_list').height();
@@ -164,13 +165,13 @@ function resetSorting() {
$.post('/plugins/dynamix.vm.manager/include/UserPrefs.php',{reset:true},function(){loadlist();});
}
function changemedia(uuid,dev,bus,file) {
if (file === "--select") getisoimage(uuid,dev,bus,file) ;
if (file === "--select") getisoimage(uuid,dev,bus,file);
if (file === "--eject") ajaxVMDispatch({action:"change-media", uuid:uuid , cdrom:"" , dev:dev , bus:bus , file:file}, "loadlist");
}
function getisoimage(uuid,dev,bus,file){
var root = <?= '"'.$domain_cfg["MEDIADIR"].'"';?> ;
var match= ".iso" ;
var root = <?= '"'.$domain_cfg["MEDIADIR"].'"';?>;
var match= ".iso";
var box = $("#dialogWindow");
box.html($("#templateISO").html());
@@ -196,7 +197,7 @@ function getisoimage(uuid,dev,bus,file){
if (!target ) {errorTarget(); return;}
} else target = '';
box.find('#target').prop('disabled',true);
ajaxVMDispatch({action:"change-media", uuid:uuid , cdrom:"" , dev:dev , bus:bus , file:target}, "loadlist"); ;
ajaxVMDispatch({action:"change-media", uuid:uuid , cdrom:"" , dev:dev , bus:bus , file:target}, "loadlist");
box.dialog('close');
},
"_(Cancel)_": function(){
@@ -248,7 +249,7 @@ function loadlist() {
var data = d.split(/\0/);
$('#kvm_list').html(data[0]);
$('head').append('<script>'+data[1]+'<\/script>');
<?if ($display['resize']):?>
<?if (_var($display,'resize')):?>
resize();
$(window).bind('resize',function(){resize(true);});
<?endif;?>
@@ -272,7 +273,6 @@ function loadlist() {
$(this).prop('checked', data.autostart);
},'json');
});
context.init({preventDoubleContext:false,left:true,above:false});
$('div.spinner.fixed').hide('slow');
$('input[type=button]').prop('disabled',false).show('slow');
$('.text').click(showInput);
@@ -292,7 +292,7 @@ $(function() {
<div id="dialogWindow"></div>
<div markdown="1" id="templateISO" class="template">
<html <?=$display['rtl']?>lang="<?=strtok($locale,'_')?:'en'?>">
<html <?=_var($display,'rtl')?>lang="<?=strtok($locale,'_')?:'en'?>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -1,7 +1,7 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2015-2021, Derek Macias, Eric Schultz, Jon Panozzo.
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2015-2023, Derek Macias, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -13,14 +13,13 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = 'vms';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
$vms = $lv->get_domains();
if (empty($vms)) {
@@ -28,17 +27,18 @@ if (empty($vms)) {
return;
}
if (file_exists($user_prefs)) {
$prefs = parse_ini_file($user_prefs); $sort = [];
foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?? 999;
$prefs = @parse_ini_file($user_prefs) ?: [];
$sort = [];
foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?: 999;
array_multisort($sort,SORT_NUMERIC,$vms);
} else {
natcasesort($vms);
}
$i = 0;
$kvm = ['var kvm=[];'];
$show = explode(',',unscript($_GET['show']??''));
$path = $domain_cfg['MEDIADIR'] ;
$show = explode(',',unscript(_var($_GET,'show')));
$path = _var($domain_cfg,'MEDIADIR');
foreach ($vms as $vm) {
$res = $lv->get_domain_by_name($vm);
$desc = $lv->domain_get_description($res);
@@ -51,9 +51,9 @@ foreach ($vms as $vm) {
$image = substr($icon,-4)=='.png' ? "<img src='$icon' class='img'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
$arrConfig = domain_to_config($uuid);
if ($state == 'running') {
$mem = $dom['memory'] / 1024;
$mem = $dom['memory']/1024;
} else {
$mem = $lv->domain_get_memory($res) / 1024;
$mem = $lv->domain_get_memory($res)/1024;
}
$mem = round($mem).'M';
$vcpu = $dom['nrVirtCpu'];
@@ -74,13 +74,13 @@ foreach ($vms as $vm) {
$graphics = '';
if ($vmrcport > 0) {
$wsport = $lv->domain_get_ws_port($res);
$vmrcprotocol = $lv->domain_get_vmrc_protocol($res) ;
$vmrcurl = autov('/plugins/dynamix.vm.manager/'.$vmrcprotocol.'.html',true).'&autoconnect=true&host=' . $_SERVER['HTTP_HOST'] ;
if ($vmrcprotocol == "spice") $vmrcurl .= '&vmname='. urlencode($vm) .'&port=/wsproxy/' . $vmrcport . '/' ; else $vmrcurl .= '&port=&path=/wsproxy/' . $wsport . '/';
$vmrcprotocol = $lv->domain_get_vmrc_protocol($res);
$vmrcurl = autov('/plugins/dynamix.vm.manager/'.$vmrcprotocol.'.html',true).'&autoconnect=true&host='._var($_SERVER,'HTTP_HOST');
if ($vmrcprotocol == "spice") $vmrcurl .= '&vmname='. urlencode($vm) .'&port=/wsproxy/'.$vmrcport.'/'; else $vmrcurl .= '&port=&path=/wsproxy/'.$wsport.'/';
$graphics = strtoupper($vmrcprotocol).":".$vmrcport;
} elseif ($vmrcport == -1 || $autoport) {
$vmrcprotocol = $lv->domain_get_vmrc_protocol($res) ;
if ($autoport == "yes") $auto = "auto" ; else $auto="manual" ;
$vmrcprotocol = $lv->domain_get_vmrc_protocol($res);
if ($autoport == "yes") $auto = "auto"; else $auto="manual";
$graphics = strtoupper($vmrcprotocol).':'._($auto);
} elseif (!empty($arrConfig['gpu'])) {
$arrValidGPUDevices = getValidGPUDevices();
@@ -89,10 +89,10 @@ foreach ($vms as $vm) {
if ($arrGPU['id'] == $arrDev['id']) {
if (count(array_filter($arrValidGPUDevices, function($v) use ($arrDev) { return $v['name'] == $arrDev['name']; })) > 1) {
$graphics .= $arrDev['name'].' ('.$arrDev['id'].')'."\n";
$vmrcprotocol = "VGA" ;
$vmrcprotocol = "VGA";
} else {
$graphics .= $arrDev['name']."\n";
$vmrcprotocol = "VGA" ;
$vmrcprotocol = "VGA";
}
}
}
@@ -145,9 +145,9 @@ foreach ($vms as $vm) {
$disk = $arrDisk['file'] ?? $arrDisk['partition'];
$dev = $arrDisk['device'];
$bus = $arrValidDiskBuses[$arrDisk['bus']] ?? 'VirtIO';
$boot= $arrDisk["boot order"] ;
$serial = $arrDisk["serial"] ;
if ($boot < 1) $boot="Not set" ;
$boot= $arrDisk["boot order"];
$serial = $arrDisk["serial"];
if ($boot < 1) $boot="Not set";
echo "<tr><td>$disk</td><td>$serial</td><td>$bus</td>";
if ($state == 'shutoff') {
echo "<td title='Click to increase Disk Size'>";
@@ -173,17 +173,17 @@ foreach ($vms as $vm) {
$disk = $arrCD['file'] ?? $arrCD['partition'];
$dev = $arrCD['device'];
$bus = $arrValidDiskBuses[$arrCD['bus']] ?? 'VirtIO';
$boot= $arrCD["boot order"] ;
if ($boot < 1) $boot="Not set" ;
$boot= $arrCD["boot order"];
if ($boot < 1) $boot="Not set";
if ($disk != "" ) {
$title = _("Eject CD Drive").".";
$changemedia = "changemedia(\"{$uuid}\",\"{$dev}\",\"{$bus}\", \"--eject\")" ;
echo "<tr><td>$disk <a title='$title' href='#' onclick='$changemedia'> <i class='fa fa-eject' aria-hidden=true></i></a></td><td></td><td>$bus</td><td>$capacity</td><td>$allocation</td><td>$boot</td></tr>";
$changemedia = "changemedia(\"{$uuid}\",\"{$dev}\",\"{$bus}\", \"--eject\")";
echo "<tr><td>$disk <a title='$title' href='#' onclick='$changemedia'> <i class='fa fa-eject' aria-hidden=true></i></a></td><td></td><td>$bus</td><td>$capacity</td><td>$allocation</td><td>$boot</td></tr>";
} else {
$title = _("Insert CD").".";
$changemedia = "changemedia(\"{$uuid}\",\"{$dev}\",\"{$bus}\",\"--select\")" ;
$disk = _("No CD image inserted in to drive") ;
echo "<tr><td>$disk<a title='$title' href='#' onclick='$changemedia'> <i class='fa fa-bullseye' aria-hidden=true></i></a> </td><td></td><td>$bus</td><td>$capacity</td><td>$allocation</td><td>$boot</td></tr>";
$changemedia = "changemedia(\"{$uuid}\",\"{$dev}\",\"{$bus}\",\"--select\")";
$disk = _("No CD image inserted in to drive");
echo "<tr><td>$disk<a title='$title' href='#' onclick='$changemedia'> <i class='fa fa-bullseye' aria-hidden=true></i></a> </td><td></td><td>$bus</td><td>$capacity</td><td>$allocation</td><td>$boot</td></tr>";
}
@@ -191,21 +191,21 @@ foreach ($vms as $vm) {
/* Display VM IP Addresses "execute":"guest-network-get-interfaces" --pretty */
echo "<thead><tr><th><i class='fa fa-sitemap'></i> <b>"._('Interfaces')."</b></th><th></th><th></th><th>"._('Type')."</th><th>"._('IP Address')."</th><th>"._('Prefix')."</th></tr></thead>";
$gastate = getgastate($res) ;
$gastate = getgastate($res);
if ($gastate == "connected") {
$ip = $lv->domain_interface_addresses($res, 1) ;
$ip = $lv->domain_interface_addresses($res, 1);
if ($ip != false) {
$duplicates = []; // hide duplicate interface names
foreach ($ip as $arrIP) {
$ipname = $arrIP["name"] ;
$ipname = $arrIP["name"];
if (preg_match('/^(lo|Loopback)/',$ipname)) continue; // omit loopback interface
$iphdwadr = $arrIP["hwaddr"] == "" ? _("N/A") : $arrIP["hwaddr"] ;
$iplist = $arrIP["addrs"] ;
$iphdwadr = $arrIP["hwaddr"] == "" ? _("N/A") : $arrIP["hwaddr"];
$iplist = $arrIP["addrs"];
foreach ($iplist as $arraddr) {
$ipaddrval = $arraddr["addr"] ;
$ipaddrval = $arraddr["addr"];
if (preg_match('/^f[c-f]/',$ipaddrval)) continue; // omit ipv6 private addresses
$iptype = $arraddr["type"] ? "ipv6" : "ipv4" ;
$ipprefix = $arraddr["prefix"] ;
$iptype = $arraddr["type"] ? "ipv6" : "ipv4";
$ipprefix = $arraddr["prefix"];
$ipnamemac = "$ipname ($iphdwadr)";
if (!in_array($ipnamemac,$duplicates)) $duplicates[] = $ipnamemac; else $ipnamemac = "";
echo "<tr><td>$ipnamemac</td><td></td><td></td><td>$iptype</td><td>$ipaddrval</td><td>$ipprefix</td></tr>";
@@ -214,7 +214,7 @@ foreach ($vms as $vm) {
}
} else {
if ($gastate == "disconnected") echo "<tr><td>"._('Guest agent not installed')."</td><td></td><td></td><td></td></tr>";
else echo "<tr><td>"._('Guest not running')."</td><td></td><td></td><td></td><td></td></tr>" ;
else echo "<tr><td>"._('Guest not running')."</td><td></td><td></td><td></td><td></td></tr>";
}
echo "</tbody></table>";
echo "</td></tr>";
+27 -26
View File
@@ -1,7 +1,7 @@
<?PHP
/* Copyright 2005-2020, Lime Technology
* Copyright 2015-2020, Derek Macias, Eric Schultz, Jon Panozzo.
* Copyright 2012-2020, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2015-2023, Derek Macias, Eric Schultz, Jon Panozzo.
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -13,10 +13,10 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = 'vms';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
@@ -62,8 +62,8 @@ function embed(&$syslinux, $key, $value) {
}
$arrSizePrefix = [0 => '', 1 => 'K', 2 => 'M', 3 => 'G', 4 => 'T', 5 => 'P'];
$action = unscript($_REQUEST['action']??'');
$uuid = unscript($_REQUEST['uuid']??'');
$action = unscript(_var($_REQUEST,'action'));
$uuid = unscript(_var($_REQUEST,'uuid'));
$arrResponse = [];
if ($uuid) {
@@ -90,22 +90,22 @@ case 'domain-start':
: ['error' => $lv->get_last_error()];
break;
case 'domain-start-console':
requireLibvirt();
$arrResponse = $lv->domain_start($domName)
? ['success' => true, 'state' => $lv->domain_get_state($domName)]
: ['error' => $lv->get_last_error()];
$dom = $lv->get_domain_by_name($domName) ;
$vmrcport = $lv->domain_get_vnc_port($dom);
$wsport = $lv->domain_get_ws_port($dom);
$protocol = $lv->domain_get_vmrc_protocol($dom);
if ($vmrcport > 0) {
$vmrcurl = autov('/plugins/dynamix.vm.manager/'.$protocol.'.html',true).'&autoconnect=true&host=' . $_SERVER['HTTP_HOST'] ;
if ($protocol == "spice") $vmrcurl .= '&vmname='. urlencode($domName) .'&port=/wsproxy/'.$vmrcport.'/'; else $vmrcurl .= '&port=&path=/wsproxy/' . $wsport . '/';
}
$arrResponse['vmrcurl'] = $vmrcurl ;
break;
case 'domain-start-console':
requireLibvirt();
$arrResponse = $lv->domain_start($domName)
? ['success' => true, 'state' => $lv->domain_get_state($domName)]
: ['error' => $lv->get_last_error()];
$dom = $lv->get_domain_by_name($domName);
$vmrcport = $lv->domain_get_vnc_port($dom);
$wsport = $lv->domain_get_ws_port($dom);
$protocol = $lv->domain_get_vmrc_protocol($dom);
if ($vmrcport > 0) {
$vmrcurl = autov('/plugins/dynamix.vm.manager/'.$protocol.'.html',true).'&autoconnect=true&host='._var($_SERVER,'HTTP_HOST');
if ($protocol == "spice") $vmrcurl .= '&vmname='. urlencode($domName) .'&port=/wsproxy/'.$vmrcport.'/'; else $vmrcurl .= '&port=&path=/wsproxy/'.$wsport.'/';
}
$arrResponse['vmrcurl'] = $vmrcurl;
break;
case 'domain-pause':
requireLibvirt();
$arrResponse = $lv->domain_suspend($domName)
@@ -216,13 +216,13 @@ case 'cdrom-change':
case 'change-media':
requireLibvirt();
$dev= $_REQUEST['dev'] ;
$file= $_REQUEST['file'] ;
$cmdstr = "virsh change-media '$domName' $dev $file" ;
$dev= $_REQUEST['dev'];
$file= $_REQUEST['file'];
$cmdstr = "virsh change-media '$domName' $dev $file";
$rtn=shell_exec($cmdstr)
? ['success' => true]
: ['error' => "Change Media Failed"];
break;
break;
case 'memory-change':
requireLibvirt();
@@ -616,6 +616,7 @@ case 'virtio-win-iso-remove':
$arrResponse = ['success' => true];
}
break;
default:
$arrResponse = ['error' => _('Unknown action')." '$action'"];
break;
@@ -48,6 +48,7 @@ function addVMContext(name, uuid, template, state, vmrcurl,vmrcprotocol , log){
}});
opts.push({divider:true});
}
context.settings({right:false,above:false});
if (state == "running") {
opts.push({text:_("Stop"), icon:"fa-stop", action:function(e) {
e.preventDefault();
@@ -14,28 +14,27 @@
<?
$cfgfile = "/boot/config/domain.cfg";
$cfg_defaults = [
"SERVICE" => "disable",
"IMAGE_FILE" => "/mnt/user/system/libvirt/libvirt.img",
"IMAGE_SIZE" => "1",
"DEBUG" => "no",
"DOMAINDIR" => "/mnt/user/domains/",
"MEDIADIR" => "/mnt/user/isos/",
"VIRTIOISO" => "",
"BRNAME" => "br0",
"VMSTORAGEMODE" => "auto"
"SERVICE" => "disable",
"IMAGE_FILE" => "/mnt/user/system/libvirt/libvirt.img",
"IMAGE_SIZE" => "1",
"DEBUG" => "no",
"DOMAINDIR" => "/mnt/user/domains/",
"MEDIADIR" => "/mnt/user/isos/",
"VIRTIOISO" => "",
"BRNAME" => "br0",
"VMSTORAGEMODE" => "auto"
];
$cfg_new = $cfg_defaults;
if (file_exists($cfgfile)) {
$cfg_old = parse_ini_file($cfgfile);
if (!empty($cfg_old)) {
$cfg_new = array_merge($cfg_defaults, $cfg_old);
if (empty(array_diff($cfg_new, $cfg_old)))
unset($cfg_new);
}
$cfg_old = parse_ini_file($cfgfile);
if (!empty($cfg_old)) {
$cfg_new = array_merge($cfg_defaults, $cfg_old);
if (empty(array_diff($cfg_new, $cfg_old))) unset($cfg_new);
}
}
if (isset($cfg_new)) {
foreach ($cfg_new as $key => $value) $tmp .= "$key=\"$value\"\n";
file_put_contents($cfgfile, $tmp);
foreach ($cfg_new as $key => $value) $tmp .= "$key=\"$value\"\n";
file_put_contents($cfgfile, $tmp);
}
?>
+20 -22
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
#!/usr/bin/php -q
<?PHP
if (!isset($argv[1])) {
exit(0);
exit(0);
}
# We simply use this script to replace any arguments containing a user share path (e.g. /mnt/user/domains/) with the real backing disk (e.g. /mnt/disk1/domains/).
@@ -12,31 +12,29 @@ if (!isset($argv[1])) {
# -blockdev '{"driver":"file","filename":"/mnt/user/domains/win2012r2/win2012r2.qcow2","node-name":"libvirt-2-storage","cache":{"direct":false,"no-flush":false},"auto-read-only":true,"discard":"unmap"}'
function detect_user_share(&$arg) {
$arg = preg_replace_callback('|(/mnt/user/[^,"]+\.[^,"\s]*)|', function($match) {
if (is_file($match[0])) {
// resolve the actual disk or cache backing device for this user share path
$realdisk = trim(shell_exec("getfattr --absolute-names --only-values -n system.LOCATION ".escapeshellarg($match[0])." 2>/dev/null"));
if (!empty($realdisk)) {
$replacement = str_replace('/mnt/user/', "/mnt/$realdisk/", $match[0]);
if (is_file($replacement)) {
// the replacement path (e.g. /mnt/disk1/domains/vmname/vdisk1.img) checks out so use it
return $replacement;
}
}
}
return $match[0];
}, $arg);
};
$arg = preg_replace_callback('|(/mnt/user/[^,"]+\.[^,"\s]*)|', function($match) {
if (is_file($match[0])) {
// resolve the actual disk or cache backing device for this user share path
$realdisk = trim(shell_exec("getfattr --absolute-names --only-values -n system.LOCATION ".escapeshellarg($match[0])." 2>/dev/null"));
if (!empty($realdisk)) {
$replacement = str_replace('/mnt/user/', "/mnt/$realdisk/", $match[0]);
if (is_file($replacement)) {
// the replacement path (e.g. /mnt/disk1/domains/vmname/vdisk1.img) checks out so use it
return $replacement;
}
}
}
return $match[0];
}, $arg);
}
array_shift($argv);
array_walk($argv, 'detect_user_share');
$whole_cmd = '';
foreach ($argv as $arg) {
$whole_cmd .= escapeshellarg($arg).' ';
$whole_cmd .= escapeshellarg($arg).' ';
}
echo trim($whole_cmd);
?>
+6 -6
View File
@@ -3,8 +3,8 @@ Title="Array Devices"
Tag="database"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -55,7 +55,7 @@ function toggle_diskio(init) {
display_diskio();
}
<?if ($var['fsState']=='Started'):?>
<?if (_var($var,'fsState')=="Started"):?>
$('#tab1').bind({click:function() {$('i.toggle').show('slow');}});
<?endif;?>
</script>
@@ -65,17 +65,17 @@ $('#tab1').bind({click:function() {$('i.toggle').show('slow');}});
<tbody id="array_devices">
<?
foreach ($disks as $disk):
if ($disk['type']=='Parity' or $disk['type']=='Data')
if (_var($disk,'type')=='Parity' or _var($disk,'type')=='Data')
echo "<tr><td colspan='11'>&nbsp;</td></tr>";
endforeach;
if ($display['total']) echo "<tr class='tr_last'><td colspan='11'>&nbsp;</td></tr>";
if (_var($display,'total')) echo "<tr class='tr_last'><td colspan='11'>&nbsp;</td></tr>";
?>
</tbody>
</table>
:main_array_devices_help:
<?if ($var['fsState'] == "Stopped"):?>
<?if (_var($var,'fsState')=="Stopped"):?>
<div></div>
:main_slots_help:
<?endif;?>
+67 -67
View File
@@ -16,21 +16,21 @@ Nchan="device_list,disk_load,parity_list"
*/
?>
<?
$keyfile = file_exists($var['luksKeyfile']);
$keyfile = file_exists(_var($var,'luksKeyfile'));
$missing = file_exists('/var/tmp/missing.tmp');
$encrypt = false;
$spot = $var['mdResyncPos']>0;
$spot = _var($var,'mdResyncPos',0)>0;
/* only one of $present, $missing, or $wrong will be true, or all will be false */
$forced = $present = $wrong = false;
foreach ($disks as $disk) {
if (!isset($disk['fsType'])) continue;
if (strpos($disk['fsType'],'luks:')!==false || ($disk['fsType']=='auto' && (strpos($var['defaultFsType'],'luks:')!==false || $disk['luksState']==2 || $disk['luksState']==3))) {
if (strpos(_var($disk,'fsType'),'luks:')!==false || (_var($disk,'fsType')=='auto' && (strpos(_var($var,'defaultFsType'),'luks:')!==false || _var($disk,'luksState',0)==2 || _var($disk,'luksState',0)==3))) {
$encrypt = true;
if ($disk['luksState']==0) $forced = true;
if ($disk['luksState']==1) $present = true;
if ($disk['luksState']==2) $missing = true;
if ($disk['luksState']==3) $wrong = true;
if (_var($disk,'luksState',0)==0) $forced = true;
if (_var($disk,'luksState',0)==1) $present = true;
if (_var($disk,'luksState',0)==2) $missing = true;
if (_var($disk,'luksState',0)==3) $wrong = true;
}
}
if ($forced && ($present || $missing || $wrong)) $forced = false;
@@ -60,7 +60,7 @@ function maintenance_mode() {
}
function status_indicator() {
global $var;
switch ($var['mdColor']) {
switch (_var($var,'mdColor')) {
case 'green-on': $orb = 'circle'; $color = 'green'; $help =_('Started, array protected'); break;
case 'green-blink': $orb = 'circle'; $color = 'grey'; $help = _('Stopped'); break;
case 'yellow-on': $orb = 'warning'; $color = 'yellow'; $help = _('Started, array unprotected'); break;
@@ -71,7 +71,7 @@ function status_indicator() {
function missing_cache() {
global $disks;
$missing = false;
foreach (cache_filter($disks) as $disk) $missing |= (strpos($disk['status']??'','_MISSING')!==false);
foreach (cache_filter($disks) as $disk) $missing |= (strpos(_var($disk,'status'),'_MISSING')!==false);
return $missing;
}
function resync($d) {
@@ -183,7 +183,7 @@ function prepareInput(form) {
}
function parityWarning(form) {
if (form.md_invalidslot.checked) {
<?if (strpos($disks['parity2']['status'],'_NP')===false):?>
<?if (strpos(_var($disks['parity2'],'status'),'_NP')===false):?>
var text = "_(*Dual parity* valid requires **ALL** disks in their original slots)_";
<?else:?>
var text = "_(*Parity valid* requires **ALL** disks to have their original content)_";
@@ -255,18 +255,18 @@ $('div[class=title]:not(":last, .disable_diskio")').each(function(){$(this).appe
$('.tooltip_diskio').tooltipster({delay:100,trigger:'custom',triggerOpen:{mouseenter:true},triggerClose:{click:false,scroll:true,mouseleave:true}});
toggle_diskio(true);
<?if ($var['fsState']=='Started'):?>
<?if (_var($var,'fsState')=='Started'):?>
var mymonitor = new NchanSubscriber('/sub/mymonitor',{subscriber:'websocket'});
mymonitor.on('message', function(state) {
switch (state) {
case '0': // normal operation
$('#stop-button').prop('disabled',false);
$('#stop-text').html("");
<?if ($var['fsState']!="Stopped"):?>
<?if (_var($var,'fsState')!="Stopped"):?>
$('#spinup-button').prop('disabled',false);
$('#spindown-button').prop('disabled',false);
<?endif;?>
<?if ($var['shareUser']=='e' && $pool_devices):?>
<?if (_var($var,'shareUser')=='e' && $pool_devices):?>
$('#mover-button').prop('disabled',false);
$('#mover-text').html("<b>_(Move)_</b> _(will immediately invoke the Mover)_.&nbsp;<a href=\"/Main/Settings/Scheduler\"<?if($tabbed):?> onclick=\"$.cookie('one','tab2')\"<?endif;?>>(_(Schedule)_)</a>");
<?endif;?>
@@ -274,11 +274,11 @@ mymonitor.on('message', function(state) {
case '1': // parity running
$('#stop-button').prop('disabled',true);
$('#stop-text').html("<br><small>_(Disabled)_ -- _(Parity operation is running)_</small>");
<?if ($var['fsState']!="Stopped" && $var['mdResync']>0):?>
<?if (_var($var,'fsState')!="Stopped" && _var($var,'mdResync',0)>0):?>
$('#spinup-button').prop('disabled',true);
$('#spindown-button').prop('disabled',true);
<?endif;?>
<?if ($var['shareUser']=='e' && $pool_devices):?>
<?if (_var($var,'shareUser')=='e' && $pool_devices):?>
$('#mover-button').prop('disabled',true);
$('#mover-text').html("_(Disabled)_ -- _(Parity operation is running)_");
<?endif;?>
@@ -286,7 +286,7 @@ mymonitor.on('message', function(state) {
case '2': // mover running
$('#stop-button').prop('disabled',true);
$('#stop-text').html("<br><small>_(Disabled)_ -- _(Mover is running)_</small>");
<?if ($var['shareUser']=='e' && $pool_devices):?>
<?if (_var($var,'shareUser')=='e' && $pool_devices):?>
$('#mover-button').prop('disabled',true);
$('#mover-text').html("_(Disabled)_ - _(Mover is running)_.");
<?endif;?>
@@ -294,7 +294,7 @@ mymonitor.on('message', function(state) {
case '3': // btrfs running
$('#stop-button').prop('disabled',true);
$('#stop-text').html("<br><small>_(Disabled)_ -- _(BTRFS operation is running)_</small>");
<?if ($var['shareUser']=='e' && $pool_devices):?>
<?if (_var($var,'shareUser')=='e' && $pool_devices):?>
$('#mover-button').prop('disabled',true);
$('#mover-text').html("_(Disabled)_ -- _(BTRFS operation is running)_");
<?endif;?>
@@ -325,7 +325,7 @@ devices.on('message', function(msg,meta) {
display_diskio();
// stop updating when array is stopped
if (stopped==1) {
<?if ($var['fsState']=='Started'):?>
<?if (_var($var,'fsState')=='Started'):?>
setTimeout(refresh,0);
<?else:?>
if (!timers.stopped) timers.stopped = setTimeout(function(){devices.stop(); arraymonitor.start();},1000);
@@ -356,7 +356,7 @@ devices.on('message', function(msg,meta) {
});
devices.start();
<?if (substr($var['fsState'],-3)=='ing'):?>
<?if (substr(_var($var,'fsState'),-3)=='ing'):?>
var fsState = new NchanSubscriber('/sub/fsState',{subscriber:'websocket'});
fsState.on('message', function(msg) {
switch (msg) {
@@ -397,28 +397,28 @@ function formatWarning(val) {
}
</script>
<form name="arrayOps" method="POST" action="/update.htm" target="progressFrame">
<input type="hidden" name="startState" value="<?=htmlspecialchars($var['mdState'])?>">
<input type="hidden" name="startState" value="<?=htmlspecialchars(_var($var,'mdState'))?>">
<input type="hidden" name="file" value="">
<table markdown="1" class="array_status">
<?switch ($var['fsState']):
<?switch (_var($var,'fsState')):
case "Started":?>
<tr><td><?status_indicator()?>**_(Started)_<?=(($var['startMode']=='Maintenance')?' - _(Maintenance Mode)_':'')?>**</td>
<tr><td><?status_indicator()?>**_(Started)_<?=((_var($var,'startMode')=='Maintenance')?' - _(Maintenance Mode)_':'')?>**</td>
<td><input type="button" id="stop-button" value="_(Stop)_" onclick="stopArray(this.form)"></td>
<td>**_(Stop)_** _(will take the array off-line)_.<span id="stop-text"></span></td></tr>
<? if ($var['fsNumUnmountable']>0):?>
<tr><td>**<?=_('Unmountable disk'.($var['fsNumUnmountable']==1?'':'s').' present')?>:**<br>
<? if (_var($var,'fsNumUnmountable',0)>0):?>
<tr><td>**<?=_('Unmountable disk'.(_var($var,'fsNumUnmountable',0)==1?'':'s').' present')?>:**<br>
<? $cache = [];
foreach ($disks as $disk) if (substr($disk['fsStatus']??'',0,11)=='Unmountable' || in_array(prefix($disk['name']),$cache)) {
if (strlen($disk['id'])) echo "<span class='blue-text'>".my_disk($disk['name'])."</span> &bullet; ".my_id($disk['id'])." (".$disk['device'].")<br>";
if (in_array($disk['name'],$pools)) $cache[] = $disk['name'];
foreach ($disks as $disk) if (substr(_var($disk,'fsStatus'),0,11)=='Unmountable' || in_array(prefix(_var($disk,'name')),$cache)) {
if (strlen(_var($disk,'id'))) echo "<span class='blue-text'>".my_disk(_var($disk,'name'))."</span> &bullet; ".my_id(_var($disk,'id'))." ("._var($disk,'device').")<br>";
if (in_array(_var($disk,'name'),$pools)) $cache[] = $disk['name'];
}
?> </td><td><input type="submit" id="btnFormat" name="cmdFormat" value="_(Format)_" disabled><input type="hidden" name="unmountable_mask" value="<?=$var['fsUnmountableMask']?>"></td>
?> </td><td><input type="submit" id="btnFormat" name="cmdFormat" value="_(Format)_" disabled><input type="hidden" name="unmountable_mask" value="<?=_var($var,'fsUnmountableMask')?>"></td>
<td>**_(Format)_** _(will create a file system in all **Unmountable** disks)_.<br>
<a class="info none img nohand"><input type="checkbox" name="confirmFormat" value="OFF" onclick="formatWarning(this.checked),$('#btnFormat').prop('disabled',!arrayOps.confirmFormat.checked)">
<small>_(Yes, I want to do this)_</small></a>
</td></tr>
<? endif;
$action = preg_split('/\s+/',$var['mdResyncAction']);
$action = preg_split('/\s+/',_var($var,'mdResyncAction'));
if (!$spot):
if ($action[0]=="recon"):
$resync = resync($action[1]);
@@ -434,11 +434,11 @@ function formatWarning(val) {
<? endif;?>
<tr><td></td><td><input type="button" value="_(History)_" onclick="parityHistory()"></td>
<? [$date,$duration,$speed,$status,$error,$action,$size] = last_parity_log();
if ($var['sbSyncExit']!=0):?>
<td class="wrap"><?=sprintf(_('Last check incomplete on **%s**'),_(my_time($var['sbSynced2']).day_count($var['sbSynced2']),0))?><?if ($var['sbSynced2']):?>
<br><i class="fa fa-fw fa-dot-circle-o"></i> _(Error code)_: <?=my_error($var['sbSyncExit'])?>
<br><i class="fa fa-fw fa-search"></i> <?=print_error($var['sbSyncErrs'])?><?endif;?></td></tr>
<? elseif ($var['sbSynced']==0):
if (_var($var,'sbSyncExit',0)!=0):?>
<td class="wrap"><?=sprintf(_('Last check incomplete on **%s**'),_(my_time(_var($var,'sbSynced2',0)).day_count(_var($var,'sbSynced2',0)),0))?><?if (_var($var,'sbSynced2')):?>
<br><i class="fa fa-fw fa-dot-circle-o"></i> _(Error code)_: <?=my_error(_var($var,'sbSyncExit'))?>
<br><i class="fa fa-fw fa-search"></i> <?=print_error(_var($var,'sbSyncErrs',0))?><?endif;?></td></tr>
<? elseif (_var($var,'sbSynced',0)==0):
if ($status==0):?>
<td class="wrap"><?=sprintf(_('Last checked on **%s**'),_(my_time($date).day_count($date),0))?>
<br><i class="fa fa-fw fa-clock-o"></i> _(Duration)_: <?=my_check($duration,$speed)?>
@@ -448,52 +448,52 @@ function formatWarning(val) {
<br><i class="fa fa-fw fa-dot-circle-o"></i> _(Error code)_: <?=my_error($status)?>
<br><i class="fa fa-fw fa-search"></i> <?=print_error($error)?></td></tr>
<? endif;
elseif ($var['sbSynced2']==0):
elseif (_var($var,'sbSynced2',0)==0):
if ($status==0):?>
<td class="wrap"><?=sprintf(_('Last checked on **%s**'),_(my_time($var['sbSynced']).day_count($var['sbSynced']),0))?>
<td class="wrap"><?=sprintf(_('Last checked on **%s**'),_(my_time(_var($var,'sbSynced',0)).day_count(_var($var,'sbSynced',0)),0))?>
<br><i class="fa fa-fw fa-clock-o"></i> _(Duration)_: <?=my_check($duration,$speed)?>
<br><i class="fa fa-fw fa-search"></i> <?=print_error($error)?></td></tr>
<? else:?>
<td class="wrap"><?=sprintf(_('Last check incomplete on **%s**'),_(my_time($var['sbSynced']).day_count($var['sbSynced']),0))?>
<td class="wrap"><?=sprintf(_('Last check incomplete on **%s**'),_(my_time(_var($var,'sbSynced',0)).day_count(_var($var,'sbSynced',0)),0))?>
<br><i class="fa fa-fw fa-dot-circle-o"></i> _(Error code)_: <?=my_error($status)?>
<br><i class="fa fa-fw fa-search"></i> <?=print_error($error)?></td></tr>
<? endif;
else:?>
<td class="wrap"><?=sprintf(_('Last check completed on **%s**'),_(my_time($var['sbSynced2']).day_count($var['sbSynced2']),0))?>
<td class="wrap"><?=sprintf(_('Last check completed on **%s**'),_(my_time(_var($var,'sbSynced2',0)).day_count(_var($var,'sbSynced2',0)),0))?>
<br><i class="fa fa-fw fa-clock-o"></i> _(Duration)_: <?=my_check($duration,$speed)?>
<br><i class="fa fa-fw fa-search"></i> <?=print_error($var['sbSyncErrs'])?></td></tr>
<br><i class="fa fa-fw fa-search"></i> <?=print_error(_var($var,'sbSyncErrs',0))?></td></tr>
<? endif;
endif;
else:
if ($action[0]=="recon"):
$resync = resync($action[1]);
?> <tr><td><?=_("$resync in progress")?>.</td><td>
<input type="button" id="pauseButton"<?if ($var['mdResync']):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="pauseButton"<?if (_var($var,'mdResync')):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="cancelButton" value="_(Cancel)_" onclick="stopParity(this.form,'<?=$resync?>')" disabled></td>
<td id="cancelText"><?if ($var['mdResync']):?>**<?=_('Pause')?>** <?=_("will pause $resync")?>.<?else:?>**<?=_('Resume')?>** <?=_("will resume $resync")?>.<?endif;?><br>**<?=_('Cancel')?>** <?=_("will stop $resync")?>.
<td id="cancelText"><?if (_var($var,'mdResync')):?>**<?=_('Pause')?>** <?=_("will pause $resync")?>.<?else:?>**<?=_('Resume')?>** <?=_("will resume $resync")?>.<?endif;?><br>**<?=_('Cancel')?>** <?=_("will stop $resync")?>.
<br>_(WARNING: canceling may leave the array unprotected)_!</td></tr>
<? elseif ($action[0]=="clear"):?>
<tr><td>_(Disk-Clear in progress)_.</td><td>
<input type="button" id="pauseButton"<?if ($var['mdResync']):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="pauseButton"<?if (_var($var,'mdResync')):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="cancelButton" value="_(Cancel)_" onclick="stopParity(this.form,'Disk-Clear')" disabled></td>
<td id="cancelText"><?if ($var['mdResync']):?>**_(Pause)_** _(will pause Disk-Clear)_.<?else:?>**_(Resume)_** _(will resume Disk-Clear)_.<?endif;?><br>**_(Cancel)_** _(will stop Disk-Clear)_.</td></tr>
<td id="cancelText"><?if (_var($var,'mdResync')):?>**_(Pause)_** _(will pause Disk-Clear)_.<?else:?>**_(Resume)_** _(will resume Disk-Clear)_.<?endif;?><br>**_(Cancel)_** _(will stop Disk-Clear)_.</td></tr>
<? elseif ($action[0]=="check" && count($action)>1):?>
<tr><td>_(Parity-Check in progress)_.</td><td>
<input type="button" id="pauseButton"<?if ($var['mdResync']):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="pauseButton"<?if (_var($var,'mdResync')):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="cancelButton" value="_(Cancel)_" onclick="stopParity(this.form,'Parity-Check')" disabled></td>
<td id="cancelText"><?if ($var['mdResync']):?>**_(Pause)_** _(will pause Parity-Check)_.<?else:?>**_(Resume)_** _(will resume Parity-Check)_.<?endif;?><br>**_(Cancel)_** _(will stop Parity-Check)_.</td></tr>
<td id="cancelText"><?if (_var($var,'mdResync')):?>**_(Pause)_** _(will pause Parity-Check)_.<?else:?>**_(Resume)_** _(will resume Parity-Check)_.<?endif;?><br>**_(Cancel)_** _(will stop Parity-Check)_.</td></tr>
<? elseif ($action[0]=="check"):?>
<tr><td>_(Read-Check in progress)_.</td><td>
<input type="button" id="pauseButton"<?if ($var['mdResync']):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="pauseButton"<?if (_var($var,'mdResync')):?> value="_(Pause)_" onclick="pauseParity(this.form)"<?else:?> value="_(Resume)_" onclick="resumeParity(this.form)"<?endif;?> disabled>
<input type="button" id="cancelButton" value="_(Cancel)_" onclick="stopParity(this.form,'Read-Check')" disabled></td>
<td id="cancelText"><?if ($var['mdResync']):?>**_(Pause)_** _(will pause Read-Check)_.<?else:?>**_(Resume)_** _(will resume Read-Check)_.<?endif;?><br>**_(Cancel)_** _(will stop Read-Check)_.</td></tr>
<td id="cancelText"><?if (_var($var,'mdResync')):?>**_(Pause)_** _(will pause Read-Check)_.<?else:?>**_(Resume)_** _(will resume Read-Check)_.<?endif;?><br>**_(Cancel)_** _(will stop Read-Check)_.</td></tr>
<? endif;
$stamps = '/var/tmp/stamps.ini';
$synced = file_exists($stamps) ? explode(',',file_get_contents($stamps)) : [];
$sbSynced = array_shift($synced) ?: $var['sbSynced'];
$sbUpdate = $var['mdResyncDt'] ? $sbSynced : $var['sbUpdated'];?>
$sbSynced = array_shift($synced) ?: _var($var,'sbSynced');
$sbUpdate = _var($var,'mdResyncDt') ? $sbSynced : _var($var,'sbUpdated');?>
<tr><td></td><td><input type="button" value="_(History)_" onclick="parityHistory()"></td>
<td><?=sprintf(_('Current operation %s on **%s**'),($var['mdResyncDt']?_('started'):_('paused')),_(my_time($sbUpdate).day_count($sbUpdate),0))?></td></tr>
<td><?=sprintf(_('Current operation %s on **%s**'),(_var($var,'mdResyncDt')?_('started'):_('paused')),_(my_time($sbUpdate).day_count($sbUpdate),0))?></td></tr>
<tr><td>_(Total size)_:</td><td id="line0"></td><td></td></tr>
<tr><td>_(Elapsed time)_:</td><td id="line1"></td><td></td></tr>
<tr><td>_(Current position)_:</td><td id="line2"></td><td></td></tr>
@@ -501,9 +501,9 @@ function formatWarning(val) {
<tr><td>_(Estimated finish)_:</td><td id="line4"></td><td></td></tr>
<? if ($action[0]=="check"):?>
<? if (count($action)>1):?>
<tr><td><?=$var['mdResyncCorr']==0 ? _('Sync errors detected') : _('Sync errors corrected')?>:</td><td id="line5"></td><td></td></tr>
<tr><td><?=_var($var,'mdResyncCorr')==0 ? _('Sync errors detected') : _('Sync errors corrected')?>:</td><td id="line5"></td><td></td></tr>
<? else:?>
<tr><td><?=$var['mdResyncCorr']==0 ? _('Read errors detected') : _('Read errors corrected')?>:</td><td id="line5"></td><td></td></tr>
<tr><td><?=_var($var,'mdResyncCorr')==0 ? _('Read errors detected') : _('Read errors corrected')?>:</td><td id="line5"></td><td></td></tr>
<? endif;
endif;
endif;
@@ -519,33 +519,33 @@ function formatWarning(val) {
case "Copying":?>
<tr><td><?status_indicator()?>**_(Starting, copying)_... <span id="fsState"></span>**</td><td><input type="submit" name="cmdNoCopy" value="_(Cancel)_"></td><td></td></tr>
<tr><td></td><td><input type="button" value="_(History)_" onclick="parityHistory()"></td>
<td><?=sprintf(_('Current operation %s on **%s**'),_('started'),_(my_time($var['sbUpdated']).day_count($var['sbSynced']),0))?></td></tr>
<td><?=sprintf(_('Current operation %s on **%s**'),_('started'),_(my_time(_var($var,'sbUpdated',0)).day_count(_var($var,'sbSynced',0)),0))?></td></tr>
<? break;
case "Clearing":?>
<tr><td><?status_indicator()?>**_(Started, clearing)_... <span id="fsState"></span>**</td><td><input type="submit" name="cmdNoClear" value="_(Cancel)_"></td><td></td></tr>
<tr><td></td><td><input type="button" value="_(History)_" onclick="parityHistory()"></td>
<td><?=sprintf(_('Current operation %s on **%s**'),_('started'),_(my_time($var['sbUpdated']).day_count($var['sbSynced']),0))?></td></tr>
<td><?=sprintf(_('Current operation %s on **%s**'),_('started'),_(my_time(_var($var,'sbUpdated',0)).day_count(_var($var,'sbSynced',0)),0))?></td></tr>
<? break;
case "Stopping":?>
<tr><td><?status_indicator()?>**_(Stopping)_...**</td><td><input type="submit" name="cmdStop" value="_(Stop)_" disabled></td><td></td></tr>
<? break;
case "Stopped":
if ($var['configValid']=="error"):?>
if (_var($var,'configValid')=="error"):?>
<tr><td><?status_indicator()?>**_(Stopped)_.**</td><td><input type="submit" name="cmdStart" value="_(Start)_" disabled></td>
<td>_(Invalid, missing or expired)_ <a href="/Tools/Registration">_(registration key)_</a>.</td></tr>
<? elseif ($var['configValid']=="invalid"):?>
<? elseif (_var($var,'configValid')=="invalid"):?>
<tr><td><?status_indicator()?>**_(Stopped)_.**</td><td><input type="submit" name="cmdStart" value="_(Start)_" disabled></td>
<td>_(Too many attached devices. Please consider upgrading your)_ <a href="/Tools/Registration">_(registration key)_</a>.</td></tr>
<? elseif ($var['configValid']=="nokeyserver"):?>
<? elseif (_var($var,'configValid')=="nokeyserver"):?>
<tr><td><?status_indicator()?>**_(Stopped)_.**</td><td><input type="submit" name="cmdStart" value="_(Start)_" disabled></td>
<td>_(Cannot contact key-server. Please check your)_ <a href="/Settings/NetworkSettings">_(network settings)_</a>.</td></tr>
<? elseif ($var['configValid']=="withdrawn"):?>
<? elseif (_var($var,'configValid')=="withdrawn"):?>
<tr><td><?status_indicator()?>**_(Stopped)_.**</td><td><input type="submit" name="cmdStart" value="_(Start)_" disabled></td>
<td>_(This Unraid OS release has been withdrawn and may no longer be used. Please)_ <a href="/Plugins">_(update)_</a> _(your server)_.</td></tr>
<? else:
switch ($var['mdState']):
switch (_var($var,'mdState')):
case "STOPPED":
$action = explode(' ',$var['mdResyncAction']);
$action = explode(' ',_var($var,'mdResyncAction'));
if ($action[0]=="recon"):
$resync = resync($action[1]);
?> <tr><td><?status_indicator()?>**_(Stopped)_**. _(Configuration valid)_.</td><td><input type="button" id="cmdStart" value="_(Start)_" onclick="prepareInput(this.form)"></td>
@@ -553,11 +553,11 @@ function formatWarning(val) {
<? elseif ($action[0]=="clear"):?>
<tr><td><?status_indicator()?>**_(Stopped)_**. _(New data disk(s) detected)_.</td><td><input type="button" id="cmdStart" value="_(Start)_" onclick="prepareInput(this.form)"></td>
<td>**_(Start)_** _(will bring the array on-line and start **Disk-Clear** of new data disk(s))_.</td></tr>
<? elseif ($var['sbClean']!="yes" && $action[0]=="check" && count($action)>1):?>
<? elseif (_var($var,'sbClean')!="yes" && $action[0]=="check" && count($action)>1):?>
<tr><td><?status_indicator()?>**_(Stopped)_**. _(Unclean shutdown detected)_.</td><td><input type="button" id="cmdStart" value="_(Start)_" onclick="prepareInput(this.form)"></td>
<td>**_(Start)_** _(will bring the array on-line and start **Parity-Check**)_.
<br><input type="checkbox" name="optionCorrect" value="correct" checked><small>_(Write corrections to parity)_</small></td></tr>
<? elseif ($var['sbClean']!="yes" && $action[0]=="check"):?>
<? elseif (_var($var,'sbClean')!="yes" && $action[0]=="check"):?>
<tr><td><?status_indicator()?>**_(Stopped)_**. _(Unclean shutdown detected)_.</td><td><input type="button" id="cmdStart" value="_(Start)_" onclick="prepareInput(this.form)"></td>
<td>**_(Start)_** _(will bring the array on-line)_.</td></tr>
<? elseif (missing_cache()):?>
@@ -572,7 +572,7 @@ function formatWarning(val) {
check_encryption();
break;
case "NEW_ARRAY":
if (strpos($disks['parity']['status'],"DISK_NP")===0 && strpos($disks['parity2']['status'],"DISK_NP")===0):?>
if (strpos(_var($disks['parity'],'status'),"DISK_NP")===0 && strpos(_var($disks['parity2'],'status'),"DISK_NP")===0):?>
<tr><td><?status_indicator()?>**_(Stopped)_**. _(Configuration valid)_.</td><td><input type="button" id="cmdStart" value="_(Start)_" onclick="prepareInput(this.form)"></td>
<td>**_(Start)_** _(will record all disk information and bring the array on-line)_.
<br>_(The array will be immediately available, but **unprotected** since *parity* has not been assigned)_.</td></tr>
@@ -599,7 +599,7 @@ function formatWarning(val) {
check_encryption();
break;
case "SWAP_DSBL":
if ($var['fsCopyPrcnt']=="100"):?>
if (_var($var,'fsCopyPrcnt')=="100"):?>
<tr><td><?status_indicator()?>**_(Stopped)_**. _(Upgrading disk/swapping parity)_.</td><td><input type="button" id="cmdStart" value="_(Start)_" onclick="prepareInput(this.form)"></td>
<td>**_(Start)_** _(will expand the file system of the data disk (if possible); then bring the array on-line and start Data-Rebuild)_.</td></tr>
<? maintenance_mode();
@@ -638,7 +638,7 @@ function formatWarning(val) {
<tr><td></td><td class="line" colspan="2"></td></tr>
</table>
</form>
<?if ($var['fsState']!="Stopped"):?>
<?if (_var($var,'fsState')!="Stopped"):?>
<?if ($keyfile):?>
<form name="delete_keyfile" method="POST" action="/update.php" target="progressFrame">
<input type="hidden" name="#file" value="unused">
@@ -656,7 +656,7 @@ function formatWarning(val) {
<tr><td></td><td><input type="button" value="_(Clear Stats)_" onclick="toggle_state('Clear')"></td><td>**_(Clear Stats)_** _(will immediately clear all disk statistics)_.</td></tr>
<tr><td></td><td class="line" colspan="2"></td></tr>
</table>
<?if ($var['shareUser']=='e' && $pool_devices):?>
<?if (_var($var,'shareUser')=='e' && $pool_devices):?>
<form name="mover_schedule" method="POST" action="/update.htm" target="progressFrame">
<table markdown="1" class="array_status noshift">
<tr><td></td><td><input type="submit" id="mover-button" name="cmdStartMover" value="_(Move)_"></td><td id="mover-text"></td></tr>
@@ -683,7 +683,7 @@ function formatWarning(val) {
<!-- markdown fix --></p><?if (isset($display['sleep'])) eval('?>'.parse_file($display['sleep']))?>
:array_status_help:
<?if ($var['fsState']=="Stopped"):?>
<?if (_var($var,'fsState')=="Stopped"):?>
:array_devices_help:
<?if ($encrypt):?>
+3 -3
View File
@@ -3,8 +3,8 @@ Title="Boot Device"
Tag="paw"
---
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -15,7 +15,7 @@ Tag="paw"
*/
?>
<script>
<?if ($var['fsState']=='Started'):?>
<?if (_var($var,'fsState')=="Started"):?>
$('#tab3').bind({click:function() {$('i.toggle').show('slow');}});
<?endif;?>
</script>
+7 -7
View File
@@ -4,8 +4,8 @@ Tag="bullseye"
Cond="($pool_devices || $var['fsState']=='Stopped')"
---
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -81,14 +81,14 @@ function addPoolPopup() {
$(".ui-button-text").css({'padding':'0px 5px'});
}
<?if ($var['fsState']=='Started'):?>
<?if (_var($var,'fsState')=="Started"):?>
$('#tab2').bind({click:function() {$('i.toggle').show('slow');}});
<?endif;?>
</script>
<?$i = 0?>
<?foreach ($pools as $pool):?>
<?if (isset($disks[$pool]['devices']) || $var['fsState']=='Stopped'):?>
<?if (isset($disks[$pool]['devices']) or _var($var,'fsState')=="Stopped"):?>
<table class="disk_status wide<?=$i?' divider':''?>">
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_.</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
<tbody id="pool_device<?=$i++?>">
@@ -97,7 +97,7 @@ $('#tab2').bind({click:function() {$('i.toggle').show('slow');}});
</table>
<?endif;?>
<?endforeach;?>
<?if ($var['fsState']=='Stopped'):?>
<?if (_var($var,'fsState')=="Stopped"):?>
<input type="button" value="_(Add Pool)_" style="margin:0" onclick="addPoolPopup()">
<div id="dialogAddPool" style="display:none"></div>
@@ -109,7 +109,7 @@ _(Name)_:
_(Slots)_:
: <select name="poolSlots">
<?for ($n=1; $n<=$var['MAX_CACHESZ']; $n++):?>
<?for ($n=1; $n<=_var($var,'MAX_CACHESZ',0); $n++):?>
<?=mk_option(1,$n,$n)?>
<?endfor;?>
</select>
@@ -120,7 +120,7 @@ _(Slots)_:
:cache_devices_help:
<?if ($var['fsState'] == "Stopped"):?>
<?if (_var($var,'fsState')=="Stopped"):?>
<div></div>
:cache_slots_help:
<?endif;?>
+32 -34
View File
@@ -58,41 +58,41 @@ $libvirtd = pgrep('libvirtd');
$apcupsd = file_exists('/var/run/apcupsd.pid');
$conf = glob('/etc/wireguard/wg*.conf');
$wireguard = is_executable('/usr/bin/wg') && count($conf);
$started = $var['fsState']=='Started';
$started = _var($var,'fsState')=='Started';
$sleep = isset($display['sleep']);
$array_size = $array_used = 0;
$extra_size = $extra_used = 0;
$cache_size = $cache_used = [];
$cache_type = $cache_rate = [];
$parity = $var['mdResync'];
$parity = _var($var,'mdResync');
$mover = file_exists('/var/run/mover.pid');
$btrfs = exec('pgrep -cf /sbin/btrfs');
$dot = $display['number'][0];
$dot = _var($display,'number','.,')[0];
$zfs = file_exists('/proc/spl/kstat/zfs/arcstats');
foreach ($disks as $disk) {
switch ($disk['type']) {
switch (_var($disk,'type')) {
case 'Data':
if (isset($disk['fsFree'])) {
$array_size += $disk['fsSize'];
$array_used += $disk['fsSize']-$disk['fsFree'];
$array_size += _var($disk,'fsSize',0);
$array_used += _var($disk,'fsSize',0)-_var($disk,'fsFree',0);
}
break;
case 'Cache':
$name = $disk['name'];
$name = _var($disk,'name');
if (in_array($name,$pools)) {
$cache_size[$name] = $disk['fsSize'];
$cache_used[$name] = $disk['fsSize']-$disk['fsFree'];
$cache_type[$name] = $disk['rotational'] ? ($disk['luksState'] ? 'disk-encrypted' : 'disk') : 'nvme';
$cache_size[$name] = _var($disk,'fsSize',0);
$cache_used[$name] = _var($disk,'fsSize',0)-_var($disk,'fsFree',0);
$cache_type[$name] = _var($disk,'rotational') ? (_var($disk,'luksState') ? 'disk-encrypted' : 'disk') : 'nvme';
$cache_rate[$name] = number_format(100*$cache_used[$name]/($cache_size[$name] ?: 1),1,$dot,'');
if (!$disks[$name]['devices']) unset($pools[array_search($name,$pools)]);
if (empty($disks[$name]['devices'])) unset($pools[array_search($name,$pools)]);
}
break;
}
}
foreach ($devs as $disk) {
$extra_size += $disk['sectors']*$disk['sector_size'];
$extra_size += _var($disk,'sectors',0)*_var($disk,'sector_size',0);
}
$array_percent = number_format(100*$array_used/($array_size ?: 1),1,$dot,'');
exec('cat /sys/devices/system/cpu/*/topology/thread_siblings_list|sort -nu', $cpus);
@@ -102,7 +102,7 @@ $up = count($wg_up);
$down = max(count($conf)-$up,0);
$fans = exec("sensors -uA 2>/dev/null|grep -c 'fan[0-9]_input'");
$autofan = is_executable("$docroot/plugins/dynamix.system.autofan/scripts/rc.autofan");
$group = $var['shareSMBEnabled']=='yes' | $var['shareNFSEnabled']=='yes';
$group = _var($var,'shareSMBEnabled')=='yes' | _var($var,'shareNFSEnabled')=='yes';
$names = [];
$cache_only = $encrypted = 0;
foreach ($shares as $share) {
@@ -234,7 +234,7 @@ input[value=Edit]{margin:12px 0 0 0;padding:5px 10px}
<div class='tile' id='tile1'>
<table id='db-box1' class='share_status dashboard'>
<tbody class='system'>
<tr><td><?=$var['NAME']?>
<tr><td><?=_var($var,'NAME')?>
<i class='fa fa-fw fa-wrench control' onclick='contentMgmt()' title="_(Content Management)_"></i><a href='/Dashboard/Settings/Identification'><i class='fa fa-fw fa-cog control' title="_(Go to identification settings)_"></i></a>
<span class='ctrl'>
<?if ($parity||$mover||$btrfs):?>
@@ -248,8 +248,8 @@ input[value=Edit]{margin:12px 0 0 0;padding:5px 10px}
</td></tr>
<tr><td>
<div class='leftside'>
<span class='header'><i class='indent fa fa-file-text-o'></i>_(Description)_</span><br><i class='indent'></i><?=$var['COMMENT']?><br><i class='indent'></i><?=$var['SYS_MODEL']?><br><br>
<span class='header'><i class='indent fa fa-id-badge'></i>_(Registration)_</span><br><i class='indent'></i>Unraid OS <b><em><?=$var['regTy']?></em></b><br><br>
<span class='header'><i class='indent fa fa-file-text-o'></i>_(Description)_</span><br><i class='indent'></i><?=_var($var,'COMMENT')?><br><i class='indent'></i><?=_var($var,'SYS_MODEL')?><br><br>
<span class='header'><i class='indent fa fa-id-badge'></i>_(Registration)_</span><br><i class='indent'></i>Unraid OS <b><em><?=_var($var,'regTy')?></em></b><br><br>
<span class='header'><i class='indent fa fa-clock-o'></i>_(Uptime)_</span><br><i class='indent'></i><span class='uptime'></span>
</div>
<div class='rightside'>
@@ -462,10 +462,10 @@ echo "</td></tr>";
<span class='info'><?=sprintf(_("Share count: %s with %s cache only and %s encrypted"),count($shares),$cache_only,$encrypted)?></span>
<?if ($group):?>
<select name="enter_share" onchange="changeMode(this.value)">
<?if ($var['shareSMBEnabled']=='yes'):?>
<?if (_var($var,'shareSMBEnabled')=='yes'):?>
<?=mk_option("", "0", "SMB")?>
<?endif;?>
<?if ($var['shareNFSEnabled']=='yes'):?>
<?if (_var($var,'shareNFSEnabled')=='yes'):?>
<?=mk_option("", "2", "NFS")?>
<?endif;?>
</select>
@@ -473,7 +473,7 @@ echo "</td></tr>";
</td></tr>
<tr class='header'><td><span class='w26'>_(Name)_</span><span class='w44'>_(Description)_</span><span class='w18'>_(Security)_</span><span>_(Streams)_</span></td></tr>
<?
if ($var['shareSMBEnabled']=='yes') {
if (_var($var,'shareSMBEnabled')=='yes') {
$i = 0;
foreach ($shares as $name => $share) {
$i++;
@@ -481,19 +481,19 @@ if ($var['shareSMBEnabled']=='yes') {
if ($share['luksStatus']>0) $list = str_replace('blue-text','green-text',$list);
elseif ($share['useCache']=='only') $list = str_replace('blue-text','orange-text',$list);
$comment = compress($share['comment'],40) ?: '&nbsp;';
$security = export_settings($var['shareSMBEnabled'], $sec[$name]);
$security = export_settings(_var($var,'shareSMBEnabled'), $sec[$name]);
$last = $name==array_key_last($shares) ? ' last' : '';
echo "<tr class='smb share share1{$last}'><td><span class='w26'><i class='icon-folder f14'></i>$list</span><span class='w44'>$comment</span><span class='w18'>$security</span><span id='share{$i}'>0</span></td></tr>";
}
if (!count($shares)) echo "<tr class='smb share share1'><td class='none'>"._("No shares present")."</td></tr>";
}
if ($var['shareNFSEnabled']=='yes') {
if (_var($var,'shareNFSEnabled')=='yes') {
foreach ($shares as $name => $share) {
$list = "<a href=\"/Dashboard/Shares/Share?name=".urlencode($name)."\" class=\"blue-text\" title=\"$name settings\">".compress($name,20)."</a>";
if ($share['luksStatus']>0) $list = str_replace('blue-text','green-text',$list);
elseif ($share['useCache']=='only') $list = str_replace('blue-text','orange-text',$list);
$comment = compress($share['comment'],40) ?: '&nbsp;';
$security = export_settings($var['shareNFSEnabled'], $sec_nfs[$name]);
$security = export_settings(_var($var,'shareNFSEnabled'), $sec_nfs[$name]);
$last = $name==array_key_last($shares) ? ' last' : '';
echo "<tr class='nfs share share3{$last}'><td><span class='w26'><i class='icon-folder f14'></i>$list</span><span class='w44'>$comment</span><span class='w18'>$security</span><span>-</span></td></tr>";
}
@@ -519,7 +519,7 @@ if (!$group) {
</td></tr>
<tr class='header'><td><span class='w26'>_(Name)_</span><span class='w44'>_(Description)_</span><span class='w18'>_(Write)_</span><span>_(Read)_</span></td></tr>
<?
if ($var['shareSMBEnabled']=='yes') {
if (_var($var,'shareSMBEnabled')=='yes') {
foreach ($users as $user) {
$name = $user['name'];
$list = "<a href=\"/Dashboard/Users/UserEdit?name=".urlencode($name)."\" class=\"blue-text\" title=\"$name settings\">".compress($name,20)."</a>";
@@ -551,7 +551,7 @@ if ($var['shareSMBEnabled']=='yes') {
echo "<tr class='smb user user1{$last}'><td><span class='w26'><i class='icon-user f14'></i>$list</span><span class='w44'>$desc</span><span class='w18'>$write</span><span>$read</span></td></tr>";
}
}
if ($var['shareNFSEnabled']=='yes') {
if (_var($var,'shareNFSEnabled')=='yes') {
foreach ($users as $user) {
$name = $user['name'];
$list = "<a href=\"/Dashboard/Users/UserEdit?name=".urlencode($name)."\" class=\"blue-text\" title=\"$name settings\">".compress($name,20)."</a>";
@@ -619,7 +619,7 @@ if (!$group) {
</div>
<form name='boot' method='POST' action='/webGui/include/Boot.php'>
<input type='hidden' name='csrf_token' value='<?=$var['csrf_token']?>'>
<input type='hidden' name='csrf_token' value='<?=_var($var,'csrf_token')?>'>
<input type='hidden' name='cmd' value=''>
</form>
<div id="iframe-popup"></div>
@@ -826,7 +826,6 @@ function loadlist(init) {
$('span.outer.vms.stopped').finish().toggle('fast',function(){noVMs();});
$('#vms').is(':checked') ? $.cookie('my_vms','startedOnly',{expires:3650}) : $.removeCookie('my_vms');
});
context.init({preventDoubleContext:false,left:true,above:false});
}
$.post('/webGui/include/DashboardApps.php',{display:'<?=$display['dashapps']?>',docker:'<?=$dockerd?>',vms:'<?=$libvirtd?>'},function(d) {
var data = d.split('\0');
@@ -836,7 +835,6 @@ function loadlist(init) {
$('#vm_view').append(data[1]);
if ($.cookie('my_apps')!=null) $('span.apps.stopped').hide(0,noApps());
if ($.cookie('my_vms')!=null) $('span.vms.stopped').hide(0,noVMs());
context.init({preventDoubleContext:false,left:true,above:false});
});
}
function getCase() {
@@ -853,11 +851,11 @@ function getCase() {
}
function changeMode(item) {
if (item==0) $.removeCookie('enter_share'); else $.cookie('enter_share',item,{expires:3650});
<?if ($var['shareSMBEnabled']=='yes'):?>
<?if (_var($var,'shareSMBEnabled')=='yes'):?>
if (item==0) $('.smb.user1').show(); else $('.smb.user1').hide();
if (item==0) $('.smb.share1').show(); else $('.smb.share1').hide();
<?endif;?>
<?if ($var['shareNFSEnabled']=='yes'):?>
<?if (_var($var,'shareNFSEnabled')=='yes'):?>
if (item==2) $('.nfs.user3').show(); else $('.nfs.user3').hide();
if (item==2) $('.nfs.share3').show(); else $('.nfs.share3').hide();
<?endif;?>
@@ -926,7 +924,7 @@ function autoscale(value,text,size,kilo) {
var data = base<unit.length?value/Math.pow(kilo, base):0;
var scale = (data<100?100:10)/size;
if (data==0) base=0;
return ((Math.round(scale*data)/scale)+' '+unit[base]+text).replace(".","<?=$display['number'][0]?>");
return ((Math.round(scale*data)/scale)+' '+unit[base]+text).replace(".","<?=_var($display,'number','.,')[0]?>");
}
function update900() {
// prevent chart overflowing, reset every 15 minutes
@@ -992,7 +990,7 @@ function StopArray() {
}
function StopArrayNow() {
$('span.hand').prop('onclick',null).off('click').addClass('busy').css('cursor','default');
$.post('/update.htm',{startState:'<?=$var['mdState']?>',cmdStop:'Stop',csrf_token:'<?=$var['csrf_token']?>'},function(){refresh();});
$.post('/update.htm',{startState:'<?=_var($var,'mdState')?>',cmdStop:'Stop',csrf_token:'<?=_var($var,'csrf_token')?>'},function(){refresh();});
}
function StartArray() {
<?if ($confirm['stop']):?>
@@ -1003,7 +1001,7 @@ function StartArray() {
}
function StartArrayNow() {
$('span.hand').prop('onclick',null).off('click').addClass('busy').css('cursor','default');
$.post('/update.htm',{startState:'<?=$var['mdState']?>',cmdStart:'Start',csrf_token:'<?=$var['csrf_token']?>'},function(){refresh();});
$.post('/update.htm',{startState:'<?=_var($var,'mdState')?>',cmdStart:'Start',csrf_token:'<?=_var($var,'csrf_token')?>'},function(){refresh();});
}
function Reboot() {
<?if ($confirm['down']):?>
@@ -1203,7 +1201,7 @@ dashboard.on('message',function(msg,meta) {
// memory & disk load
$.each(part[0].split('\0'),function(k,v) {
var load = v.slice(0,-1);
var color = setColor(load, <?=$display['critical']?>, <?=$display['warning']?>);
var color = setColor(load,<?=_var($display,'critical',0)?>,<?=_var($display,'warning',0)?>);
$('.sys'+k).text(v);
$('#sys'+k).finish().animate({width:v},{step:function(){$('#sys'+k).css('overflow','visible').removeClass().addClass(color);}});
});
@@ -1211,7 +1209,7 @@ dashboard.on('message',function(msg,meta) {
// fans rpm
$.each(part[1].split('\0'),function(k,v) {$('#fan'+k).html(v);});
<?endif;?>
<?if ($var['fsState']=='Started' && $group):?>
<?if (_var($var,'fsState')=='Started' && $group):?>
// stream counters (smb only)
var tag = $('.smb').is(':visible') ? 'smb' : $('.nfs').is(':visible') ? 'nfs' : '';
if (tag == 'smb') $.each(part[2].split('\0'),function(k,v) {$('#share'+(k+1)).html(v);});
+1 -1
View File
@@ -1,7 +1,7 @@
Menu="Device New"
Title="Attributes"
Tag="address-card-o"
Cond="strpos($disks[$name]['status']??'','_NP')===false"
Cond="strpos(_var($disks[$name],'status'),'_NP')===false"
---
<?PHP
/* Copyright 2005-2023, Lime Technology
+1 -1
View File
@@ -1,7 +1,7 @@
Menu="Device New"
Title="Capabilities"
Tag="building"
Cond="strpos($disks[$name]['status']??'','_NP')===false"
Cond="strpos(_var($disks[$name],'status'),'_NP')===false"
---
<?PHP
/* Copyright 2005-2023, Lime Technology
+1 -1
View File
@@ -1,7 +1,7 @@
Menu="Device New"
Title="Identity"
Tag="user"
Cond="strpos($disks[$name]['status']??'','_NP')===false"
Cond="strpos(_var($disks[$name],'status'),'_NP')===false"
---
<?PHP
/* Copyright 2005-2023, Lime Technology
+270 -234
View File
@@ -7,7 +7,7 @@ Tag="hdd-o"
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
* modify it under the terms of the GNU General Public License verssion 2,
* as published by the Free Software Foundation.
*
* The above copyright notice and this permission notice shall be included in
@@ -16,41 +16,59 @@ Tag="hdd-o"
?>
<?
require_once "$docroot/webGui/include/Preselect.php";
$unassigned = array_key_exists($name, $devs);
$disks = array_merge_recursive($disks, $devs);
$disk = &$disks[$name]??[];
$dev = $disk['device']??'';
$disk['id'] = $disk['id']??'';
$events = explode('|',$disk['smEvents'] ?? $var['smEvents'] ?? $numbers);
$bgcolor = in_array($display['theme'],['white','azure']) ? '#f2f2f2' : '#1c1c1c';
$mode = ['Disabled','Hourly','Daily','Weekly','Monthly'];
$days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
$disks = array_merge_recursive($disks, $devs);
$disk = &$disks[$name] ?? [];
$dev = _var($disk,'device');
$disk['id'] = _var($disk,'id');
$events = explode('|',$disk['smEvents'] ?? $var['smEvents'] ?? $numbers);
$bgcolor = in_array($display['theme'],['white','azure']) ? '#f2f2f2' : '#1c1c1c';
$mode = ['Disabled','Hourly','Daily','Weekly','Monthly'];
$days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
function fsType($type) {
global $disk;
return strpos(_var($disk,'fsType'),$type)!==false;
}
function diskStatus($status) {
global $disk;
return strpos(_var($disk,'status'),$status)!==false;
}
function diskType(...$types) {
global $disk;
$pass = false;
foreach ($types as $type) $pass |= _var($disk,'type')==$type;
return $pass;
}
function sharename($share) {
return substr($share,0,-4);
}
function displayTemp($temp) {
global $display;
return $display['unit']=='F' ? round($temp*9/5)+32 : $temp;
return _var($display,'unit')=='F' ? round($temp*9/5)+32 : $temp;
}
function maintenance_mode() {
global $var, $disk;
return ($var['fsState']=="Started" && $var['startMode']=="Maintenance" && $disk['luksState']<=1);
global $var;
return _var($var,'fsState')=="Started" && _var($var,'startMode')=="Maintenance" && _var($disk,'luksState',0)<=1;
}
function isPool($name) {
global $pools;
return in_array($name,$pools);
}
$sheets = []; $i = $n = 0;
foreach ($disks as $sheet) {
if ((isset($sheet['type']) && $sheet['type']=='Flash') || (isset($sheet['color']) && $sheet['color']=='grey-off') || empty($sheet['name'])) continue;
if (_var($sheet,'type')=="Flash" || _var($sheet,'color')=="grey-off" || empty($sheet['name'])) continue;
$sheets[] = $sheet['name'];
if ($sheet['name']==$name) {$i = $n;}
$n++;
}
$tag = $disk['name']??'';
$tag = _var($disk,'name');
$end = count($sheets)-1;
$prev = $i>0 ? $sheets[$i-1] : $sheets[$end];
$next = $i<$end ? $sheets[$i+1] : $sheets[0];
$text = in_array($name,$pools) ? _('This will ERASE content of ALL devices in the pool') : _('This will ERASE ALL device content');
$text = isPool($name) ? _('This will ERASE content of ALL devices in the pool') : _('This will ERASE ALL device content');
?>
<link type="text/css" rel="stylesheet" href="<?autov("/webGui/styles/jquery.ui.css")?>">
<link type="text/css" rel="stylesheet" href="<?autov("/plugins/dynamix.docker.manager/styles/style-{$display['theme']}.css")?>">
@@ -66,7 +84,7 @@ if ($.cookie('deletepool')!=null) {
$.removeCookie('deletepool');
done();
}
<?if (strpos($disk['fsType']??'',"btrfs")!==false):?>
<?if (fsType('btrfs')):?>
function presetBTRFS(form,hour) {
var mode = form.mode.value;
form.min.disabled = mode==0;
@@ -92,7 +110,7 @@ function prepareBTRFS(form) {
}
<?endif;?>
<?if (strpos($disk['fsType']??'',"zfs")!==false):?>
<?if (fsType('zfs')):?>
function presetZFS(form,hour) {
var mode = form.mode.value;
form.min.disabled = mode==0;
@@ -176,7 +194,7 @@ function selectDiskFsProfile(num_devices, width, init) {
$('#diskFsProfileZFS').prop('disabled',true).hide();
$('#diskFsWidthZFS').prop('disabled',true).hide();
$('#compression').show(t);
<?if (isset($disk['type']) && $disk['type']=="Cache"):?>
<?if (diskType('Cache')):?>
$('#autotrim').show(t);
<?endif;?>
} else if (($('#diskFsType').val()||'').indexOf('zfs') != -1) {
@@ -189,7 +207,7 @@ function selectDiskFsProfile(num_devices, width, init) {
$('#diskFsWidthZFS').show();
selectDiskFsWidth(num_devices, width);
$('#compression').show(t);
<?if (isset($disk['type']) && $disk['type']=="Cache"):?>
<?if (diskType('Cache')):?>
$('#autotrim').show(t);
} else if (($('#diskFsType').val()||'').indexOf('xfs') != -1) {
$('#autotrim').show(t);
@@ -199,7 +217,7 @@ function selectDiskFsProfile(num_devices, width, init) {
function changeFsType() {
var fstype = ($('#diskFsType').val()||'').replace('luks:','');
if (['btrfs', 'zfs'].includes(fstype)) $('#compression').show('slow'); else $('#compression').hide('slow');
<?if (isset($disk['type']) && $disk['type']=="Cache"):?>
<?if (diskType('Cache')):?>
if (['xfs', 'btrfs', 'zfs'].includes(fstype)) $('#autotrim').show('slow'); else $('#autotrim').hide('slow');
<?endif;?>
}
@@ -215,7 +233,7 @@ function prepareDeviceInfo(form) {
form.smEvents.value = events.join('|');
if (form.smEvents.value == '<?=$numbers?>') form.smEvents.value = '';
if (form.smLevel.value == 1.00) form.smLevel.value = '';
<?if ($display['unit']=='F'):?>
<?if (_var($display,'unit')=='F'):?>
if (form.hotTemp.value>0) form.hotTemp.value = Math.round((form.hotTemp.value-32)*5/9);
if (form.maxTemp.value>0) form.maxTemp.value = Math.round((form.maxTemp.value-32)*5/9);
<?endif;?>
@@ -235,7 +253,7 @@ function setGlue(form,reset) {
{glue:'' ,more:0,dev:0,type:''}, // marvell
{glue:',',more:1,dev:1,type:'',min1:0,max1:127} // megaraid
];
var n = form.smType.selectedIndex>0 ? form.smType.selectedIndex-1 : <?=$var['smIndex']??0?>;
var n = form.smType.selectedIndex>0 ? form.smType.selectedIndex-1 : <?=_var($var,'smIndex',0)?>;
var x = data[n]['more'];
var t = data[n]['type'];
for (var i=1; i <= x; i++) {
@@ -284,7 +302,7 @@ function setGlue(form,reset) {
$('input[name="smDevice"]').val('').hide();
$('#helptext').hide();
}
form.smGlue.value = form.smType.selectedIndex>0 ? data[n]['glue'] : "<?=$var['smGlue']??''?>";
form.smGlue.value = form.smType.selectedIndex>0 ? data[n]['glue'] : "<?=_var($var,'smGlue')?>";
}
function prepareFS(form,cookie,value) {
if ($(form).find('input[type="submit"]').val()=='Cancel') $.removeCookie(cookie); else $.cookie(cookie,value);
@@ -328,7 +346,7 @@ function btrfsCheck(path) {
function zfsScrub(path) {
$.post('/webGui/include/FileSystemStatus.php',{cmd:'zfs-scrub',path:path},function(data) {
if (data.indexOf('scrub in progress')>0) {
$('#zfs-scrub').text(data);
$('#zfs-pool').text(data);
setTimeout(function(){zfsScrub(path);},1000);
} else {
$.removeCookie('zfs-scrub-<?=$tag?>');
@@ -337,6 +355,19 @@ function zfsScrub(path) {
});
return false;
}
function zfsResilver(path) {
$.post('/webGui/include/FileSystemStatus.php',{cmd:'zfs-resilver',path:path},function(data) {
if (data.indexOf('resilver in progress')>0) {
$('#scrub-button').prop('disabled',true);
$('#zfs-pool').text(data);
setTimeout(function(){zfsResilver(path);},1000);
} else {
$.removeCookie('zfs-resilver-<?=$tag?>');
refresh();
}
});
return false;
}
function rfsCheck(path) {
$.post('/webGui/include/FileSystemStatus.php',{cmd:'rfs-check',path:path},function(data) {
$('#rfs-check').text(data);
@@ -366,7 +397,7 @@ function updateMode(form,mode) {
}
function validate(poolname) {
var valid = /^[a-z_]([a-z0-9_-]*[a-z_])*$/;
var reserved = [<?=implode(',',array_map('escapestring',explode(',',$var['reservedNames'])))?>];
var reserved = [<?=implode(',',array_map('escapestring',explode(',',_var($var,'reservedNames'))))?>];
var shares = [<?=implode(',',array_map('escapestring',array_filter(array_map('sharename',scandir('boot/config/shares')))))?>];
var pools = [<?=implode(',',array_map('escapestring',$pools))?>];
if (!poolname.trim()) return false;
@@ -439,7 +470,7 @@ function eraseDisk(name) {
$('#doneButton').prop('disabled',true);
$('#eraseButton').prop('disabled',true);
$('div.spinner.fixed').show();
$.get("/update.htm",{cmdWipefs:name,csrf_token:"<?=$var['csrf_token']?>"},function(){
$.get("/update.htm",{cmdWipefs:name,csrf_token:"<?=_var($var,'csrf_token')?>"},function(){
$('div.spinner.fixed').hide();
refresh();
});
@@ -462,7 +493,7 @@ $(function() {
$('div[class=title]:first').append(ctrl);
<?endif;?>
<?endif;?>
<?if (strpos($disk['status']??'','_NP')===false):?>
<?if (!diskStatus('_NP')):?>
var form = document.smart_settings;
<?if (!isset($disk['smType'])):?>
form.smType.selectedIndex = 0;
@@ -475,6 +506,7 @@ $(function() {
if ($.cookie('btrfs-scrub-<?=$tag?>')) status = btrfsScrub($.cookie('btrfs-scrub-<?=$tag?>'));
if ($.cookie('btrfs-check-<?=$tag?>')) status = btrfsCheck($.cookie('btrfs-check-<?=$tag?>'));
if ($.cookie('zfs-scrub-<?=$tag?>')) status = zfsScrub($.cookie('zfs-scrub-<?=$tag?>'));
if ($.cookie('zfs-resilver-<?=$tag?>')) status = zfsResilver($.cookie('zfs-resilver-<?=$tag?>'));
if ($.cookie('rfs-check-<?=$tag?>')) status = rfsCheck($.cookie('rfs-check-<?=$tag?>'));
if ($.cookie('xfs-check-<?=$tag?>')) status = xfsCheck($.cookie('xfs-check-<?=$tag?>'));
if (status) {
@@ -498,19 +530,23 @@ $(function() {
$.cookie('zfs-scrub-<?=$tag?>','<?=$tag?>');
zfsScrub($.cookie('zfs-scrub-<?=$tag?>'));
break;
case 'zfs-resilver':
$.cookie('zfs-resilver-<?=$tag?>','<?=$tag?>');
zfsResilver($.cookie('zfs-resilver-<?=$tag?>'));
break;
}
}
});
}
var groups = <?=isset($disk['fsGroups']) ? ($disk['fsGroups']?:0) : 0?>;
var width = <?=isset($disk['fsWidth']) ? ($disk['fsWidth']?:0) : 0?>;
var devices = (groups==0 || width==0) ? <?=isset($disk['devices']) ? ($disk['devices']?:0) : 0?> : groups * width;
var groups = <?=_var($disk,'fsGroups',0)?:0?>;
var width = <?=_var($disk,'fsWidth',0)?:0?>;
var devices = (groups==0 || width==0) ? <?=_var($disk,'devices',0)?:0?> : groups * width;
selectDiskFsProfile(devices,width,true);
});
</script>
<form markdown="1" method="POST" action="/update.htm" target="progressFrame">
<?if ($var['fsState']=="Stopped" && in_array($name,$pools)):?>
<?if (_var($var,'fsState')=="Stopped" && isPool($name)):?>
_(Name)_:
: <a onclick="renamePoolPopup()" style="cursor:pointer" title="_(Rename Pool)_"><?=$name?></a>
@@ -519,111 +555,111 @@ _(Name)_:
: <?=_(my_disk($name),3)?>
<?endif;?>
<?if (strpos($disk['status']??'','_NP')!==false):?>
<?if (diskStatus('_NP')):?>
_(Identification)_:
: _(No device)_
<?else:?>
_(Identification)_:
: <?=my_id($disk['id'])?>&nbsp;(<?=$dev?>)
: <?=my_id(_var($disk,'id'))?>&nbsp;(<?=$dev?>)
<?endif;?>
<?if (!$unassigned):?>
<?if (($disk['type']??'')=='Data' || (($disk['type']??'')=='Cache' && in_array($disk['name'],$pools))):?>
<?if (diskType('Data') || (diskType('Cache') && isPool(_var($disk,'name')))):?>
_(Comments)_:
: <input type="text" name="diskComment.<?=$disk['idx']?>" maxlength="256" value="<?=htmlspecialchars($disk['comment'])?>">
: <input type="text" name="diskComment.<?=_var($disk,'idx',0)?>" maxlength="256" value="<?=htmlspecialchars(_var($disk,'comment'))?>">
:info_comments_help:
<?endif;?>
_(Partition size)_:
: <?=my_number($disk['sizeSb']??0)?> KB (K=1024)
: <?=my_number(_var($disk,'sizeSb',0))?> KB (K=1024)
_(Partition format)_:
: <?=_($disk['format']??'')?>
: <?=_(_var($disk,'format'))?>
<?if ($var['spinupGroups']=="yes" && in_array($disk['type']??'',['Data','Parity'])):?>
<?if (_var($var,'spinupGroups')=="yes" && diskType('Data','Parity')):?>
_(Spinup group(s))_:
: <input type="text" name="diskSpinupGroup.<?=$disk['idx']?>" maxlength="256" value="<?=$disk['spinupGroup']?>">
: <input type="text" name="diskSpinupGroup.<?=_var($disk,'idx',0)?>" maxlength="256" value="<?=_var($disk,'spinupGroup')?>">
<?endif;?>
_(Spin down delay)_:
: <select name="diskSpindownDelay.<?=$disk['idx']??''?>">
<?=mk_option($disk['spindownDelay']??'', "-1", _('Use default'))?>
<?=mk_option($disk['spindownDelay']??'', "0", _('Never'))?>
<?=mk_option($disk['spindownDelay']??'', "15", "15 "._('minutes'))?>
<?=mk_option($disk['spindownDelay']??'', "30", "30 "._('minutes'))?>
<?=mk_option($disk['spindownDelay']??'', "45", "45 "._('minutes'))?>
<?=mk_option($disk['spindownDelay']??'', "1", "1 "._('hour'))?>
<?=mk_option($disk['spindownDelay']??'', "2", "2 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "3", "3 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "4", "4 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "5", "5 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "6", "6 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "7", "7 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "8", "8 "._('hours'))?>
<?=mk_option($disk['spindownDelay']??'', "9", "9 "._('hours'))?>
: <select name="diskSpindownDelay.<?=_var($disk,'idx',0)?>">
<?=mk_option(_var($disk,'spindownDelay'), "-1", _('Use default'))?>
<?=mk_option(_var($disk,'spindownDelay'), "0", _('Never'))?>
<?=mk_option(_var($disk,'spindownDelay'), "15", "15 "._('minutes'))?>
<?=mk_option(_var($disk,'spindownDelay'), "30", "30 "._('minutes'))?>
<?=mk_option(_var($disk,'spindownDelay'), "45", "45 "._('minutes'))?>
<?=mk_option(_var($disk,'spindownDelay'), "1", "1 "._('hour'))?>
<?=mk_option(_var($disk,'spindownDelay'), "2", "2 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "3", "3 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "4", "4 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "5", "5 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "6", "6 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "7", "7 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "8", "8 "._('hours'))?>
<?=mk_option(_var($disk,'spindownDelay'), "9", "9 "._('hours'))?>
</select><span id="smart_selftest" class='orange-text'></span>
<?endif;?>
<?if ((isset($disk['type']) && $disk['type']=="Data") || in_array($tag,$pools)):?>
<?if (diskType('Data') || isPool($tag)):?>
_(File system status)_:
: <?=_($disk['fsStatus'])?>&nbsp;
: <?=_(_var($disk,'fsStatus'))?>&nbsp;
<?$disabled = (($var['fsState']=="Stopped" && $var['mdState']=="SWAP_DSBL") || $var['fsState']=="Started" || $disk['fsStatus']=='Mounted') || !empty($disk['uuid']) ? "disabled" : ""?>
<?if ((isset($disk['type']) && $disk['type']=="Data") || (isset($disk['slots']) && $disk['slots']==1)):?>
<?$disabled = ((_var($var,'fsState')=="Stopped" && _var($var,'mdState')=="SWAP_DSBL") || _var($var,'fsState')=="Started" || _var($disk,'fsStatus')=='Mounted') || _var($disk,'uuid') ? "disabled" : ""?>
<?if (diskType('Data') || _var($disk,'slots',0)==1):?>
_(File system type)_:
: <select id="diskFsType" name="diskFsType.<?=$disk['idx']?>" onchange="changeFsType()" <?=$disabled?>>
<?=mk_option($disk['fsType'], "auto", _('auto'))?>
<?=mk_option($disk['fsType'], "xfs", _('xfs'))?>
<?=mk_option($disk['fsType'], "zfs", _('zfs'))?>
<?=mk_option($disk['fsType'], "btrfs", _('btrfs'))?>
<?=mk_option($disk['fsType'], "reiserfs", _('reiserfs'))?>
<?=mk_option($disk['fsType'], "luks:xfs", _('xfs')." - "._('encrypted'))?>
<?=mk_option($disk['fsType'], "luks:zfs", _('zfs')." - "._('encrypted'))?>
<?=mk_option($disk['fsType'], "luks:btrfs", _('btrfs')." - "._('encrypted'))?>
<?=mk_option($disk['fsType'], "luks:reiserfs", _('reiserfs')." - "._('encrypted'))?>
: <select id="diskFsType" name="diskFsType.<?=_var($disk,'idx',0)?>" onchange="changeFsType()" <?=$disabled?>>
<?=mk_option(_var($disk,'fsType'), "auto", _('auto'))?>
<?=mk_option(_var($disk,'fsType'), "xfs", _('xfs'))?>
<?=mk_option(_var($disk,'fsType'), "zfs", _('zfs'))?>
<?=mk_option(_var($disk,'fsType'), "btrfs", _('btrfs'))?>
<?=mk_option(_var($disk,'fsType'), "reiserfs", _('reiserfs'))?>
<?=mk_option(_var($disk,'fsType'), "luks:xfs", _('xfs')." - "._('encrypted'))?>
<?=mk_option(_var($disk,'fsType'), "luks:zfs", _('zfs')." - "._('encrypted'))?>
<?=mk_option(_var($disk,'fsType'), "luks:btrfs", _('btrfs')." - "._('encrypted'))?>
<?=mk_option(_var($disk,'fsType'), "luks:reiserfs", _('reiserfs')." - "._('encrypted'))?>
</select>
:info_file_system_help:
<?elseif (isset($disk['slots']) && $disk['slots']>1):?>
<?elseif (_var($disk,'slots',0)>1):?>
_(File system type)_:
: <select id="diskFsType" name="diskFsType.<?=$disk['idx']?>" onchange="selectDiskFsProfile(<?=$disk['devices']??0?>,0)" <?=$disabled?>>
<?=mk_option($disk['fsType'], "auto", _('auto'))?>
<?=mk_option($disk['fsType'], "zfs", _('zfs'))?>
<?=mk_option($disk['fsType'], "btrfs", _('btrfs'))?>
<?=mk_option($disk['fsType'], "luks:zfs", _('zfs')." - "._('encrypted'))?>
<?=mk_option($disk['fsType'], "luks:btrfs", _('btrfs')." - "._('encrypted'))?>
: <select id="diskFsType" name="diskFsType.<?=_var($disk,'idx',0)?>" onchange="selectDiskFsProfile(<?=_var($disk,'devices',0)?>,0)" <?=$disabled?>>
<?=mk_option(_var($disk,'fsType'), "auto", _('auto'))?>
<?=mk_option(_var($disk,'fsType'), "zfs", _('zfs'))?>
<?=mk_option(_var($disk,'fsType'), "btrfs", _('btrfs'))?>
<?=mk_option(_var($disk,'fsType'), "luks:zfs", _('zfs')." - "._('encrypted'))?>
<?=mk_option(_var($disk,'fsType'), "luks:btrfs", _('btrfs')." - "._('encrypted'))?>
</select>
<select id="diskFsProfileBTRFS" name="diskFsProfile.<?=$disk['idx']?>" style="display:none" <?=$disabled?>>
<?=mk_option($disk['fsProfile'],"single", _('single'))?>
<?=mk_option($disk['fsProfile'],"raid0", _('raid0'))?>
<?if ($disk['devices']>=2) echo mk_option($disk['fsProfile'],"raid1", _('raid1'))?>
<?if ($disk['devices']>=3) echo mk_option($disk['fsProfile'],"raid1c3", _('raid1c3'))?>
<?if ($disk['devices']>=4) echo mk_option($disk['fsProfile'],"raid1c4", _('raid1c4'))?>
<?if ($disk['devices']>=4) echo mk_option($disk['fsProfile'],"raid10", _('raid10'))?>
<?if ($disk['devices']>=3) echo mk_option($disk['fsProfile'],"raid5", _('raid5'))?>
<?if ($disk['devices']>=4) echo mk_option($disk['fsProfile'],"raid6", _('raid6'))?>
<select id="diskFsProfileBTRFS" name="diskFsProfile.<?=_var($disk,'idx',0)?>" style="display:none" <?=$disabled?>>
<?=mk_option(_var($disk,'fsProfile'),"single", _('single'))?>
<?=mk_option(_var($disk,'fsProfile'),"raid0", _('raid0'))?>
<?if (_var($disk,'devices',0)>=2) echo mk_option(_var($disk,'fsProfile'),"raid1", _('raid1'))?>
<?if (_var($disk,'devices',0)>=3) echo mk_option(_var($disk,'fsProfile'),"raid1c3", _('raid1c3'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(_var($disk,'fsProfile'),"raid1c4", _('raid1c4'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(_var($disk,'fsProfile'),"raid10", _('raid10'))?>
<?if (_var($disk,'devices',0)>=3) echo mk_option(_var($disk,'fsProfile'),"raid5", _('raid5'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(_var($disk,'fsProfile'),"raid6", _('raid6'))?>
</select>
<select id="diskFsProfileZFS" name="diskFsProfile.<?=$disk['idx']?>" style="display:none" onchange="selectDiskFsWidth(<?=$disk['devices']??0?>,0)" <?=$disabled?>>
<?if ($disk['devices']==1) echo mk_option($disk['fsProfile'],"", _('single'))?>
<?if ($disk['devices']>=2) echo mk_option($disk['fsProfile'],"", _('raid0'))?>
<?if (($disk['devices']%2)==0 || ($disk['devices']%3)==0 || ($disk['devices']%4)==0) echo mk_option($disk['fsProfile'],"mirror", _('mirror'))?>
<?if ($disk['devices']>=3) echo mk_option($disk['fsProfile'],"raidz1", _('raidz'))?>
<?if ($disk['devices']>=4) echo mk_option($disk['fsProfile'],"raidz2", _('raidz2'))?>
<?if ($disk['devices']>=5) echo mk_option($disk['fsProfile'],"raidz3", _('raidz3'))?>
<select id="diskFsProfileZFS" name="diskFsProfile.<?=_var($disk,'idx',0)?>" style="display:none" onchange="selectDiskFsWidth(<?=_var($disk,'devices',0)?>,0)" <?=$disabled?>>
<?if (_var($disk,'devices',0)==1) echo mk_option(_var($disk,'fsProfile'),"", _('single'))?>
<?if (_var($disk,'devices',0)>=2) echo mk_option(_var($disk,'fsProfile'),"", _('raid0'))?>
<?if ((_var($disk,'devices',0)%2)==0 || (_var($disk,'devices',0)%3)==0 || (_var($disk,'devices',0)%4)==0) echo mk_option(_var($disk,'fsProfile'),"mirror", _('mirror'))?>
<?if (_var($disk,'devices',0)>=3) echo mk_option(_var($disk,'fsProfile'),"raidz1", _('raidz'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(_var($disk,'fsProfile'),"raidz2", _('raidz2'))?>
<?if (_var($disk,'devices',0)>=5) echo mk_option(_var($disk,'fsProfile'),"raidz3", _('raidz3'))?>
</select>
<select id="diskFsWidthZFS" name="diskFsWidth.<?=$disk['idx']?>" style="display:none" <?=$disabled?>>
<select id="diskFsWidthZFS" name="diskFsWidth.<?=_var($disk,'idx',0)?>" style="display:none" <?=$disabled?>>
</select>
<?endif;?>
<div markdown="1" id="compression" style="display:none">
_(Compression)_:
<?$disabled = $disk['fsStatus']=='Mounted' ? "disabled" : ""?>
: <select id="diskCompression" name="diskCompression.<?=$disk['idx']?>" <?=$disabled?>>
<?=mk_option($disk['compression'], "off", _('Off'))?>
<?=mk_option($disk['compression'], "on", _('On'))?>
<?$disabled = _var($disk,'fsStatus')=='Mounted' ? "disabled" : ""?>
: <select id="diskCompression" name="diskCompression.<?=_var($disk,'idx',0)?>" <?=$disabled?>>
<?=mk_option(_var($disk,'compression'), "off", _('Off'))?>
<?=mk_option(_var($disk,'compression'), "on", _('On'))?>
</select>
:info_compression_help:
@@ -631,37 +667,37 @@ _(Compression)_:
<div markdown="1" id="autotrim" style="display:none">
_(Autotrim)_:
<?$disabled = $disk['fsStatus']=='Mounted' ? "disabled" : ""?>
: <select id="diskAutotrim" name="diskAutotrim.<?=$disk['idx']?>" <?=$disabled?>>
<?=mk_option($disk['autotrim'], "on", _('On'))?>
<?=mk_option($disk['autotrim'], "off", _('Off'))?>
<?$disabled = _var($disk,'fsStatus')=='Mounted' ? "disabled" : ""?>
: <select id="diskAutotrim" name="diskAutotrim.<?=_var($disk,'idx',0)?>" <?=$disabled?>>
<?=mk_option(_var($disk,'autotrim'), "on", _('On'))?>
<?=mk_option(_var($disk,'autotrim'), "off", _('Off'))?>
</select>
:info_autotrim_help:
</div>
<?if (in_array($name,$pools)):?>
<?if (isPool($name)):?>
_(Enable user share assignment)_:
<?$disabled = $var['fsState']!="Stopped" ? "disabled" : ""?>
: <select id="shareEnabled" name="diskShareEnabled.<?=$disk['idx']?>" onchange="freeSpace(this.value)" <?=$disabled?>>
<?=mk_option($disk['shareEnabled'], "yes", _('Yes'))?>
<?=mk_option($disk['shareEnabled'], "no", _('No'))?>
<?$disabled = _var($var,'fsState')!="Stopped" ? "disabled" : ""?>
: <select id="shareEnabled" name="diskShareEnabled.<?=_var($disk,'idx',0)?>" onchange="freeSpace(this.value)" <?=$disabled?>>
<?=mk_option(_var($disk,'shareEnabled'), "yes", _('Yes'))?>
<?=mk_option(_var($disk,'shareEnabled'), "no", _('No'))?>
</select>
:info_share_assignment_help:
_(Minimum free space)_:
: <input type="text" id="shareFloor" name="diskShareFloor.<?=$disk['idx']?>" maxlength="16" value="<?=$disk['shareFloor']?>" class="narrow" <?=$disabled?> placeholder="0">
: <input type="text" id="shareFloor" name="diskShareFloor.<?=_var($disk,'idx',0)?>" maxlength="16" value="<?=_var($disk,'shareFloor')?>" class="narrow" <?=$disabled?> placeholder="0">
:info_free_space_help:
<?endif;?>
_(Warning disk utilization threshold)_ (%):
: <input type="number" min="0" max="100" name="diskWarning.<?=$disk['idx']?>" class="narrow" value="<?=$disk['warning']??''?>" placeholder="<?=$display['warning']?>">
: <input type="number" min="0" max="100" name="diskWarning.<?=_var($disk,'idx',0)?>" class="narrow" value="<?=_var($disk,'warning')?>" placeholder="<?=_var($display,'warning')?>">
:info_warning_utilization_help:
_(Critical disk utilization threshold)_ (%):
: <input type="number" min="0" max="100" name="diskCritical.<?=$disk['idx']?>" class="narrow" value="<?=$disk['critical']??''?>" placeholder="<?=$display['critical']?>")>
: <input type="number" min="0" max="100" name="diskCritical.<?=_var($disk,'idx',0)?>" class="narrow" value="<?=_var($disk,'critical')?>" placeholder="<?=_var($display,'critical')?>")>
:info_critical_utilization_help:
@@ -669,31 +705,31 @@ _(Critical disk utilization threshold)_ (%):
&nbsp;
: <input type="submit" name="changeDisk" value="_(Apply)_" disabled><input type="button" id="doneButton" value="_(Done)_" onclick="done()">
<?$erasable=false?>
<?if (isset($disk['type']) && ($disk['type']=='Data' || $disk['type']=='Parity')):?>
<?if ($var['fsState']=="Stopped" && strpos($disk['status']??'','_NEW')!==false):?>
<?if (diskType('Parity','Data')):?>
<?if (_var($var,'fsState')=="Stopped" && diskStatus('_NEW')):?>
<?$erasable=true?>
<?endif;?>
<?if ($var['fsState']=="Started" && $var['startMode']!="Normal" && (isset($disk['type']) && $disk['type']=='Data')):?>
<?if (_var($var,'fsState')=="Started" && _var($var,'startMode')!="Normal" && diskType('Data')):?>
<?$erasable=true?>
<?endif;?>
<input type="button" id="eraseButton" value="_(Erase)_" onclick="eraseDisk('<?=$name?>')"<?=$erasable?'':' disabled'?>>
<?endif;?>
<?if (in_array($name,$pools)):?>
<?if ($var['fsState']=="Stopped" || ($var['fsState']=="Started" && $var['startMode']!="Normal")):?>
<?if (isPool($name)):?>
<?if (_var($var,'fsState')=="Stopped" || (_var($var,'fsState')=="Started" && _var($var,'startMode')!="Normal")):?>
<?$erasable=true?>
<?endif;?>
<input type="button" id="eraseButton" value="_(Erase)_" onclick="eraseDisk('<?=$name?>')"<?=$erasable?'':' disabled'?>>
<?endif;?>
<?if ($var['fsState']=="Stopped" && in_array($name,$pools)):?>
<?$empty = $disk['devices']==0?>
<?if (_var($var,'fsState')=="Stopped" && isPool($name)):?>
<?$empty = _var($disk,'devices',0)==0?>
<input type="button" value="_(Delete Pool)_" onclick="deletePool()"<?=$empty?'':' disabled'?>><?if (!$empty):?>_(Unassign **ALL** devices to delete this pool)_<?endif;?>
<?endif;?>
</form>
<?if (strpos($disk['fsType']??'',"btrfs")!==false):?>
<?if (fsType('btrfs')):?>
<div class="title nocontrol"><span class="left"><i class="title fa fa-balance-scale"></i>_(Balance Status)_</span></div>
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'btrfs-balance-<?=$tag?>','/mnt/<?=$tag?>')">
<?if ($disk['fsStatus']=="Mounted"):?>
<?if (_var($disk,'fsStatus')=="Mounted"):?>
<?exec("$docroot/webGui/scripts/btrfs_balance status /mnt/$tag", $balance_status, $retval)?>
<?$usage = exec("/sbin/btrfs fi usage /mnt/$tag|grep -Pom1 '^Data,.+ \\(\\K[^%]+'");?>
@@ -714,17 +750,17 @@ _(btrfs balance status)_:
&nbsp;
: <input type="submit" value="_(Balance)_">
<?if (isset($disk['devices']) && $disk['devices']>1):?>
<?if (_var($disk,'devices',0)>1):?>
<select onchange="updateMode(this.form,this.value)">
<?=mk_option(1,'',_('Perform full balance'))?>
<?if ($disk['devices']>=1) echo mk_option(1,'-dconvert=single,soft -mconvert=dup,soft',_('Convert to single mode'))?>
<?if ($disk['devices']>=2) echo mk_option(1,'-dconvert=raid0,soft -mconvert=raid1,soft',_('Convert to raid0 mode'))?>
<?if ($disk['devices']>=2) echo mk_option(1,'-dconvert=raid1,soft -mconvert=raid1,soft',_('Convert to raid1 mode'))?>
<?if ($disk['devices']>=3) echo mk_option(1,'-dconvert=raid1c3,soft -mconvert=raid1c3,soft',_('Convert to raid1c3 mode'))?>
<?if ($disk['devices']>=4) echo mk_option(1,'-dconvert=raid1c4,soft -mconvert=raid1c4,soft',_('Convert to raid1c4 mode'))?>
<?if ($disk['devices']>=4) echo mk_option(1,'-dconvert=raid10,soft -mconvert=raid10,soft',_('Convert to raid10 mode'))?>
<?if ($disk['devices']>=3) echo mk_option(1,'-dconvert=raid5,soft -mconvert=raid1,soft',_('Convert to raid5 mode *see help'))?>
<?if ($disk['devices']>=4) echo mk_option(1,'-dconvert=raid6,soft -mconvert=raid1c3,soft',_('Convert to raid6 mode *see help'))?>
<?if (_var($disk,'devices',0)>=1) echo mk_option(1,'-dconvert=single,soft -mconvert=dup,soft',_('Convert to single mode'))?>
<?if (_var($disk,'devices',0)>=2) echo mk_option(1,'-dconvert=raid0,soft -mconvert=raid1,soft',_('Convert to raid0 mode'))?>
<?if (_var($disk,'devices',0)>=2) echo mk_option(1,'-dconvert=raid1,soft -mconvert=raid1,soft',_('Convert to raid1 mode'))?>
<?if (_var($disk,'devices',0)>=3) echo mk_option(1,'-dconvert=raid1c3,soft -mconvert=raid1c3,soft',_('Convert to raid1c3 mode'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(1,'-dconvert=raid1c4,soft -mconvert=raid1c4,soft',_('Convert to raid1c4 mode'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(1,'-dconvert=raid10,soft -mconvert=raid10,soft',_('Convert to raid10 mode'))?>
<?if (_var($disk,'devices',0)>=3) echo mk_option(1,'-dconvert=raid5,soft -mconvert=raid1,soft',_('Convert to raid5 mode *see help'))?>
<?if (_var($disk,'devices',0)>=4) echo mk_option(1,'-dconvert=raid6,soft -mconvert=raid1c3,soft',_('Convert to raid6 mode *see help'))?>
</select>
<?else:?>
*_(Perform full balance)_*
@@ -761,48 +797,48 @@ _(btrfs balance status)_:
_(Balance schedule)_:
: <select name="mode" onchange="presetBTRFS(this.form,'#balance-hour')">
<?for ($m=0; $m<count($mode); $m++):?>
<?=mk_option($$balance['mode']??'', strval($m), _($mode[$m]).($m<4 ? '': ' ('._('recommended').')'))?>
<?=mk_option(_var($$balance,'mode'), strval($m), _($mode[$m]).($m<4 ? '': ' ('._('recommended').')'))?>
<?endfor;?>
</select>
_(Day of the week)_:
: <select name="day">
<?for ($d=0; $d<count($days); $d++):?>
<?=mk_option($$balance['day']??'', strval($d), _($days[$d]),0)?>
<?=mk_option(_var($$balance,'day'), strval($d), _($days[$d]),0)?>
<?endfor;?>
<?=mk_option($$balance['day']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($$balance,'day'), "*", "--------", _("disabled"))?>
</select>
_(Day of the month)_:
: <select name="dotm">
<?for ($d=1; $d<=31; $d++):?>
<?=mk_option($$balance['dotm']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$balance,'dotm'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
<?=mk_option($$balance['dotm']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($$balance,'dotm'), "*", "--------", _("disabled"))?>
</select>
_(Time of the day)_:
: <span id="balance-hour1" style="display:none"><select name="hour1" class="narrow">
<?for ($d=0; $d<=23; $d++):?>
<?=mk_option($$balance['hour']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$balance,'hour'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>
<select name="min" class="narrow">
<?for ($d=0; $d<=55; $d+=5):?>
<?=mk_option($$balance['min']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$balance,'min'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>&nbsp;&nbsp;_(HH:MM)_</span>
: <span id="balance-hour2" style="display:none"><select name="hour2">
<?=mk_option($$balance['hour']??'', "*/1", _("Every hour"))?>
<?=mk_option($$balance['hour']??'', "*/2", _("Every 2 hours"))?>
<?=mk_option($$balance['hour']??'', "*/3", _("Every 3 hours"))?>
<?=mk_option($$balance['hour']??'', "*/4", _("Every 4 hours"))?>
<?=mk_option($$balance['hour']??'', "*/6", _("Every 6 hours"))?>
<?=mk_option($$balance['hour']??'', "*/8", _("Every 8 hours"))?>
<?=mk_option(_var($$balance,'hour'), "*/1", _("Every hour"))?>
<?=mk_option(_var($$balance,'hour'), "*/2", _("Every 2 hours"))?>
<?=mk_option(_var($$balance,'hour'), "*/3", _("Every 3 hours"))?>
<?=mk_option(_var($$balance,'hour'), "*/4", _("Every 4 hours"))?>
<?=mk_option(_var($$balance,'hour'), "*/6", _("Every 6 hours"))?>
<?=mk_option(_var($$balance,'hour'), "*/8", _("Every 8 hours"))?>
</select></span>
_(Block group usage)_ (%):
: <input type="number" name="usage" class="narrow" min="0" max="100" value="<?=$$balance['usage']??''?>" placeholder="50">
: <input type="number" name="usage" class="narrow" min="0" max="100" value="<?=_var($$balance,'usage')?>" placeholder="50">
&nbsp;
: <input type="submit" name="#apply" value="_(Apply)_"><input type="button" value="_(Done)_" onclick="done()">
@@ -810,7 +846,7 @@ _(Block group usage)_ (%):
<div class="title nocontrol"><span class="left"><i class="title fa fa-paint-brush"></i>_(Scrub Status)_</span></div>
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'btrfs-scrub-<?=$tag?>','/mnt/<?=$tag?>')">
<?if ($disk['fsStatus']=="Mounted"):?>
<?if (_var($disk,'fsStatus')=="Mounted"):?>
<?exec("$docroot/webGui/scripts/btrfs_scrub status /mnt/$tag", $scrub_status, $retval)?>
_(btrfs scrub status)_:
@@ -856,44 +892,44 @@ _(btrfs scrub status)_:
_(Scrub schedule)_:
: <select name="mode" onchange="presetBTRFS(this.form,'#scrub-hour')">
<?for ($m=0; $m<count($mode); $m++):?>
<?=mk_option($$scrub['mode']??'', strval($m), _($mode[$m]))?>
<?=mk_option(_var($$scrub,'mode'), strval($m), _($mode[$m]))?>
<?endfor;?>
</select>
_(Day of the week)_:
: <select name="day">
<?for ($d=0; $d<count($days); $d++):?>
<?=mk_option($$scrub['day']??'', strval($d), _($days[$d]),0)?>
<?=mk_option(_var($$scrub,'day'), strval($d), _($days[$d]),0)?>
<?endfor;?>
<?=mk_option($$scrub['day']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($$scrub,'day'), "*", "--------", _("disabled"))?>
</select>
_(Day of the month)_:
: <select name="dotm">
<?for ($d=1; $d<=31; $d++):?>
<?=mk_option($$scrub['dotm']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$scrub,'dotm'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
<?=mk_option($$scrub['dotm']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($$scrub,'dotm'), "*", "--------", _("disabled"))?>
</select>
_(Time of the day)_:
: <span id="scrub-hour1" style="display:none"><select name="hour1" class="narrow">
<?for ($d=0; $d<=23; $d++):?>
<?=mk_option($$scrub['hour']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$scrub,'hour'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>
<select name="min" class="narrow">
<?for ($d=0; $d<=55; $d+=5):?>
<?=mk_option($$scrub['min']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$scrub,'min'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>&nbsp;&nbsp;_(HH:MM)_</span>
: <span id="scrub-hour2" style="display:none"><select name="hour2">
<?=mk_option($$scrub['hour']??'', "*/1", _("Every hour"))?>
<?=mk_option($$scrub['hour']??'', "*/2", _("Every 2 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/3", _("Every 3 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/4", _("Every 4 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/6", _("Every 6 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/8", _("Every 8 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/1", _("Every hour"))?>
<?=mk_option(_var($$scrub,'hour'), "*/2", _("Every 2 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/3", _("Every 3 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/4", _("Every 4 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/6", _("Every 6 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/8", _("Every 8 hours"))?>
</select></span>
&nbsp;
@@ -901,9 +937,9 @@ _(Time of the day)_:
</form>
<div class="title nocontrol"><span class="left"><i class="title fa fa-shield"></i>_(Check Filesystem Status)_</span></div>
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'btrfs-check-<?=$tag?>','/dev/<?=$disk['deviceSb']?> <?=$disk['id']?>')">
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'btrfs-check-<?=$tag?>','/dev/<?=_var($disk,'deviceSb')?> <?=_var($disk,'id')?>')">
<?if (maintenance_mode()):?>
<?exec("$docroot/webGui/scripts/btrfs_check status /dev/{$disk['deviceSb']} {$disk['id']}", $check_status, $retval)?>
<?exec("$docroot/webGui/scripts/btrfs_check status /dev/"._var($disk,'deviceSb')." "._var($disk,'id'), $check_status, $retval)?>
_(btrfs check status)_:
: <?echo "<pre id='btrfs-check'>".implode("\n", $check_status)."</pre>"?>
@@ -911,8 +947,8 @@ _(btrfs check status)_:
<?if ($retval != 0):?>
<input type="hidden" name="#command" value="/webGui/scripts/btrfs_check">
<input type="hidden" name="#arg[1]" value="start">
<input type="hidden" name="#arg[2]" value="/dev/<?=$disk['deviceSb']?>">
<input type="hidden" name="#arg[3]" value="<?=$disk['id']?>">
<input type="hidden" name="#arg[2]" value="/dev/<?=_var($disk,'deviceSb')?>">
<input type="hidden" name="#arg[3]" value="<?=_var($disk,'id')?>">
&nbsp;
: <input type="submit" value="_(Check)_"><input type="text" name="#arg[4]" class="narrow" maxlength="256" value="--readonly"> _(Options (see Help))_
@@ -922,8 +958,8 @@ _(btrfs check status)_:
<?else:?>
<input type="hidden" name="#command" value="/webGui/scripts/btrfs_check">
<input type="hidden" name="#arg[1]" value="cancel">
<input type="hidden" name="#arg[2]" value="/dev/<?=$disk['deviceSb']?>">
<input type="hidden" name="#arg[3]" value="<?=$disk['id']?>">
<input type="hidden" name="#arg[2]" value="/dev/<?=_var($disk,'deviceSb')?>">
<input type="hidden" name="#arg[3]" value="<?=_var($disk,'id')?>">
&nbsp;
: <input type="submit" value="_(Cancel)_"> *_(Running)_*
@@ -945,14 +981,14 @@ _(btrfs check status)_:
<?endif;?>
</form>
<?endif;?>
<?if (strpos($disk['fsType']??'',"zfs")!==false):?>
<div class="title nocontrol"><span class="left"><i class="title fa fa-paint-brush"></i>_(Scrub Status)_</span></div>
<?if (fsType('zfs')):?>
<div class="title nocontrol"><span class="left"><i class="title fa fa-info"></i>_(Pool Status)_</span></div>
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'zfs-scrub-<?=$tag?>','<?=$tag?>')">
<?if ($disk['fsStatus']=="Mounted"):?>
<?exec("$docroot/webGui/scripts/zfs_scrub status $tag", $scrub_status, $retval)?>
<?if (_var($disk,'fsStatus')=="Mounted"):?>
<?exec("$docroot/webGui/scripts/zfs_scrub status $tag", $zfs_status, $retval)?>
_(zfs scrub status)_:
: <?echo "<pre id='zfs-scrub'>".implode("\n", $scrub_status)."</pre>"?>
_(zfs pool status)_:
: <pre id='zfs-pool'><?=implode("\n",$zfs_status)?></pre>
<?if ($retval != 0):?>
<input type="hidden" name="#command" value="/webGui/scripts/zfs_scrub">
@@ -960,7 +996,7 @@ _(zfs scrub status)_:
<input type="hidden" name="#arg[2]" value="<?=$tag?>">
&nbsp;
: <input type="submit" value="_(Scrub)_">
: <input type="submit" id="scrub-button" value="_(Scrub)_">
:info_zfs_scrub_help:
@@ -993,55 +1029,55 @@ _(zfs scrub status)_:
_(Scrub schedule)_:
: <select name="mode" onchange="presetZFS(this.form,'#scrub-hour')">
<?for ($m=0; $m<count($mode); $m++):?>
<?=mk_option($$scrub['mode']??'', strval($m), _($mode[$m]))?>
<?=mk_option(_var($$scrub,'mode'), strval($m), _($mode[$m]))?>
<?endfor;?>
</select>
_(Day of the week)_:
: <select name="day">
<?for ($d=0; $d<count($days); $d++):?>
<?=mk_option($$scrub['day']??'', strval($d), _($days[$d]),0)?>
<?=mk_option(_var($$scrub,'day'), strval($d), _($days[$d]),0)?>
<?endfor;?>
<?=mk_option($$scrub['day']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($$scrub,'day'), "*", "--------", _("disabled"))?>
</select>
_(Day of the month)_:
: <select name="dotm">
<?for ($d=1; $d<=31; $d++):?>
<?=mk_option($$scrub['dotm']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$scrub,'dotm'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
<?=mk_option($$scrub['dotm']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($$scrub,'dotm'), "*", "--------", _("disabled"))?>
</select>
_(Time of the day)_:
: <span id="scrub-hour1" style="display:none"><select name="hour1" class="narrow">
<?for ($d=0; $d<=23; $d++):?>
<?=mk_option($$scrub['hour']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$scrub,'hour'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>
<select name="min" class="narrow">
<?for ($d=0; $d<=55; $d+=5):?>
<?=mk_option($$scrub['min']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($$scrub,'min'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>&nbsp;&nbsp;_(HH:MM)_</span>
: <span id="scrub-hour2" style="display:none"><select name="hour2">
<?=mk_option($$scrub['hour']??'', "*/1", _("Every hour"))?>
<?=mk_option($$scrub['hour']??'', "*/2", _("Every 2 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/3", _("Every 3 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/4", _("Every 4 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/6", _("Every 6 hours"))?>
<?=mk_option($$scrub['hour']??'', "*/8", _("Every 8 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/1", _("Every hour"))?>
<?=mk_option(_var($$scrub,'hour'), "*/2", _("Every 2 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/3", _("Every 3 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/4", _("Every 4 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/6", _("Every 6 hours"))?>
<?=mk_option(_var($$scrub,'hour'), "*/8", _("Every 8 hours"))?>
</select></span>
&nbsp;
: <input type="submit" name="#apply" value="_(Apply)_"><input type="button" value="_(Done)_" onclick="done()">
</form>
<?endif;?>
<?if (strpos($disk['fsType']??'',"reiserfs")!==false):?>
<?if (fsType('reiserfs')):?>
<div class="title nocontrol"><span class="left"><i class="title fa fa-shield"></i>_(Check Filesystem Status)_</span></div>
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'rfs-check-<?=$tag?>','/dev/<?=$disk['deviceSb']?> <?=$disk['id']?>')">
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'rfs-check-<?=$tag?>','/dev/<?=_var($disk,'deviceSb')?> <?=_var($disk,'id')?>')">
<?if (maintenance_mode()):?>
<?exec("$docroot/webGui/scripts/reiserfs_check status /dev/{$disk['deviceSb']} {$disk['id']}", $check_status, $retval)?>
<?exec("$docroot/webGui/scripts/reiserfs_check status /dev/"._var($disk,'deviceSb')." "._var($disk,'id'), $check_status, $retval)?>
_(reiserfsck status)_:
: <?echo "<pre id='rfs-check'>".implode("\n", $check_status)."</pre>"?>
@@ -1049,8 +1085,8 @@ _(reiserfsck status)_:
<?if ($retval != 0):?>
<input type="hidden" name="#command" value="/webGui/scripts/reiserfs_check">
<input type="hidden" name="#arg[1]" value="start">
<input type="hidden" name="#arg[2]" value="/dev/<?=$disk['deviceSb']?>">
<input type="hidden" name="#arg[3]" value="<?=$disk['id']?>">
<input type="hidden" name="#arg[2]" value="/dev/<?=_var($disk,'deviceSb')?>">
<input type="hidden" name="#arg[3]" value="<?=_var($disk,'id')?>">
&nbsp;
: <input type="submit" value="_(Check)_"><input type="text" name="#arg[4]" class="narrow" maxlength="256" value=""> _(Options (see Help))_
@@ -1060,8 +1096,8 @@ _(reiserfsck status)_:
<?else:?>
<input type="hidden" name="#command" value="/webGui/scripts/reiserfs_check">
<input type="hidden" name="#arg[1]" value="cancel">
<input type="hidden" name="#arg[2]" value="/dev/<?=$disk['deviceSb']?>">
<input type="hidden" name="#arg[3]" value="<?=$disk['id']?>">
<input type="hidden" name="#arg[2]" value="/dev/<?=_var($disk,'deviceSb')?>">
<input type="hidden" name="#arg[3]" value="<?=_var($disk,'id')?>">
&nbsp;
: <input type="submit" value="_(Cancel)_"> *_(Running)_*
@@ -1077,11 +1113,11 @@ _(reiserfsck status)_:
<?endif;?>
</form>
<?endif;?>
<?if (strpos($disk['fsType']??'',"xfs")!==false):?>
<?if (fsType('xfs')):?>
<div class="title nocontrol"><span class="left"><i class="title fa fa-shield"></i>_(Check Filesystem Status)_</span></div>
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'xfs-check-<?=$tag?>','/dev/<?=$disk['deviceSb']?> <?=$disk['id']?>')">
<form markdown="1" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareFS(this,'xfs-check-<?=$tag?>','/dev/<?=_var($disk,'deviceSb')?> <?=_var($disk,'id')?>')">
<?if (maintenance_mode()):?>
<?exec("$docroot/webGui/scripts/xfs_check status /dev/{$disk['deviceSb']} {$disk['id']}", $check_status, $retval)?>
<?exec("$docroot/webGui/scripts/xfs_check status /dev/"._var($disk,'deviceSb')." "._var($disk,'id'), $check_status, $retval)?>
_(xfs_repair status)_:
: <?echo "<pre id='xfs-check'>".implode("\n", $check_status)."</pre>"?>
@@ -1089,8 +1125,8 @@ _(xfs_repair status)_:
<?if ($retval != 0):?>
<input type="hidden" name="#command" value="/webGui/scripts/xfs_check">
<input type="hidden" name="#arg[1]" value="start">
<input type="hidden" name="#arg[2]" value="/dev/<?=$disk['deviceSb']?>">
<input type="hidden" name="#arg[3]" value="<?=$disk['id']?>">
<input type="hidden" name="#arg[2]" value="/dev/<?=_var($disk,'deviceSb')?>">
<input type="hidden" name="#arg[3]" value="<?=_var($disk,'id')?>">
&nbsp;
: <input type="submit" value="_(Check)_"><input type="text" name="#arg[4]" class="narrow" maxlength="256" value="-n"> _(Options (see Help))_
@@ -1100,7 +1136,7 @@ _(xfs_repair status)_:
<?else:?>
<input type="hidden" name="#command" value="/webGui/scripts/xfs_check">
<input type="hidden" name="#arg[1]" value="cancel">
<input type="hidden" name="#arg[2]" value="/dev/<?=$disk['deviceSb']?>">
<input type="hidden" name="#arg[2]" value="/dev/<?=_var($disk,'deviceSb')?>">
&nbsp;
: <input type="submit" value="_(Cancel)_"> *_(Running)_*
@@ -1117,78 +1153,78 @@ _(xfs_repair status)_:
</form>
<?endif;?>
<?if (strpos($disk['status']??'','_NP')===false):?>
<?if (!diskStatus('_NP')):?>
<div class="title"><span class="left"><i class="title fa fa-plus-square"></i>_(SMART Settings)_</span></div>
<form markdown="1" name="smart_settings" method="POST" action="/update.php" target="progressFrame" onsubmit="prepareDeviceInfo(this)">
<input type="hidden" name="#file" value="/boot/config/smart-one.cfg">
<input type="hidden" name="#include" value="webGui/include/update.smart.php">
<input type="hidden" name="#section" value="<?=$disk['id']?>">
<input type="hidden" name="#section" value="<?=_var($disk,'id')?>">
<input type="hidden" name="#cleanup" value="true">
<input type="hidden" name="smEvents" value="">
<input type="hidden" name="smGlue" value="<?=$var['smGlue']??''?>">
_(Warning disk temperature threshold)_ (&deg;<?=$display['unit']?>):
: <input type="number" min="0" max="300" name="hotTemp" class="narrow" value="<?=displayTemp($disk['hotTemp']??'')?>" placeholder="<?=displayTemp($display['hot'])?>">
<input type="hidden" name="smGlue" value="<?=_var($var,'smGlue')?>">
_(Warning disk temperature threshold)_ (&deg;<?=_var($display,'unit','C')?>):
: <input type="number" min="0" max="300" name="hotTemp" class="narrow" value="<?=displayTemp(_var($disk,'hotTemp'))?>" placeholder="<?=displayTemp(_var($display,'hot'))?>">
:info_warning_temp_help:
_(Critical disk temperature threshold)_ (&deg;<?=$display['unit']?>):
: <input type="number" min="0" max="300" name="maxTemp" class="narrow" value="<?=displayTemp($disk['maxTemp']??'')?>" placeholder="<?=displayTemp($display['max'])?>">
_(Critical disk temperature threshold)_ (&deg;<?=_var($display,'unit','C')?>):
: <input type="number" min="0" max="300" name="maxTemp" class="narrow" value="<?=displayTemp(_var($disk,'maxTemp'))?>" placeholder="<?=displayTemp(_var($display,'max'))?>">
:info_critical_temp_help:
_(SMART notification value)_:
: <select name="smSelect">
<?=mk_option($disk['smSelect']??'', "-1", _('Use default'))?>
<?=mk_option($disk['smSelect']??'', "0", _('Raw'))?>
<?=mk_option($disk['smSelect']??'', "1", _('Normalized'))?>
<?=mk_option(_var($disk,'smSelect'), "-1", _('Use default'))?>
<?=mk_option(_var($disk,'smSelect'), "0", _('Raw'))?>
<?=mk_option(_var($disk,'smSelect'), "1", _('Normalized'))?>
</select>
:info_smart_notifications_help:
_(SMART notification tolerance level)_:
: <select name="smLevel">
<?=mk_option($disk['smLevel']??'', "-1", _('Use default'))?>
<?=mk_option($disk['smLevel']??'', "1.00", _('Absolute'))?>
<?=mk_option($disk['smLevel']??'', "1.05", "5%")?>
<?=mk_option($disk['smLevel']??'', "1.10", "10%")?>
<?=mk_option($disk['smLevel']??'', "1.15", "15%")?>
<?=mk_option($disk['smLevel']??'', "1.20", "20%")?>
<?=mk_option($disk['smLevel']??'', "1.25", "25%")?>
<?=mk_option($disk['smLevel']??'', "1.50", "50%")?>
<?=mk_option(_var($disk,'smLevel'), "-1", _('Use default'))?>
<?=mk_option(_var($disk,'smLevel'), "1.00", _('Absolute'))?>
<?=mk_option(_var($disk,'smLevel'), "1.05", "5%")?>
<?=mk_option(_var($disk,'smLevel'), "1.10", "10%")?>
<?=mk_option(_var($disk,'smLevel'), "1.15", "15%")?>
<?=mk_option(_var($disk,'smLevel'), "1.20", "20%")?>
<?=mk_option(_var($disk,'smLevel'), "1.25", "25%")?>
<?=mk_option(_var($disk,'smLevel'), "1.50", "50%")?>
</select>
:info_tolerance_level_help:
_(SMART controller type)_:
: <select name="smType" onchange="setGlue(this.form,true)">
<?=mk_option($disk['smType']??'', "-1", _('Use default'))?>
<?=mk_option($disk['smType']??'', " ", _('Automatic'))?>
<?=mk_option($disk['smType']??'', "-d ata", "ATA")?>
<?=mk_option($disk['smType']??'', "-d nvme", "NVMe")?>
<?=mk_option($disk['smType']??'', "-d sat", "SAT")?>
<?=mk_option($disk['smType']??'', "-d scsi", "SCSI")?>
<?=mk_option($disk['smType']??'', "-d 3ware", "3Ware")?>
<?=mk_option($disk['smType']??'', "-d aacraid", "Adaptec")?>
<?=mk_option($disk['smType']??'', "-d areca", "Areca")?>
<?=mk_option($disk['smType']??'', "-d hpt", "HighPoint")?>
<?=mk_option($disk['smType']??'', "-d cciss", "HP cciss")?>
<?=mk_option($disk['smType']??'', "-d marvell", "Marvell")?>
<?=mk_option($disk['smType']??'', "-d megaraid", "MegaRAID")?>
<?=mk_option(_var($disk,'smType'), "-1", _('Use default'))?>
<?=mk_option(_var($disk,'smType'), " ", _('Automatic'))?>
<?=mk_option(_var($disk,'smType'), "-d ata", "ATA")?>
<?=mk_option(_var($disk,'smType'), "-d nvme", "NVMe")?>
<?=mk_option(_var($disk,'smType'), "-d sat", "SAT")?>
<?=mk_option(_var($disk,'smType'), "-d scsi", "SCSI")?>
<?=mk_option(_var($disk,'smType'), "-d 3ware", "3Ware")?>
<?=mk_option(_var($disk,'smType'), "-d aacraid", "Adaptec")?>
<?=mk_option(_var($disk,'smType'), "-d areca", "Areca")?>
<?=mk_option(_var($disk,'smType'), "-d hpt", "HighPoint")?>
<?=mk_option(_var($disk,'smType'), "-d cciss", "HP cciss")?>
<?=mk_option(_var($disk,'smType'), "-d marvell", "Marvell")?>
<?=mk_option(_var($disk,'smType'), "-d megaraid", "MegaRAID")?>
</select>
<input type="text" name="smPort1" value="<?=$disk['smPort1']??''?>" class="option"><select name="smPort1" class="narrow option" disabled></select>
<input type="text" name="smPort2" value="<?=$disk['smPort2']??''?>" class="option"><select name="smPort2" class="narrow option" disabled></select>
<input type="text" name="smPort3" value="<?=$disk['smPort3']??''?>" class="option"><select name="smPort3" class="narrow option" disabled></select><span id="devtext">/dev/</span>
<input type="text" name="smDevice" value="<?=$disk['smDevice']??''?>" class="option" placeholder="<?=$dev?>"><span id="helptext">_(enter disk index and device name as applicable to your controller)_</span>
<input type="text" name="smPort1" value="<?=_var($disk,'smPort1')?>" class="option"><select name="smPort1" class="narrow option" disabled></select>
<input type="text" name="smPort2" value="<?=_var($disk,'smPort2')?>" class="option"><select name="smPort2" class="narrow option" disabled></select>
<input type="text" name="smPort3" value="<?=_var($disk,'smPort3')?>" class="option"><select name="smPort3" class="narrow option" disabled></select><span id="devtext">/dev/</span>
<input type="text" name="smDevice" value="<?=_var($disk,'smDevice')?>" class="option" placeholder="<?=$dev?>"><span id="helptext">_(enter disk index and device name as applicable to your controller)_</span>
:info_controller_type_help:
_(SMART attribute notifications)_:
: <input type="text" name="smCustom" value="<?=$disk['smCustom']??$var['smCustom']??''?>" class="narrow">_(Custom attributes (use comma to separate numbers))_
<?for ($x=0; $x < count($preselect); $x++):?>
<?for ($x=0; $x<count($preselect); $x++):?>
&nbsp;
: <input type="checkbox" name="at<?=$x?>" value="<?=$preselect[$x]['code']??''?>"<?=in_array($preselect[$x]['code']??'',$events)?' checked':''?>><span class="code">_(Attribute)_ = <?=$preselect[$x]['code']?></span><?=$preselect[$x]['text']?>
: <input type="checkbox" name="at<?=$x?>" value="<?=_var($preselect[$x],'code')?>"<?=in_array(_var($preselect[$x],'code'),$events)?' checked':''?>><span class="code">_(Attribute)_ = <?=_var($preselect[$x],'code')?></span><?=_var($preselect[$x],'text')?>
<?endfor;?>
:info_attribute_notifications_help:
@@ -1214,15 +1250,15 @@ _(Name)_:
<input type="hidden" name="changeSlots" value="apply">
<input type="hidden" name="poolName" value="<?=$name?>">
<input type="hidden" name="poolSlots" value="0">
<input type='hidden' name='csrf_token' value='<?=$var['csrf_token']?>'>
<input type='hidden' name='csrf_token' value='<?=_var($var,'csrf_token')?>'>
</form>
<script>
$(function(){
<?if (strpos($disk['fsType']??'',"btrfs")!==false):?>
<?if (fsType('btrfs')):?>
presetBTRFS(document.balance_schedule,'#balance-hour');
presetBTRFS(document.scrub_schedule,'#scrub-hour');
<?elseif (strpos($disk['fsType']??'',"zfs")!==false):?>
<?elseif (fsType('zfs')):?>
presetZFS(document.scrub_schedule,'#scrub-hour');
<?endif;?>
});
+4 -4
View File
@@ -1,11 +1,11 @@
Menu="Shares:2"
Title="Disk Shares"
Tag="user-circle-o"
Cond="$var['fsState']!='Stopped' && $var['shareDisk']!='no'"
Cond="_var($var,'fsState')!='Stopped' && _var($var,'shareDisk')!='no'"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -22,7 +22,7 @@ function displayDisks(all) {
$('#disk_list').html("<tr><td colspan='8'><div class='spinner'></div></td></tr>");
$('div.spinner').html(unraid_logo);
}
$.get('/webGui/include/DiskList.php',{compute:all,path:'<?=$path?>',scale:'<?=$display['scale']?>',number:'<?=$display['number']?>',fill:$.cookie('ssz')},function(data){
$.get('/webGui/include/DiskList.php',{compute:all,path:'<?=$path?>',scale:'<?=_var($display,'scale')?>',number:'<?=_var($display,'number','.,')?>',fill:$.cookie('ssz')||''},function(data){
$.removeCookie('ssz')
$('#disk_list').html(data);
$('#compute-disks').prop('disabled',!data || data.indexOf('colspan=')!=-1);
+31 -31
View File
@@ -21,7 +21,7 @@ $events = explode('|',$var['smEvents'] ?? $numbers);
function displayTemp($temp) {
global $display;
return $display['unit']=='F' ? round(9/5*$temp)+32 : $temp;
return (is_numeric($temp) && _var($display,'unit')=='F') ? round(9/5*$temp)+32 : $temp;
}
?>
<style>
@@ -30,7 +30,7 @@ span.code{display:inline-block;width:186px}
<script>
function doDispatch(form) {
var fields = {};
<?if ($display['unit']=='F'):?>
<?if (_var($display,'unit')=='F'):?>
form.display_hot.value = Math.round((form.display_hot.value-32)*5/9);
form.display_max.value = Math.round((form.display_max.value-32)*5/9);
<?endif;?>
@@ -166,22 +166,22 @@ _(Tunable (md_write_method))_:
:disk_tunable_md_write_method_help:
_(Default warning disk utilization threshold)_ (%):
: <input type="number" min="0" max="100" name="display_warning" class="narrow" value="<?=$display['warning']?>">
: <input type="number" min="0" max="100" name="display_warning" class="narrow" value="<?=_var($display,'warning')?>">
:disk_default_warning_utilization_help:
_(Default critical disk utilization threshold)_ (%):
: <input type="number" min="0" max="100" name="display_critical" class="narrow" value="<?=$display['critical']?>">
: <input type="number" min="0" max="100" name="display_critical" class="narrow" value="<?=_var($display,'critical')?>">
:disk_default_critical_utilization_help:
_(Default warning disk temperature threshold)_ (&deg;<?=$display['unit']?>):
: <input type="number" min="0" max="300" name="display_hot" class="narrow" value="<?=displayTemp($display['hot'])?>">
_(Default warning disk temperature threshold)_ (&deg;<?=_var($display,'unit','C')?>):
: <input type="number" min="0" max="300" name="display_hot" class="narrow" value="<?=displayTemp(_var($display,'hot'))?>">
:disk_default_warning_temperature_help:
_(Default critical disk temperature threshold)_ (&deg;<?=$display['unit']?>):
: <input type="number" min="0" max="300" name="display_max" class="narrow" value="<?=displayTemp($display['max'])?>">
_(Default critical disk temperature threshold)_ (&deg;<?=_var($display,'unit','C')?>):
: <input type="number" min="0" max="300" name="display_max" class="narrow" value="<?=displayTemp(_var($display,'max'))?>">
:disk_default_critical_temperature_help:
@@ -200,49 +200,49 @@ _(Default critical disk temperature threshold)_ (&deg;<?=$display['unit']?>):
<input type="hidden" name="smIndex" value="0">
_(Default SMART notification value)_:
: <select name="smSelect" size="1">
<?=mk_option($var['smSelect']??'', "0", _('Raw'))?>
<?=mk_option($var['smSelect']??'', "1", _('Normalized'))?>
<?=mk_option(_var($var,'smSelect'), "0", _('Raw'))?>
<?=mk_option(_var($var,'smSelect'), "1", _('Normalized'))?>
</select>
:disk_default_smart_notification_help:
_(Default SMART notification tolerance level)_:
: <select name="smLevel" size="1">
<?=mk_option($var['smLevel']??'', "1.00", _('Absolute'))?>
<?=mk_option($var['smLevel']??'', "1.05", "5%")?>
<?=mk_option($var['smLevel']??'', "1.10", "10%")?>
<?=mk_option($var['smLevel']??'', "1.15", "15%")?>
<?=mk_option($var['smLevel']??'', "1.20", "20%")?>
<?=mk_option($var['smLevel']??'', "1.25", "25%")?>
<?=mk_option($var['smLevel']??'', "1.50", "50%")?>
<?=mk_option(_var($var,'smLevel'), "1.00", _('Absolute'))?>
<?=mk_option(_var($var,'smLevel'), "1.05", "5%")?>
<?=mk_option(_var($var,'smLevel'), "1.10", "10%")?>
<?=mk_option(_var($var,'smLevel'), "1.15", "15%")?>
<?=mk_option(_var($var,'smLevel'), "1.20", "20%")?>
<?=mk_option(_var($var,'smLevel'), "1.25", "25%")?>
<?=mk_option(_var($var,'smLevel'), "1.50", "50%")?>
</select>
:disk_default_smart_tolerance_help:
_(Default SMART controller type)_:
: <select name="smType" size="1" onchange="setIndex(this.form)">
<?=mk_option($var['smType']??'', "", _('Automatic'))?>
<?=mk_option($var['smType']??'', "-d ata", "ATA")?>
<?=mk_option($var['smType']??'', "-d nvme", "NVMe")?>
<?=mk_option($var['smType']??'', "-d sat", "SAT")?>
<?=mk_option($var['smType']??'', "-d scsi", "SCSI")?>
<?=mk_option($var['smType']??'', "-d 3ware", "3Ware")?>
<?=mk_option($var['smType']??'', "-d aacraid", "Adaptec")?>
<?=mk_option($var['smType']??'', "-d areca", "Areca")?>
<?=mk_option($var['smType']??'', "-d hpt", "HighPoint")?>
<?=mk_option($var['smType']??'', "-d cciss", "HP cciss")?>
<?=mk_option($var['smType']??'', "-d marvell", "Marvell")?>
<?=mk_option($var['smType']??'', "-d megaraid", "MegaRAID")?>
<?=mk_option(_var($var,'smType'), "", _('Automatic'))?>
<?=mk_option(_var($var,'smType'), "-d ata", "ATA")?>
<?=mk_option(_var($var,'smType'), "-d nvme", "NVMe")?>
<?=mk_option(_var($var,'smType'), "-d sat", "SAT")?>
<?=mk_option(_var($var,'smType'), "-d scsi", "SCSI")?>
<?=mk_option(_var($var,'smType'), "-d 3ware", "3Ware")?>
<?=mk_option(_var($var,'smType'), "-d aacraid", "Adaptec")?>
<?=mk_option(_var($var,'smType'), "-d areca", "Areca")?>
<?=mk_option(_var($var,'smType'), "-d hpt", "HighPoint")?>
<?=mk_option(_var($var,'smType'), "-d cciss", "HP cciss")?>
<?=mk_option(_var($var,'smType'), "-d marvell", "Marvell")?>
<?=mk_option(_var($var,'smType'), "-d megaraid", "MegaRAID")?>
</select>
:disk_default_smart_controller_help:
_(Default SMART attribute notifications)_:
: <input type="text" name="smCustom" value="<?=$var['smCustom']??''?>" class="narrow">_(Custom attributes (use comma to separate numbers))_
: <input type="text" name="smCustom" value="<?=_var($var,'smCustom')?>" class="narrow">_(Custom attributes (use comma to separate numbers))_
<?for ($x = 0; $x < count($preselect); $x++):?>
&nbsp;
: <input type="checkbox" name="at<?=$x?>" value="<?=$preselect[$x]['code']??''?>"<?=in_array($preselect[$x]['code']??'',$events)?' checked':''?>><span class="code">_(Attribute)_ = <?=$preselect[$x]['code']?></span><?=$preselect[$x]['text']?>
: <input type="checkbox" name="at<?=$x?>" value="<?=_var($preselect[$x],'code')?>"<?=in_array(_var($preselect[$x],'code'),$events)?' checked':''?>><span class="code">_(Attribute)_ = <?=_var($preselect[$x],'code')?></span><?=_var($preselect[$x],'text')?>
<?endfor;?>
:disk_default_smart_attribute_help:
+130 -130
View File
@@ -450,7 +450,7 @@ $(function() {
<input type="hidden" name="BRFD" value="0">
_(Interface description)_:
: <span class="status vshift"><i id="tag-eth0" class="fa fa-fw fa-chevron-down" style="cursor:pointer" onclick="viewToggle('eth0')"></i></span>
<input type="text" name="DESCRIPTION:0" maxlength="80" value="<?=htmlspecialchars($eth0["DESCRIPTION:0"]??'')?>" onchange="exitCode(this.form,true)">
<input type="text" name="DESCRIPTION:0" maxlength="80" value="<?=htmlspecialchars(_var($eth0,"DESCRIPTION:0"))?>" onchange="exitCode(this.form,true)">
:eth_interface_description_help:
@@ -462,8 +462,8 @@ _(MAC address)_:
_(Enable bonding)_:
: <select name="BONDING" onchange="checkBondingSettings(this.form,1,'eth0')">
<?=mk_option($eth0['BONDING']??'', "no", _("No"))?>
<?=mk_option($eth0['BONDING']??'', "yes", _("Yes"))?>
<?=mk_option(_var($eth0,'BONDING'), "no", _("No"))?>
<?=mk_option(_var($eth0,'BONDING'), "yes", _("Yes"))?>
</select>
:eth_enable_bonding_help:
@@ -471,13 +471,13 @@ _(Enable bonding)_:
<div markdown="1" id="bond-members-eth0" style="display:none">
_(Bonding mode)_:
: <select name="BONDING_MODE" onchange="checkBondingSettings(this.form,-1,'eth0')">
<?=mk_option($eth0['BONDING_MODE']??'', "0", _("balance-rr")." (0)")?>
<?=mk_option($eth0['BONDING_MODE']??'', "1", _("active-backup")." (1)",isset($eth0['BONDING_MODE'])?'':'selected')?>
<?=mk_option($eth0['BONDING_MODE']??'', "2", _("balance-xor")." (2)")?>
<?=mk_option($eth0['BONDING_MODE']??'', "3", _("broadcast")." (3)")?>
<?=mk_option($eth0['BONDING_MODE']??'', "4", _("802.3ad")." (4)")?>
<?=mk_option($eth0['BONDING_MODE']??'', "5", _("balance-tlb")." (5)")?>
<?=mk_option($eth0['BONDING_MODE']??'', "6", _("balance-alb")." (6)")?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "0", _("balance-rr")." (0)")?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "1", _("active-backup")." (1)",isset($eth0['BONDING_MODE'])?'':'selected')?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "2", _("balance-xor")." (2)")?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "3", _("broadcast")." (3)")?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "4", _("802.3ad")." (4)")?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "5", _("balance-tlb")." (5)")?>
<?=mk_option(_var($eth0,'BONDING_MODE'), "6", _("balance-alb")." (6)")?>
</select>
<span id="attention0" style="display:none">**_(Attention)_:** _(this mode requires a network switch with proper setup and support)_...</span>
@@ -485,9 +485,9 @@ _(Bonding mode)_:
_(Bonding members of)_ bond0:
: <select id="bond-eth0" name="BONDNICS" multiple="multiple" style="display:none">
<?=mk_option($eth0['BONDNICS']??'','eth0','eth0','selected disabled')?>
<?=mk_option(_var($eth0,'BONDNICS'),'eth0','eth0','selected disabled')?>
<?foreach ($ports as $port):?>
<?if (!locked('eth0',$port)) echo mk_option_check($eth0['BONDNICS']??'',$port,$port)?>
<?if (!locked('eth0',$port)) echo mk_option_check(_var($eth0,'BONDNICS'),$port,$port)?>
<?endforeach;?>
</select>
@@ -496,8 +496,8 @@ _(Bonding members of)_ bond0:
</div>
_(Enable bridging)_:
: <select name="BRIDGING" onchange="checkBridgingSettings(this.form,1,'eth0')">
<?=mk_option($eth0['BRIDGING']??'', "no", _("No"))?>
<?=mk_option($eth0['BRIDGING']??'', "yes", _("Yes"))?>
<?=mk_option(_var($eth0,'BRIDGING'), "no", _("No"))?>
<?=mk_option(_var($eth0,'BRIDGING'), "yes", _("Yes"))?>
</select>
:eth_enable_bridging_help:
@@ -505,9 +505,9 @@ _(Enable bridging)_:
<div markdown="1" id="bridge-members-eth0" style="display:none">
_(Bridging members of)_ br0:
: <select id="bridge-eth0" name="BRNICS" multiple="multiple" style="display:none">
<?=mk_option($eth0['BRNICS']??'','eth0','eth0','selected disabled')?>
<?=mk_option(_var($eth0,'BRNICS'),'eth0','eth0','selected disabled')?>
<?foreach ($ports as $port):?>
<?if (!locked('eth0',$port)) echo mk_option_check($eth0['BRNICS']??'',$port,$port)?>
<?if (!locked('eth0',$port)) echo mk_option_check(_var($eth0,'BRNICS'),$port,$port)?>
<?endforeach;?>
</select>
@@ -516,9 +516,9 @@ _(Bridging members of)_ br0:
</div>
_(Network protocol)_:
: <select name="PROTOCOL:0" onchange="selectProtocol(this.form,'eth0',0)">
<?=mk_option($eth0["PROTOCOL:0"]??'', 'ipv4', _('IPv4 only'))?>
<?=mk_option($eth0["PROTOCOL:0"]??'', 'ipv6', _('IPv6 only'))?>
<?=mk_option($eth0["PROTOCOL:0"]??'', 'ipv4+ipv6', _('IPv4 + IPv6'))?>
<?=mk_option(_var($eth0,"PROTOCOL:0"), 'ipv4', _('IPv4 only'))?>
<?=mk_option(_var($eth0,"PROTOCOL:0"), 'ipv6', _('IPv6 only'))?>
<?=mk_option(_var($eth0,"PROTOCOL:0"), 'ipv4+ipv6', _('IPv4 + IPv6'))?>
</select>
:eth_network_protocol_help:
@@ -526,65 +526,65 @@ _(Network protocol)_:
<div markdown="1" class="ipv4-eth0-0" style="display:none">
_(IPv4 address assignment)_:
: <select name="USE_DHCP:0" onchange="selectProtocol(this.form,'eth0',0)">
<?=mk_option($eth0["USE_DHCP:0"]??'', 'yes', _('Automatic'))?>
<?=mk_option($eth0["USE_DHCP:0"]??'', 'no', _('Static'))?>
<?=mk_option(_var($eth0,"USE_DHCP:0"), 'yes', _('Automatic'))?>
<?=mk_option(_var($eth0,"USE_DHCP:0"), 'no', _('Static'))?>
</select>
:eth_ipv4_address_assignment_help:
<div markdown="1" class="more-ipv4-eth0-0" style="display:none">
_(IPv4 address)_:
: <input type="text" name="IPADDR:0" maxlength="15" value="<?=$eth0["IPADDR:0"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:0" class="slim">
<?=mk_option($eth0["NETMASK:0"]??'', "255.0.0.0", "8")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.0.0", "16")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.128.0", "17")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.192.0", "18")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.224.0", "19")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.240.0", "20")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.248.0", "21")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.252.0", "22")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.254.0", "23")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.0", "24", $eth0["IPADDR:0"]?"":"selected")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.128", "25")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.192", "26")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.224", "27")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.240", "28")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.248", "29")?>
<?=mk_option($eth0["NETMASK:0"]??'', "255.255.255.252", "30")?>
: <input type="text" name="IPADDR:0" maxlength="15" value="<?=_var($eth0,"IPADDR:0")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:0" class="slim">
<?=mk_option(_var($eth0,"NETMASK:0"), "255.0.0.0", "8")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.0.0", "16")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.128.0", "17")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.192.0", "18")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.224.0", "19")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.240.0", "20")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.248.0", "21")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.252.0", "22")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.254.0", "23")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.0", "24", $eth0["IPADDR:0"]?"":"selected")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.128", "25")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.192", "26")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.224", "27")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.240", "28")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.248", "29")?>
<?=mk_option(_var($eth0,"NETMASK:0"), "255.255.255.252", "30")?>
</select>
:eth_ipv4_address_help:
_(IPv4 default gateway)_:
: <input type="text" name="GATEWAY:0" maxlength="15" value="<?=$eth0["GATEWAY:0"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:0" min="0" max="9999" value="<?=$eth0["METRIC:0"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY:0" maxlength="15" value="<?=_var($eth0,"GATEWAY:0")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:0" min="0" max="9999" value="<?=_var($eth0,"METRIC:0")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv4_default_gateway_help:
</div>
_(IPv4 DNS server assignment)_:
: <select name="DHCP_KEEPRESOLV" onchange="checkDNSSettings(this.form)">
<?=mk_option($eth0['DHCP_KEEPRESOLV']??'', "no", _("Automatic"))?>
<?=mk_option($eth0['DHCP_KEEPRESOLV']??'', "yes", _("Static"))?>
<?=mk_option(_var($eth0,'DHCP_KEEPRESOLV'), "no", _("Automatic"))?>
<?=mk_option(_var($eth0,'DHCP_KEEPRESOLV'), "yes", _("Static"))?>
</select>
:eth_ipv4_dns_server_assignment_help:
_(IPv4 DNS server)_:
: <input type="text" name="DNS_SERVER1" maxlength="15" value="<?=$eth0['DNS_SERVER1']??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
: <input type="text" name="DNS_SERVER1" maxlength="15" value="<?=_var($eth0,'DNS_SERVER1')?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
:eth_ipv4_dns_server_help:
<div markdown="1" id="dnsserver2" style="display:none">
_(IPv4 DNS server)_ 2:
: <input type="text" name="DNS_SERVER2" maxlength="15" value="<?=$eth0['DNS_SERVER2']??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
: <input type="text" name="DNS_SERVER2" maxlength="15" value="<?=_var($eth0,'DNS_SERVER2')?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
:eth_ipv4_dns_server2_help:
</div>
<div markdown="1" id="dnsserver3" style="display:none">
_(IPv4 DNS server)_ 3:
: <input type="text" name="DNS_SERVER3" maxlength="15" value="<?=$eth0['DNS_SERVER3']??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
: <input type="text" name="DNS_SERVER3" maxlength="15" value="<?=_var($eth0,'DNS_SERVER3')?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
:eth_ipv4_dns_server3_help:
@@ -593,28 +593,28 @@ _(IPv4 DNS server)_ 3:
<div markdown="1" class="ipv6-eth0-0" style="display:none">
_(IPv6 address assignment)_:
: <select name="USE_DHCP6:0" onchange="selectProtocol(this.form,'eth0',0)">
<?=mk_option($eth0["USE_DHCP6:0"]??'', 'yes', _('Automatic'))?>
<?=mk_option($eth0["USE_DHCP6:0"]??'', 'no', _('Static'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:0"), 'yes', _('Automatic'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:0"), 'no', _('Static'))?>
</select>
:eth_ipv6_address_assignment_help:
<div markdown="1" class="more-ipv6-eth0-0" style="display:none">
_(IPv6 address)_:
: <input type="text" name="IPADDR6:0" maxlength="39" value="<?=$eth0["IPADDR6:0"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:0" min="1" max="128" value="<?=$eth0["NETMASK6:0"]??''?>" class="slim">
: <input type="text" name="IPADDR6:0" maxlength="39" value="<?=_var($eth0,"IPADDR6:0")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:0" min="1" max="128" value="<?=_var($eth0,"NETMASK6:0")?>" class="slim">
:eth_ipv6_address_help:
_(IPv6 default gateway)_:
: <input type="text" name="GATEWAY6:0" maxlength="39" value="<?=$eth0["GATEWAY6:0"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:0" min="0" max="9999" value="<?=$eth0["METRIC6:0"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY6:0" maxlength="39" value="<?=_var($eth0,"GATEWAY6:0")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:0" min="0" max="9999" value="<?=_var($eth0,"METRIC6:0")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv6_default_gateway_help:
_(IPv6 privacy extensions)_:
: <select name="PRIVACY6:0">
<?=mk_option($eth0["PRIVACY6:0"]??'', "0", _("Disabled"))?>
<?=mk_option($eth0["PRIVACY6:0"]??'', "2", _("Enabled"))?>
<?=mk_option(_var($eth0,"PRIVACY6:0"), "0", _("Disabled"))?>
<?=mk_option(_var($eth0,"PRIVACY6:0"), "2", _("Enabled"))?>
</select>
:eth_ipv6_privacy_extensions_help:
@@ -623,42 +623,42 @@ _(IPv6 privacy extensions)_:
<div markdown="1" id="dns6server1" style="display:none">
_(IPv6 DNS server assignment)_:
: <select name="DHCP6_KEEPRESOLV" onchange="checkDNSSettings6(this.form)">
<?=mk_option($eth0['DHCP6_KEEPRESOLV']??'', "no", _("Automatic"))?>
<?=mk_option($eth0['DHCP6_KEEPRESOLV']??'', "yes", _("Static"))?>
<?=mk_option(_var($eth0,'DHCP6_KEEPRESOLV'), "no", _("Automatic"))?>
<?=mk_option(_var($eth0,'DHCP6_KEEPRESOLV'), "yes", _("Static"))?>
</select>
:eth_ipv6_dns_server_assignment_help:
_(IPv6 DNS server)_:
: <input type="text" name="DNS6_SERVER1" maxlength="39" value="<?=$eth0['DNS6_SERVER1']??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
: <input type="text" name="DNS6_SERVER1" maxlength="39" value="<?=_var($eth0,'DNS6_SERVER1')?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
:eth_ipv6_dns_server_help:
</div>
<div markdown="1" id="dns6server2" style="display:none">
_(IPv6 DNS server)_ 2:
: <input type="text" name="DNS6_SERVER2" maxlength="39" value="<?=$eth0['DNS6_SERVER2']??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
: <input type="text" name="DNS6_SERVER2" maxlength="39" value="<?=_var($eth0,'DNS6_SERVER2')?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
:eth_ipv6_dns_server2_help:
</div>
<div markdown="1" id="dns6server3" style="display:none">
_(IPv6 DNS server)_ 3:
: <input type="text" name="DNS6_SERVER3" maxlength="39" value="<?=$eth0['DNS6_SERVER3']??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
: <input type="text" name="DNS6_SERVER3" maxlength="39" value="<?=_var($eth0,'DNS6_SERVER3')?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
:eth_ipv6_dns_server3_help:
</div>
</div>
_(Desired MTU)_:
: <input type="number" name="MTU" min="68" max="9198" value="<?=$eth0['MTU']??''?>" class="narrow" placeholder="1500">
: <input type="number" name="MTU" min="68" max="9198" value="<?=_var($eth0,'MTU')?>" class="narrow" placeholder="1500">
:eth_desired_mtu_help:
_(Enable VLANs)_:
: <select name="TYPE" onchange="checkNetworkAccess(this.form,'eth0')">
<?=mk_option($eth0['TYPE']??'', 'access', _('No'))?>
<?=mk_option($eth0['TYPE']??'', 'trunk', _('Yes'))?>
<?=mk_option(_var($eth0,'TYPE'), 'access', _('No'))?>
<?=mk_option(_var($eth0,'TYPE'), 'trunk', _('Yes'))?>
</select>
:eth_enable_vlans_help:
@@ -669,22 +669,22 @@ _(Enable VLANs)_:
<div markdown="1" id="index-eth0-<?=$i?>" class="access-eth0 shade-<?=$display['theme']?>" style="display:none">
_(Interface description)_:
: <span class="status vshift"><i id="tag-eth0-<?=$i?>" class="fa fa-fw fa-chevron-down" style="cursor:pointer" onclick="viewToggle('eth0','<?=$i?>')"></i></span>
<input type="text" name="DESCRIPTION:<?=$i?>" maxlength="80" value="<?=htmlspecialchars($eth0["DESCRIPTION:$i"]??'')?>" onchange="exitCode(this.form,true)">
<input type="text" name="DESCRIPTION:<?=$i?>" maxlength="80" value="<?=htmlspecialchars(_var($eth0,"DESCRIPTION:$i"))?>" onchange="exitCode(this.form,true)">
:eth_interface_description_help:
<div markdown="1" id="view-eth0-<?=$i?>" style="display:none">
_(VLAN number)_:
: <input type="number" name="VLANID:<?=$i?>" min="1" max="4095" value="<?=$eth0["VLANID:$i"]??''?>" class="narrow gap" required>
: <input type="number" name="VLANID:<?=$i?>" min="1" max="4095" value="<?=_var($eth0,"VLANID:$i")?>" class="narrow gap" required>
<?if (!$service):?><input type="button" class="form" value="_(Delete VLAN)_" onclick="removeVLAN($('#index-eth0-<?=$i?>'))"><?endif;?>
:eth_vlan_number_help:
_(Network protocol)_:
: <select name="PROTOCOL:<?=$i?>" onchange="selectProtocol(this.form,'eth0',<?=$i?>)">
<?=mk_option($eth0["PROTOCOL:$i"]??'', 'ipv4', _('IPv4 only'))?>
<?=mk_option($eth0["PROTOCOL:$i"]??'', 'ipv6', _('IPv6 only'))?>
<?=mk_option($eth0["PROTOCOL:$i"]??'', 'ipv4+ipv6', _('IPv4 + IPv6'))?>
<?=mk_option(_var($eth0,"PROTOCOL:$i"), 'ipv4', _('IPv4 only'))?>
<?=mk_option(_var($eth0,"PROTOCOL:$i"), 'ipv6', _('IPv6 only'))?>
<?=mk_option(_var($eth0,"PROTOCOL:$i"), 'ipv4+ipv6', _('IPv4 + IPv6'))?>
</select>
:eth_network_protocol_help:
@@ -692,10 +692,10 @@ _(Network protocol)_:
<div markdown="1" class="ipv4-eth0-<?=$i?>" style="display:none">
_(IPv4 address assignment)_:
: <select name="USE_DHCP:<?=$i?>" onchange="selectProtocol(this.form,'eth0',<?=$i?>)">
<?=mk_option($eth0["USE_DHCP:$i"]??'', 'yes', _('Automatic'))?>
<?=mk_option($eth0["USE_DHCP:$i"]??'', 'no', _('Static'))?>
<?=mk_option(_var($eth0,"USE_DHCP:$i"), 'yes', _('Automatic'))?>
<?=mk_option(_var($eth0,"USE_DHCP:$i"), 'no', _('Static'))?>
<?if ($i>0):?>
<?=mk_option($eth0["USE_DHCP:$i"]??'', '', _('None'))?>
<?=mk_option(_var($eth0,"USE_DHCP:$i"), '', _('None'))?>
<?endif;?>
</select>
@@ -703,30 +703,30 @@ _(IPv4 address assignment)_:
<div markdown="1" class="more-ipv4-eth0-<?=$i?>" style="display:none">
_(IPv4 address)_:
: <input type="text" name="IPADDR:<?=$i?>" maxlength="15" value="<?=$eth0["IPADDR:$i"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:<?=$i?>" class="slim">
<?=mk_option($eth0["NETMASK:$i"]??'', "255.0.0.0", "8")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.0.0", "16")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.128.0", "17")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.192.0", "18")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.224.0", "19")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.240.0", "20")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.248.0", "21")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.252.0", "22")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.254.0", "23")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.0", "24", $eth0["IPADDR:$i"]??''?"":"selected")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.128", "25")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.192", "26")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.224", "27")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.240", "28")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.248", "29")?>
<?=mk_option($eth0["NETMASK:$i"]??'', "255.255.255.252", "30")?>
: <input type="text" name="IPADDR:<?=$i?>" maxlength="15" value="<?=_var($eth0,"IPADDR:$i")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:<?=$i?>" class="slim">
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.0.0.0", "8")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.0.0", "16")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.128.0", "17")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.192.0", "18")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.224.0", "19")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.240.0", "20")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.248.0", "21")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.252.0", "22")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.254.0", "23")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.0", "24", _var($eth0,"IPADDR:$i")?"":"selected")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.128", "25")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.192", "26")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.224", "27")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.240", "28")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.248", "29")?>
<?=mk_option(_var($eth0,"NETMASK:$i"), "255.255.255.252", "30")?>
</select>
:eth_ipv4_address_help:
_(IPv4 default gateway)_:
: <input type="text" name="GATEWAY:<?=$i?>" maxlength="15" value="<?=$eth0["GATEWAY:$i"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:<?=$i?>" min="0" max="9999" value="<?=$eth0["METRIC:$i"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY:<?=$i?>" maxlength="15" value="<?=_var($eth0,"GATEWAY:$i")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:<?=$i?>" min="0" max="9999" value="<?=_var($eth0,"METRIC:$i")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv4_default_gateway_help:
@@ -735,10 +735,10 @@ _(IPv4 default gateway)_:
<div markdown="1" class="ipv6-eth0-<?=$i?>" style="display:none">
_(IPv6 address assignment)_:
: <select name="USE_DHCP6:<?=$i?>" onchange="selectProtocol(this.form,'eth0',<?=$i?>)">
<?=mk_option($eth0["USE_DHCP6:$i"]??'', 'yes', _('Automatic'))?>
<?=mk_option($eth0["USE_DHCP6:$i"]??'', 'no', _('Static'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:$i"), 'yes', _('Automatic'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:$i"), 'no', _('Static'))?>
<?if ($i>0):?>
<?=mk_option($eth0["USE_DHCP6:$i"]??'', '', _('None'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:$i"), '', _('None'))?>
<?endif;?>
</select>
@@ -746,20 +746,20 @@ _(IPv6 address assignment)_:
<div markdown="1" class="more-ipv6-eth0-<?=$i?>" style="display:none">
_(IPv6 address)_:
: <input type="text" name="IPADDR6:<?=$i?>" maxlength="39" value="<?=$eth0["IPADDR6:$i"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:<?=$i?>" min="1" max="128" value="<?=$eth0["NETMASK6:$i"]??''?>" class="slim">
: <input type="text" name="IPADDR6:<?=$i?>" maxlength="39" value="<?=_var($eth0,"IPADDR6:$i")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:<?=$i?>" min="1" max="128" value="<?=_var($eth0,"NETMASK6:$i")?>" class="slim">
:eth_ipv6_address_help:
_(IPv6 default gateway)_:
: <input type="text" name="GATEWAY6:<?=$i?>" maxlength="39" value="<?=$eth0["GATEWAY6:$i"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:<?=$i?>" min="0" max="9999" value="<?=$eth0["METRIC6:$i"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY6:<?=$i?>" maxlength="39" value="<?=_var($eth0,"GATEWAY6:$i")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:<?=$i?>" min="0" max="9999" value="<?=_var($eth0,"METRIC6:$i")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv6_default_gateway_help:
_(IPv6 privacy extensions)_:
: <select name="PRIVACY6:<?=$i?>">
<?=mk_option($eth0["PRIVACY6:$i"]??'', "0", _("Disabled"))?>
<?=mk_option($eth0["PRIVACY6:$i"]??'', "2", _("Enabled"))?>
<?=mk_option(_var($eth0,"PRIVACY6:$i"), "0", _("Disabled"))?>
<?=mk_option(_var($eth0,"PRIVACY6:$i"), "2", _("Enabled"))?>
</select>
:eth_ipv6_privacy_extensions_help:
@@ -781,75 +781,75 @@ _(IPv6 privacy extensions)_:
<div markdown="1" id="index-eth0-INDEX" class="access-eth0 shade-<?=$display['theme']?>">
_(Interface description)_:
: <span class="status vshift"><i id="tag-eth0-INDEX" class="fa fa-fw fa-chevron-up" style="cursor:pointer" onclick="viewToggle('eth0','INDEX')"></i></span>
<input type="text" name="DESCRIPTION:INDEX" maxlength="80" value="<?=htmlspecialchars($eth0["DESCRIPTION:INDEX"]??'')?>" onchange="exitCode(this.form,true)">
<input type="text" name="DESCRIPTION:INDEX" maxlength="80" value="<?=htmlspecialchars(_var($eth0,"DESCRIPTION:INDEX"))?>" onchange="exitCode(this.form,true)">
<div markdown="1" id="view-eth0-INDEX">
_(VLAN number)_:
: <input type="number" name="VLANID:INDEX" min="1" max="4095" value="<?=$eth0["VLANID:INDEX"]??''?>" class="narrow gap" required>
: <input type="number" name="VLANID:INDEX" min="1" max="4095" value="<?=_var($eth0,"VLANID:INDEX")?>" class="narrow gap" required>
<input type="button" class="form" value="_(Delete VLAN)_" onclick="removeVLAN($('#index-eth0-INDEX'))">
_(Network protocol)_:
: <select name="PROTOCOL:INDEX" onchange="selectProtocol(this.form,'eth0',INDEX)">
<?=mk_option($eth0["PROTOCOL:INDEX"]??'', 'ipv4', _('IPv4 only'))?>
<?=mk_option($eth0["PROTOCOL:INDEX"]??'', 'ipv6', _('IPv6 only'))?>
<?=mk_option($eth0["PROTOCOL:INDEX"]??'', 'ipv4+ipv6', _('IPv4 + IPv6'))?>
<?=mk_option(_var($eth0,"PROTOCOL:INDEX"), 'ipv4', _('IPv4 only'))?>
<?=mk_option(_var($eth0,"PROTOCOL:INDEX"), 'ipv6', _('IPv6 only'))?>
<?=mk_option(_var($eth0,"PROTOCOL:INDEX"), 'ipv4+ipv6', _('IPv4 + IPv6'))?>
</select>
<div markdown="1" class="ipv4-eth0-INDEX" style="display:none">
_(IPv4 address assignment)_:
: <select name="USE_DHCP:INDEX" onchange="selectProtocol(this.form,'eth0',INDEX)">
<?=mk_option($eth0["USE_DHCP:INDEX"]??'', 'yes', _('Automatic'))?>
<?=mk_option($eth0["USE_DHCP:INDEX"]??'', 'no', _('Static'))?>
<?=mk_option($eth0["USE_DHCP:INDEX"]??'', '', _('None'))?>
<?=mk_option(_var($eth0,"USE_DHCP:INDEX"), 'yes', _('Automatic'))?>
<?=mk_option(_var($eth0,"USE_DHCP:INDEX"), 'no', _('Static'))?>
<?=mk_option(_var($eth0,"USE_DHCP:INDEX"), '', _('None'))?>
</select>
<div markdown="1" class="more-ipv4-eth0-INDEX" style="display:none">
_(IPv4 address)_:
: <input type="text" name="IPADDR:INDEX" maxlength="15" value="<?=$eth0["IPADDR:INDEX"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="=_(IPv4 address A.B.C.D)_">/<select name="NETMASK:INDEX" class="slim">
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.0.0.0", "8")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.0.0", "16")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.128.0", "17")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.192.0", "18")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.224.0", "19")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.240.0", "20")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.248.0", "21")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.252.0", "22")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.254.0", "23")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.0", "24", "selected")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.128", "25")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.192", "26")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.224", "27")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.240", "28")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.248", "29")?>
<?=mk_option($eth0["NETMASK:INDEX"]??'', "255.255.255.252", "30")?>
: <input type="text" name="IPADDR:INDEX" maxlength="15" value="<?=_var($eth0,"IPADDR:INDEX")?>" class="narrow" pattern="<?=$validIP4?>" title="=_(IPv4 address A.B.C.D)_">/<select name="NETMASK:INDEX" class="slim">
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.0.0.0", "8")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.0.0", "16")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.128.0", "17")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.192.0", "18")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.224.0", "19")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.240.0", "20")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.248.0", "21")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.252.0", "22")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.254.0", "23")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.0", "24", "selected")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.128", "25")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.192", "26")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.224", "27")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.240", "28")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.248", "29")?>
<?=mk_option(_var($eth0,"NETMASK:INDEX"), "255.255.255.252", "30")?>
</select>
_(IPv4 default gateway)_:
: <input type="text" name="GATEWAY:INDEX" maxlength="15" value="<?=$eth0["GATEWAY:INDEX"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:INDEX" min="1" max="9999" value="<?=$eth0["METRIC:INDEX"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY:INDEX" maxlength="15" value="<?=_var($eth0,"GATEWAY:INDEX")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:INDEX" min="1" max="9999" value="<?=_var($eth0,"METRIC:INDEX")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
</div>
</div>
<div markdown="1" class="ipv6-eth0-INDEX" style="display:none">
_(IPv6 address assignment)_:
: <select name="USE_DHCP6:INDEX" onchange="selectProtocol(this.form,'eth0',INDEX)">
<?=mk_option($eth0["USE_DHCP6:INDEX"]??'', 'yes', _('Automatic'))?>
<?=mk_option($eth0["USE_DHCP6:INDEX"]??'', 'no', _('Static'))?>
<?=mk_option($eth0["USE_DHCP6:INDEX"]??'', '', _('None'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:INDEX"), 'yes', _('Automatic'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:INDEX"), 'no', _('Static'))?>
<?=mk_option(_var($eth0,"USE_DHCP6:INDEX"), '', _('None'))?>
</select>
<div markdown="1" class="more-ipv6-eth0-INDEX" style="display:none">
_(IPv6 address)_:
: <input type="text" name="IPADDR6:INDEX" maxlength="39" value="<?=$eth0["IPADDR6:INDEX"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:INDEX" min="1" max="128" value="<?=$eth0["NETMASK6:INDEX"]??''?>" class="slim">
: <input type="text" name="IPADDR6:INDEX" maxlength="39" value="<?=_var($eth0,"IPADDR6:INDEX")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:INDEX" min="1" max="128" value="<?=_var($eth0,"NETMASK6:INDEX")?>" class="slim">
_(IPv6 default gateway)_:
: <input type="text" name="GATEWAY6:INDEX" maxlength="39" value="<?=$eth0["GATEWAY6:INDEX"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:INDEX" min="1" max="9999" value="<?=$eth0["METRIC6:INDEX"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY6:INDEX" maxlength="39" value="<?=_var($eth0,"GATEWAY6:INDEX")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:INDEX" min="1" max="9999" value="<?=_var($eth0,"METRIC6:INDEX")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
_(IPv6 privacy extensions)_:
: <select name="PRIVACY6:INDEX">
<?=mk_option($eth0['PRIVACY6:INDEX']??'', "0", _("Disabled"))?>
<?=mk_option($eth0['PRIVACY6:INDEX']??'', "2", _("Enabled"))?>
<?=mk_option(_var($eth0,'PRIVACY6:INDEX'), "0", _("Disabled"))?>
<?=mk_option(_var($eth0,'PRIVACY6:INDEX'), "2", _("Enabled"))?>
</select>
</div>
+122 -122
View File
@@ -98,7 +98,7 @@ $(function() {
_(Interface description)_:
: <span class="status vshift"><i id="tag-ethX" class="fa fa-fw fa-chevron-down" style="cursor:pointer" onclick="viewToggle('ethX')"></i></span>
<?if (!$more):?>
<input type="text" name="DESCRIPTION:0" maxlength="80" value="<?=htmlspecialchars($ethX["DESCRIPTION:0"]??'')?>" onchange="exitCode(this.form,true)">
<input type="text" name="DESCRIPTION:0" maxlength="80" value="<?=htmlspecialchars(_var($ethX,"DESCRIPTION:0"))?>" onchange="exitCode(this.form,true)">
<?else:?>
<span class="<?=$class?>"><?=$reason?></span>
<?endif;?>
@@ -114,8 +114,8 @@ _(MAC address)_:
<div markdown="1" class="slave-ethX">
_(Enable bonding)_:
: <select name="BONDING" onchange="checkBondingSettings(this.form,1,'ethX')">
<?=mk_option($ethX['BONDING']??'', "no", _("No"))?>
<?=mk_option($ethX['BONDING']??'', "yes", _("Yes"))?>
<?=mk_option(_var($ethX,'BONDING'), "no", _("No"))?>
<?=mk_option(_var($ethX,'BONDING'), "yes", _("Yes"))?>
</select>
:eth_enable_bonding_help:
@@ -123,13 +123,13 @@ _(Enable bonding)_:
<div markdown="1" id="bond-members-ethX" style="display:none">
_(Bonding mode)_:
: <select name="BONDING_MODE" onchange="checkBondingSettings(this.form,-1,'ethX')">
<?=mk_option($ethX['BONDING_MODE']??'', "0", _("balance-rr")." (0)")?>
<?=mk_option($ethX['BONDING_MODE']??'', "1", _("active-backup")." (1)",isset($ethX['BONDING_MODE'])?'':'selected')?>
<?=mk_option($ethX['BONDING_MODE']??'', "2", _("balance-xor")." (2)")?>
<?=mk_option($ethX['BONDING_MODE']??'', "3", _("broadcast")." (3)")?>
<?=mk_option($ethX['BONDING_MODE']??'', "4", _("802.3ad")." (4)")?>
<?=mk_option($ethX['BONDING_MODE']??'', "5", _("balance-tlb")." (5)")?>
<?=mk_option($ethX['BONDING_MODE']??'', "6", _("balance-alb")." (6)")?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "0", _("balance-rr")." (0)")?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "1", _("active-backup")." (1)",isset($ethX['BONDING_MODE'])?'':'selected')?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "2", _("balance-xor")." (2)")?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "3", _("broadcast")." (3)")?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "4", _("802.3ad")." (4)")?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "5", _("balance-tlb")." (5)")?>
<?=mk_option(_var($ethX,'BONDING_MODE'), "6", _("balance-alb")." (6)")?>
</select>
<span id="attention0" style="display:none">**_(Attention)_:** _(this mode requires a network switch with proper setup and support)_...</span>
@@ -137,9 +137,9 @@ _(Bonding mode)_:
_(Bonding members of)_ bondX:
: <select id="bond-ethX" name="BONDNICS" multiple="multiple" style="display:none">
<?=mk_option($ethX['BONDNICS']??'','ethX','ethX','selected disabled')?>
<?=mk_option(_var($ethX,'BONDNICS'),'ethX','ethX','selected disabled')?>
<?foreach ($ports as $port):?>
<?if ($port!='ethX' && !locked('ethX',$port)) echo mk_option_check($ethX['BONDNICS']??'',$port,$port)?>
<?if ($port!='ethX' && !locked('ethX',$port)) echo mk_option_check(_var($ethX,'BONDNICS'),$port,$port)?>
<?endforeach;?>
</select>
@@ -148,8 +148,8 @@ _(Bonding members of)_ bondX:
</div>
_(Enable bridging)_:
: <select name="BRIDGING" onchange="checkBridgingSettings(this.form,1,'ethX')">
<?=mk_option($ethX['BRIDGING']??'', "no", _("No"))?>
<?=mk_option($ethX['BRIDGING']??'', "yes", _("Yes"))?>
<?=mk_option(_var($ethX,'BRIDGING'), "no", _("No"))?>
<?=mk_option(_var($ethX,'BRIDGING'), "yes", _("Yes"))?>
</select>
:eth_enable_bridging_help:
@@ -157,9 +157,9 @@ _(Enable bridging)_:
<div markdown="1" id="bridge-members-ethX" style="display:none">
_(Bridging members of)_ brX:
: <select id="bridge-ethX" name="BRNICS" multiple="multiple" style="display:none">
<?=mk_option($ethX['BRNICS']??'','ethX','ethX','selected disabled')?>
<?=mk_option(_var($ethX,'BRNICS'),'ethX','ethX','selected disabled')?>
<?foreach ($ports as $port):?>
<?if ($port!='ethX' && !locked('ethX',$port)) echo mk_option_check($ethX['BRNICS']??'',$port,$port)?>
<?if ($port!='ethX' && !locked('ethX',$port)) echo mk_option_check(_var($ethX,'BRNICS'),$port,$port)?>
<?endforeach;?>
</select>
@@ -168,9 +168,9 @@ _(Bridging members of)_ brX:
</div>
_(Network protocol)_:
: <select name="PROTOCOL:0" onchange="selectProtocol(this.form,'ethX',0)">
<?=mk_option($ethX["PROTOCOL:0"]??'', 'ipv4', _('IPv4 only'))?>
<?=mk_option($ethX["PROTOCOL:0"]??'', 'ipv6', _('IPv6 only'))?>
<?=mk_option($ethX["PROTOCOL:0"]??'', 'ipv4+ipv6', _('IPv4 + IPv6'))?>
<?=mk_option(_var($ethX,"PROTOCOL:0"), 'ipv4', _('IPv4 only'))?>
<?=mk_option(_var($ethX,"PROTOCOL:0"), 'ipv6', _('IPv6 only'))?>
<?=mk_option(_var($ethX,"PROTOCOL:0"), 'ipv4+ipv6', _('IPv4 + IPv6'))?>
</select>
:eth_network_protocol_help:
@@ -178,39 +178,39 @@ _(Network protocol)_:
<div markdown="1" class="ipv4-ethX-0" style="display:none">
_(IPv4 address assignment)_:
: <select name="USE_DHCP:0" onchange="selectProtocol(this.form,'ethX',0)">
<?=mk_option($ethX["USE_DHCP:0"]??'', 'yes', _('Automatic'))?>
<?=mk_option($ethX["USE_DHCP:0"]??'', 'no', _('Static'))?>
<?=mk_option($ethX["USE_DHCP:0"]??'', '', _('None'))?>
<?=mk_option(_var($ethX,"USE_DHCP:0"), 'yes', _('Automatic'))?>
<?=mk_option(_var($ethX,"USE_DHCP:0"), 'no', _('Static'))?>
<?=mk_option(_var($ethX,"USE_DHCP:0"), '', _('None'))?>
</select>
:eth_ipv4_address_assignment_help:
<div markdown="1" class="more-ipv4-ethX-0" style="display:none">
_(IPv4 address)_:
: <input type="text" name="IPADDR:0" maxlength="15" value="<?=$ethX["IPADDR:0"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:0" class="slim">
<?=mk_option($ethX["NETMASK:0"]??'', "255.0.0.0", "8")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.0.0", "16")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.128.0", "17")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.192.0", "18")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.224.0", "19")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.240.0", "20")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.248.0", "21")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.252.0", "22")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.254.0", "23")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.0", "24", $ethX["IPADDR:0"]??''?"":"selected")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.128", "25")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.192", "26")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.224", "27")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.240", "28")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.248", "29")?>
<?=mk_option($ethX["NETMASK:0"]??'', "255.255.255.252", "30")?>
: <input type="text" name="IPADDR:0" maxlength="15" value="<?=_var($ethX,"IPADDR:0")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:0" class="slim">
<?=mk_option(_var($ethX,"NETMASK:0"), "255.0.0.0", "8")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.0.0", "16")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.128.0", "17")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.192.0", "18")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.224.0", "19")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.240.0", "20")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.248.0", "21")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.252.0", "22")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.254.0", "23")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.0", "24", _var($ethX,"IPADDR:0")?"":"selected")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.128", "25")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.192", "26")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.224", "27")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.240", "28")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.248", "29")?>
<?=mk_option(_var($ethX,"NETMASK:0"), "255.255.255.252", "30")?>
</select>
:eth_ipv4_address_help:
_(IPv4 default gateway)_:
: <input type="text" name="GATEWAY:0" maxlength="15" value="<?=$ethX["GATEWAY:0"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:0" min="0" max="9999" value="<?=$ethX["METRIC:0"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY:0" maxlength="15" value="<?=_var($ethX,"GATEWAY:0")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:0" min="0" max="9999" value="<?=_var($ethX,"METRIC:0")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv4_default_gateway_help:
@@ -219,29 +219,29 @@ _(IPv4 default gateway)_:
<div markdown="1" class="ipv6-ethX-0" style="display:none">
_(IPv6 address assignment)_:
: <select name="USE_DHCP6:0" onchange="selectProtocol(this.form,'ethX',0)">
<?=mk_option($ethX["USE_DHCP6:0"]??'', 'yes', _('Automatic'))?>
<?=mk_option($ethX["USE_DHCP6:0"]??'', 'no', _('Static'))?>
<?=mk_option($ethX["USE_DHCP6:0"]??'', '', _('None'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:0"), 'yes', _('Automatic'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:0"), 'no', _('Static'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:0"), '', _('None'))?>
</select>
:eth_ipv6_address_assignment_help:
<div markdown="1" class="more-ipv6-ethX-0" style="display:none">
_(IPv6 address)_:
: <input type="text" name="IPADDR6:0" maxlength="39" value="<?=$ethX["IPADDR6:0"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:0" min="1" max="128" value="<?=$ethX["NETMASK6:0"]??''?>" class="slim">
: <input type="text" name="IPADDR6:0" maxlength="39" value="<?=_var($ethX,"IPADDR6:0")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:0" min="1" max="128" value="<?=_var($ethX,"NETMASK6:0")?>" class="slim">
:eth_ipv6_address_help:
_(IPv6 default gateway)_:
: <input type="text" name="GATEWAY6:0" maxlength="39" value="<?=$ethX["GATEWAY6:0"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:0" min="0" max="9999" value="<?=$ethX["METRIC6:0"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY6:0" maxlength="39" value="<?=_var($ethX,"GATEWAY6:0")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:0" min="0" max="9999" value="<?=_var($ethX,"METRIC6:0")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv6_default_gateway_help:
_(IPv6 privacy extensions)_:
: <select name="PRIVACY6:0">
<?=mk_option($ethX["PRIVACY6:0"]??'', "0", _("Disabled"))?>
<?=mk_option($ethX["PRIVACY6:0"]??'', "2", _("Enabled"))?>
<?=mk_option(_var($ethX,"PRIVACY6:0"), "0", _("Disabled"))?>
<?=mk_option(_var($ethX,"PRIVACY6:0"), "2", _("Enabled"))?>
</select>
:eth_ipv6_privacy_extensions_help:
@@ -249,14 +249,14 @@ _(IPv6 privacy extensions)_:
</div>
</div>
_(Desired MTU)_:
: <input type="number" name="MTU" min="68" max="9198" value="<?=$ethX['MTU']??''?>" class="narrow" placeholder="1500">
: <input type="number" name="MTU" min="68" max="9198" value="<?=_var($ethX,'MTU')?>" class="narrow" placeholder="1500">
:eth_desired_mtu_help:
_(Enable VLANs)_:
: <select name="TYPE" onchange="checkNetworkAccess(this.form,'ethX')">
<?=mk_option($ethX['TYPE']??'', 'access', _('No'))?>
<?=mk_option($ethX['TYPE']??'', 'trunk', _('Yes'))?>
<?=mk_option(_var($ethX,'TYPE'), 'access', _('No'))?>
<?=mk_option(_var($ethX,'TYPE'), 'trunk', _('Yes'))?>
</select>
:eth_enable_vlans_help:
@@ -268,22 +268,22 @@ _(Enable VLANs)_:
<div markdown="1" id="index-ethX-<?=$i?>" class="access-ethX shade-<?=$display['theme']?>" style="display:none">
_(Interface description)_:
: <span class="status vshift"><i id="tag-ethX-<?=$i?>" class="fa fa-fw fa-chevron-down" style="cursor:pointer" onclick="viewToggle('ethX','<?=$i?>')"></i></span>
<input type="text" name="DESCRIPTION:<?=$i?>" maxlength="80" value="<?=htmlspecialchars($ethX["DESCRIPTION:$i"]??'')?>" onchange="exitCode(this.form,true)">
<input type="text" name="DESCRIPTION:<?=$i?>" maxlength="80" value="<?=htmlspecialchars(_var($ethX,"DESCRIPTION:$i"))?>" onchange="exitCode(this.form,true)">
:eth_interface_description_help:
<div markdown="1" id="view-ethX-<?=$i?>" style="display:none">
_(VLAN number)_:
: <input type="number" name="VLANID:<?=$i?>" min="1" max="4095" value="<?=$ethX["VLANID:$i"]??''?>" class="narrow gap" required>
: <input type="number" name="VLANID:<?=$i?>" min="1" max="4095" value="<?=_var($ethX,"VLANID:$i")?>" class="narrow gap" required>
<?if (!$service):?><input type="button" class="form" value="_(Delete VLAN)_" onclick="removeVLAN($('#index-ethX-<?=$i?>'))"><?endif;?>
:eth_vlan_number_help:
_(Network protocol)_:
: <select name="PROTOCOL:<?=$i?>" onchange="selectProtocol(this.form,'ethX',<?=$i?>)">
<?=mk_option($ethX["PROTOCOL:$i"]??'', 'ipv4', _('IPv4 only'))?>
<?=mk_option($ethX["PROTOCOL:$i"]??'', 'ipv6', _('IPv6 only'))?>
<?=mk_option($ethX["PROTOCOL:$i"]??'', 'ipv4+ipv6', _('IPv4 + IPv6'))?>
<?=mk_option(_var($ethX,"PROTOCOL:$i"), 'ipv4', _('IPv4 only'))?>
<?=mk_option(_var($ethX,"PROTOCOL:$i"), 'ipv6', _('IPv6 only'))?>
<?=mk_option(_var($ethX,"PROTOCOL:$i"), 'ipv4+ipv6', _('IPv4 + IPv6'))?>
</select>
:eth_network_protocol_help:
@@ -291,39 +291,39 @@ _(Network protocol)_:
<div markdown="1" class="ipv4-ethX-<?=$i?>" style="display:none">
_(IPv4 address assignment)_:
: <select name="USE_DHCP:<?=$i?>" onchange="selectProtocol(this.form,'ethX',<?=$i?>)">
<?=mk_option($ethX["USE_DHCP:$i"]??'', 'yes', _('Automatic'))?>
<?=mk_option($ethX["USE_DHCP:$i"]??'', 'no', _('Static'))?>
<?=mk_option($ethX["USE_DHCP:$i"]??'', '', _('None'))?>
<?=mk_option(_var($ethX,"USE_DHCP:$i"), 'yes', _('Automatic'))?>
<?=mk_option(_var($ethX,"USE_DHCP:$i"), 'no', _('Static'))?>
<?=mk_option(_var($ethX,"USE_DHCP:$i"), '', _('None'))?>
</select>
:eth_ipv4_address_assignment_help:
<div markdown="1" class="more-ipv4-ethX-<?=$i?>" style="display:none">
_(IPv4 address)_:
: <input type="text" name="IPADDR:<?=$i?>" maxlength="15" value="<?=$ethX["IPADDR:$i"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:<?=$i?>" class="slim">
<?=mk_option($ethX["NETMASK:$i"]??'', "255.0.0.0", "8")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.0.0", "16")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.128.0", "17")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.192.0", "18")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.224.0", "19")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.240.0", "20")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.248.0", "21")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.252.0", "22")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.254.0", "23")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.0", "24", $ethX["IPADDR:$i"]?"":"selected")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.128", "25")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.192", "26")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.224", "27")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.240", "28")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.248", "29")?>
<?=mk_option($ethX["NETMASK:$i"]??'', "255.255.255.252", "30")?>
: <input type="text" name="IPADDR:<?=$i?>" maxlength="15" value="<?=_var($ethX,"IPADDR:$i")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:<?=$i?>" class="slim">
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.0.0.0", "8")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.0.0", "16")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.128.0", "17")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.192.0", "18")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.224.0", "19")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.240.0", "20")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.248.0", "21")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.252.0", "22")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.254.0", "23")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.0", "24", isset($ethX["IPADDR:$i"])?"":"selected")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.128", "25")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.192", "26")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.224", "27")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.240", "28")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.248", "29")?>
<?=mk_option(_var($ethX,"NETMASK:$i"), "255.255.255.252", "30")?>
</select>
:eth_ipv4_address_help:
_(IPv4 default gateway)_:
: <input type="text" name="GATEWAY:<?=$i?>" maxlength="15" value="<?=$ethX["GATEWAY:$i"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:<?=$i?>" min="0" max="9999" value="<?=$ethX["METRIC:$i"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY:<?=$i?>" maxlength="15" value="<?=_var($ethX,"GATEWAY:$i")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:<?=$i?>" min="0" max="9999" value="<?=_var($ethX,"METRIC:$i")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv4_default_gateway_help:
@@ -332,29 +332,29 @@ _(IPv4 default gateway)_:
<div markdown="1" class="ipv6-ethX-<?=$i?>" style="display:none">
_(IPv6 address assignment)_:
: <select name="USE_DHCP6:<?=$i?>" onchange="selectProtocol(this.form,'ethX',<?=$i?>)">
<?=mk_option($ethX["USE_DHCP6:$i"]??'', 'yes', _('Automatic'))?>
<?=mk_option($ethX["USE_DHCP6:$i"]??'', 'no', _('Static'))?>
<?=mk_option($ethX["USE_DHCP6:$i"]??'', '', _('None'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:$i"), 'yes', _('Automatic'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:$i"), 'no', _('Static'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:$i"), '', _('None'))?>
</select>
:eth_ipv6_address_assignment_help:
<div markdown="1" class="more-ipv6-ethX-<?=$i?>" style="display:none">
_(IPv6 address)_:
: <input type="text" name="IPADDR6:<?=$i?>" maxlength="39" value="<?=$ethX["IPADDR6:$i"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:<?=$i?>" min="1" max="128" value="<?=$ethX["NETMASK6:$i"]??''?>" class="slim">
: <input type="text" name="IPADDR6:<?=$i?>" maxlength="39" value="<?=_var($ethX,"IPADDR6:$i")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:<?=$i?>" min="1" max="128" value="<?=_var($ethX,"NETMASK6:$i")?>" class="slim">
:eth_ipv6_address_help:
_(IPv6 default gateway)_:
: <input type="text" name="GATEWAY6:<?=$i?>" maxlength="39" value="<?=$ethX["GATEWAY6:$i"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:<?=$i?>" min="0" max="9999" value="<?=$ethX["METRIC6:$i"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY6:<?=$i?>" maxlength="39" value="<?=_var($ethX,"GATEWAY6:$i")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:<?=$i?>" min="0" max="9999" value="<?=_var($ethX,"METRIC6:$i")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
:eth_ipv6_default_gateway_help:
_(IPv6 privacy extensions)_:
: <select name="PRIVACY6:<?=$i?>">
<?=mk_option($ethX["PRIVACY6:$i"]??'', "0", _("Disabled"))?>
<?=mk_option($ethX["PRIVACY6:$i"]??'', "2", _("Enabled"))?>
<?=mk_option(_var($ethX,"PRIVACY6:$i"), "0", _("Disabled"))?>
<?=mk_option(_var($ethX,"PRIVACY6:$i"), "2", _("Enabled"))?>
</select>
:eth_ipv6_privacy_extensions_help:
@@ -377,75 +377,75 @@ _(IPv6 privacy extensions)_:
<div markdown="1" id="index-ethX-INDEX" class="access-ethX shade-<?=$display['theme']?>">
_(Interface description)_:
: <span class="status vshift"><i id="tag-ethX-INDEX" class="fa fa-fw fa-chevron-up" style="cursor:pointer" onclick="viewToggle('ethX','INDEX')"></i></span>
<input type="text" name="DESCRIPTION:INDEX" maxlength="80" value="<?=htmlspecialchars($ethX["DESCRIPTION:INDEX"]??'')?>" onchange="exitCode(this.form,true)">
<input type="text" name="DESCRIPTION:INDEX" maxlength="80" value="<?=htmlspecialchars(_var($ethX,"DESCRIPTION:INDEX"))?>" onchange="exitCode(this.form,true)">
<div markdown="1" id="view-ethX-INDEX">
_(VLAN number)_:
: <input type="number" name="VLANID:INDEX" min="1" max="4095" value="<?=$ethX["VLANID:INDEX"]??''?>" class="narrow gap" required>
: <input type="number" name="VLANID:INDEX" min="1" max="4095" value="<?=_var($ethX,"VLANID:INDEX")?>" class="narrow gap" required>
<input type="button" class="form" value="_(Delete VLAN)_" onclick="removeVLAN($('#index-ethX-INDEX'))">
_(Network protocol)_:
: <select name="PROTOCOL:INDEX" onchange="selectProtocol(this.form,'ethX',INDEX)">
<?=mk_option($ethX["PROTOCOL:INDEX"]??'', 'ipv4', _('IPv4 only'))?>
<?=mk_option($ethX["PROTOCOL:INDEX"]??'', 'ipv6', _('IPv6 only'))?>
<?=mk_option($ethX["PROTOCOL:INDEX"]??'', 'ipv4+ipv6', _('IPv4 + IPv6'))?>
<?=mk_option(_var($ethX,"PROTOCOL:INDEX"), 'ipv4', _('IPv4 only'))?>
<?=mk_option(_var($ethX,"PROTOCOL:INDEX"), 'ipv6', _('IPv6 only'))?>
<?=mk_option(_var($ethX,"PROTOCOL:INDEX"), 'ipv4+ipv6', _('IPv4 + IPv6'))?>
</select>
<div markdown="1" class="ipv4-ethX-INDEX" style="display:none">
_(IPv4 address assignment)_:
: <select name="USE_DHCP:INDEX" onchange="selectProtocol(this.form,'ethX',INDEX)">
<?=mk_option($ethX["USE_DHCP:INDEX"]??'', 'yes', _('Automatic'))?>
<?=mk_option($ethX["USE_DHCP:INDEX"]??'', 'no', _('Static'))?>
<?=mk_option($ethX["USE_DHCP:INDEX"]??'', '', _('None'))?>
<?=mk_option(_var($ethX,"USE_DHCP:INDEX"), 'yes', _('Automatic'))?>
<?=mk_option(_var($ethX,"USE_DHCP:INDEX"), 'no', _('Static'))?>
<?=mk_option(_var($ethX,"USE_DHCP:INDEX"), '', _('None'))?>
</select>
<div markdown="1" class="more-ipv4-ethX-INDEX" style="display:none">
_(IPv4 address)_:
: <input type="text" name="IPADDR:INDEX" maxlength="15" value="<?=$ethX["IPADDR:INDEX"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:INDEX" class="slim">
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.0.0.0", "8")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.0.0", "16")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.128.0", "17")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.192.0", "18")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.224.0", "19")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.240.0", "20")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.248.0", "21")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.252.0", "22")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.254.0", "23")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.0", "24", "selected")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.128", "25")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.192", "26")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.224", "27")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.240", "28")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.248", "29")?>
<?=mk_option($ethX["NETMASK:INDEX"]??'', "255.255.255.252", "30")?>
: <input type="text" name="IPADDR:INDEX" maxlength="15" value="<?=_var($ethX,"IPADDR:INDEX")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">/<select name="NETMASK:INDEX" class="slim">
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.0.0.0", "8")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.0.0", "16")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.128.0", "17")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.192.0", "18")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.224.0", "19")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.240.0", "20")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.248.0", "21")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.252.0", "22")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.254.0", "23")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.0", "24", "selected")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.128", "25")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.192", "26")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.224", "27")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.240", "28")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.248", "29")?>
<?=mk_option(_var($ethX,"NETMASK:INDEX"), "255.255.255.252", "30")?>
</select>
_(IPv4 default gateway)_:
: <input type="text" name="GATEWAY:INDEX" maxlength="15" value="<?=$ethX["GATEWAY:INDEX"]??''?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:INDEX" min="1" max="9999" value="<?=$ethX["METRIC:INDEX"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY:INDEX" maxlength="15" value="<?=_var($ethX,"GATEWAY:INDEX")?>" class="narrow" pattern="<?=$validIP4?>" title="_(IPv4 address A.B.C.D)_">
<input type="text" name="METRIC:INDEX" min="1" max="9999" value="<?=_var($ethX,"METRIC:INDEX")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
</div>
</div>
<div markdown="1" class="ipv6-ethX-INDEX" style="display:none">
_(IPv6 address assignment)_:
: <select name="USE_DHCP6:INDEX" onchange="selectProtocol(this.form,'ethX',INDEX)">
<?=mk_option($ethX["USE_DHCP6:INDEX"]??'', 'yes', _('Automatic'))?>
<?=mk_option($ethX["USE_DHCP6:INDEX"]??'', 'no', _('Static'))?>
<?=mk_option($ethX["USE_DHCP6:INDEX"]??'', '', _('None'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:INDEX"), 'yes', _('Automatic'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:INDEX"), 'no', _('Static'))?>
<?=mk_option(_var($ethX,"USE_DHCP6:INDEX"), '', _('None'))?>
</select>
<div markdown="1" class="more-ipv6-ethX-INDEX" style="display:none">
_(IPv6 address)_:
: <input type="text" name="IPADDR6:INDEX" maxlength="39" value="<?=$ethX["IPADDR6:INDEX"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:INDEX" min="1" max="128" value="<?=$ethX["NETMASK6:INDEX"]??''?>" class="slim">
: <input type="text" name="IPADDR6:INDEX" maxlength="39" value="<?=_var($ethX,"IPADDR6:INDEX")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">/<input type="number" name="NETMASK6:INDEX" min="1" max="128" value="<?=_var($ethX,"NETMASK6:INDEX")?>" class="slim">
_(IPv6 default gateway)_:
: <input type="text" name="GATEWAY6:INDEX" maxlength="39" value="<?=$ethX["GATEWAY6:INDEX"]??''?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:INDEX" min="1" max="9999" value="<?=$ethX["METRIC6:INDEX"]??''?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
: <input type="text" name="GATEWAY6:INDEX" maxlength="39" value="<?=_var($ethX,"GATEWAY6:INDEX")?>" pattern="<?=$validIP6?>" title="_(IPv6 address nnnn:xxxx::yyyy)_">
<input type="text" name="METRIC6:INDEX" min="1" max="9999" value="<?=_var($ethX,"METRIC6:INDEX")?>" class="slim"><i class="fa fa-sort-numeric-asc"></i> *_(optional metric (lowest is preferred, 0 is no default gateway))_*
_(IPv6 privacy extensions)_:
: <select name="PRIVACY6:INDEX">
<?=mk_option($ethX['PRIVACY6:INDEX']??'', "0", _("Disabled"))?>
<?=mk_option($ethX['PRIVACY6:INDEX']??'', "2", _("Enabled"))?>
<?=mk_option(_var($ethX,'PRIVACY6:INDEX'), "0", _("Disabled"))?>
<?=mk_option(_var($ethX,'PRIVACY6:INDEX'), "2", _("Enabled"))?>
</select>
</div>
+8 -8
View File
@@ -5,8 +5,8 @@ Icon="icon-home"
Tag="home"
---
<?PHP
/* Copyright 2005-2020, Lime Technology
* Copyright 2012-2020, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -22,22 +22,22 @@ $name_regex = '^[A-Za-z0-9]([A-Za-z0-9\-\.]{0,13}[A-Za-z0-9])?$';
$name_warn = preg_match('/'.$name_regex.'/', $var['NAME']) ? 'none' : 'block';
?>
<form markdown="1" name="NameSettings" method="POST" action="/update.htm" target="progressFrame">
<input type="hidden" name="server_https" value="<?=$_SERVER['HTTPS']??''?>">
<input type="hidden" name="server_name" value="<?=$_SERVER['HTTP_HOST']??''?>">
<input type="hidden" name="server_addr" value="<?=$_SERVER['SERVER_ADDR']??''?>">
<input type="hidden" name="server_https" value="<?=_var($_SERVER,'HTTPS')?>">
<input type="hidden" name="server_name" value="<?=_var($_SERVER,'HTTP_HOST')?>">
<input type="hidden" name="server_addr" value="<?=_var($_SERVER,'SERVER_ADDR')?>">
_(Server name)_:
: <input type="text" name="NAME" id="NAME" maxlength="15" pattern="<?=$name_regex?>" value="<?=htmlspecialchars($var['NAME']??'')?>" title="_(Only alphanumeric characters)_ (&quot;A-Z&quot;, &quot;a-z&quot;, and &quot;0-9&quot;), dashes (&quot;-&quot;), and dots (&quot;.&quot;); _(and, the first and last characters must be alphanumeric)_" <?=$disabled?> required> <span id="name_warning" style="display:<?=$name_warn?>"><i class="fa fa-warning icon warning"></i> _(Not compatible with NetBIOS)_</span>
: <input type="text" name="NAME" id="NAME" maxlength="15" pattern="<?=$name_regex?>" value="<?=htmlspecialchars(_var($var,'NAME'))?>" title="_(Only alphanumeric characters)_ (&quot;A-Z&quot;, &quot;a-z&quot;, and &quot;0-9&quot;), dashes (&quot;-&quot;), and dots (&quot;.&quot;); _(and, the first and last characters must be alphanumeric)_" <?=$disabled?> required> <span id="name_warning" style="display:<?=$name_warn?>"><i class="fa fa-warning icon warning"></i> _(Not compatible with NetBIOS)_</span>
:id_server_name_help:
_(Description)_:
: <input type="text" name="COMMENT" value="<?=htmlspecialchars($var['COMMENT']??'')?>" <?=$disabled?>>
: <input type="text" name="COMMENT" value="<?=htmlspecialchars(_var($var,'COMMENT'))?>" <?=$disabled?>>
:id_description_help:
_(Model)_:
: <input type="text" name="SYS_MODEL" value="<?=htmlspecialchars($var['SYS_MODEL']??'')?>" <?=$disabled?>>
: <input type="text" name="SYS_MODEL" value="<?=htmlspecialchars(_var($var,'SYS_MODEL'))?>" <?=$disabled?>>
:id_model_help:
+57 -53
View File
@@ -5,8 +5,8 @@ Icon="icon-key"
Tag="expeditedssl"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -52,20 +52,23 @@ function acceptableCert($certFile, $hostname, $expectedURL) {
return false;
}
$tasks = find_tasks();
$nginx = parse_ini_file('/var/local/emhttp/nginx.ini');
$addr = (array_key_exists('NGINX_LANIP', $nginx) && $nginx['NGINX_LANIP']) ? $nginx['NGINX_LANIP'] : ((array_key_exists('NGINX_LANIP6', $nginx) && $nginx['NGINX_LANIP6']) ? $nginx['NGINX_LANIP6'] : '');
$keyfile = @file_get_contents($var['regFILE']);
$nginx = @parse_ini_file('/var/local/emhttp/nginx.ini') ?: [];
$addr = _var($nginx,'NGINX_LANIP') ?: _var($nginx,'NGINX_LANIP6');
$keyfile = @file_get_contents(_var($var,'regFILE'));
$cert2Issuer = '';
$isLEcert = false;
if ($keyfile !== false) $keyfile = base64_encode($keyfile);
// self-signed or user-provided cert
$cert1File = "/boot/config/ssl/certs/{$var['NAME']}_unraid_bundle.pem";
$cert1File = "/boot/config/ssl/certs/"._var($var,'NAME','tower')."_unraid_bundle.pem";
$cert1Present = file_exists("$cert1File");
$cert1SelfSigned = $cert1URLvalid = false;
$cert1Issuer = '&nbsp;';
if ($cert1Present) {
$cert1URL = $var['NAME'].".".$var['LOCAL_TLD'];
$cert1URL = _var($var,'NAME','tower').(_var($var,'LOCAL_TLD') ? '.'._var($var,'LOCAL_TLD') : '');
// if user replaced cert without reloading nginx, the cert on the flash could be invalid
$cert1URLvalid = acceptableCert($cert1File, $var['NAME'], $cert1URL);
$cert1URLvalid = acceptableCert($cert1File, _var($var,'NAME','tower'), $cert1URL);
$cert1Subject = exec("/usr/bin/openssl x509 -in $cert1File -noout -text | sed -n 's/^.*Subject: //p'");
$cert1Issuer = exec("/usr/bin/openssl x509 -in $cert1File -noout -text | sed -n -e 's/^.*Issuer: //p'");
$cert1Expires = exec("/usr/bin/openssl x509 -in $cert1File -noout -text | sed -n -e 's/^.*Not After : //p'");
@@ -117,48 +120,49 @@ if ($cert2Present) {
}
}
$http_port = $var['PORT'] != 80 ? ":{$var['PORT']}" : '';
$https_port = $var['PORTSSL'] != 443 ? ":{$var['PORTSSL']}" : '';
$http_port = _var($var,'PORT',80) != 80 ? ":{$var['PORT']}" : '';
$https_port = _var($var,'PORTSSL',443) != 443 ? ":{$var['PORTSSL']}" : '';
$http_ip_url = "http://"._var($nginx,'NGINX_LANIP')."{$http_port}/";
$https_ip_url = "https://"._var($nginx,'NGINX_LANIP')."{$https_port}/";
$http_ip6_url = "http://"._var($nginx,'NGINX_LANIP6')."{$http_port}/";
$https_ip6_url = "https://"._var($nginx,'NGINX_LANIP6')."{$https_port}/";
$http_mdns_url = "http://"._var($nginx,'NGINX_LANMDNS')."{$http_port}/";
$https_mdns_url = "https://"._var($nginx,'NGINX_LANMDNS')."{$https_port}/";
$https_fqdn_url = "https://"._var($nginx,'NGINX_LANFQDN')."{$https_port}/";
$https_fqdn6_url = "https://"._var($nginx,'NGINX_LANFQDN6')."{$https_port}/";
$http_ip_url = "http://{$nginx['NGINX_LANIP']}{$http_port}/";
$https_ip_url = "https://{$nginx['NGINX_LANIP']}{$https_port}/";
$http_ip6_url = "http://{$nginx['NGINX_LANIP6']}{$http_port}/";
$https_ip6_url = "https://{$nginx['NGINX_LANIP6']}{$https_port}/";
$http_mdns_url = "http://{$nginx['NGINX_LANMDNS']}{$http_port}/";
$https_mdns_url = "https://{$nginx['NGINX_LANMDNS']}{$https_port}/";
$https_fqdn_url = "https://{$nginx['NGINX_LANFQDN']}{$https_port}/";
$https_fqdn6_url = "https://{$nginx['NGINX_LANFQDN6']}{$https_port}/";
$urls = array();
// push an array of three values into the $urls array:
$urls = [];
// push an array of four values into the $urls array:
// 0 - the url
// 1 - the url it redirects to, or null
// 2 - the certificate file used, or null
switch($var['USE_SSL']) {
case 'no':
if ($nginx['NGINX_LANIP']) $urls[] = [$http_ip_url, null, null, false];
if ($nginx['NGINX_LANIP6']) $urls[] = [$http_ip6_url, null, null, false];
if ($nginx['NGINX_LANMDNS']) $urls[] = [$http_mdns_url, null, null, false];
if ($nginx['NGINX_LANFQDN']) $urls[] = [$https_fqdn_url, null, "certificate_bundle.pem", false];
if ($nginx['NGINX_LANFQDN6']) $urls[] = [$https_fqdn6_url, null, "certificate_bundle.pem", false];
break;
case 'yes':
if ($nginx['NGINX_LANIP']) $urls[] = [$http_ip_url, $https_ip_url, null, false];
if ($nginx['NGINX_LANIP']) $urls[] = [$https_ip_url, null, "{$var['NAME']}_unraid_bundle.pem", $cert1SelfSigned];
if ($nginx['NGINX_LANIP6']) $urls[] = [$http_ip6_url, $https_ip6_url, null, false];
if ($nginx['NGINX_LANIP6']) $urls[] = [$https_ip6_url, null, "{$var['NAME']}_unraid_bundle.pem", $cert1SelfSigned];
if ($nginx['NGINX_LANMDNS']) $urls[] = [$http_mdns_url, $https_mdns_url, null, false];
if ($nginx['NGINX_LANMDNS']) $urls[] = [$https_mdns_url, null, "{$var['NAME']}_unraid_bundle.pem", $cert1SelfSigned];
if ($nginx['NGINX_LANFQDN']) $urls[] = [$https_fqdn_url, null, "certificate_bundle.pem", false];
if ($nginx['NGINX_LANFQDN6']) $urls[] = [$https_fqdn6_url, null, "certificate_bundle.pem", false];
break;
case 'auto': // aka strict
if ($nginx['NGINX_LANIP']) $urls[] = [$http_ip_url, $https_fqdn_url, null, false];
if ($nginx['NGINX_LANIP6']) $urls[] = [$http_ip6_url, $https_fqdn6_url, null, false];
if ($nginx['NGINX_LANMDNS']) $urls[] = [$http_mdns_url, $https_fqdn_url, null, false];
if ($nginx['NGINX_LANFQDN']) $urls[] = [$https_fqdn_url, null, "certificate_bundle.pem", false];
if ($nginx['NGINX_LANFQDN6']) $urls[] = [$https_fqdn6_url, null, "certificate_bundle.pem", false];
break;
// 3 - self-signed certificate, or false
switch(_var($var,'USE_SSL','no')) {
case 'no':
if (!empty($nginx['NGINX_LANIP'])) $urls[] = [$http_ip_url, null, null, false];
if (!empty($nginx['NGINX_LANIP6'])) $urls[] = [$http_ip6_url, null, null, false];
if (!empty($nginx['NGINX_LANMDNS'])) $urls[] = [$http_mdns_url, null, null, false];
if (!empty($nginx['NGINX_LANFQDN'])) $urls[] = [$https_fqdn_url, null, "certificate_bundle.pem", false];
if (!empty($nginx['NGINX_LANFQDN6'])) $urls[] = [$https_fqdn6_url, null, "certificate_bundle.pem", false];
break;
case 'yes':
if (!empty($nginx['NGINX_LANIP'])) $urls[] = [$http_ip_url, $https_ip_url, null, false];
if (!empty($nginx['NGINX_LANIP'])) $urls[] = [$https_ip_url, null, "{$var['NAME']}_unraid_bundle.pem", $cert1SelfSigned];
if (!empty($nginx['NGINX_LANIP6'])) $urls[] = [$http_ip6_url, $https_ip6_url, null, false];
if (!empty($nginx['NGINX_LANIP6'])) $urls[] = [$https_ip6_url, null, "{$var['NAME']}_unraid_bundle.pem", $cert1SelfSigned];
if (!empty($nginx['NGINX_LANMDNS'])) $urls[] = [$http_mdns_url, $https_mdns_url, null, false];
if (!empty($nginx['NGINX_LANMDNS'])) $urls[] = [$https_mdns_url, null, "{$var['NAME']}_unraid_bundle.pem", $cert1SelfSigned];
if (!empty($nginx['NGINX_LANFQDN'])) $urls[] = [$https_fqdn_url, null, "certificate_bundle.pem", false];
if (!empty($nginx['NGINX_LANFQDN6'])) $urls[] = [$https_fqdn6_url, null, "certificate_bundle.pem", false];
break;
case 'auto': // aka strict
if (!empty($nginx['NGINX_LANIP'])) $urls[] = [$http_ip_url, $https_fqdn_url, null, false];
if (!empty($nginx['NGINX_LANIP6'])) $urls[] = [$http_ip6_url, $https_fqdn6_url, null, false];
if (!empty($nginx['NGINX_LANMDNS'])) $urls[] = [$http_mdns_url, $https_fqdn_url, null, false];
if (!empty($nginx['NGINX_LANFQDN'])) $urls[] = [$https_fqdn_url, null, "certificate_bundle.pem", false];
if (!empty($nginx['NGINX_LANFQDN6'])) $urls[] = [$https_fqdn6_url, null, "certificate_bundle.pem", false];
break;
}
$cert_time_format = $display['date'].($display['date']!='%c' ? ', '.str_replace(['%M','%R'],['%M:%S','%R:%S'],$display['time']):'');
@@ -270,14 +274,14 @@ $(function(){
</script>
<form markdown="1" name="SSLSettings" method="POST" action="/update.htm" target="progressFrame">
<input type="hidden" name="changePorts" value="Apply">
<input type="hidden" name="server_name" value="<?=strtok($_SERVER['HTTP_HOST'],":")?>">
<input type="hidden" name="server_addr" value="<?=$_SERVER['SERVER_ADDR']?>">
<input type="hidden" name="server_name" value="<?=strtok(_var($_SERVER,'HTTP_HOST'),":")?>">
<input type="hidden" name="server_addr" value="<?=_var($_SERVER,'SERVER_ADDR')?>">
_(User 'root')_:
: [_(Manage)_](/Settings/Users/ManagementAccess/UserEdit?name=root)
_(Start page)_:
: <select name="START_PAGE">
<?foreach ($tasks as $task) echo mk_option($var['START_PAGE']??'Main', $task, _($task));?>
<?foreach ($tasks as $task) echo mk_option(_var($var,'START_PAGE','Main'), $task, _($task));?>
</select>
:mgmt_start_page_help:
@@ -380,7 +384,7 @@ foreach($urls as $url) {
_(Self-signed or user-provided certificate)_:
: <?=$cert1File?>
<?if ($cert1URLvalid && $var['USE_SSL']=='yes'):?>
<?if ($cert1URLvalid && _var($var,'USE_SSL')=='yes'):?>
_(Certificate URL)_:
: <?="<a href='https://$cert1URL$https_port'>$cert1URL</a>"?>
@@ -395,7 +399,7 @@ _(Certificate URL)_:
_(Certificate issuer)_:
: <?=$cert1Issuer?>
<?if ($cert1URLvalid && $var['USE_SSL']=='yes' && $cert1SelfSigned):?>
<?if ($cert1URLvalid && _var($var,'USE_SSL')=='yes' && $cert1SelfSigned):?>
<span class="warning"><i class="fa fa-warning fa-fw"></i> _(is a self-signed certificate, ignore the browser's warning when using this certificate)_</span>
<?endif;?>
@@ -408,8 +412,8 @@ _(Self-signed certificate file)_:
<?endif;?>
<form markdown="1" name="Provision" method="POST" target="progressFrame" action="/update.htm" onsubmit="provisionHandler(event, this)">
<input type="hidden" name="server_name" value="<?=strtok($_SERVER['HTTP_HOST'],":")?>">
<input type="hidden" name="server_addr" value="<?=$_SERVER['SERVER_ADDR']?>">
<input type="hidden" name="server_name" value="<?=strtok(_var($_SERVER,'HTTP_HOST'),":")?>">
<input type="hidden" name="server_addr" value="<?=_var($_SERVER,'SERVER_ADDR')?>">
<?if ($cert2Present):?>
_(Unraid Let's Encrypt certificate)_:
: <?=$cert2File?>
+2 -2
View File
@@ -19,7 +19,7 @@ Tag="folder-o"
$width = [166,300];
function data_disks($disk) {
global $pools;
return ((isset($disk['type']) && $disk['type']=='Data' || (isset($disk['type']) && $disk['type']=="Cache" && in_array($disk['name'],$pools))) && ($disk['status']??'')=='DISK_OK');
return (_var($disk,'type')=="Data" || (_var($disk,'type')=="Cache" && in_array(_var($disk,'name'),$pools))) && _var($disk,'status')=='DISK_OK';
}
?>
<style>
@@ -125,7 +125,7 @@ Note that this tool may negatively affect any docker containers if you allow you
</select>
</span>
<?if ($var['fsState']=="Started"):?>
<?if (_var($var,'fsState')=="Started"):?>
<div><input type="button" value="_(Start)_" onclick="setNewPerms(this.form)"><input type="button" value="_(Done)_" class="lock" onclick="done()"></div>
<?else:?>
<div><input type="button" value="_(Start)_" disabled><input type="button" value="_(Done)_" class="lock" onclick="done()">_(Array must be **Started** to change permissions)_.</div>
+4 -4
View File
@@ -28,7 +28,7 @@ i.red-text{font-size:1.6rem}
<script>
var rows = [];
var filter = "<?=unscript($_GET['filter']??'')?>";
var filter = "<?=unscript(_var($_GET,'filter'))?>";
var files = -1;
Array.prototype.remove = function() {
@@ -39,7 +39,7 @@ Array.prototype.remove = function() {
}
return this;
};
<?if ($display['resize']):?>
<?if (_var($display,'resize')):?>
function resize(bind) {
var width = [];
var h = $('#archive_list').height();
@@ -63,7 +63,7 @@ function archiveList(init) {
files = data[1];
$('#archive_list').html(data[0]);
if (init) {
<?if ($display['resize']):?>
<?if (_var($display,'resize')):?>
resize();
<?endif;?>
$('#archive_table').tablesorter({headers:{5:{sorter:false}},textAttribute:'data'});
@@ -103,7 +103,7 @@ $(function(){
$('span.left').append("<span class='right'><select class='filter narrow' onchange='filter=this.value;archiveList()'><?=$filters?></select></span>");
$('select.filter').val(filter);
archiveList(true);
<?if ($display['resize']):?>
<?if (_var($display,'resize')):?>
$(window).bind('resize',function(){resize(true);});
<?endif;?>
});
+8 -8
View File
@@ -48,20 +48,20 @@ under normal running conditions.
<input type="hidden" name="#file" value="<?=$ini?>">
<input type="hidden" name="error_log" value="<?=$log?>">
<input type="hidden" name="display_startup_errors" value="0">
<input type="hidden" name="display_errors" value="<?=$conf['display_errors']??0?>">
<input type="hidden" name="display_errors" value="<?=_var($conf,'display_errors',0)?>">
<input type="hidden" name="log_errors" value="1">
_(Error reporting level)_:
: <select name="error_reporting" onchange="toggleScreen(this.selectedIndex)">
<?=mk_option($conf['error_reporting']??'', "", "_(Default)_");?>
<?=mk_option($conf['error_reporting']??'', "32767", "_(All Categories)_");?>
<?=mk_option($conf['error_reporting']??'', "1", "_(Errors Only)_");?>
<?=mk_option($conf['error_reporting']??'', "2", "_(Warnings Only)_");?>
<?=mk_option($conf['error_reporting']??'', "8", "_(Notices Only)_");?>
<?=mk_option($conf['error_reporting']??'', "8192", "_(Deprecated Only)_");?>
<?=mk_option(_var($conf,'error_reporting'), "", "_(Default)_");?>
<?=mk_option(_var($conf,'error_reporting'), "32767", "_(All Categories)_");?>
<?=mk_option(_var($conf,'error_reporting'), "1", "_(Errors Only)_");?>
<?=mk_option(_var($conf,'error_reporting'), "2", "_(Warnings Only)_");?>
<?=mk_option(_var($conf,'error_reporting'), "8", "_(Notices Only)_");?>
<?=mk_option(_var($conf,'error_reporting'), "8192", "_(Deprecated Only)_");?>
</select>
&nbsp;
: <input type="checkbox" id="screenlog" onclick="screenLog()" <?=($conf['display_errors']??0)?'checked':''?> disabled><span id="screentext" class="dim">_(Show errors on screen)_</span>
: <input type="checkbox" id="screenlog" onclick="screenLog()" <?=_var($conf,'display_errors',0)?'checked':''?> disabled><span id="screentext" class="dim">_(Show errors on screen)_</span>
<input type="button" value="_(PHP Info)_" onclick="PHPinfo()"><input type="button" id="clearlog" value="_(Clear Log)_" onclick="clearLog()"<?=filesize($log)>0?'':' disabled'?>><input type="button" id="viewlog" value="_(View Log)_" onclick="viewLog()" disabled>_(LOG size)_:&nbsp;<span id="logsize"></span>
: <input type="submit" value="_(Apply)_" disabled><input type="button" value="_(Done)_" onclick="done()">
+10 -10
View File
@@ -15,7 +15,7 @@ Tag="calendar"
*/
?>
<?
if ($disks['parity']['status']=='DISK_NP_DSBL' && $disks['parity2']['status']=='DISK_NP_DSBL') {
if (_var($disks['parity'],'status')=='DISK_NP_DSBL' && _var($disks['parity2'],'status')=='DISK_NP_DSBL') {
echo "<p class='notice'>"._('No Parity disk present')."!</p>";
}
$width = [166,300];
@@ -26,13 +26,13 @@ $memory = '/tmp/memory.tmp';
if (file_exists($memory)) {
parse_str(file_get_contents($memory), $parity);
if (empty($parity['hour'])) $parity['hour'] = "";
if (empty($parity['day'])) $parity['day'] = "";
if (empty($parity['dotm'])) $parity['dotm'] = "";
if (empty($parity['hour'])) $parity['hour'] = "";
if (empty($parity['day'])) $parity['day'] = "";
if (empty($parity['dotm'])) $parity['dotm'] = "";
if (empty($parity['month'])) $parity['month'] = "";
if (empty($parity['write'])) $parity['write'] = "NOCORRECT";
}
if ($parity['mode']<2) $parity['cumulative'] = '';
if ($parity['mode']<2) $parity['cumulative'] = '';
if ($parity['mode']==2) $parity['frequency'] = '1';
?>
<script>
@@ -199,8 +199,8 @@ _(Write corrections to parity disk)_:
_(Cumulative parity check)_:
: <select name="cumulative" onchange="showCumulative(this.value,'slow')" <?=$parity['mode']>1?'':'disabled'?>>
<?=mk_option($parity['cumulative']??'', "", _("No"))?>
<?=mk_option($parity['cumulative']??'', "1", _("Yes"))?>
<?=mk_option(_var($parity,'cumulative'), "", _("No"))?>
<?=mk_option(_var($parity,'cumulative'), "1", _("Yes"))?>
</select>
:parity_cumulative_check_help:
@@ -208,8 +208,8 @@ _(Cumulative parity check)_:
<div markdown="1" id="cumulative" style="display:none">
_(Accumulation frequency)_:
: <select name="frequency">
<?=mk_option($parity['frequency']??'', "1", _("Daily"))?>
<?=mk_option($parity['frequency']??'', "7", _("Weekly"),$parity['mode']==2 ? 'disabled' : '')?>
<?=mk_option(_var($parity,'frequency'), "1", _("Daily"))?>
<?=mk_option(_var($parity,'frequency'), "7", _("Weekly"),$parity['mode']==2 ? 'disabled' : '')?>
</select>
:parity_accumulation_frequency_help:
@@ -217,7 +217,7 @@ _(Accumulation frequency)_:
_(Accumulation duration)_:
: <select name="duration">
<?for ($h=1; $h<24; $h++):?>
<?=mk_option($parity['duration']??'', $h, $h.' '._('hour'.($h==1?'':'s')))?>
<?=mk_option(_var($parity,'duration'), $h, $h.' '._('hour'.($h==1?'':'s')))?>
<?endfor;?>
</select>
+5 -5
View File
@@ -1,7 +1,7 @@
Menu="Device:2 New:2"
Title="Self-Test"
Tag="wrench"
Cond="strpos($disks[$name]['status']??'','_NP')===false"
Cond="strpos(_var($disks[$name],'status'),'_NP')===false"
---
<?PHP
/* Copyright 2005-2023, Lime Technology
@@ -17,9 +17,9 @@ Cond="strpos($disks[$name]['status']??'','_NP')===false"
?>
<?
$date = date('Ymd-Hi');
$file = $disk['id']."-$date.txt";
$zip = str_replace(' ','_',strtolower($var['NAME']))."-smart-$date.zip";
$long = isset($disks[$name]['spindownDelay']) && ($disks[$name]['spindownDelay']==0 || ($disks[$name]['spindownDelay']==-1 && $var['spindownDelay']==0));
$file = _var($disk,'id','no-id')."-$date.txt";
$zip = str_replace(' ','_',strtolower(_var($var,'NAME','tower')))."-smart-$date.zip";
$long = _var($disks[$name],'spindownDelay')==0 || (_var($disks[$name],'spindownDelay')==-1 && _var($var,'spindownDelay')==0);
?>
_(Download SMART report)_:
: <input type='button' value="_(Download)_" onclick='saveSMART()'>
@@ -79,7 +79,7 @@ function testUpdate(init) {
if ($('#smart_selftest').length) {
$('#smart_selftest').html('<i class="fa fa-camera"></i> _(SMART self-test in progress)_...');
}
if (!init) timers.testUpdate = setTimeout(testUpdate, 3000);
if (!init) timers.testUpdate = setTimeout(testUpdate,3000);
} else {
if ($('#smart_selftest').length) $('#smart_selftest').html('');
$('#short_test').val("_(Start)_");
+6 -6
View File
@@ -1,11 +1,11 @@
Menu="Shares:1"
Title="User Shares"
Tag="user-circle"
Cond="$var['fsState']!='Stopped' && $var['shareUser']=='e'"
Cond="_var($var,'fsState')!='Stopped' && _var($var,'shareUser')=='e'"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -22,7 +22,7 @@ function displayShares(all) {
$('#shareslist').html("<tr><td colspan='8'><div class='spinner'></div></td></tr>");
$('div.spinner').html(unraid_logo);
}
$.get('/webGui/include/ShareList.php',{compute:all,path:'<?=addslashes(htmlspecialchars($path))?>',scale:'<?=$display['scale']?>',number:'<?=$display['number']?>',raw:'<?=$display['raw']?>',fill:$.cookie('ssz')},function(data){
$.get('/webGui/include/ShareList.php',{compute:all,path:'<?=addslashes(htmlspecialchars($path))?>',scale:'<?=_var($display,'scale')?>',number:'<?=_var($display,'number','.,')?>',raw:'<?=_var($display,'raw')?>',fill:$.cookie('ssz')},function(data){
$.removeCookie('ssz')
$('#shareslist').html(data);
$('#compute-shares').prop('disabled',!data || data.indexOf('colspan=')!=-1);
@@ -44,8 +44,8 @@ table.share_status thead tr td:nth-child(n+3){width:10%}
</table>
<p><form name="share_form" method="POST" action="<?=htmlspecialchars($path)?>/Share?name=">
<input id="compute-shares" type="button" value="_(Compute All)_" onclick="$(this).prop('disabled',true);displayShares('yes')">
<?if ($var['startMode']=='Normal'):?>
<input type="submit" value="_(Add Share)_"<?=$var['shareUser']=='e'?'>':' disabled>User shares must be <strong>enabled</strong> to add shares.'?>
<?if (_var($var,'startMode')=='Normal'):?>
<input type="submit" value="_(Add Share)_"<?=_var($var,'shareUser')=='e'?'>':' disabled>User shares must be <strong>enabled</strong> to add shares.'?>
<?else:?>
<input type="submit" value="_(Add Share)_" disabled>
<?endif;?>
+5 -5
View File
@@ -5,8 +5,8 @@ Icon="icon-share"
Tag="share-alt"
---
<?PHP
/* Copyright 2005-2020, Lime Technology
* Copyright 2012-2020, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -17,7 +17,7 @@ Tag="share-alt"
*/
?>
<?
$disabled = $var['fsState']!='Stopped' ? 'disabled' : '';
$disabled = _var($var,'fsState')!='Stopped' ? 'disabled' : '';
$disks = array_filter($disks,'my_disks');
$width = [166,300];
?>
@@ -83,7 +83,7 @@ _(Enable user shares)_:
_(Included disk(s))_:
: <select id="s1" name="shareUserInclude" multiple="multiple" style="display:none">
<?foreach ($disks as $disk):?>
<?=mk_option_luks($disk['name'], $var['shareUserInclude'], strstr($disk['fsType']??'',':',true))?>
<?=mk_option_luks(_var($disk,'name'),_var($var,'shareUserInclude'),strstr(_var($disk,'fsType'),':',true))?>
<?endforeach;?>
</select>
@@ -92,7 +92,7 @@ _(Included disk(s))_:
_(Excluded disk(s))_:
: <select id="s2" name="shareUserExclude" multiple="multiple" style="display:none">
<?foreach ($disks as $disk):?>
<?=mk_option_luks($disk['name'], $var['shareUserExclude'], strstr($disk['fsType']??'',':',true))?>
<?=mk_option_luks(_var($disk,'name'),_var($var,'shareUserExclude'),strstr(_var($disk,'fsType'),':',true))?>
<?endforeach;?>
</select>
+49 -49
View File
@@ -3,8 +3,8 @@ Title="SMTP Settings"
Tag="envelope"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -17,8 +17,8 @@ Tag="envelope"
<?
require_once "$docroot/webGui/include/Encryption.php";
$ssmtp['AuthPass'] = base64_decrypt($ssmtp['AuthPass']);
$incomplete = strlen($ssmtp['root'])==0 || strlen($ssmtp['server'])==0 || strlen($ssmtp['port'])==0 || ((strlen($ssmtp['AuthUser'])==0 || strlen($ssmtp['AuthPass'])==0) && $ssmtp['AuthMethod']!='none');
$ssmtp['AuthPass'] = base64_decrypt(_var($ssmtp,'AuthPass'));
$incomplete = !_var($ssmtp,'root') || !_var($ssmtp,'server') || !_var($ssmtp,'port') || ((!_var($ssmtp,'AuthUser') || !_var($ssmtp,'AuthPass')) && _var($ssmtp,'AuthMethod')!='none');
?>
<script>
var counter,pid;
@@ -75,112 +75,112 @@ function settings(form, data) {
<input type="hidden" name="#arg[1]" value="smtp-init">
_(Preset service)_:
: <select name="service" size="1" onchange="settings(this.form,this.value)">
<?=mk_option($ssmtp['service']??'', "smtp.gmail.com:465:YES:NO:login", "Gmail")?>
<?=mk_option($ssmtp['service']??'', "smtp.gmail.com:587:YES:YES:login", "Gmail with TLS")?>
<?=mk_option($ssmtp['service']??'', "smtp.office365.com:587:YES:YES:login", "Outlook")?>
<?=mk_option($ssmtp['service']??'', "smtp.office365.com:587:YES:YES:login", "Hotmail")?>
<?=mk_option($ssmtp['service']??'', "smtp.office365.com:587:YES:YES:login", "Office365")?>
<?=mk_option($ssmtp['service']??'', "smtp.mail.yahoo.com:465:YES:NO:login", "Yahoo")?>
<?=mk_option($ssmtp['service']??'', "plus.smtp.mail.yahoo.com:465:YES:NO:login", "Yahoo Plus")?>
<?=mk_option($ssmtp['service']??'', "smtp.mail.yahoo.co.uk:465:YES:NO:login", "Yahoo UK")?>
<?=mk_option($ssmtp['service']??'', "smtp.mail.yahoo.com.au:465:YES:NO:login", "Yahoo AU/NZ")?>
<?=mk_option($ssmtp['service']??'', "smtp.o2.ie:25:NO:NO:login", "O2")?>
<?=mk_option($ssmtp['service']??'', "smtp.o2.co.uk:25:NO:NO:login", "O2 UK")?>
<?=mk_option($ssmtp['service']??'', "smtp.o2online.de:25:NO:NO:login", "O2 Online Deutschland")?>
<?=mk_option($ssmtp['service']??'', "securesmtp.t-online.de:587:YES:YES:login", "T-Online Deutschland")?>
<?=mk_option($ssmtp['service']??'', "smtp.1and1.com:587:YES:YES:login", "1&1")?>
<?=mk_option($ssmtp['service']??'', "smtp.1und1.de:587:YES:YES:login", "1&1 Deutschland")?>
<?=mk_option($ssmtp['service']??'', "smtp.att.yahoo.com:465:YES:NO:login", "AT&T")?>
<?=mk_option($ssmtp['service']??'', "smtp.ntlworld.com:465:YES:NO:login", "NTL")?>
<?=mk_option($ssmtp['service']??'', "mail.btopenworld.com:25:NO:NO:login", "BT Openworld")?>
<?=mk_option($ssmtp['service']??'', "mail.btinternet.com:25:NO:NO:login", "BT Internet")?>
<?=mk_option($ssmtp['service']??'', "smtp.comcast.net:465:YES:NO:login", "Comcast")?>
<?=mk_option($ssmtp['service']??'', "outgoing.verizon.net:465:YES:NO:login", "Verizon")?>
<?=mk_option($ssmtp['service']??'', "outgoing.yahoo.verizon.net:587:NO:NO:login", "Verizon (Yahoo hosted)")?>
<?=mk_option($ssmtp['service']??'', "smtp.mail.com:465:YES:NO:login", "Mail.com")?>
<?=mk_option($ssmtp['service']??'', "smtp.gmx.com:465:YES:NO:login", "GMX.com")?>
<?=mk_option($ssmtp['service']??'', "smtp.zoho.com:465:YES:NO:login", "zoho Mail")?>
<?=mk_option($ssmtp['service']??'', "::NO:NO:none", _("Custom"))?>
<?=mk_option(_var($ssmtp,'service'), "smtp.gmail.com:465:YES:NO:login", "Gmail")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.gmail.com:587:YES:YES:login", "Gmail with TLS")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.office365.com:587:YES:YES:login", "Outlook")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.office365.com:587:YES:YES:login", "Hotmail")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.office365.com:587:YES:YES:login", "Office365")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.mail.yahoo.com:465:YES:NO:login", "Yahoo")?>
<?=mk_option(_var($ssmtp,'service'), "plus.smtp.mail.yahoo.com:465:YES:NO:login", "Yahoo Plus")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.mail.yahoo.co.uk:465:YES:NO:login", "Yahoo UK")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.mail.yahoo.com.au:465:YES:NO:login", "Yahoo AU/NZ")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.o2.ie:25:NO:NO:login", "O2")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.o2.co.uk:25:NO:NO:login", "O2 UK")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.o2online.de:25:NO:NO:login", "O2 Online Deutschland")?>
<?=mk_option(_var($ssmtp,'service'), "securesmtp.t-online.de:587:YES:YES:login", "T-Online Deutschland")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.1and1.com:587:YES:YES:login", "1&1")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.1und1.de:587:YES:YES:login", "1&1 Deutschland")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.att.yahoo.com:465:YES:NO:login", "AT&T")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.ntlworld.com:465:YES:NO:login", "NTL")?>
<?=mk_option(_var($ssmtp,'service'), "mail.btopenworld.com:25:NO:NO:login", "BT Openworld")?>
<?=mk_option(_var($ssmtp,'service'), "mail.btinternet.com:25:NO:NO:login", "BT Internet")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.comcast.net:465:YES:NO:login", "Comcast")?>
<?=mk_option(_var($ssmtp,'service'), "outgoing.verizon.net:465:YES:NO:login", "Verizon")?>
<?=mk_option(_var($ssmtp,'service'), "outgoing.yahoo.verizon.net:587:NO:NO:login", "Verizon (Yahoo hosted)")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.mail.com:465:YES:NO:login", "Mail.com")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.gmx.com:465:YES:NO:login", "GMX.com")?>
<?=mk_option(_var($ssmtp,'service'), "smtp.zoho.com:465:YES:NO:login", "zoho Mail")?>
<?=mk_option(_var($ssmtp,'service'), "::NO:NO:none", _("Custom"))?>
</select>
:smtp_preset_service_help:
_(Sending email address)_:
: <input type="text" name="root" value="<?=htmlspecialchars($ssmtp['root']??'')?>">
: <input type="text" name="root" value="<?=htmlspecialchars(_var($ssmtp,'root'))?>">
:smtp_email_address_help:
_(Email recipients)_:
: <input type="text" name="RcptTo" value="<?=htmlspecialchars($ssmtp['RcptTo']??'')?>">
: <input type="text" name="RcptTo" value="<?=htmlspecialchars(_var($ssmtp,'RcptTo'))?>">
:smtp_recipients_help:
_(Priority in header)_:
: <select name="SetEmailPriority">
<?=mk_option($ssmtp['SetEmailPriority']??'', "False", _("No"))?>
<?=mk_option($ssmtp['SetEmailPriority']??'', "True", _("Yes"))?>
<?=mk_option(_var($ssmtp,'SetEmailPriority'), "False", _("No"))?>
<?=mk_option(_var($ssmtp,'SetEmailPriority'), "True", _("Yes"))?>
</select>
:smtp_priority_help:
_(Email subject prefix)_:
: <input type="text" name="Subject" value="<?=htmlspecialchars($ssmtp['Subject']??'')?>">
: <input type="text" name="Subject" value="<?=htmlspecialchars(_var($ssmtp,'Subject'))?>">
:smtp_subject_prefix_help:
_(Mail server)_:
: <input type="text" name="server" value="<?=htmlspecialchars($ssmtp['server']??'')?>">
: <input type="text" name="server" value="<?=htmlspecialchars(_var($ssmtp,'server'))?>">
:smtp_mail_server_help:
_(Mail server port)_:
: <input type="text" name="port" class="narrow" maxlength="5" value="<?=htmlspecialchars($ssmtp['port']??'')?>">
: <input type="text" name="port" class="narrow" maxlength="5" value="<?=htmlspecialchars(_var($ssmtp,'port'))?>">
:smtp_mail_server_port_help:
_(Use SSL/TLS)_:
: <select name="UseTLS">
<?=mk_option($ssmtp['UseTLS']??'', "NO", _("No"))?>
<?=mk_option($ssmtp['UseTLS']??'', "YES", _("Yes"))?>
<?=mk_option(_var($ssmtp,'UseTLS'), "NO", _("No"))?>
<?=mk_option(_var($ssmtp,'UseTLS'), "YES", _("Yes"))?>
</select>
:smtp_use_ssl_tls_help:
_(Use STARTTLS)_:
: <select name="UseSTARTTLS">
<?=mk_option($ssmtp['UseSTARTTLS']??'', "NO", _("No"))?>
<?=mk_option($ssmtp['UseSTARTTLS']??'', "YES", _("Yes"))?>
<?=mk_option(_var($ssmtp,'UseSTARTTLS'), "NO", _("No"))?>
<?=mk_option(_var($ssmtp,'UseSTARTTLS'), "YES", _("Yes"))?>
</select>
:smtp_use_starttls_help:
_(Define a TLS certificate)_:
: <select name="UseTLSCert" onchange="tls(this.form)">
<?=mk_option($ssmtp['UseTLSCert']??'', "NO", _("No"))?>
<?=mk_option($ssmtp['UseTLSCert']??'', "YES", _("Yes"))?>
<?=mk_option(_var($ssmtp,'UseTLSCert'), "NO", _("No"))?>
<?=mk_option(_var($ssmtp,'UseTLSCert'), "YES", _("Yes"))?>
</select>
:smtp_define_tls_cert_help:
_(TLS certificate location)_:
: <input type="text" name="TLSCert" value="<?=htmlspecialchars($ssmtp['TLSCert']??'')?>">
: <input type="text" name="TLSCert" value="<?=htmlspecialchars(_var($ssmtp,'TLSCert'))?>">
:smtp_tls_cert_location_help:
_(Authentication method)_:
: <select name="AuthMethod" onchange="pwd(this.form)">
<?=mk_option($ssmtp['AuthMethod']??'', "none", _("None"))?>
<?=mk_option($ssmtp['AuthMethod']??'', "cram-md5", _("CRAM-MD5"))?>
<?=mk_option($ssmtp['AuthMethod']??'', "login", _("Login"))?>
<?=mk_option(_var($ssmtp,'AuthMethod'), "none", _("None"))?>
<?=mk_option(_var($ssmtp,'AuthMethod'), "cram-md5", _("CRAM-MD5"))?>
<?=mk_option(_var($ssmtp,'AuthMethod'), "login", _("Login"))?>
</select>
:smtp_authentication_method_help:
_(Username)_:
: <input type="text" name="AuthUser" value="<?=htmlspecialchars($ssmtp['AuthUser']??'')?>">
: <input type="text" name="AuthUser" value="<?=htmlspecialchars(_var($ssmtp,'AuthUser'))?>">
_(Password)_:
: <input type="password" name="AuthPass" value="<?=htmlspecialchars($ssmtp['AuthPass']??'')?>">
: <input type="password" name="AuthPass" value="<?=htmlspecialchars(_var($ssmtp,'AuthPass'))?>">
:smtp_username_password_help:
+33 -33
View File
@@ -4,8 +4,8 @@ Icon="icon-eula"
Tag="file-text-o"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -16,7 +16,7 @@ Tag="file-text-o"
*/
?>
<?
$syslog = (array)@parse_ini_file('/boot/config/rsyslog.cfg');
$syslog = @parse_ini_file('/boot/config/rsyslog.cfg') ?: [];
function plain($ip) {
return str_replace(['[',']'],'',$ip);
@@ -27,7 +27,7 @@ exec("lsof -Pni|awk '/LISTEN/ && \$9!~/127.0.0.1/ && \$9!~/\\[::1\\]/{print \$9}
$ethX = 'eth0';
$addr = ipaddr($ethX);
$bind = $var['BIND_MGT']=='yes';
$bind = _var($var,'BIND_MGT')=='yes';
$list = ['*',$addr];
foreach ($output as $line) {
@@ -52,7 +52,7 @@ $(function(){
});
function validatePort(form) {
var portsInUse = JSON.parse('<?=json_encode($portsInUse)?>');
var currentPort = "<?=(isset($syslog['local_server']) && $syslog['server_protocol']??''!='udp') ? $syslog['server_port']??'0' : '0'?>";
var currentPort = "<?=(_var($syslog,'local_server') && _var($syslog,'server_protocol')!='udp') ? _var($syslog,'server_port',514) : 514?>";
var port = $(form).find('input[name="server_port"]');
var remotePort = $(form).find('input[name="remote_port"]');
var protocol = $(form).find('select[name="server_protocol"]').val();
@@ -90,15 +90,15 @@ function validatePort(form) {
_(Local syslog server)_:
: <span class="span"><select name="local_server" onchange="localFolder(this.value,'slow')">
<?=mk_option($syslog['local_server']??'', "", _("Disabled"))?>
<?=mk_option($syslog['local_server']??'', "1", _("Enabled"))?>
<?=mk_option(_var($syslog,'local_server'), "", _("Disabled"))?>
<?=mk_option(_var($syslog,'local_server'), "1", _("Enabled"))?>
</select></span>
<select name="server_protocol" class="narrow">
<?=mk_option($syslog['server_protocol']??'', "udp", _("UDP"))?>
<?=mk_option($syslog['server_protocol']??'', "tcp", _("TCP"))?>
<?=mk_option($syslog['server_protocol']??'', "both", _("Both"))?>
<?=mk_option(_var($syslog,'server_protocol'), "udp", _("UDP"))?>
<?=mk_option(_var($syslog,'server_protocol'), "tcp", _("TCP"))?>
<?=mk_option(_var($syslog,'server_protocol'), "both", _("Both"))?>
</select>
<input type="text" name="server_port" class="trim" value="<?=$syslog['server_port']??''?>" maxlength="5" placeholder="514">
<input type="text" name="server_port" class="trim" value="<?=_var($syslog,'server_port')?>" maxlength="5" placeholder="514">
:syslog_local_server_help:
@@ -106,15 +106,15 @@ _(Local syslog server)_:
_(Local syslog folder)_:
: <select name="server_folder">
<?=mk_option(0,'','&lt;'._('custom').'&gt;','disabled')?>
<?foreach ($shares as $share){echo mk_option($syslog['server_folder']??'', '/mnt/user/'.$share['name'], $share['name']);}?>
<?foreach ($shares as $share){echo mk_option(_var($syslog,'server_folder'), '/mnt/user/'.$share['name'], $share['name']);}?>
</select>
:syslog_local_folder_help:
_(Local syslog rotation)_:
: <select name="log_rotation" onchange="logOptions(this.value,'slow')">
<?=mk_option($syslog['log_rotation']??'', "", _("Disabled"))?>
<?=mk_option($syslog['log_rotation']??'', "1", _("Enabled"))?>
<?=mk_option(_var($syslog,'log_rotation'), "", _("Disabled"))?>
<?=mk_option(_var($syslog,'log_rotation'), "1", _("Enabled"))?>
</select>
:syslog_local_rotation_help:
@@ -122,25 +122,25 @@ _(Local syslog rotation)_:
<div markdown="1" id="log_options" style="display:none">
_(Local syslog maximum file size)_:
: <select name="log_size">
<?=mk_option($syslog['log_size']??'', '1M', '1 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '2M', '2 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '5M', '5 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '10M', '10 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '20M', '20 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '50M', '50 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '100M', '100 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '200M', '200 '._('MB'))?>
<?=mk_option($syslog['log_size']??'', '500M', '500 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '1M', '1 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '2M', '2 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '5M', '5 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '10M', '10 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '20M', '20 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '50M', '50 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '100M', '100 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '200M', '200 '._('MB'))?>
<?=mk_option(_var($syslog,'log_size'), '500M', '500 '._('MB'))?>
</select>
:syslog_local_file_size_help:
_(Local syslog number of files)_:
: <select name="log_files">
<?=mk_option($syslog['log_files']??'', '1', '1')?>
<?=mk_option($syslog['log_files']??'', '2', '2')?>
<?=mk_option($syslog['log_files']??'', '3', '3')?>
<?=mk_option($syslog['log_files']??'', '4', '4')?>
<?=mk_option(_var($syslog,'log_files'), '1', '1')?>
<?=mk_option(_var($syslog,'log_files'), '2', '2')?>
<?=mk_option(_var($syslog,'log_files'), '3', '3')?>
<?=mk_option(_var($syslog,'log_files'), '4', '4')?>
</select>
:syslog_local_file_number_help:
@@ -149,19 +149,19 @@ _(Local syslog number of files)_:
</div>
_(Remote syslog server)_:
: <span class="span"><input type="text" name="remote_server" class="narrow" value="<?=$syslog['remote_server']??''?>" maxlength="23" placeholder="_(name or ip address)_"></span>
: <span class="span"><input type="text" name="remote_server" class="narrow" value="<?=_var($syslog,'remote_server')?>" maxlength="23" placeholder="_(name or ip address)_"></span>
<select name="remote_protocol" class="narrow" size="1">
<?=mk_option($syslog['remote_protocol']??'', "udp", _("UDP"))?>
<?=mk_option($syslog['remote_protocol']??'', "tcp", _("TCP"))?>
<?=mk_option(_var($syslog,'remote_protocol'), "udp", _("UDP"))?>
<?=mk_option(_var($syslog,'remote_protocol'), "tcp", _("TCP"))?>
</select>
<input type="number" name="remote_port" class="trim" value="<?=$syslog['remote_port']??''?>" maxlength="5" placeholder="514" pattern="([0-9]{1,5})">
<input type="number" name="remote_port" class="trim" value="<?=_var($syslog,'remote_port')?>" maxlength="5" placeholder="514" pattern="([0-9]{1,5})">
:syslog_remote_server_help:
_(Mirror syslog to flash)_:
: <select name="syslog_flash" size="1">
<?=mk_option($syslog['syslog_flash']??'', "", _("No"))?>
<?=mk_option($syslog['syslog_flash']??'', "1", _("Yes"))?>
<?=mk_option(_var($syslog,'syslog_flash'), "", _("No"))?>
<?=mk_option(_var($syslog,'syslog_flash'), "1", _("Yes"))?>
</select>
:syslog_mirror_flash_help:
+15 -15
View File
@@ -3,8 +3,8 @@ Title="SSD TRIM Settings"
Tag="superpowers"
---
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -62,7 +62,7 @@ $(function() {
_(SSD TRIM schedule)_:
: <select name="mode" onchange="presetTrim(this.form)">
<?for ($m=0; $m<count($mode); $m++):?>
<?=mk_option($ssd['mode']??'', strval($m), _($mode[$m]))?>
<?=mk_option(_var($ssd,'mode'), strval($m), _($mode[$m]))?>
<?endfor;?>
</select>
@@ -75,9 +75,9 @@ _(SSD TRIM schedule)_:
_(Day of the week)_:
: <select name="day">
<?for ($d=0; $d<count($days); $d++):?>
<?=mk_option($ssd['day']??'', strval($d), _($days[$d],0))?>
<?=mk_option(_var($ssd,'day'), strval($d), _($days[$d],0))?>
<?endfor;?>
<?=mk_option($ssd['day']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($ssd,'day'), "*", "--------", _("disabled"))?>
</select>
:trim_day_of_the_week_plug:
@@ -87,9 +87,9 @@ _(Day of the week)_:
_(Day of the month)_:
: <select name="dotm">
<?for ($d=1; $d<=31; $d++):?>
<?=mk_option($ssd['dotm']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($ssd,'dotm'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
<?=mk_option($ssd['dotm']??'', "*", "--------", _("disabled"))?>
<?=mk_option(_var($ssd,'dotm'), "*", "--------", _("disabled"))?>
</select>
:trim_day_of_the_month_plug:
@@ -99,21 +99,21 @@ _(Day of the month)_:
_(Time of the day)_:
: <span id="hour1" style="display:none"><select name="hour1" class="narrow">
<?for ($d=0; $d<=23; $d++):?>
<?=mk_option($ssd['hour']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($ssd,'hour'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>
<select name="min" class="narrow">
<?for ($d=0; $d<=55; $d+=5):?>
<?=mk_option($ssd['min']??'', strval($d), sprintf("%02d", $d))?>
<?=mk_option(_var($ssd,'min'), strval($d), sprintf("%02d", $d))?>
<?endfor;?>
</select>&nbsp;&nbsp;_(HH:MM)_</span>
: <span id="hour2" style="display:none"><select name="hour2">
<?=mk_option($ssd['hour']??'', "*/1", _("Every hour"))?>
<?=mk_option($ssd['hour']??'', "*/2", _("Every 2 hours"))?>
<?=mk_option($ssd['hour']??'', "*/3", _("Every 3 hours"))?>
<?=mk_option($ssd['hour']??'', "*/4", _("Every 4 hours"))?>
<?=mk_option($ssd['hour']??'', "*/6", _("Every 6 hours"))?>
<?=mk_option($ssd['hour']??'', "*/8", _("Every 8 hours"))?>
<?=mk_option(_var($ssd,'hour'), "*/1", _("Every hour"))?>
<?=mk_option(_var($ssd,'hour'), "*/2", _("Every 2 hours"))?>
<?=mk_option(_var($ssd,'hour'), "*/3", _("Every 3 hours"))?>
<?=mk_option(_var($ssd,'hour'), "*/4", _("Every 4 hours"))?>
<?=mk_option(_var($ssd,'hour'), "*/6", _("Every 6 hours"))?>
<?=mk_option(_var($ssd,'hour'), "*/8", _("Every 8 hours"))?>
</select></span>
:trim_time_of_the_day_plug:
+61 -61
View File
@@ -27,7 +27,7 @@ exec("ip -6 addr show scope global|grep -PA2 ': (eth|br|bond)\d+'|awk '/inet6 .+
exec("ls --indicator-style=none $etc/wg*.conf*|grep -Po wg[0-9]+",$vtuns);
exec("docker network ls --filter driver='macvlan' --filter driver='ipvlan' --format='{{.Name}}' 2>/dev/null",$filter);
$nginx = (array)parse_ini_file('state/nginx.ini');
$nginx = @parse_ini_file('state/nginx.ini') ?: [];
// add subnets defined in Docker custom networks
if (count($filter)) {
@@ -42,7 +42,7 @@ $hosts = implode(',',$hosts);
$subnets6 = implode(',',$subnets6);
$hosts6 = implode(',',$hosts6);
function ifname($eth,$new) {
function ifname($eth, $new) {
return str_replace('eth',$new,$eth);
}
function iflink($eth) {
@@ -54,7 +54,7 @@ function iflink($eth) {
function concat($array) {
return implode(',',array_map(function($v){return "'$v'";},$array));
}
function readConf(&$peer_wg,&$wg,$vtun) {
function readConf(&$peer_wg, &$wg, $vtun) {
global $etc,$netbase,$netpool,$netbase6,$netpool6,$validIP4,$validIP6;
$conf = "$etc/$vtun.conf";
$cfg = "$etc/$vtun.cfg";
@@ -114,27 +114,27 @@ function readConf(&$peer_wg,&$wg,$vtun) {
}
}
$wg = array_merge($wg,$more);
[$subnet,$mask] = my_explode('/',$wg['Network:0']??'');
[$subnet6,$mask6] = my_explode('/',$wg['Network6:0']??'');
[$subnet,$mask] = my_explode('/',_var($wg,'Network:0'));
[$subnet6,$mask6] = my_explode('/',_var($wg,'Network6:0'));
$netbase[$vtun] = ip2long($subnet) & (0x100000000-2**(32-$mask));
$netbase6[$vtun] = $subnet6 ?: $netpool6[$vtun];
} else {
$netbase[$vtun] = ip2long($netpool[$vtun]);
$netbase6[$vtun] = $netpool6[$vtun];
}
foreach ($peer_wg as $i) if (isset($wg["TYPE:$i"]) && $wg["TYPE:$i"]>=7) {$vpn = $wg["TYPE:$i"]; break;}
foreach ($peer_wg as $i) if (_var($wg,"TYPE:$i",0)>=7) {$vpn = $wg["TYPE:$i"]; break;}
return [$conf,$cfg,$file,$vpn];
}
$public = $nginx['NGINX_WANFQDN'];
$active = (array)explode(' ',exec('wg show interfaces'));
$autostart = (array)explode(' ',@file_get_contents("$etc/autostart"));
$public = _var($nginx,'NGINX_WANFQDN');
$active = explode(' ',exec('wg show interfaces'));
$autostart = explode(' ',@file_get_contents("$etc/autostart")?:'');
$build = false;
$script = "$docroot/webGui/scripts/upnp_port";
$template = "$docroot/webGui/WGX.page";
$tower = $var['NAME'];
$tower = _var($var,'NAME');
$ethX = 'eth0';
$server = ipaddr($ethX);
$dnsserver = $$ethX['DNS_SERVER1'];
$dnsserver = _var($$ethX,'DNS_SERVER1');
$link = iflink($ethX);
$postUp0 = "$script add $link WireGuard-<wg> $server <port> <port> udp";
@@ -154,7 +154,7 @@ $postDown3 = "iptables -F WIREGUARD_DROP_<WG>;iptables -D WIREGUARD -o $link -j
$postDown26= "ip6tables -t nat -D POSTROUTING -s <source> -o $link -j MASQUERADE";
$postDown36= "ip6tables -F WIREGUARD_DROP_<WG>;ip6tables -D WIREGUARD -o $link -j WIREGUARD_DROP_<WG>;ip6tables -X WIREGUARD_DROP_<WG>";
$tld = file_get_contents("$docroot/webGui/include/tld.key");
$tld = @file_get_contents("$docroot/webGui/include/tld.key")?:'';
$validDNS = "([0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?\.)+($tld)";
$validIP4 = "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}";
$validIP6 = "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(:|([0-9a-fA-F]{1,4}:)+):(([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?)";
@@ -257,11 +257,11 @@ Array.prototype.bind = function(w){return (this.join(';')).replace(/<WG>/g,w
var xml = $.cookie('upnp')||'<?=@file_get_contents('/var/tmp/upnp')?>';
var netbase = {}, netpool = {}, netport = {}, netbase6 = {}, netpool6 = {};
netbase['wg0'] = <?=$netbase['wg0']?>;
netpool['wg0'] = "<?=$netpool['wg0']?>";
netport['wg0'] = "<?=$netport['wg0']?>";
netbase6['wg0'] = "<?=$netbase6['wg0']?>";
netpool6['wg0'] = "<?=$netpool6['wg0']?>";
netbase['wg0'] = <?=_var($netbase,'wg0')?>;
netpool['wg0'] = "<?=_var($netpool,'wg0')?>";
netport['wg0'] = "<?=_var($netport,'wg0')?>";
netbase6['wg0'] = "<?=_var($netbase6,'wg0')?>";
netpool6['wg0'] = "<?=_var($netpool6,'wg0')?>";
// polyfill to fix reportValidity() for Firefox
if (!HTMLInputElement.prototype.reportValidity || (navigator.userAgent.indexOf("Firefox") !== -1)) {
@@ -1251,7 +1251,7 @@ $(function(){
<input type="hidden" name="#deleted" value="">
<input type="hidden" name="#locale" value="<?=$locale?>">
_(Local name)_:
: <span class="input"><input type="text" name="Name:0" class="wide" maxlength="99" value="<?=$wg0["Name:0"]??''?>" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="Name:0" class="wide" maxlength="99" value="<?=_var($wg0,"Name:0")?>" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
<span class="pin"><i class="fa fa-fw fa-eye eye0<?=$this_wg0?'':' key-off'?>" style="cursor:pointer" onclick="WGconfig(this,'wg0','')" title="_(View Local Config)_"></i>
<i class="fa fa-fw fa-key zone0<?=isset($wg0['PublicKey:0'])?'':' key-off'?>" style="cursor:pointer" onclick="openClose($(document.wg0),null,'div.key0')" title="_(Toggle keys)_"></i>
<i id="chevron-wg0-0" class="fa fa-fw fa-chevron-down" style="cursor:pointer" onclick="openClose($(document.wg0),this,'div.zone0')" title="_(Toggle view)_"></i></span>
@@ -1260,13 +1260,13 @@ _(Local name)_:
<div markdown="1" class="keys wg0 key0"<?=isset($wg0['PublicKey:0'])?' style="display:none">':'>'?>
_(Local private key)_:
: <span class="input"><input type="text" name="PrivateKey:0" class="wide private-0" maxlength="64" value="<?=$wg0['PrivateKey:0']??''?>" onchange="highlight($(document.wg0),this,0)" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="PrivateKey:0" class="wide private-0" maxlength="64" value="<?=_var($wg0,'PrivateKey:0')?>" onchange="highlight($(document.wg0),this,0)" placeholder="(_(mandatory)_)" required></span>
<input type="button" class="form" value="_(Generate Keypair)_" onclick="keypair($(document.wg0),'0')">
:wg_generate_keypair_help:
_(Local public key)_:
: <span class="input"><input type="text" name="PublicKey:0" class="wide public-0" maxlength="64" value="<?=$wg0['PublicKey:0']??''?>" onchange="highlight($(document.wg0),this,0)" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="PublicKey:0" class="wide public-0" maxlength="64" value="<?=_var($wg0,'PublicKey:0')?>" onchange="highlight($(document.wg0),this,0)" placeholder="(_(mandatory)_)" required></span>
:wg_generate_keypair_help:
@@ -1274,46 +1274,46 @@ _(Local public key)_:
<div markdown="1" class="advanced wg0 zone0" style="display:none">
_(Network protocol)_:
: <span class="input"><select id="protocol-wg0" name="PROT:0" class="subnet" onchange="setProtocol($(document.wg0),'wg0',true)">
<?=mk_option($wg0['PROT:0']??'', "", "_(IPv4 only)_")?>
<?=mk_option($wg0['PROT:0']??'', "6", "_(IPv6 only)_")?>
<?=mk_option($wg0['PROT:0']??'', "46", "_(IPv4 + IPv6)_")?>
<?=mk_option(_var($wg0,'PROT:0'), "", "_(IPv4 only)_")?>
<?=mk_option(_var($wg0,'PROT:0'), "6", "_(IPv6 only)_")?>
<?=mk_option(_var($wg0,'PROT:0'), "46", "_(IPv4 + IPv6)_")?>
</select></span>
<div markdown="1" class="ipv4 wg0" style="display:none">
_(Local tunnel network pool)_:
<input type="hidden" name="Network:0" value="">
: <span class="input"><input type="text" name="gui:Network:0" class="subnet" maxlength="15" value="<?=explode('/',$wg0['Network:0']??'')[0]?>" onchange="setPool($(document.wg0),'wg0')" pattern="<?=$validIP4?>" title="_(IPv4 network)_" placeholder="<?=$netpool['wg0']??''?>">/
<input type="number" name="gui:Mask:0" class="mask" min="1" max="32" value="<?=my_explode('/',$wg0['Network:0']??'')[1]?>" onchange="if(quickValidate(this)) {setPool($(document.wg0),'wg0')}" placeholder="24"></span>
: <span class="input"><input type="text" name="gui:Network:0" class="subnet" maxlength="15" value="<?=explode('/',_var($wg0,'Network:0'))[0]?>" onchange="setPool($(document.wg0),'wg0')" pattern="<?=$validIP4?>" title="_(IPv4 network)_" placeholder="<?=_var($netpool,'wg0')?>">/
<input type="number" name="gui:Mask:0" class="mask" min="1" max="32" value="<?=my_explode('/',_var($wg0,'Network:0'))[1]?>" onchange="if(quickValidate(this)) {setPool($(document.wg0),'wg0')}" placeholder="24"></span>
</div>
<div markdown="1" class="ipv6 wg0" style="display:none">
_(Local tunnel network pool IPv6)_:
<input type="hidden" name="Network6:0" value="">
: <span class="input"><input type="text" name="gui:Network6:0" class="subnet" maxlength="40" value="<?=explode('/',$wg0['Network6:0']??'')[0]?>" onchange="setPool6($(document.wg0),'wg0')" pattern="<?=$validIP6?>" title="_(IPv6 network)_" placeholder="<?=$netpool6['wg0']??''?>">/
<input type="number" name="gui:Mask6:0" class="mask" min="1" max="128" value="<?=my_explode('/',$wg0['Network6:0']??'')[1]?>" onchange="if(quickValidate(this)) {setPool6($(document.wg0),'wg0')}" placeholder="64"></span>
: <span class="input"><input type="text" name="gui:Network6:0" class="subnet" maxlength="40" value="<?=explode('/',_var($wg0,'Network6:0'))[0]?>" onchange="setPool6($(document.wg0),'wg0')" pattern="<?=$validIP6?>" title="_(IPv6 network)_" placeholder="<?=_var($netpool6,'wg0')?>">/
<input type="number" name="gui:Mask6:0" class="mask" min="1" max="128" value="<?=my_explode('/',_var($wg0,'Network6:0'))[1]?>" onchange="if(quickValidate(this)) {setPool6($(document.wg0),'wg0')}" placeholder="64"></span>
</div>
:wg_local_tunnel_network_pool_help:
<div markdown="1" class="ipv4 wg0" style="display:none">
_(Local tunnel address)_:
: <span class="input"><input type="text" name="Address:0" class="subnet" maxlength="15" value="<?=$wg0['Address:0']??long2ip($netbase['wg0']+1)?>" onchange="verifyInSubnet(this)" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
: <span class="input"><input type="text" name="Address:0" class="subnet" maxlength="15" value="<?=_var($wg0,'Address:0')?:long2ip(_var($netbase,'wg0')+1)?>" onchange="verifyInSubnet(this)" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
:wg_local_tunnel_address_help:
</div>
<div markdown="1" class="ipv6 wg0" style="display:none">
_(Local tunnel address IPv6)_:
: <span class="input"><input type="text" name="Address6:0" class="subnet" maxlength="40" value="<?=$wg0['Address6:0']??($netbase6['wg0'].'1')?>" onchange="verifyInSubnet6(this)" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
: <span class="input"><input type="text" name="Address6:0" class="subnet" maxlength="40" value="<?=_var($wg0,'Address6:0')?:(_var($netbase6,'wg0').'1')?>" onchange="verifyInSubnet6(this)" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
:wg_local_tunnel_address_help:
</div>
</div>
_(Local endpoint)_:
: <span class="input"><input type="text" id="endpoint-wg0" name="Endpoint:0" class="subnet" value="<?=$vpn_wg0?'':$wg0['Endpoint:0']??''?>" onchange="toLC(this);quickValidate(this);" pattern="<?=$validText?>" title="_(IP address or FQDN)_" placeholder="<?=$vpn_wg0?'(_(not used)_)':preg_replace('/^(.+?\.)[0-9a-zA-Z]+(\.(my)?unraid.net)$/','$1<hash>$2',$public)?>">:
<input type="number" name="gui:ListenPort:0" class="port" min="1" max="65535" value="<?=$vpn_wg0?'':$wg0['ListenPort:0']??''?>" onchange="if(quickValidate(this)) {portRemark($(document.wg0),'wg0',this.value)}" placeholder="<?=$vpn_wg0?'':$netport['wg0']?>"></span>
<span class="remark block" style="display:none">_(Remark)_: _(configure your router with port forwarding of port)_ **<span id="my-port-wg0"><?=$wg0['ListenPort:0']??$netport['wg0']??''?></span>/_(UDP)_** _(to)_ **<?=$server?>:<?=$wg0['ListenPort:0']??$netport['wg0']??''?>**</span><span class="upnp wg0 block"></span>
: <span class="input"><input type="text" id="endpoint-wg0" name="Endpoint:0" class="subnet" value="<?=$vpn_wg0?'':_var($wg0,'Endpoint:0')?>" onchange="toLC(this);quickValidate(this);" pattern="<?=$validText?>" title="_(IP address or FQDN)_" placeholder="<?=$vpn_wg0?'(_(not used)_)':preg_replace('/^(.+?\.)[0-9a-zA-Z]+(\.(my)?unraid.net)$/','$1<hash>$2',$public)?>">:
<input type="number" name="gui:ListenPort:0" class="port" min="1" max="65535" value="<?=$vpn_wg0?'':_var($wg0,'ListenPort:0')?>" onchange="if(quickValidate(this)) {portRemark($(document.wg0),'wg0',this.value)}" placeholder="<?=$vpn_wg0?'':_var($netport,'wg0')?>"></span>
<span class="remark block" style="display:none">_(Remark)_: _(configure your router with port forwarding of port)_ **<span id="my-port-wg0"><?=_var($wg0,'ListenPort:0')?:_var($netport,'wg0')?></span>/_(UDP)_** _(to)_ **<?=$server?>:<?=_var($wg0,'ListenPort:0')?:_var($netport,'wg0')?>**</span><span class="upnp wg0 block"></span>
<input type="hidden" name="ListenPort:0" value=""><dl id="endpoint4-wg0" style="display:none"></dl><dl id="endpoint6-wg0" style="display:none"></dl>
:wg_local_endpoint_help:
@@ -1321,34 +1321,34 @@ _(Local endpoint)_:
<div markdown="1" class="advanced wg0 zone0" style="display:none">
_(Local server uses NAT)_:
: <span class="input"><select name="NAT:0" class="narrow" onchange="showRoute($(document.wg0),'wg0',0)">
<?=mk_option($wg0['NAT:0']??'', "", _("Yes"))?>
<?=mk_option($wg0['NAT:0']??'', "no", _("No"))?>
<?=mk_option(_var($wg0,'NAT:0'), "", _("Yes"))?>
<?=mk_option(_var($wg0,'NAT:0'), "no", _("No"))?>
</select></span>
<span id="my-static1-wg0" class="block" style="display:none">_(Remark)_: _(configure your router with a static route of)_ **<?=$wg0['Network:0']??''?>** _(to)_ **<?=$server?>**</span><span id="my-static2-wg0" class="block" style="display:none">_(Remark)_: _(docker containers on custom networks need static routing)_ **<?=$wg0['Network:0']??''?>** _(to)_ **<?=$server?>**</span>
<span id="my-static1-wg0" class="block" style="display:none">_(Remark)_: _(configure your router with a static route of)_ **<?=_var($wg0,'Network:0')?>** _(to)_ **<?=$server?>**</span><span id="my-static2-wg0" class="block" style="display:none">_(Remark)_: _(docker containers on custom networks need static routing)_ **<?=_var($wg0,'Network:0')?>** _(to)_ **<?=$server?>**</span>
:wg_local_server_uses_nat_help:
<div markdown="1" class="upnp wg0" style="display:none">
_(Local gateway uses UPnP)_:
: <span class="input"><select name="UPNP:0" class="narrow" onchange="showRemark($(document.wg0))">
<?=mk_option($wg0['UPNP:0']??'', "", _("Yes"))?>
<?=mk_option($wg0['UPNP:0']??'', "no", _("No"))?>
<?=mk_option(_var($wg0,'UPNP:0'), "", _("Yes"))?>
<?=mk_option(_var($wg0,'UPNP:0'), "no", _("No"))?>
</select></span>
:wg_local_gateway_uses_upnp_help:
</div>
_(Local tunnel firewall)_:
: <span class="input"><input type="text" name="DROP:0" class="wide" value="<?=$wg0['DROP:0']??''?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="DROP:0" class="wide" value="<?=_var($wg0,'DROP:0')?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(optional)_)"></span>
_(Rule)_: <select name="RULE:0" class="auto">
<?=mk_option($wg0['RULE:0']??'', "", _("Deny"))?>
<?=mk_option($wg0['RULE:0']??'', "1", _("Allow"))?>
<?=mk_option(_var($wg0,'RULE:0'), "", _("Deny"))?>
<?=mk_option(_var($wg0,'RULE:0'), "1", _("Allow"))?>
</select>
:wg_local_tunnel_firewall_help:
_(MTU size)_:
: <span class="input"><input type="number" name="MTU:0" class="trim" min="68" max="9198" value="<?=$wg0['MTU:0']??''?>" onchange="quickValidate(this);" placeholder="(_(automatic)_)">_(bytes)_</span>
: <span class="input"><input type="number" name="MTU:0" class="trim" min="68" max="9198" value="<?=_var($wg0,'MTU:0')?>" onchange="quickValidate(this);" placeholder="(_(automatic)_)">_(bytes)_</span>
:wg_mtu_size_help:
@@ -1372,7 +1372,7 @@ _(DNS servers)_:
<?foreach ($peer_wg0 as $i):?>
<div markdown="1" id="index-wg0-<?=$i?>" class="shade-<?=$display['theme']?>">
_(Peer name)_:
: <span class="input"><input type="text" name="Name:<?=$i?>" class="wide" maxlength="99" value="<?=$wg0["Name:$i"]??''?>" onchange="quickValidate(this);" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="Name:<?=$i?>" class="wide" maxlength="99" value="<?=_var($wg0,"Name:$i")?>" onchange="quickValidate(this);" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
<input type="button" class="form" value="_(Delete Peer)_" onclick="delPeer($(document.wg0),'#index-wg0-<?=$i?>')">
<span class="pin"><i class="fa fa-fw fa-eye eye<?=$i?><?=(file_exists("$etc/peers/peer-$tower-wg0-$i.conf")&&isset($wg0["TYPE:$i"])&&$wg0["TYPE:$i"]<=6)?'':' key-off'?>" style="cursor:pointer" onclick="WGconfig(this,'peer-<?=$tower?>-wg0-<?=$i?>','/peers')" title="_(View Peer Config)_"></i>
<i class="fa fa-fw fa-key zone<?=$i?><?=isset($wg0["PublicKey:$i"])?'':' key-off'?>" style="cursor:pointer" onclick="openClose($(document.wg0),null,'div.key<?=$i?>')" title="_(Toggle keys)_"></i>
@@ -1382,15 +1382,15 @@ _(Peer name)_:
_(Peer type of access)_:
: <span class="input"><select name="TYPE:<?=$i?>" class="auto" onchange="updatePeer($(document.wg0),<?=$i?>,this.value,'wg0')">
<?=mk_option($wg0["TYPE:$i"]??'', "0", _("Remote access to server"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "1", _("Remote access to LAN"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "2", _("Server to server access"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "3", _("LAN to LAN access"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "4", _("Server hub & spoke access"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "5", _("LAN hub & spoke access"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "6", _("Remote tunneled access"))?>
<?=mk_option($wg0["TYPE:$i"]??'', "7", _("VPN tunneled access for system"),count($peer_wg0)==1?'':'disabled')?>
<?=mk_option($wg0["TYPE:$i"]??'', "8", _("VPN tunneled access for docker"),count($peer_wg0)==1?'':'disabled')?>
<?=mk_option(_var($wg0,"TYPE:$i"), "0", _("Remote access to server"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "1", _("Remote access to LAN"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "2", _("Server to server access"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "3", _("LAN to LAN access"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "4", _("Server hub & spoke access"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "5", _("LAN hub & spoke access"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "6", _("Remote tunneled access"))?>
<?=mk_option(_var($wg0,"TYPE:$i"), "7", _("VPN tunneled access for system"),count($peer_wg0)==1?'':'disabled')?>
<?=mk_option(_var($wg0,"TYPE:$i"), "8", _("VPN tunneled access for docker"),count($peer_wg0)==1?'':'disabled')?>
</select></span>
<span id="access-type-<?=$i?>" class="access-type"></span>
@@ -1400,18 +1400,18 @@ _(Peer type of access)_:
<div markdown="1" class="keys wg0 key<?=$i?>"<?=isset($wg0["PublicKey:$i"])?' style="display:none">':'>'?>
_(Peer private key)_:
: <span class="input"><input type="text" name="PrivateKey:<?=$i?>" class="wide private-<?=$i?>" maxlength="64" value="<?=$wg0["PrivateKey:$i"]??''?>" onchange="highlight($(document.wg0),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="PrivateKey:<?=$i?>" class="wide private-<?=$i?>" maxlength="64" value="<?=_var($wg0,"PrivateKey:$i")?>" onchange="highlight($(document.wg0),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
<input type="button" class="form" value="_(Generate Keypair)_" onclick="keypair($(document.wg0),'<?=$i?>')">
:wg_generate_keypair_help:
_(Peer public key)_:
: <span class="input"><input type="text" name="PublicKey:<?=$i?>" class="wide public-<?=$i?>" maxlength="64" value="<?=$wg0["PublicKey:$i"]??''?>" onchange="highlight($(document.wg0),this,<?=$i?>)" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="PublicKey:<?=$i?>" class="wide public-<?=$i?>" maxlength="64" value="<?=_var($wg0,"PublicKey:$i")?>" onchange="highlight($(document.wg0),this,<?=$i?>)" placeholder="(_(mandatory)_)" required></span>
:wg_generate_keypair_help:
_(Peer preshared key)_:
: <span class="input"><input type="text" name="PresharedKey:<?=$i?>" class="wide preshared-<?=$i?>" maxlength="64" value="<?=$wg0["PresharedKey:$i"]??''?>" onchange="highlight($(document.wg0),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="PresharedKey:<?=$i?>" class="wide preshared-<?=$i?>" maxlength="64" value="<?=_var($wg0,"PresharedKey:$i")?>" onchange="highlight($(document.wg0),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
<input type="button" class="form" value="_(Generate Key)_" onclick="presharedkey($(document.wg0),'<?=$i?>')">
:wg_peer_preshared_key_help:
@@ -1420,13 +1420,13 @@ _(Peer preshared key)_:
<div markdown="1" class="advanced wg0 zone<?=$i?>" style="display:none">
<div markdown="1" class="ipv4 wg0" style="display:none">
_(Peer tunnel address)_:
: <span class="input"><input type="text" name="Address:<?=$i?>" class="subnet" maxlength="15" value="<?=$wg0["Address:$i"]??''?>" onchange="if(verifyInSubnet(this)){setAllow($(document.wg0),this.value,<?=$i?>)}" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
: <span class="input"><input type="text" name="Address:<?=$i?>" class="subnet" maxlength="15" value="<?=_var($wg0,"Address:$i")?>" onchange="if(verifyInSubnet(this)){setAllow($(document.wg0),this.value,<?=$i?>)}" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
<input type="button" class="form ping-button1-<?=$i?>" value="_(Ping)_" onclick="ping($(document.wg0),this,'input[name=&quot;Address:<?=$i?>&quot;]')"<?=isset($wg0["Address:$i"])?'':' disabled'?>>
</div>
<div markdown="1" class="ipv6 wg0" style="display:none">
_(Peer tunnel address IPv6)_:
: <span class="input"><input type="text" name="Address6:<?=$i?>" class="subnet" maxlength="40" value="<?=$wg0["Address6:$i"]??''?>" onchange="if(verifyInSubnet6(this)){setAllow6($(document.wg0),this.value,<?=$i?>)}" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
: <span class="input"><input type="text" name="Address6:<?=$i?>" class="subnet" maxlength="40" value="<?=_var($wg0,"Address6:$i")?>" onchange="if(verifyInSubnet6(this)){setAllow6($(document.wg0),this.value,<?=$i?>)}" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
<input type="button" class="form ping-button6-<?=$i?>" value="_(Ping)_" onclick="ping($(document.wg0),this,'input[name=&quot;Address6:<?=$i?>&quot;]')"<?=isset($wg0["Address6:$i"])?'':' disabled'?>>
</div>
@@ -1434,24 +1434,24 @@ _(Peer tunnel address IPv6)_:
_(Peer endpoint)_:
<input type="hidden" name="Endpoint:<?=$i?>" value="">
: <span class="input"><input type="text" name="gui:Endpoint:<?=$i?>" class="subnet" value="<?=$wg0["Endpoint:$i"]??''?>" pattern="<?=$validText?>" title="_(IP address or FQDN)_" onchange="toLC(this);quickValidate(this);" <?=($vpn_wg0||isset($wg0["TYPE:$i"])&&(int)$wg0["TYPE:$i"]==2||isset($wg0["TYPE:$i"])&&(int)$wg0["TYPE:$i"]==3)?'placeholder="(_(mandatory)_)" required':'placeholder="(_(not used)_)"'?>>:
<input type="number" name="gui:ListenPort:<?=$i?>" class="port" min="1" max="65535" value="<?=$wg0["ListenPort:$i"]??''?>" onchange="quickValidate(this);"<?=isset($wg0["Endpoint:$i"])?" placeholder=\"".($wg0['ListenPort:0']??$netport['wg0']??'')."\"":""?>></span>
: <span class="input"><input type="text" name="gui:Endpoint:<?=$i?>" class="subnet" value="<?=_var($wg0,"Endpoint:$i")?>" pattern="<?=$validText?>" title="_(IP address or FQDN)_" onchange="toLC(this);quickValidate(this);" <?=($vpn_wg0||(int)_var($wg0,"TYPE:$i",0)==2||(int)_var($wg0,"TYPE:$i",0)==3)?'placeholder="(_(mandatory)_)" required':'placeholder="(_(not used)_)"'?>>:
<input type="number" name="gui:ListenPort:<?=$i?>" class="port" min="1" max="65535" value="<?=_var($wg0,"ListenPort:$i")?>" onchange="quickValidate(this);"<?=isset($wg0["Endpoint:$i"])?" placeholder=\"".(_var($wg0,'ListenPort:0')?:_var($netport,'wg0'))."\"":""?>></span>
<input type="button" class="form ping-button2-<?=$i?>" value="_(Ping)_" onclick="ping($(document.wg0),this,'input[name=&quot;gui:Endpoint:<?=$i?>&quot;]')"<?=isset($wg0["Endpoint:$i"])?'':' disabled'?>>
:wg_peer_endpoint_help:
_(Peer allowed IPs)_:
: <span class="input"><input type="text" name="AllowedIPs:<?=$i?>" class="wide" value="<?=$wg0["AllowedIPs:$i"]??''?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="AllowedIPs:<?=$i?>" class="wide" value="<?=_var($wg0,"AllowedIPs:$i")?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(mandatory)_)" required></span>
:wg_peer_allowed_ips_help:
_(Peer DNS server)_:
: <span class="input"><input type="text" name="DNS:<?=$i?>" class="subnet" maxlength="40" value="<?=$wg0["DNS:$i"]??''?>" onchange="quickValidate(this);" pattern="<?=$validDNSServerList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_" <?=isset($wg0["TYPE:$i"])&&(int)$wg0["TYPE:$i"]!=6?'placeholder="(_(optional)_)"':'placeholder="(_(mandatory)_)" required'?>></span>
: <span class="input"><input type="text" name="DNS:<?=$i?>" class="subnet" maxlength="40" value="<?=_var($wg0,"DNS:$i")?>" onchange="quickValidate(this);" pattern="<?=$validDNSServerList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_" <?=(int)_var($wg0,"TYPE:$i",0)!=6?'placeholder="(_(optional)_)"':'placeholder="(_(mandatory)_)" required'?>></span>
:wg_peer_dns_server_help:
_(Persistent keepalive)_:
: <span class="input"><input type="number" name="PersistentKeepalive:<?=$i?>" class="trim" min="0" max="600" value="<?=$wg0["PersistentKeepalive:$i"]??''?>" onchange="quickValidate(this);" placeholder="(_(disabled)_)">_(seconds)_</span>
: <span class="input"><input type="number" name="PersistentKeepalive:<?=$i?>" class="trim" min="0" max="600" value="<?=_var($wg0,"PersistentKeepalive:$i")?>" onchange="quickValidate(this);" placeholder="(_(disabled)_)">_(seconds)_</span>
:wg_persistent_keepalive_help:
+49 -49
View File
@@ -27,11 +27,11 @@ $netport['wgX'] = $netport['wg0']+XXX;
[$conf_wgX,$cfg_wgX,$this_wgX,$vpn_wgX] = readConf($peer_wgX,$wgX,'wgX');
?>
<script>
netbase['wgX'] = <?=$netbase['wgX']?>;
netpool['wgX'] = '<?=$netpool['wgX']?>';
netport['wgX'] = '<?=$netport['wgX']?>';
netbase6['wgX'] = '<?=$netbase6['wgX']?>';
netpool6['wgX'] = '<?=$netpool6['wgX']?>';
netbase['wgX'] = <?=_var($netbase,'wgX')?>;
netpool['wgX'] = "<?=_var($netpool,'wgX')?>";
netport['wgX'] = "<?=_var($netport,'wgX')?>";
netbase6['wgX'] = "<?=_var($netbase6,'wgX')?>";
netpool6['wgX'] = "<?=_var($netpool6,'wgX')?>";
tstate['wgX'] = "<?=$check_wgX ? 'active' : 'passive'?>";
$(function(){
@@ -164,7 +164,7 @@ $(function(){
<input type="hidden" name="#deleted" value="">
<input type="hidden" name="#locale" value="<?=$locale?>">
_(Local name)_:
: <span class="input"><input type="text" name="Name:0" class="wide" maxlength="99" value="<?=$wgX["Name:0"]??''?>" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="Name:0" class="wide" maxlength="99" value="<?=_var($wgX,"Name:0")?>" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
<span class="pin"><i class="fa fa-fw fa-eye eye0<?=$this_wgX?'':' key-off'?>" style="cursor:pointer" onclick="WGconfig(this,'wgX','')" title="_(View Local Config)_"></i>
<i class="fa fa-fw fa-key zone0<?=isset($wgX['PublicKey:0'])?'':' key-off'?>" style="cursor:pointer" onclick="openClose($(document.wgX),null,'div.key0')" title="_(Toggle keys)_"></i>
<i id="chevron-wgX-0" class="fa fa-fw fa-chevron-down" style="cursor:pointer" onclick="openClose($(document.wgX),this,'div.zone0')" title="_(Toggle view)_"></i></span>
@@ -173,13 +173,13 @@ _(Local name)_:
<div markdown="1" class="keys wgX key0"<?=isset($wgX['PublicKey:0'])?' style="display:none">':'>'?>
_(Local private key)_:
: <span class="input"><input type="text" name="PrivateKey:0" class="wide private-0" maxlength="64" value="<?=$wgX['PrivateKey:0']??''?>" onchange="highlight($(document.wgX),this,0)" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="PrivateKey:0" class="wide private-0" maxlength="64" value="<?=_var($wgX,'PrivateKey:0')?>" onchange="highlight($(document.wgX),this,0)" placeholder="(_(mandatory)_)" required></span>
<input type="button" class="form" value="_(Generate Keypair)_" onclick="keypair($(document.wgX),'0')">
:wg_generate_keypair_help:
_(Local public key)_:
: <span class="input"><input type="text" name="PublicKey:0" class="wide public-0" maxlength="64" value="<?=$wgX['PublicKey:0']??''?>" onchange="highlight($(document.wgX),this,0)" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="PublicKey:0" class="wide public-0" maxlength="64" value="<?=_var($wgX,'PublicKey:0')?>" onchange="highlight($(document.wgX),this,0)" placeholder="(_(mandatory)_)" required></span>
:wg_generate_keypair_help:
@@ -187,46 +187,46 @@ _(Local public key)_:
<div markdown="1" class="advanced wgX zone0" style="display:none">
_(Network protocol)_:
: <span class="input"><select id="protocol-wgX" name="PROT:0" class="subnet" onchange="setProtocol($(document.wgX),'wgX',true)">
<?=mk_option($wgX['PROT:0']??'', "", _("IPv4 only"))?>
<?=mk_option($wgX['PROT:0']??'', "6", _("IPv6 only"))?>
<?=mk_option($wgX['PROT:0']??'', "46", _("IPv4 + IPv6"))?>
<?=mk_option(_var($wgX,'PROT:0'), "", _("IPv4 only"))?>
<?=mk_option(_var($wgX,'PROT:0'), "6", _("IPv6 only"))?>
<?=mk_option(_var($wgX,'PROT:0'), "46", _("IPv4 + IPv6"))?>
</select></span>
<div markdown="1" class="ipv4 wgX" style="display:none">
_(Local tunnel network pool)_:
<input type="hidden" name="Network:0" value="">
: <span class="input"><input type="text" name="gui:Network:0" class="subnet" maxlength="15" value="<?=explode('/',$wgX['Network:0']??'')[0]?>" onchange="setPool($(document.wgX),'wgX')" pattern="<?=$validIP4?>" title="_(IPv4 network)_" placeholder="<?=$netpool['wgX']??''?>">/
<input type="number" name="gui:Mask:0" class="mask" min="1" max="32" value="<?=my_explode('/',$wgX['Network:0']??'')[1]?>" onchange="if(quickValidate(this)) {setPool($(document.wgX),'wgX')}" placeholder="24"></span>
: <span class="input"><input type="text" name="gui:Network:0" class="subnet" maxlength="15" value="<?=explode('/',_var($wgX,'Network:0'))[0]?>" onchange="setPool($(document.wgX),'wgX')" pattern="<?=$validIP4?>" title="_(IPv4 network)_" placeholder="<?=_var($netpool,'wgX')?>">/
<input type="number" name="gui:Mask:0" class="mask" min="1" max="32" value="<?=my_explode('/',_var($wgX,'Network:0'))[1]?>" onchange="if(quickValidate(this)) {setPool($(document.wgX),'wgX')}" placeholder="24"></span>
</div>
<div markdown="1" class="ipv6 wgX" style="display:none">
_(Local tunnel network pool IPv6)_:
<input type="hidden" name="Network6:0" value="">
: <span class="input"><input type="text" name="gui:Network6:0" class="subnet" maxlength="40" value="<?=explode('/',$wgX['Network6:0']??'')[0]?>" onchange="setPool6($(document.wgX),'wgX')" pattern="<?=$validIP6?>" title="_(IPv6 network)_" placeholder="<?=$netpool6['wgX']??''?>">/
<input type="number" name="gui:Mask6:0" class="mask" min="1" max="128" value="<?=my_explode('/',$wgX['Network6:0']??'')[1]?>" onchange="if(quickValidate(this)) {setPool6($(document.wgX),'wgX')}" placeholder="64"></span>
: <span class="input"><input type="text" name="gui:Network6:0" class="subnet" maxlength="40" value="<?=explode('/',_var($wgX,'Network6:0'))[0]?>" onchange="setPool6($(document.wgX),'wgX')" pattern="<?=$validIP6?>" title="_(IPv6 network)_" placeholder="<?=_var($netpool6,'wgX')?>">/
<input type="number" name="gui:Mask6:0" class="mask" min="1" max="128" value="<?=my_explode('/',_var($wgX,'Network6:0'))[1]?>" onchange="if(quickValidate(this)) {setPool6($(document.wgX),'wgX')}" placeholder="64"></span>
</div>
:wg_local_tunnel_network_pool_X_help:
<div markdown="1" class="ipv4 wgX" style="display:none">
_(Local tunnel address)_:
: <span class="input"><input type="text" name="Address:0" class="subnet" maxlength="15" value="<?=$wgX['Address:0']??long2ip($netbase['wgX']+1)?>" onchange="verifyInSubnet(this);" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
: <span class="input"><input type="text" name="Address:0" class="subnet" maxlength="15" value="<?=_var($wgX,'Address:0')?:long2ip(_var($netbase,'wgX')+1)?>" onchange="verifyInSubnet(this);" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
:wg_local_tunnel_address_help:
</div>
<div markdown="1" class="ipv6 wgX" style="display:none">
_(Local tunnel address IPv6)_:
: <span class="input"><input type="text" name="Address6:0" class="subnet" maxlength="40" value="<?=$wgX['Address6:0']??($netbase6['wgX'].'1')?>" onchange="verifyInSubnet6(this);" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
: <span class="input"><input type="text" name="Address6:0" class="subnet" maxlength="40" value="<?=_var($wgX,'Address6:0')?:(_var($netbase6,'wgX').'1')?>" onchange="verifyInSubnet6(this);" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
:wg_local_tunnel_address_help:
</div>
</div>
_(Local endpoint)_:
: <span class="input"><input type="text" id="endpoint-wgX" name="Endpoint:0" class="subnet" value="<?=$vpn_wgX?'':$wgX['Endpoint:0']??''?>" onchange="toLC(this);quickValidate(this);" pattern="<?=$validText?>" title="_(IP address or FQDN)_" placeholder="<?=$vpn_wgX?'(_(not used)_)':preg_replace('/^(www\.).+(\.unraid.net)$/','$1<hash>$2',$public)?>">:
<input type="number" name="gui:ListenPort:0" class="port" min="1" max="65535" value="<?=$vpn_wgX?'':$wgX['ListenPort:0']??''?>" onchange="if(quickValidate(this)) {portRemark($(document.wgX),'wgX',this.value)}" placeholder="<?=$vpn_wgX?'':$netport['wgX']??''?>"></span>
<span class="remark block" style="display:none">_(Remark)_: _(configure your router with port forwarding of port)_ **<span id="my-port-wgX"><?=$wgX['ListenPort:0']??$netport['wgX']?></span>/_(UDP)_** _(to)_ **<?=$server?>:<?=$wgX['ListenPort:0']??$netport['wgX']??''?>**</span><span class="upnp wgX block"></span>
: <span class="input"><input type="text" id="endpoint-wgX" name="Endpoint:0" class="subnet" value="<?=$vpn_wgX?'':_var($wgX,'Endpoint:0')?>" onchange="toLC(this);quickValidate(this);" pattern="<?=$validText?>" title="_(IP address or FQDN)_" placeholder="<?=$vpn_wgX?'(_(not used)_)':preg_replace('/^(www\.).+(\.unraid.net)$/','$1<hash>$2',$public)?>">:
<input type="number" name="gui:ListenPort:0" class="port" min="1" max="65535" value="<?=$vpn_wgX?'':_var($wgX,'ListenPort:0')?>" onchange="if(quickValidate(this)) {portRemark($(document.wgX),'wgX',this.value)}" placeholder="<?=$vpn_wgX?'':_var($netport,'wgX')?>"></span>
<span class="remark block" style="display:none">_(Remark)_: _(configure your router with port forwarding of port)_ **<span id="my-port-wgX"><?=_var($wgX,'ListenPort:0')?:_var($netport,'wgX')?></span>/_(UDP)_** _(to)_ **<?=$server?>:<?=_var($wgX,'ListenPort:0')?:_var($netport,'wgX')?>**</span><span class="upnp wgX block"></span>
<input type="hidden" name="ListenPort:0" value=""><dl id="endpoint4-wgX" style="display:none"></dl><dl id="endpoint6-wgX" style="display:none"></dl>
:wg_local_endpoint_X_help:
@@ -234,34 +234,34 @@ _(Local endpoint)_:
<div markdown="1" class="advanced wgX zone0" style="display:none">
_(Local server uses NAT)_:
: <span class="input"><select name="NAT:0" class="narrow" onchange="showRoute($(document.wgX),'wgX',0)">
<?=mk_option($wgX['NAT:0']??'', "", _("Yes"))?>
<?=mk_option($wgX['NAT:0']??'', "no", _("No"))?>
<?=mk_option(_var($wgX,'NAT:0'), "", _("Yes"))?>
<?=mk_option(_var($wgX,'NAT:0'), "no", _("No"))?>
</select></span>
<span id="my-static1-wgX" class="block" style="display:none">_(Remark)_: _(configure your router with a static route of)_ **<?=$wgX['Network:0']??''?>** _(to)_ **<?=$server?>**</span><span id="my-static2-wgX" class="block" style="display:none">_(Remark)_: _(docker containers on custom networks need static routing)_ **<?=$wgX['Network:0']??''?>** _(to)_ **<?=$server?>**</span>
<span id="my-static1-wgX" class="block" style="display:none">_(Remark)_: _(configure your router with a static route of)_ **<?=_var($wgX,'Network:0')?>** _(to)_ **<?=$server?>**</span><span id="my-static2-wgX" class="block" style="display:none">_(Remark)_: _(docker containers on custom networks need static routing)_ **<?=_var($wgX,'Network:0')?>** _(to)_ **<?=$server?>**</span>
:wg_local_server_uses_nat_help:
<div markdown="1" class="upnp wg0" style="display:none">
_(Local gateway uses UPnP)_:
: <span class="input"><select name="UPNP:0" class="narrow" onchange="showRemark($(document.wgX))">
<?=mk_option($wgX['UPNP:0']??'', "", _("Yes"))?>
<?=mk_option($wgX['UPNP:0']??'', "no", _("No"))?>
<?=mk_option(_var($wgX,'UPNP:0'), "", _("Yes"))?>
<?=mk_option(_var($wgX,'UPNP:0'), "no", _("No"))?>
</select></span>
:wg_local_gateway_uses_upnp_help:
</div>
_(Local tunnel firewall)_:
: <span class="input"><input type="text" name="DROP:0" class="wide" value="<?=$wgX['DROP:0']??''?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="DROP:0" class="wide" value="<?=_var($wgX,'DROP:0')?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(optional)_)"></span>
_(Rule)_: <select name="RULE:0" class="auto">
<?=mk_option($wgX['RULE:0']??'', "", _("Deny"))?>
<?=mk_option($wgX['RULE:0']??'', "1", _("Allow"))?>
<?=mk_option(_var($wgX,'RULE:0'), "", _("Deny"))?>
<?=mk_option(_var($wgX,'RULE:0'), "1", _("Allow"))?>
</select>
:wg_local_tunnel_firewall_help:
_(MTU size)_:
: <span class="input"><input type="number" name="MTU:0" class="trim" min="68" max="9198" value="<?=$wgX['MTU:0']??''?>" onchange="quickValidate(this);" placeholder="(_(automatic)_)">_(bytes)_</span>
: <span class="input"><input type="number" name="MTU:0" class="trim" min="68" max="9198" value="<?=_var($wgX,'MTU:0')?>" onchange="quickValidate(this);" placeholder="(_(automatic)_)">_(bytes)_</span>
:wg_mtu_size_help:
@@ -285,7 +285,7 @@ _(DNS servers)_:
<?foreach ($peer_wgX as $i):?>
<div markdown="1" id="index-wgX-<?=$i?>" class="shade-<?=$display['theme']?>">
_(Peer name)_:
: <span class="input"><input type="text" name="Name:<?=$i?>" class="wide" maxlength="99" value="<?=$wgX["Name:$i"]??''?>" onchange="quickValidate(this);" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="Name:<?=$i?>" class="wide" maxlength="99" value="<?=_var($wgX,"Name:$i")?>" onchange="quickValidate(this);" pattern="<?=$validname?>" title="_(Use only letters A-Z, digits or space,dash,underscore)_" placeholder="(_(optional)_)"></span>
<input type="button" class="form" value="_(Delete Peer)_" onclick="delPeer($(document.wgX),'#index-wgX-<?=$i?>')">
<span class="pin"><i class="fa fa-fw fa-eye eye<?=$i?><?=(file_exists("$etc/peers/peer-$tower-wgX-$i.conf")&&isset($wgX["TYPE:$i"])&&$wgX["TYPE:$i"]<=6)?'':' key-off'?>" style="cursor:pointer" onclick="WGconfig(this,'peer-<?=$tower?>-wgX-<?=$i?>','/peers')" title="_(View Peer Config)_"></i>
<i class="fa fa-fw fa-key zone<?=$i?><?=isset($wgX["PublicKey:$i"])?'':' key-off'?>" style="cursor:pointer" onclick="openClose($(document.wgX),null,'div.key<?=$i?>')" title="_(Toggle keys)_"></i>
@@ -295,15 +295,15 @@ _(Peer name)_:
_(Peer type of access)_:
: <span class="input"><select name="TYPE:<?=$i?>" class="auto" onchange="updatePeer($(document.wgX),<?=$i?>,this.value,'wgX')">
<?=mk_option($wgX["TYPE:$i"]??'', "0", _("Remote access to server"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "1", _("Remote access to LAN"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "2", _("Server to server access"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "3", _("LAN to LAN access"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "4", _("Server hub & spoke access"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "5", _("LAN hub & spoke access"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "6", _("Remote tunneled access"))?>
<?=mk_option($wgX["TYPE:$i"]??'', "7", _("VPN tunneled access for system"),count($peer_wgX)==1?'':'disabled')?>
<?=mk_option($wgX["TYPE:$i"]??'', "8", _("VPN tunneled access for docker"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "0", _("Remote access to server"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "1", _("Remote access to LAN"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "2", _("Server to server access"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "3", _("LAN to LAN access"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "4", _("Server hub & spoke access"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "5", _("LAN hub & spoke access"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "6", _("Remote tunneled access"))?>
<?=mk_option(_var($wgX,"TYPE:$i"), "7", _("VPN tunneled access for system"),count($peer_wgX)==1?'':'disabled')?>
<?=mk_option(_var($wgX,"TYPE:$i"), "8", _("VPN tunneled access for docker"))?>
</select></span>
<span id="access-type-<?=$i?>" class="access-type"></span>
@@ -313,18 +313,18 @@ _(Peer type of access)_:
<div markdown="1" class="keys wgX key<?=$i?>"<?=isset($wgX["PublicKey:$i"])?' style="display:none">':'>'?>
_(Peer private key)_:
: <span class="input"><input type="text" name="PrivateKey:<?=$i?>" class="wide private-<?=$i?>" maxlength="64" value="<?=$wgX["PrivateKey:$i"]??''?>" onchange="highlight($(document.wgX),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="PrivateKey:<?=$i?>" class="wide private-<?=$i?>" maxlength="64" value="<?=_var($wgX,"PrivateKey:$i")?>" onchange="highlight($(document.wgX),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
<input type="button" class="form" value="_(Generate Keypair)_" onclick="keypair($(document.wgX),'<?=$i?>')">
:wg_generate_keypair_help:
_(Peer public key)_:
: <span class="input"><input type="text" name="PublicKey:<?=$i?>" class="wide public-<?=$i?>" maxlength="64" value="<?=$wgX["PublicKey:$i"]??''?>" onchange="highlight($(document.wgX),this,<?=$i?>)" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="PublicKey:<?=$i?>" class="wide public-<?=$i?>" maxlength="64" value="<?=_var($wgX,"PublicKey:$i")?>" onchange="highlight($(document.wgX),this,<?=$i?>)" placeholder="(_(mandatory)_)" required></span>
:wg_generate_keypair_help:
_(Peer preshared key)_:
: <span class="input"><input type="text" name="PresharedKey:<?=$i?>" class="wide preshared-<?=$i?>" maxlength="64" value="<?=$wgX["PresharedKey:$i"]??''?>" onchange="highlight($(document.wgX),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
: <span class="input"><input type="text" name="PresharedKey:<?=$i?>" class="wide preshared-<?=$i?>" maxlength="64" value="<?=_var($wgX,"PresharedKey:$i")?>" onchange="highlight($(document.wgX),this,<?=$i?>)" placeholder="(_(optional)_)"></span>
<input type="button" class="form" value="_(Generate Key)_" onclick="presharedkey($(document.wgX),'<?=$i?>')">
:wg_peer_preshared_key_help:
@@ -333,13 +333,13 @@ _(Peer preshared key)_:
<div markdown="1" class="advanced wgX zone<?=$i?>" style="display:none">
<div markdown="1" class="ipv4 wgX" style="display:none">
_(Peer tunnel address)_:
: <span class="input"><input type="text" name="Address:<?=$i?>" class="subnet" maxlength="15" value="<?=$wgX["Address:$i"]??''?>" onchange="if(verifyInSubnet(this)){setAllow($(document.wgX),this.value,<?=$i?>)}" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
: <span class="input"><input type="text" name="Address:<?=$i?>" class="subnet" maxlength="15" value="<?=_var($wgX,"Address:$i")?>" onchange="if(verifyInSubnet(this)){setAllow($(document.wgX),this.value,<?=$i?>)}" pattern="<?=$validIP4?>" title="_(IPv4 address)_"></span>
<input type="button" class="form ping-button1-<?=$i?>" value="_(Ping)_" onclick="ping($(document.wgX),this,'input[name=&quot;Address:<?=$i?>&quot;]')"<?=isset($wgX["Address:$i"])?'':' disabled'?>>
</div>
<div markdown="1" class="ipv6 wgX" style="display:none">
_(Peer tunnel address IPv6)_:
: <span class="input"><input type="text" name="Address6:<?=$i?>" class="subnet" maxlength="40" value="<?=$wgX["Address6:$i"]??''?>" onchange="if(verifyInSubnet6(this)){setAllow6($(document.wgX),this.value,<?=$i?>)}" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
: <span class="input"><input type="text" name="Address6:<?=$i?>" class="subnet" maxlength="40" value="<?=_var($wgX,"Address6:$i")?>" onchange="if(verifyInSubnet6(this)){setAllow6($(document.wgX),this.value,<?=$i?>)}" pattern="<?=$validIP6?>" title="_(IPv6 address)_"></span>
<input type="button" class="form ping-button6-<?=$i?>" value="_(Ping)_" onclick="ping($(document.wgX),this,'input[name=&quot;Address6:<?=$i?>&quot;]')"<?=isset($wgX["Address6:$i"])?'':' disabled'?>>
</div>
@@ -347,24 +347,24 @@ _(Peer tunnel address IPv6)_:
_(Peer endpoint)_:
<input type="hidden" name="Endpoint:<?=$i?>" value="">
: <span class="input"><input type="text" name="gui:Endpoint:<?=$i?>" class="subnet" value="<?=$wgX["Endpoint:$i"]??''?>" pattern="<?=$validText?>" title="_(IP address or FQDN)_" onchange="toLC(this);quickValidate(this);" <?=($vpn_wgX||isset($wgX["TYPE:$i"])&&(int)$wgX["TYPE:$i"]==2||isset($wgX["TYPE:$i"])&&(int)$wgX["TYPE:$i"]==3)?'placeholder="(_(mandatory)_)" required':'placeholder="(_(not used)_)"'?>>:
<input type="number" name="gui:ListenPort:<?=$i?>" class="port" min="1" max="65535" value="<?=$wgX["ListenPort:$i"]??''?>" onchange="quickValidate(this);"<?=isset($wgX["Endpoint:$i"])?" placeholder=\"".($wgX['ListenPort:0']??$netport['wgX']??'')."\"":""?>></span>
: <span class="input"><input type="text" name="gui:Endpoint:<?=$i?>" class="subnet" value="<?=_var($wgX,"Endpoint:$i")?>" pattern="<?=$validText?>" title="_(IP address or FQDN)_" onchange="toLC(this);quickValidate(this);" <?=($vpn_wgX||(int)_var($wgX,"TYPE:$i",0)==2||(int)_var($wgX,"TYPE:$i",0)==3)?'placeholder="(_(mandatory)_)" required':'placeholder="(_(not used)_)"'?>>:
<input type="number" name="gui:ListenPort:<?=$i?>" class="port" min="1" max="65535" value="<?=_var($wgX,"ListenPort:$i")?>" onchange="quickValidate(this);"<?=isset($wgX["Endpoint:$i"])?" placeholder=\"".(_var($wgX,'ListenPort:0')?:_var($netport,'wgX'))."\"":""?>></span>
<input type="button" class="form ping-button2-<?=$i?>" value="Ping" onclick="ping($(document.wgX),this,'input[name=&quot;gui:Endpoint:<?=$i?>&quot;]')"<?=isset($wgX["Endpoint:$i"])?'':' disabled'?>>
:wg_peer_endpoint_help:
_(Peer allowed IPs)_:
: <span class="input"><input type="text" name="AllowedIPs:<?=$i?>" class="wide" value="<?=$wgX["AllowedIPs:$i"]??''?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(mandatory)_)" required></span>
: <span class="input"><input type="text" name="AllowedIPs:<?=$i?>" class="wide" value="<?=_var($wgX,"AllowedIPs:$i")?>" onchange="quickValidate(this);" pattern="<?=$validList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_, _(CIDR optional)_" placeholder="(_(mandatory)_)" required></span>
:wg_peer_allowed_ips_help:
_(Peer DNS server)_:
: <span class="input"><input type="text" name="DNS:<?=$i?>" class="subnet" maxlength="40" value="<?=$wgX["DNS:$i"]??''?>" onchange="quickValidate(this);" pattern="<?=$validDNSServerList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_"<?=isset($wgX["TYPE:$i"])&&(int)$wgX["TYPE:$i"]!=6?'placeholder="(_(optional)_)"':'placeholder="(_(mandatory)_)" required'?>></span>
: <span class="input"><input type="text" name="DNS:<?=$i?>" class="subnet" maxlength="40" value="<?=_var($wgX,"DNS:$i")?>" onchange="quickValidate(this);" pattern="<?=$validDNSServerList?>" title="_(Comma separated list of IPv4 and IPv6 IP addresses)_"<?=(int)_var($wgX,"TYPE:$i",0)!=6?'placeholder="(_(optional)_)"':'placeholder="(_(mandatory)_)" required'?>></span>
:wg_peer_dns_server_help:
_(Persistent keepalive)_:
: <span class="input"><input type="number" name="PersistentKeepalive:<?=$i?>" class="trim" min="0" max="600" value="<?=$wgX["PersistentKeepalive:$i"]??''?>" onchange="quickValidate(this);" placeholder="(_(disabled)_)">_(seconds)_</span>
: <span class="input"><input type="number" name="PersistentKeepalive:<?=$i?>" class="trim" min="0" max="600" value="<?=_var($wgX,"PersistentKeepalive:$i")?>" onchange="quickValidate(this);" placeholder="(_(disabled)_)">_(seconds)_</span>
:wg_persistent_keepalive_help:
+10 -9
View File
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,13 +12,14 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = '';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = '';
require_once "$docroot/webGui/include/Translations.php";
$var = parse_ini_file("/var/local/emhttp/var.ini");
?>
<!DOCTYPE HTML>
@@ -80,21 +81,21 @@ function power_on() {
$(document).ajaxSend(function(elm, xhr, s){
if (s.type == "POST") {
s.data += s.data?"&":"";
s.data += "csrf_token=<?=$var['csrf_token']?>";
s.data += "csrf_token=<?=_var($var,'csrf_token')?>";
}
});
/**
* If we have a sessionStorage item for hiding the UPC's 'lets unleash your hardware' overlay for ENOKEYFILE state users
* this will remove the item so that if the user reboots their server the overlay will display again once the server comes back up.
*/
const serverName = '<?= $var['NAME'] ?>';
const guid = '<?= $var['flashGUID'] ?>';
const serverName = '<?=_var($var,'NAME')?>';
const guid = '<?=_var($var,'flashGUID')?>';
sessionStorage.removeItem(`${serverName}_${guid ? guid.slice(-12) : 'NO_GUID'}`);
</script>
</head>
<?
$safemode = '/boot/unraidsafemode';
switch ($_POST['cmd']) {
switch (_var($_POST,'cmd')) {
case 'reboot':
if (isset($_POST['safemode'])) touch($safemode); else @unlink($safemode);
exec('/sbin/reboot -n');?>
+4 -2
View File
@@ -12,10 +12,12 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Helpers.php";
// add translations
$_SERVER['REQUEST_URI'] = 'settings';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
$cpus = explode(';',$_POST['cpus']??'');
@@ -47,7 +49,7 @@ function create($id, $name, $vcpu) {
echo implode(array_map(function($t){return "<td>$t</td>";},$text));
}
switch ($_POST['id']) {
switch ($_POST['id']??'') {
case 'vm':
// create the current vm assignments
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
+20 -16
View File
@@ -11,7 +11,7 @@
*/
?>
<?
$display['font'] = filter_var($_COOKIE['fontSize']??$display['font'], FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
$display['font'] = filter_var($_COOKIE['fontSize']??$display['font']??'', FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
$theme = strtok($display['theme'],'-');
$header = $display['header'];
$backgnd = $display['background'];
@@ -30,7 +30,7 @@ function annotate($text) {echo "\n<!--\n",str_repeat("#",strlen($text)),"\n$text
<!DOCTYPE html>
<html <?=$display['rtl']?>lang="<?=strtok($locale,'_')?:'en'?>">
<head>
<title><?=$var['NAME']?>/<?=$myPage['name']?></title>
<title><?=_var($var,'NAME')?>/<?=_var($myPage,'name')?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Security-Policy" content="block-all-mixed-content">
@@ -38,7 +38,7 @@ function annotate($text) {echo "\n<!--\n",str_repeat("#",strlen($text)),"\n$text
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="referrer" content="same-origin">
<link type="image/png" rel="shortcut icon" href="/webGui/images/<?=$var['mdColor']?>.png">
<link type="image/png" rel="shortcut icon" href="/webGui/images/<?=_var($var,'mdColor','red-on')?>.png">
<link type="text/css" rel="stylesheet" href="<?autov("/webGui/styles/default-fonts.css")?>">
<link type="text/css" rel="stylesheet" href="<?autov("/webGui/styles/default-cases.css")?>">
<link type="text/css" rel="stylesheet" href="<?autov("/webGui/styles/font-awesome.css")?>">
@@ -75,7 +75,7 @@ i.abortOps{font-size:2rem;float:right;margin-right:20px;margin-top:8px;cursor:po
pre#swalbody p{margin-block-end:1em}
<?
$nchan = ['webGui/nchan/notify_poller','webGui/nchan/session_check'];
$safemode = $var['safeMode']=='yes';
$safemode = _var($var,'safeMode')=='yes';
$tasks = find_pages('Tasks');
$buttons = find_pages('Buttons');
$banner = "$config/plugins/dynamix/banner.png";
@@ -104,10 +104,11 @@ String.prototype.actionName = function(){return this.split(/[\\/]/g).pop();}
String.prototype.channel = function(){return this.split(':')[1].split(',').findIndex((e)=>/\[\d\]/.test(e));}
Shadowbox.init({skipSetup:true});
context.init();
// server uptime
var uptime = <?=strtok(exec("cat /proc/uptime"),' ')?>;
var expiretime = <?=$var['regTy']=='Trial'||strstr($var['regTy'],'expired')?$var['regTm2']:0?>;
var expiretime = <?=_var($var,'regTy')=='Trial'||strstr(_var($var,'regTy'),'expired')?_var($var,'regTm2'):0?>;
var before = new Date();
// page timer events
@@ -124,7 +125,7 @@ addAlert.plg = $.cookie('addAlert-plg');
addAlert.func = $.cookie('addAlert-func');
// current csrf_token
var csrf_token = "<?=$var['csrf_token']?>";
var csrf_token = "<?=_var($var,'csrf_token')?>";
// form has unsaved changes indicator
var formHasUnsavedChanges = false;
@@ -194,7 +195,7 @@ function settab(tab) {
<?switch ($myPage['name']):?>
<?case'Main':?>
$.cookie('tab',tab);
<?if ($var['fsState']=='Started'):?>
<?if (_var($var,'fsState')=='Started'):?>
$.cookie('one','tab1');
<?endif;?>
<?break;?>
@@ -590,7 +591,7 @@ $.ajaxPrefilter(function(s, orig, xhr){
<div id="header" class="<?=$display['banner']?>">
<div class="logo">
<a href="https://unraid.net" target="_blank"><?readfile("$docroot/webGui/images/UN-logotype-gradient.svg")?></a>
<?=_('Version')?>: <?=$var['version']?><?=$notes?>
<?=_('Version')?>: <?=_var($var,'version','?')?><?=$notes?>
</div>
<?include "$docroot/plugins/dynamix.my.servers/include/myservers2.php"?>
</div>
@@ -734,8 +735,8 @@ unset($pages,$page,$pgs,$pg,$icon,$nchan,$running,$start,$stop,$row,$script,$opt
// Build footer
annotate('Footer');
echo '<div id="footer"><span id="statusraid"><span id="statusbar">';
$progress = ($var['fsProgress']!='')? "&bullet;<span class='blue strong'>{$var['fsProgress']}</span>" : '';
switch ($var['fsState']) {
$progress = (_var($var,'fsProgress')!='')? "&bullet;<span class='blue strong'>{$var['fsProgress']}</span>" : '';
switch (_var($var,'fsState')) {
case 'Stopped':
echo "<span class='red strong'><i class='fa fa-stop-circle'></i> "._('Array Stopped')."</span>$progress"; break;
case 'Starting':
@@ -811,7 +812,7 @@ defaultPage.on('message', function(msg,meta) {
default : var action = '';
}
action += " "+(ini['mdResyncPos']/(ini['mdResyncSize']/100+1)).toFixed(1)+" %";
status += "&bullet;<span class='orange strong'>"+action.replace('.','<?=$display['number'][0]?>');
status += "&bullet;<span class='orange strong'>"+action.replace('.','<?=_var($display,'number','.,')[0]?>');
if (ini['mdResyncDt']==0) status += " &bullet; <?=_('Paused')?>";
status += "</span>";
}
@@ -944,9 +945,9 @@ $(function() {
$('div.spinner.fixed').html(unraid_logo);
setTimeout(function(){$('div.spinner').not('.fixed').each(function(){$(this).html(unraid_logo);});},500); // display animation if page loading takes longer than 0.5s
shortcut.add('F1',function(){HelpButton();});
<?if ($var['regTy']=='unregistered'):?>
<?if (_var($var,'regTy')=='unregistered'):?>
$('#licensetype').addClass('orange-text');
<?elseif (!in_array($var['regTy'],['Trial','Basic','Plus','Pro'])):?>
<?elseif (!in_array(_var($var,'regTy'),['Trial','Basic','Plus','Pro'])):?>
$('#licensetype').addClass('red-text');
<?endif;?>
$('input[value="<?=_("Apply")?>"],input[value="Apply"],input[name="cmdEditShare"],input[name="cmdUserEdit"]').prop('disabled',true);
@@ -975,7 +976,7 @@ $(function() {
<?if ($safemode):?>
showNotice("<?=_('System running in')?> <b><?=('safe mode')?></b>");
<?else:?>
<?$readme = @file_get_contents("$docroot/plugins/unRAIDServer/README.md",false,null,0,20)??'';?>
<?$readme = @file_get_contents("$docroot/plugins/unRAIDServer/README.md",false,null,0,20)?:''?>
<?if (strpos($readme,'REBOOT REQUIRED')!==false):?>
showUpgrade("<b><?=_('Reboot Now')?></b> <?=_('to upgrade Unraid OS')?>",true);
<?elseif (strpos($readme,'DOWNGRADE')!==false):?>
@@ -983,17 +984,20 @@ $(function() {
<?elseif ($version = plugin_update_available('unRAIDServer',true)):?>
showUpgrade("Unraid OS v<?=$version?> <?=_('is available')?>. <?if (is_file('/tmp/plugins/unRAIDServer.txt')):?><span class='fa fa-info-circle fa-fw big blue-text' onclick='showUpgradeChanges()' title=\"<?=_('Release Notes')?>\"></span> <?endif;?><a><?=_('Update Now')?></a>");
<?endif;?>
<?if (!$notify['system']):?>
<?if (!_var($notify,'system')):?>
addBannerWarning("<?=_('System notifications are')?> <b><?=_('disabled')?></b>. <?=_('Click')?> <a href='/Settings/Notifications'><?=_('here')?></a> <?=_('to change notification settings')?>.",true,true);
<?endif;?>
<?endif;?>
var opts = [];
context.init({above:false,right:true});
context.settings({right:true,above:false});
opts.push({header:"<?=_('Notifications')?>"});
opts.push({text:"<?=_('Alerts')?>",icon:'fa-bell-o',subMenu:[{text:"<?=_('View')?>",icon:'fa-folder-open-o',action:function(e){e.preventDefault();openNotifier('alert');}},{text:"<?=_('History')?>",icon:'fa-file-text-o',action:function(e){e.preventDefault();viewHistory('alert');}},{text:"<?=_('Acknowledge')?>",icon:'fa-check-square-o',action:function(e){e.preventDefault();closeNotifier('alert');}}]});
opts.push({text:"<?=_('Warnings')?>",icon:'fa-star-o',subMenu:[{text:"<?=_('View')?>",icon:'fa-folder-open-o',action:function(e){e.preventDefault();openNotifier('warning');}},{text:"<?=_('History')?>",icon:'fa-file-text-o',action:function(e){e.preventDefault();viewHistory('warning');}},{text:"<?=_('Acknowledge')?>",icon:'fa-check-square-o',action:function(e){e.preventDefault();closeNotifier('warning');}}]});
opts.push({text:"<?=_('Notices')?>",icon:'fa-sun-o',subMenu:[{text:"<?=_('View')?>",icon:'fa-folder-open-o',action:function(e){e.preventDefault();openNotifier('normal');}},{text:"<?=_('History')?>",icon:'fa-file-text-o',action:function(e){e.preventDefault();viewHistory('normal');}},{text:"<?=_('Acknowledge')?>",icon:'fa-check-square-o',action:function(e){e.preventDefault();closeNotifier('normal');}}]});
context.attach('#board',opts);
// simulate a click to set first context menu
$('#board').click();
$('#header').click();
if (location.pathname.search(/\/(AddVM|UpdateVM|AddContainer|UpdateContainer)/)==-1) {
$('blockquote.inline_help').each(function(i) {
+5 -3
View File
@@ -14,9 +14,11 @@
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
$dynamix = parse_plugin_cfg('dynamix',true);
$unread = $dynamix['notify']['path']."/unread/";
$archive = $dynamix['notify']['path']."/archive";
extract(parse_plugin_cfg('dynamix',true));
$path = _var($notify,'path','/tmp/notifications');
$unread = "$path/unread/";
$archive = "$path/archive";
$log = $_POST['log']??'';
$filter = $_POST['filter']??false;
$files = strpos($log,'*')===false ? [realpath("$archive/$log")] : glob("$archive/$log",GLOB_NOSORT);
+25 -23
View File
@@ -12,34 +12,36 @@
?>
<?
$docroot = $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";
require_once "$docroot/webGui/include/Helpers.php";
$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);
$compute = unscript($_GET['compute']??'');
$path = unscript($_GET['path']??'');
$fill = unscript($_GET['fill']??'');
$compute = unscript(_var($_GET,'compute'));
$path = unscript(_var($_GET,'path'));
$fill = unscript(_var($_GET,'fill'));
$display = [];
$display['scale'] = unscript($_GET['scale']??'');
$display['number'] = unscript($_GET['number']??'');
$display['scale'] = unscript(_var($_GET,'scale'));
$display['number'] = unscript(_var($_GET,'number','.,'));
// Display export settings
function disk_share_settings($protocol,$share) {
if (empty($share)) return;
if ($protocol!='yes' || $share['export']=='-') return "-";
return ($share['export']=='e') ? _(ucfirst($share['security'])) : '<em>'._(ucfirst($share['security'])).'</em>';
if ($protocol!='yes' || _var($share,'export')=='-') return "-";
return (_var($share,'export')=='e') ? _(ucfirst(_var($share,'security'))) : '<em>'._(ucfirst(_var($share,'security'))).'</em>';
}
function globalInclude($name) {
global $var;
return substr($name,0,4)!='disk' || !$var['shareUserInclude'] || strpos("{$var['shareUserInclude']},","$name,")!==false;
return substr($name,0,4)!='disk' || !_var($var,'shareUserInclude') || strpos(_var($var,'shareUserInclude').",","$name,")!==false;
}
function shareInclude($name) {
@@ -48,7 +50,7 @@ function shareInclude($name) {
}
function sharesOnly($disk) {
return in_array($disk['type'],['Data','Cache']) && ($disk['exportable']??'')=='yes';
return in_array(_var($disk,'type'),['Data','Cache']) && _var($disk,'exportable')=='yes';
}
// filter disk shares
@@ -58,11 +60,11 @@ $disks = array_filter($disks,'sharesOnly');
$crypto = false;
foreach ($disks as $name => $disk) {
if ($compute=='yes') exec("webGui/scripts/disk_size ".escapeshellarg($name)." ssz2");
$crypto |= strpos($disk['fsType']??'','luks:')!==false;
$crypto |= strpos(_var($disk,'fsType'),'luks:')!==false;
}
// global shares include/exclude
$myDisks = array_filter(array_diff(array_keys($disks), explode(',',$var['shareUserExclude'])), 'globalInclude');
$myDisks = array_filter(array_diff(array_keys($disks), explode(',',_var($var,'shareUserExclude'))), 'globalInclude');
// Share size per disk
$ssz2 = [];
@@ -74,13 +76,13 @@ else
// Build table
$row = 0;
foreach ($disks as $name => $disk) {
$color = $disk['fsColor'];
$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 ($disk['luksState']) {
if ($crypto) switch (_var($disk,'luksState',0)) {
case 0: $luks = "<i class='nolock fa fa-lock'></i>"; break;
case 1: $luks = "<a class='info' onclick='return false'><i class='padlock fa fa-unlock-alt green-text'></i><span>"._('All files encrypted')."</span></a>"; break;
case 2: $luks = "<a class='info' onclick='return false'><i class='padlock fa fa-unlock-alt orange-text'></i><span>"._('Some or all files unencrypted')."</span></a>"; break;
@@ -89,20 +91,20 @@ foreach ($disks as $name => $disk) {
echo "<tr><td><a class='view' href=\"/$path/Browse?dir=/mnt/$name\"><i class=\"icon-u-tab\" title=\"",_('Browse')," /mnt/$name\"></i></a>";
echo "<a class='info nohand' onclick='return false'><i class='fa fa-$orb orb $color-orb'></i><span style='left:18px'>$help</span></a>$luks<a href=\"/$path/Disk?name=$name\" onclick=\"$.cookie('one','tab1')\">",compress($name),"</a></td>";
echo "<td>{$disk['comment']}</td>";
echo "<td>",disk_share_settings($var['shareSMBEnabled'], $sec[$name]),"</td>";
echo "<td>",disk_share_settings($var['shareNFSEnabled'], $sec_nfs[$name]),"</td>";
echo "<td>",disk_share_settings(_var($var,'shareSMBEnabled'), $sec[$name]),"</td>";
echo "<td>",disk_share_settings(_var($var,'shareNFSEnabled'), $sec_nfs[$name]),"</td>";
$cmd="/webGui/scripts/disk_size&arg1=$name&arg2=ssz2";
$type = $disk['rotational'] ? _('HDD') : _('SSD');
$type = _var($disk,'rotational') ? _('HDD') : _('SSD');
if (array_key_exists($name, $ssz2)) {
echo "<td>$type</td>";
echo "<td>",my_scale(($disk['fsSize'])*1024, $unit)," $unit</td>";
echo "<td>",my_scale($disk['fsFree']*1024, $unit)," $unit</td>";
echo "<td>",my_scale(_var($disk,'fsSize',0)*1024, $unit)," $unit</td>";
echo "<td>",my_scale(_var($disk,'fsFree',0)*1024, $unit)," $unit</td>";
echo "</tr>";
foreach ($ssz2[$name] as $entry) {
[$sharename,$sharesize] = my_explode('=',$entry);
if ($sharename=='share.total') continue;
$include = $shares[$sharename]['include'];
$inside = in_array($disk['name'], array_filter(array_diff($myDisks, explode(',',$shares[$sharename]['exclude'])), 'shareInclude'));
$include = _var($shares[$sharename],'include');
$inside = in_array(_var($disk,'name'), array_filter(array_diff($myDisks, explode(',',_var($shares[$sharename],'exclude'))), 'shareInclude'));
echo "<tr class='",($inside ? "'>" : "warning'>");
echo "<td><a class='view'></a><a href=\"/update.htm?cmd=$cmd&csrf_token={$var['csrf_token']}\" target=\"progressFrame\" title=\"";
echo _('Recompute'),"...\" onclick='$.cookie(\"ssz\",\"ssz\",{path:\"/\"});$(\".disk-$row-1\").html(\"",_('Please wait'),"...\");$(\".disk-$row-2\").html(\"\");'><i class='fa fa-refresh icon'></i></a>&nbsp;$sharename</td>";
@@ -111,14 +113,14 @@ foreach ($disks as $name => $disk) {
echo "<td></td>";
echo "<td></td>";
echo "<td class='disk-$row-1'>",my_scale($sharesize, $unit)," $unit</td>";
echo "<td class='disk-$row-2'>",my_scale($disk['fsFree']*1024, $unit)," $unit</td>";
echo "<td class='disk-$row-2'>",my_scale(_var($disk,'fsFree',0)*1024, $unit)," $unit</td>";
echo "</tr>";
}
} else {
echo "<td>$type</td>";
echo "<td><a href=\"/update.htm?cmd=$cmd&csrf_token={$var['csrf_token']}\" target=\"progressFrame\" onclick=\"$.cookie('ssz','ssz');$(this).text('";
echo _('Please wait'),"...')\">",_('Compute'),"...</a></td>";
echo "<td>",my_scale($disk['fsFree']*1024, $unit)," $unit</td>";
echo "<td>",my_scale(_var($disk,'fsFree',0)*1024, $unit)," $unit</td>";
echo "</tr>";
}
}
+2 -2
View File
@@ -22,9 +22,9 @@ function validpath($file) {
switch ($_POST['cmd']) {
case 'save':
if (!validpath($file)) break;
$source = $_POST['source'];
$source = $_POST['source']??'';
$opts = $_POST['opts'] ?? 'qlj';
if (in_array(pathinfo($source, PATHINFO_EXTENSION),['txt','conf','png'])) {
if ($source && in_array(pathinfo($source,PATHINFO_EXTENSION),['txt','conf','png'])) {
exec("zip -$opts ".escapeshellarg("$docroot/$file")." ".escapeshellarg($source));
} else {
$tmp = "/var/tmp/".basename($source).".txt";
+3 -2
View File
@@ -17,12 +17,12 @@ $cmd = $_POST['cmd'];
$path = $_POST['path'];
function btrfs($data) {return "btrfs-$data";}
function zfs($data) {return "zfs-$data";}
function zfs($data) {return "zfs-".strtok($data,' ');}
switch ($cmd) {
case 'status':
exec("ps -C btrfs -o cmd=|awk '/$path\$/{print $2}'",$btrfs);
exec("/usr/sbin/zpool status|grep -om1 'scrub in progress'|grep -o scrub",$zfs);
exec("/usr/sbin/zpool status $path|grep -Po '(scrub|resilver) in progress'",$zfs);
echo implode(',',array_merge(array_map('btrfs',$btrfs),array_map('zfs',$zfs)));
break;
case 'btrfs-balance':
@@ -31,6 +31,7 @@ case 'btrfs-scrub':
echo shell_exec("/sbin/btrfs $cmd status $path");
break;
case 'zfs-scrub':
case 'zfs-resilver':
echo shell_exec("/usr/sbin/zpool status -P $path");
break;
default:
+1 -1
View File
@@ -66,7 +66,7 @@ if (is_low($rootdir) && is_dir($rootdir)) {
foreach ($files as $name) {
$htmlRel = htmlspecialchars($rootdir.$name);
$htmlName = htmlspecialchars($name);
$ext = mb_strtolower(pathinfo($name)['extension']??'');
$ext = mb_strtolower(pathinfo($name,PATHINFO_EXTENSION));
foreach ($filters as $filter) if (empty($filter)||$ext==$filter) {
if (empty($match)||preg_match("/$match/",$name)) echo "<li class='file ext_$ext'>$checkbox<a href='#' rel=\"$htmlRel\">$htmlName</a></li>";
}
+31 -31
View File
@@ -19,7 +19,7 @@ require_once "$docroot/webGui/include/Secure.php";
function my_scale($value, &$unit, $decimals=NULL, $scale=NULL, $kilo=1000) {
global $display,$language;
$scale = $scale ?? $display['scale'];
$number = $display['number'] ?? '.,';
$number = _var($display,'number','.,');
$units = explode(' ', ' '.($kilo==1000 ? ($language['prefix_SI'] ?? 'K M G T P E Z Y') : ($language['prefix_IEC'] ?? 'Ki Mi Gi Ti Pi Ei Zi Yi')));
$size = count($units);
if ($scale==0 && ($decimals===NULL || $decimals<0)) {
@@ -39,41 +39,41 @@ function my_scale($value, &$unit, $decimals=NULL, $scale=NULL, $kilo=1000) {
}
function my_number($value) {
global $display;
$number = $display['number'] ?? '.,';
$number = _var($display,'number','.,');
return number_format($value, 0, $number[0], ($value>=10000 ? $number[1] : ''));
}
function my_time($time, $fmt=NULL) {
global $display;
if (!$fmt) $fmt = $display['date'].($display['date']!='%c' ? ", {$display['time']}" : "");
if (!$fmt) $fmt = _var($display,'date').(_var($display,'date')!='%c' ? ", "._var($display,'time') : "");
return $time ? my_date($fmt, $time) : _('unknown');
}
function my_temp($value) {
global $display;
$unit = $display['unit'];
$number = $display['number'];
$unit = _var($display,'unit','C');
$number = _var($display,'number','.,');
return is_numeric($value) ? (($unit=='F' ? round(9/5*$value+32) : str_replace('.', $number[0], $value))." $unit") : $value;
}
function my_disk($name,$raw=false) {
function my_disk($name, $raw=false) {
global $display;
return $display['raw']||$raw ? $name : ucfirst(preg_replace('/(\d+)$/',' $1',$name));
return _var($display,'raw')||$raw ? $name : ucfirst(preg_replace('/(\d+)$/',' $1',$name));
}
function my_disks($disk) {
return strpos($disk['status'],'_NP')===false;
return strpos(_var($disk,'status'),'_NP')===false;
}
function my_hyperlink($text,$link) {
function my_hyperlink($text, $link) {
return str_replace(['[',']'],["<a href=\"$link\">","</a>"],$text);
}
function prefix($key) {
return preg_replace('/\d+$/','',$key);
}
function parity_only($disk) {
return $disk['type']=='Parity';
return _var($disk,'type')=='Parity';
}
function data_only($disk) {
return $disk['type']=='Data';
return _var($disk,'type')=='Data';
}
function cache_only($disk) {
return $disk['type']=='Cache';
return _var($disk,'type')=='Cache';
}
function parity_filter($disks) {
return array_filter($disks,'parity_only');
@@ -91,7 +91,7 @@ function my_id($id) {
global $display;
$len = strlen($id);
$wwn = substr($id,-18);
return ($display['wwn'] || substr($wwn,0,2)!='_3' || preg_match('/.[_-]/',$wwn)) ? $id : substr($id,0,$len-18);
return (_var($display,'wwn') || substr($wwn,0,2)!='_3' || preg_match('/.[_-]/',$wwn)) ? $id : substr($id,0,$len-18);
}
function my_word($num) {
$words = ['zero','one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen','twenty','twenty-one','twenty-two','twenty-three','twenty-four','twenty-five','twenty-six','twenty-seven','twenty-eight','twenty-nine','thirty'];
@@ -102,12 +102,12 @@ function my_usage() {
$arraysize=0;
$arrayfree=0;
foreach ($disks as $disk) {
if (strpos($disk['name'],'disk')!==false) {
$arraysize += $disk['sizeSb'];
$arrayfree += $disk['fsFree'];
if (strpos(_var($disk,'name'),'disk')!==false) {
$arraysize += _var($disk,'sizeSb',0);
$arrayfree += _var($disk,'fsFree',0);
}
}
if ($var['fsNumMounted']>0) {
if (_var($var,'fsNumMounted',0)>0) {
$used = $arraysize ? 100-round(100*$arrayfree/$arraysize) : 0;
echo "<div class='usage-bar'><span style='width:{$used}%' class='".usage_color($display,$used,false)."'>{$used}%</span></div>";
} else {
@@ -116,16 +116,16 @@ function my_usage() {
}
function usage_color(&$disk, $limit, $free) {
global $display;
if ($display['text']==1 || intval($display['text']/10)==1) return '';
$critical = !empty($disk['critical']) ? $disk['critical'] : $display['critical'];
$warning = !empty($disk['warning']) ? $disk['warning'] : $display['warning'];
if (_var($display,'text',0)==1 || intval(_var($display,'text',0)/10)==1) return '';
$critical = ($disk['critical'] ?? $display['critical'] ?? 0) ?: 0;
$warning = ($disk['warning'] ?? $display['warning'] ?? 0) ?: 0;
if (!$free) {
if ($limit>=$critical && $critical>0) return 'redbar';
if ($limit>=$warning && $warning>0) return 'orangebar';
if ($critical>0 && $limit>=$critical) return 'redbar';
if ($warning>0 && $limit>=$warning) return 'orangebar';
return 'greenbar';
} else {
if ($limit<=100-$critical && $critical>0) return 'redbar';
if ($limit<=100-$warning && $warning>0) return 'orangebar';
if ($critical>0 && $limit<=100-$critical) return 'redbar';
if ($warning>0 && $limit<=100-$warning) return 'orangebar';
return 'greenbar';
}
}
@@ -154,13 +154,13 @@ function mk_option_check($name, $value, $text="") {
$checked = in_array($value,explode(',',$name)) ? " selected" : "";
return "<option value='$value'$checked>$text</option>";
}
if (strpos($name, 'disk')!==false) {
if (strpos($name,'disk')!==false) {
$checked = in_array($name,explode(',',$value)) ? " selected" : "";
return "<option value='$name'$checked>".my_disk($name)."</option>";
}
}
function mk_option_luks($name, $value, $luks) {
if (strpos($name, 'disk')!==false) {
if (strpos($name,'disk')!==false) {
$checked = in_array($name,explode(',',$value)) ? " selected" : "";
return "<option luks='$luks' value='$name'$checked>".my_disk($name)."</option>";
}
@@ -192,7 +192,7 @@ function day_count($time) {
function plus($val, $word, $last) {
return $val>0 ? (($val || $last) ? ($val.' '._($word.($val!=1?'s':'')).($last ?'':', ')) : '') : '';
}
function compress($name,$size=18,$end=6) {
function compress($name, $size=18, $end=6) {
return mb_strlen($name)<=$size ? $name : mb_substr($name,0,$size-($end?$end+3:0)).'...'.($end?mb_substr($name,-$end):'');
}
function escapestring($name) {
@@ -223,7 +223,7 @@ function urlencode_path($path) {
}
function pgrep($process_name, $escape_arg=true) {
$pid = exec("pgrep ".($escape_arg?escapeshellarg($process_name):$process_name), $output, $retval);
return $retval == 0 ? $pid : false;
return $retval==0 ? $pid : false;
}
function is_block($path) {
return (@filetype(realpath($path))=='block');
@@ -240,7 +240,7 @@ function autov($file,$ret=false) {
echo $newFile;
}
function transpose_user_path($path) {
if (strpos($path, '/mnt/user/') === 0 && file_exists($path)) {
if (strpos($path,'/mnt/user/')===0 && file_exists($path)) {
$realdisk = trim(shell_exec("getfattr --absolute-names --only-values -n system.LOCATION ".escapeshellarg($path)." 2>/dev/null"));
if (!empty($realdisk))
$path = str_replace('/mnt/user/', "/mnt/$realdisk/", $path);
@@ -258,10 +258,10 @@ function cpu_list() {
exec('cat /sys/devices/system/cpu/*/topology/thread_siblings_list|sort -nu', $cpus);
return $cpus;
}
function my_explode($split,$text,$count=2) {
function my_explode($split, $text, $count=2) {
return array_pad(explode($split,$text,$count),$count,'');
}
function my_preg_split($split,$text,$count=2) {
function my_preg_split($split, $text, $count=2) {
return array_pad(preg_split($split,$text,$count),$count,'');
}
function delete_file(...$file) {
+11 -7
View File
@@ -1,5 +1,5 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
/* Copyright 2005-2023, Lime Technology
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -11,17 +11,20 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Helpers.php";
// add translations
$_SERVER['REQUEST_URI'] = 'settings';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
/**
* @name response_complete
* @param {HTTP Response Status Code} $httpcode https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
* @param {String|Array} $result - strings are assumed to be encoded JSON. Arrays will be encoded to JSON.
* @param {String} $cli_success_msg
*/
function response_complete($httpcode, $result, $cli_success_msg='') {
global $cli;
$mutatedResult = is_array($result) ? json_encode($result) : $result;
@@ -38,15 +41,16 @@ function response_complete($httpcode, $result, $cli_success_msg='') {
exit((string)$mutatedResult);
}
$cli = php_sapi_name()=='cli';
$url = unscript($_GET['url']??'');
$host = parse_url($url)['host'];
$cli = php_sapi_name()=='cli';
$url = unscript(_var($_GET,'url'));
$host = parse_url($url)['host']??'';
if (in_array($host,['keys.lime-technology.com','lime-technology.com'])) {
if ($host && in_array($host,['keys.lime-technology.com','lime-technology.com'])) {
$key_file = basename($url);
exec("/usr/bin/wget -q -O ".escapeshellarg("/boot/config/$key_file")." ".escapeshellarg($url), $output, $return_var);
if ($return_var === 0) {
if (parse_ini_file('/var/local/emhttp/var.ini')['mdState'] == "STARTED") {
$var = @parse_ini_file('/var/local/emhttp/var.ini') ?: [];
if (_var($var,'mdState')=="STARTED") {
response_complete(200, array('status' => _('Please Stop array to complete key installation')), _('success').', '._('Please Stop array to complete key installation'));
} else {
response_complete(200, array('status' => ''), _('success'));
+3 -3
View File
@@ -15,7 +15,7 @@
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
$notify = "$docroot/webGui/scripts/notify";
switch ($_POST['cmd']) {
switch ($_POST['cmd']??'') {
case 'init':
shell_exec("$notify init");
break;
@@ -48,11 +48,11 @@ case 'get':
break;
case 'hide':
$file = $_POST['file']??'';
if (file_exists($file) && $file==realpath($file) && pathinfo($file)['extension']=='notify') chmod($file,0400);
if (file_exists($file) && $file==realpath($file) && pathinfo($file,PATHINFO_EXTENSION)=='notify') chmod($file,0400);
break;
case 'archive':
$file = $_POST['file']??'';
if (strlen($file) && strpos($file,'/')===false) shell_exec("$notify archive ".escapeshellarg($file));
if ($file && strpos($file,'/')===false) shell_exec("$notify archive ".escapeshellarg($file));
break;
}
?>
+10 -7
View File
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,11 +12,14 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Secure.php";
switch ($_GET['protocol']??'') {
case 'smb': $data = parse_ini_file('state/sec.ini',true); break;
case 'nfs': $data = parse_ini_file('state/sec_nfs.ini',true); break;
require_once "$docroot/webGui/include/Secure.php";
require_once "$docroot/webGui/include/Wrappers.php";
switch (_var($_GET,'protocol')) {
case 'smb': $data = @parse_ini_file('state/sec.ini',true) ?: []; break;
case 'nfs': $data = @parse_ini_file('state/sec_nfs.ini',true) ?: []; break;
}
echo json_encode($data[unscript($_GET['name']??'')]);
$name = unscript(_var($_GET,'name'));
echo json_encode(_var($data,$name));
?>
+9 -6
View File
@@ -11,6 +11,11 @@
*/
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Secure.php";
require_once "$docroot/webGui/include/Wrappers.php";
switch ($_POST['cmd']??'') {
case 'config':
$config = "/boot/config";
@@ -26,22 +31,20 @@ case 'config':
break;
}
}
if ( $flag ) break;
if ($flag) break;
}
echo $flag;
break;
case 'notice':
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Secure.php";
$tmp = "/tmp/reboot_notifications";
$notices = file_exists($tmp) ? file($tmp,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) : [];
echo implode("\n",array_map('unbundle',$notices));
break;
case 'state':
$pools = explode(',',$_POST['pools']);
$disks = parse_ini_file('state/disks.ini',true);
$pools = explode(',',_var($_POST,'pools'));
$disks = @parse_ini_file('state/disks.ini',true) ?: [];
$error = [];
foreach ($pools as $pool) if (stripos($disks[$pool]['state'],'ERROR:')===0) $error[] = $pool.' - '.str_ireplace('ERROR:','',$disks[$pool]['state']);
foreach ($pools as $pool) if (stripos(_var($disks[$pool],'state'),'ERROR:')===0) $error[] = $pool.' - '.str_ireplace('ERROR:','',$disks[$pool]['state']);
echo implode('<br>',$error);
break;
}
+2 -2
View File
@@ -17,7 +17,7 @@ $root = "/boot/config/plugins/dynamix";
$name = "$root/$file";
if (realpath(dirname($name)) == $root) {
switch ($_POST['mode']) {
switch ($_POST['mode']??'') {
case 'set':
if ($model) file_put_contents($name,$model);
break;
@@ -27,7 +27,7 @@ if (realpath(dirname($name)) == $root) {
case 'file':
$case = 'case-model.png';
file_put_contents($name,$case);
file_put_contents("$root/$case",base64_decode(str_replace('data:image/png;base64,','',$_POST['data'])));
file_put_contents("$root/$case",base64_decode(str_replace('data:image/png;base64,','',$_POST['data']??'')));
break;
}
}
+8 -5
View File
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,8 +12,11 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Secure.php";
$shares = parse_ini_file('state/shares.ini',true);
echo json_encode($shares[unscript($_GET['name']??'')]);
require_once "$docroot/webGui/include/Secure.php";
require_once "$docroot/webGui/include/Wrappers.php";
$shares = @parse_ini_file('state/shares.ini',true) ?: [];
$name = unscript(_var($_GET,'name'));
echo json_encode(_var($shares,$name));
?>
+9 -8
View File
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,6 +12,7 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = 'shares';
require_once "$docroot/webGui/include/Translations.php";
@@ -22,14 +23,14 @@ $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);
$compute = unscript($_GET['compute']??'');
$path = unscript($_GET['path']??'');
$fill = unscript($_GET['fill']??'');
$compute = unscript(_var($_GET,'compute'));
$path = unscript(_var($_GET,'path'));
$fill = unscript(_var($_GET,'fill'));
$display = [];
$display['scale'] = unscript($_GET['scale']??'');
$display['number'] = unscript($_GET['number']??'');
$display['raw'] = unscript($_GET['raw']??'');
$display['scale'] = unscript(_var($_GET,'scale'));
$display['number'] = unscript(_var($_GET,'number','.,'));
$display['raw'] = unscript(_var($_GET,'raw'));
$pools_check = pools_filter(cache_filter($disks));
$pools = implode(',', $pools_check);
+14 -13
View File
@@ -12,11 +12,12 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = 'main';
require_once "$docroot/webGui/include/Translations.php";
$disks = array_merge_recursive((array)parse_ini_file('state/disks.ini',true), (array)parse_ini_file('state/devs.ini',true));
$disks = array_merge_recursive(@parse_ini_file('state/disks.ini',true)?:[], @parse_ini_file('state/devs.ini',true)?:[]);
require_once "$docroot/webGui/include/CustomMerge.php";
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/webGui/include/Preselect.php";
@@ -40,8 +41,8 @@ function duration(&$hrs) {
function append(&$ref, &$info) {
if ($info) $ref .= ($ref ? " " : "").$info;
}
$name = $_POST['name'] ?? '';
$port = $_POST['port'] ?? '';
$name = $_POST['name']??'';
$port = $_POST['port']??'';
if ($name) {
$disk = &$disks[$name];
$type = get_value($disk,'smType','');
@@ -51,14 +52,14 @@ if ($name) {
$type = '';
}
$port = port_name($disk['smDevice'] ?? $port);
switch ($_POST['cmd']) {
switch ($_POST['cmd']??'') {
case "attributes":
$select = get_value($disk,'smSelect',0);
$level = get_value($disk,'smLevel',1);
$events = explode('|',get_value($disk,'smEvents',$numbers));
$unraid = parse_plugin_cfg('dynamix',true);
$max = $disk['maxTemp'] ?? $unraid['display']['max'];
$hot = $disk['hotTemp'] ?? $unraid['display']['hot'];
extract(parse_plugin_cfg('dynamix',true));
$max = ($disk['maxTemp'] ?? $display['max'] ?? 0) ?: 0;
$hot = ($disk['hotTemp'] ?? $display['hot'] ?? 0) ?: 0;
$top = $_POST['top'] ?? 120;
$empty = true;
exec("smartctl -n standby -A $type ".escapeshellarg("/dev/$port"),$output);
@@ -139,7 +140,7 @@ case "capabilities":
$nvme_section = "psdetail";
preg_match('/^(?P<data1>.\S+)\s+(?P<data2>\S+)\s+(?P<data3>\S+)\s+(?P<data4>\S+)\s+(?P<data5>\S+)\s+(?P<data6>\S+)\s+(?P<data7>\S+)\s+(?P<data8>\S+)\s+(?P<data9>\S+)\s+(?P<data10>\S+)\s+(?P<data11>\S+)$/',$line, $psheadings);
for ($i = 1; $i <= 11; $i++) {
echo "<td>".($psheadings['data'.$i]??'')."</td>" ;
echo "<td>"._var($psheadings,'data'.$i)."</td>" ;
}
$row = ['','',''];
echo '</tr></thead><tbody>' ;
@@ -149,7 +150,7 @@ case "capabilities":
echo '<tr>' ;
preg_match('/^(?P<data1>.\S+)\s+(?P<data2>\S\s+)\s+(?P<data3>\S+)\s+(?P<data4>\S\s+)\s+(?P<data5>\S+)\s+(?P<data6>\S+)\s+(?P<data7>\S+)\s+(?P<data8>\S+)\s+(?P<data9>\S+)\s+(?P<data10>\S+)\s+(?P<data11>\S+)$/',$line, $psdetails);
for ($i = 1; $i <= 11; $i++) {
echo "<td>".($psdetails['data'.$i]??'')."</td>" ;
echo "<td>"._var($psdetails,'data'.$i)."</td>" ;
}
$row = ['','',''];
echo '</tr>' ;
@@ -159,7 +160,7 @@ case "capabilities":
$nvme_section = "lbadetail";
preg_match('/^(?P<data1>.\S+)\s+(?P<data2>\S+)\s+(?P<data3>\S+)\s+(?P<data4>\S+)\s+(?P<data5>\S+)$/',$line, $lbaheadings);
for ($i = 1; $i <= 5; $i++) {
echo "<td>".($lbaheadings['data'.$i]??'')."</td>" ;
echo "<td>"._var($lbaheadings,'data'.$i)."</td>" ;
}
$row = ['','',''];
echo '</thead><tbody>' ;
@@ -169,7 +170,7 @@ case "capabilities":
preg_match('/^(?P<data1>.\S+)\s+(?P<data2>\S\s+)\s+(?P<data3>\S+)\s+(?P<data4>\S\s+)\s+(?P<data5>\S+)$/',$line, $lbadetails);
echo '<tr>' ;
for ($i = 1; $i <= 5; $i++) {
echo "<td>".($lbadetails['data'.$i]??'')."</td>" ;
echo "<td>"._var($lbadetails,'data'.$i)."</td>" ;
}
$row = ['','',''];
echo '</tr>' ;
@@ -203,10 +204,10 @@ case "identify":
$disk = $disks[$name]['id'];
$info = &$extra[$disk];
$periods = ['6','12','18','24','36','48','60'];
echo "<tr><td>"._('Manufacturing date').":</td><td><input type='date' class='narrow' value='".($info['date']??'')."' onchange='disklog(\"$disk\",\"date\",this.value)'></td></tr>";
echo "<tr><td>"._('Manufacturing date').":</td><td><input type='date' class='narrow' value='"._var($info,'date')."' onchange='disklog(\"$disk\",\"date\",this.value)'></td></tr>";
echo "<tr><td>"._('Date of purchase').":</td><td><input type='date' class='narrow' value='".($info['purchase']??'')."' onchange='disklog(\"$disk\",\"purchase\",this.value)'></td></tr>";
echo "<tr><td>"._('Warranty period').":</td><td><select class='noframe' onchange='disklog(\"$disk\",\"warranty\",this.value)'><option value=''>"._('unknown')."</option>";
foreach ($periods as $period) echo "<option value='$period'".(($info['warranty']??'')==$period?" selected":"").">$period "._('months')."</option>";
foreach ($periods as $period) echo "<option value='$period'".(_var($info,'warranty')==$period?" selected":"").">$period "._('months')."</option>";
echo "</select></td></tr>";
}
break;
+12 -9
View File
@@ -11,6 +11,10 @@
*/
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
$device = $_POST['device']??'';
$name = $_POST['name']??'';
$action = $_POST['action']??'';
@@ -23,9 +27,7 @@ function prefix($key) {
function emhttpd($cmd) {
global $state, $csrf;
$ch = curl_init("http://127.0.0.1/update");
$options = array(CURLOPT_UNIX_SOCKET_PATH => '/var/run/emhttpd.socket',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => "$cmd&startState=$state&csrf_token=$csrf");
$options = [CURLOPT_UNIX_SOCKET_PATH => '/var/run/emhttpd.socket', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => "$cmd&startState=$state&csrf_token=$csrf"];
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
@@ -33,7 +35,7 @@ function emhttpd($cmd) {
switch ($device) {
case 'New':
emhttpd("cmdSpin$action=$name");
emhttpd("cmdSpin{$action}={$name}");
break;
case 'Clear':
emhttpd("clearStatistics=true");
@@ -46,16 +48,17 @@ default:
}
if (substr($name,-1) != '*') {
// spin up/down single device
emhttpd("cmdSpin$action=$name");
emhttpd("cmdSpin{$action}={$name}");
break;
}
// spin up/down group of devices
$disks = (array)parse_ini_file('state/disks.ini',true);
$disks = @parse_ini_file('state/disks.ini',true) ?: [];
// remove '*' from name
$name = substr($name,0,-1);
foreach ($disks as $disk) {
if ($disk['status'] != 'DISK_OK') continue;
$array = ($name=='array' && in_array($disk['type'],['Parity','Data']));
if ($array || prefix($disk['name'])==$name) emhttpd("cmdSpin$action={$disk['name']}");
if (_var($disk,'status') != 'DISK_OK') continue;
$array = ($name=='array' && in_array(_var($disk,'type'),['Parity','Data']));
if ($array || prefix(_var($disk,'name'))==$name) emhttpd("cmdSpin{$action}="._var($disk,'name'));
}
break;
}
+1 -1
View File
@@ -121,7 +121,7 @@ function translate($key) {
// main
$language = [];
$locale = $_SESSION['locale'] ?? ($login_locale??'');
$locale = $_SESSION['locale'] ?? $login_locale ?? '';
$return = "function _(t){return t;}";
$jscript = "$docroot/webGui/javascript/translate.en_US.js";
$root = "$docroot/languages/en_US/helptext.txt";
+47 -46
View File
@@ -12,6 +12,7 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// add translations
$_SERVER['REQUEST_URI'] = 'settings';
require_once "$docroot/webGui/include/Translations.php";
@@ -19,14 +20,14 @@ require_once "$docroot/webGui/include/Helpers.php";
function host_lookup_ip($host) {
$result = @dns_get_record($host, DNS_A);
$ip = ($result) ? $result[0]['ip']??'' : '';
$ip = $result ? _var($result[0],'ip') : '';
return($ip);
}
function rebindDisabled() {
global $isLegacyCert;
$rebindtesturl = $isLegacyCert ? "rebindtest.unraid.net" : "rebindtest.myunraid.net";
// DNS Rebind Protection - this checks the server but clients could still have issues
$validResponse = array("192.168.42.42", "fd42");
$validResponse = ["192.168.42.42", "fd42"];
$response = host_lookup_ip($rebindtesturl);
return in_array(explode('::',$response)[0], $validResponse);
}
@@ -69,24 +70,24 @@ function verbose_output($httpcode, $result) {
if (!$cli || !$verbose) return;
if ($anon) echo "(Output is anonymized, use '-vv' to see full details)".PHP_EOL;
echo "Unraid OS {$var['version']}".((strpos($plgversion, "base-") === false) ? " with My Servers plugin version {$plgversion}" : '').PHP_EOL;
echo "Unraid OS "._var($var,'version','???').((strpos($plgversion, "base-") === false) ? " with My Servers plugin version {$plgversion}" : '').PHP_EOL;
echo ($isRegistered) ? "{$icon_ok}Signed in to Unraid.net as {$myservers['remote']['username']}".PHP_EOL : "{$icon_warn}Not signed in to Unraid.net".PHP_EOL ;
echo "Use SSL is {$nginx['NGINX_USESSL']}".PHP_EOL;
echo "Use SSL is "._var($nginx,'NGINX_USESSL','No').PHP_EOL;
echo (rebindDisabled()) ? "{$icon_ok}Rebind protection is disabled" : "{$icon_warn}Rebind protection is enabled";
echo " for ".($isLegacyCert ? "unraid.net" : "myunraid.net").PHP_EOL;
if ($post) {
$wanip = trim(@file_get_contents("https://wanip4.unraid.net/"));
// check the data
$certhostname = $nginx['NGINX_CERTNAME'];
$certhostname = _var($nginx,'NGINX_CERTNAME');
if ($certhostname) {
// $certhostname is $nginx['NGINX_CERTNAME'] (certificate_bundle.pem)
$certhostip = host_lookup_ip(generate_internal_host($certhostname, $post['internalip']));
$certhosterr = ($certhostip != $post['internalip']);
$certhostip = host_lookup_ip(generate_internal_host($certhostname, _var($post,'internalip')));
$certhosterr = ($certhostip != _var($post,'internalip'));
}
if ($post['internalhostname'] != $certhostname) {
if (_var($post,'internalhostname') != $certhostname) {
// $post['internalhostname'] is $nginx['NGINX_LANMDNS'] (no cert, or Server_unraid_bundle.pem) || $nginx['NGINX_CERTNAME'] (certificate_bundle.pem)
$internalhostip = host_lookup_ip(generate_internal_host($post['internalhostname'], $post['internalip']));
$internalhosterr = ($internalhostip != $post['internalip']);
$internalhostip = host_lookup_ip(generate_internal_host(_var($post,'internalhostname'), _var($post,'internalip')));
$internalhosterr = ($internalhostip != _var($post,'internalip'));
}
if (!empty($post['externalhostname'])) {
// $post['externalhostname'] is $nginx['NGINX_CERTNAME'] (certificate_bundle.pem)
@@ -109,20 +110,20 @@ function verbose_output($httpcode, $result) {
if (!empty($post['keyfile'])) $post['keyfile'] = "[redacted]";
// output notes
if (!empty($post['internalprotocol']) && !empty($post['internalhostname']) && !empty($post['internalport'])) {
$localurl = $post['internalprotocol']."://".generate_internal_host($post['internalhostname'], $post['internalip']).format_port($post['internalport']);
$localurl = $post['internalprotocol']."://".generate_internal_host($post['internalhostname'], _var($post,'internalip')).format_port($post['internalport']);
echo 'Local Access url: '.$localurl.PHP_EOL;
if ($internalhostip) {
// $internalhostip will not be defined for .local domains, ok to skip
echo ($internalhosterr) ? $icon_warn : $icon_ok;
echo generate_internal_host($post['internalhostname'], $post['internalip'])." resolves to {$internalhostip}";
echo ($internalhosterr) ? ", it should resolve to {$post['internalip']}" : "";
echo generate_internal_host($post['internalhostname'], _var($post,'internalip'))." resolves to {$internalhostip}";
echo ($internalhosterr) ? ", it should resolve to "._var($post,'internalip') : "";
echo PHP_EOL;
}
if ($certhostname) {
echo ($certhosterr) ? $icon_warn : $icon_ok;
echo generate_internal_host($certhostname, $post['internalip']).' ';
echo generate_internal_host($certhostname, _var($post,'internalip')).' ';
echo ($certhostip) ? "resolves to {$certhostip}" : "does not resolve to an IP address";
echo ($certhosterr) ? ", it should resolve to {$post['internalip']}" : "";
echo ($certhosterr) ? ", it should resolve to "._var($post,'internalip') : "";
echo PHP_EOL;
}
if ($remoteaccess == 'yes' && !empty($post['externalprotocol']) && !empty($post['externalhostname']) && !empty($post['externalport'])) {
@@ -130,7 +131,7 @@ function verbose_output($httpcode, $result) {
echo 'Remote Access url: '.$remoteurl.PHP_EOL;
echo ($externalhosterr) ? $icon_warn : $icon_ok;
echo generate_external_host($post['externalhostname'], $wanip).' ';
echo ($externalhosterr) ? "does not resolve to an IP address" : "resolves to {$externalhostip}";
echo ($externalhosterr) ? "does not resolve to an IP address" : "resolves to ".($externalhostip??'');
echo PHP_EOL;
}
if ($reloadNginx) {
@@ -179,9 +180,9 @@ if ($cli && ($argc > 1) && $argv[1] == "-v") {
if ($cli && ($argc > 1) && $argv[1] == "-vv") {
$verbose = true;
}
$var = parse_ini_file('/var/local/emhttp/var.ini');
$nginx = parse_ini_file('/var/local/emhttp/nginx.ini');
$is69 = version_compare($var['version'],"6.9.9","<");
$var = @parse_ini_file('/var/local/emhttp/var.ini') ?: [];
$nginx = @parse_ini_file('/var/local/emhttp/nginx.ini') ?: [];
$is69 = version_compare(_var($var,'version'),"6.9.9","<");
$reloadNginx = false;
$dnserr = false;
$icon_warn = "⚠️ ";
@@ -201,11 +202,11 @@ if (empty($myservers['remote']['wanport'])) {
}
// remoteaccess, externalport
if ($cli) {
$remoteaccess = (empty($nginx['NGINX_WANFQDN'])) ? 'no' : 'yes';
$remoteaccess = empty($nginx['NGINX_WANFQDN']) ? 'no' : 'yes';
$externalport = $myservers['remote']['wanport'];
} else {
$remoteaccess = $_POST['remoteaccess']??'no';
$externalport = intval($_POST['externalport']??443);
$remoteaccess = _var($_POST,'remoteaccess','no');
$externalport = intval(_var($_POST,'externalport',443));
if ($remoteaccess != 'yes') {
$remoteaccess = 'no';
@@ -237,48 +238,48 @@ $isRegistered = !empty($myservers['remote']['username']);
// protocols, hostnames, ports
$internalprotocol = 'http';
$internalport = $nginx['NGINX_PORT'];
$internalhostname = $nginx['NGINX_LANMDNS'];
$internalport = _var($nginx,'NGINX_PORT');
$internalhostname = _var($nginx,'NGINX_LANMDNS');
$externalprotocol = 'https';
// keyserver will expand *.hash.myunraid.net or add www to hash.unraid.net as needed
$externalhostname = $nginx['NGINX_CERTNAME'];
$isLegacyCert = preg_match('/.*\.unraid\.net$/', $nginx['NGINX_CERTNAME']);
$isWildcardCert = preg_match('/.*\.myunraid\.net$/', $nginx['NGINX_CERTNAME']);
$internalip = $nginx['NGINX_LANIP'];
$externalhostname = _var($nginx,'NGINX_CERTNAME');
$isLegacyCert = preg_match('/.*\.unraid\.net$/', _var($nginx,'NGINX_CERTNAME'));
$isWildcardCert = preg_match('/.*\.myunraid\.net$/', _var($nginx,'NGINX_CERTNAME'));
$internalip = _var($nginx,'NGINX_LANIP');
if ($nginx['NGINX_USESSL']=='yes') {
if (_var($nginx,'NGINX_USESSL')=='yes') {
// When NGINX_USESSL is 'yes' in 6.9, it could be using either Server_unraid_bundle.pem or certificate_bundle.pem
// When NGINX_USESSL is 'yes' in 6.10, it is is using Server_unraid_bundle.pem
$internalprotocol = 'https';
$internalport = $nginx['NGINX_PORTSSL'];
if ($is69 && $nginx['NGINX_CERTNAME']) {
$internalport = _var($nginx,'NGINX_PORTSSL');
if ($is69 && _var($nginx,'NGINX_CERTNAME')) {
// this is from certificate_bundle.pem
$internalhostname = $nginx['NGINX_CERTNAME'];
$internalhostname = _var($nginx,'NGINX_CERTNAME');
}
}
if ($nginx['NGINX_USESSL']=='auto') {
if (_var($nginx,'NGINX_USESSL')=='auto') {
// NGINX_USESSL cannot be 'auto' in 6.9, it is either 'yes' or 'no'
// When NGINX_USESSL is 'auto' in 6.10, it is using certificate_bundle.pem
$internalprotocol = 'https';
$internalport = $nginx['NGINX_PORTSSL'];
$internalport = _var($nginx,'NGINX_PORTSSL');
// keyserver will expand *.hash.myunraid.net as needed
$internalhostname = $nginx['NGINX_CERTNAME'];
$internalhostname = _var($nginx,'NGINX_CERTNAME');
}
// My Servers version
$plgversion = file_exists("/var/log/plugins/dynamix.unraid.net.plg") ? trim(@exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.plg 2>/dev/null'))
: ( file_exists("/var/log/plugins/dynamix.unraid.net.staging.plg") ? trim(@exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.staging.plg 2>/dev/null'))
: 'base-'.$var['version'] );
$plgversion = file_exists("/var/log/plugins/dynamix.unraid.net.plg") ? trim(exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.plg 2>/dev/null'))
: (file_exists("/var/log/plugins/dynamix.unraid.net.staging.plg") ? trim(exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.staging.plg 2>/dev/null'))
: 'base-'._var($var,'version'));
// only proceed when when signed in or when legacy unraid.net SSL certificate exists
if (!$isRegistered && !$isLegacyCert) {
response_complete(406, array('error' => _('Nothing to do')));
response_complete(406, ['error' => _('Nothing to do')]);
}
// keyfile
$keyfile = empty($var['regFILE']) ? false : @file_get_contents($var['regFILE']);
if ($keyfile === false) {
response_complete(406, array('error' => _('Registration key required')));
response_complete(406, ['error' => _('Registration key required')]);
}
$keyfile = @base64_encode($keyfile);
@@ -292,7 +293,7 @@ if ($isLegacyCert) {
// enable local ddns regardless of use_ssl value
$post['internalip'] = $internalip;
// if host.unraid.net does not resolve to the internalip and DNS Rebind Protection is disabled, disable caching
if (host_lookup_ip(generate_internal_host($nginx['NGINX_CERTNAME'], $post['internalip'])) != $post['internalip'] && rebindDisabled()) $dnserr = true;
if (host_lookup_ip(generate_internal_host(_var($nginx,'NGINX_CERTNAME'), $post['internalip'])) != $post['internalip'] && rebindDisabled()) $dnserr = true;
}
if ($isRegistered) {
// if signed in, send data needed to maintain My Servers Dashboard
@@ -300,8 +301,8 @@ if ($isRegistered) {
$post['internalport'] = $internalport;
$post['internalprotocol'] = $internalprotocol;
$post['remoteaccess'] = $remoteaccess;
$post['servercomment'] = $var['COMMENT'];
$post['servername'] = $var['NAME'];
$post['servercomment'] = _var($var,'COMMENT');
$post['servername'] = _var($var,'NAME');
if ($isWildcardCert) {
// keyserver needs the internalip to generate the local access url
$post['internalip'] = $internalip;
@@ -318,11 +319,11 @@ if ($isRegistered) {
}
// if remoteaccess is enabled in 6.10.0-rc3+ and WANIP has changed since nginx started, reload nginx
if (isset($post['_wanip']) && ($post['_wanip'] != $nginx['NGINX_WANIP']) && version_compare($var['version'],"6.10.0-rc2",">")) $reloadNginx = true;
if ($post['_wanip'] != _var($nginx,'NGINX_WANIP') && version_compare(_var($var,'version'),"6.10.0-rc2",">")) $reloadNginx = true;
// if remoteaccess is currently disabled (perhaps because a wanip was not available when nginx was started)
// BUT the system is configured to have it enabled AND a wanip is now available
// then reload nginx
if ($remoteaccess == 'no' && $nginx['NGINX_WANACCESS'] == 'yes' && !empty(trim(@file_get_contents("https://wanip4.unraid.net/")))) $reloadNginx = true;
if ($remoteaccess == 'no' && _var($nginx,'NGINX_WANACCESS') == 'yes' && !empty(trim(@file_get_contents("https://wanip4.unraid.net/")))) $reloadNginx = true;
if ($reloadNginx) {
exec("/etc/rc.d/rc.nginx reload &>/dev/null");
}
@@ -356,7 +357,7 @@ curl_close($ch);
if ( ($result === false) || ($httpcode != "200") ) {
// delete cache file to retry submission on next run
@unlink($datafile);
response_complete($httpcode ?? "500", array('error' => $error));
response_complete($httpcode ?? "500", ['error' => $error]);
}
response_complete($httpcode, $result, _('success'));
+8 -5
View File
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -48,10 +48,13 @@ function plugin_update_available($plugin, $os=false) {
if (version_compare($server, $unraid, '>=')) return $remote;
}
}
function get_value(&$object, $name, $default) {
function _var(&$name, $key, $default='') {
return $name[$key] ?? $default;
}
function get_value(&$name, $key, $default) {
global $var;
$value = $object[$name] ?? -1;
return $value!==-1 ? $value : ($var[$name] ?? $default);
$value = $name[$key] ?? -1;
return $value!==-1 ? $value : ($var[$key] ?? $default);
}
function get_ctlr_options(&$type, &$disk) {
if (!$type) return;
+7 -6
View File
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -16,19 +16,20 @@ $_SERVER['REQUEST_URI'] = '';
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
$index = unscript($_GET['index']??'');
$tests = explode(',',unscript($_GET['test']??''));
$index = unscript(_var($_GET,'index'));
$tests = explode(',',unscript(_var($_GET,'test')));
if ($index < count($tests)) {
$test = $tests[$index];
[$name,$size] = my_explode(':',$test);
if (!$size) {
$default = ($test==($_GET['hash']??''));
$default = ($test==_var($_GET,'hash']));
if ($index>0) $test .= '|tail -1';
if ($default) echo "<b>";
echo preg_replace(['/^(# Tests.*\n)/','/\n$/'],["$1\n",""],shell_exec("/usr/sbin/cryptsetup benchmark -h $test"));
echo $default ? " (default)</b>\n" : "\n";
} else {
$default = ($test==($_GET['luks']??''));
$default = ($test==_var($_GET,'luks'));
if ($index>5) $size .= '|tail -1';
if ($default) echo "<b>";
echo preg_replace(['/^# Tests.*\n/','/\n$/'],["\n",""],shell_exec("/usr/sbin/cryptsetup benchmark -c $name -s $size"));
@@ -1,6 +1,6 @@
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,15 +12,17 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Secure.php";
require_once "$docroot/webGui/include/Wrappers.php";
$vfio = '/boot/config/vfio-pci.cfg';
$old = is_file($vfio) ? rtrim(file_get_contents($vfio)) : '';
$new = $_GET["cfg"]??'';
$new = unscript(_var($_GET,'cfg'));
if ($old !== $new) {
exec("cp -f $vfio $vfio.bak");
exec("echo \"$new\" >$vfio", $output, $myreturn );
if ($myreturn !== "0") {echo "1";}
exec("echo \"$new\" >$vfio", $output, $myreturn);
if ($myreturn != 0) {echo "1";}
}
?>
+59 -55
View File
@@ -12,17 +12,20 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Helpers.php";
// add translations
$_SERVER['REQUEST_URI'] = 'settings';
// special case when script is called on form-submit and processed by update.php
if (!isset($_SESSION['locale'])) $_SESSION['locale'] = $_POST['#locale']??'';
if (!isset($_SESSION['locale'])) $_SESSION['locale'] = _var($_POST,'#locale');
require_once "$docroot/webGui/include/Translations.php";
require_once "$docroot/webGui/include/Helpers.php";
$dockerd = is_file('/var/run/dockerd.pid') && is_dir('/proc/'.file_get_contents('/var/run/dockerd.pid'));
$etc = '/etc/wireguard';
$validIP4 = "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}";
$validIP6 = "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(:|([0-9a-fA-F]{1,4}:)+):(([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?)";
$validIP4 = "(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})";
$validIP6 = "(?:([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(:|([0-9a-fA-F]{1,4}:)+):(([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?)";
$normalize = ['address'=>'Address', 'dns'=>'DNS', 'privatekey'=>'PrivateKey', 'publickey'=>'PublicKey', 'allowedips'=>'AllowedIPs', 'endpoint'=>'Endpoint','listenport'=>'ListenPort','mtu'=>'MTU','persistentkeepalive'=>'PersistentKeepalive'];
$dockernet = "172.31";
@@ -36,8 +39,8 @@ function mask2cidr($mask) {
}
function thisNet($ethX='eth0') {
extract(parse_ini_file('state/network.ini',true));
$net = long2ip(ip2long($$ethX['IPADDR:0']) & ip2long($$ethX['NETMASK:0'])).'/'.mask2cidr($$ethX['NETMASK:0']);
$dev = $$ethX['BRIDGING']=='yes' ? $$ethX['BRNAME'] : ($$ethX['BONDING']=='yes' ? $$ethX['BONDNAME'] : $ethX);
$net = long2ip(ip2long(_var($$ethX,'IPADDR:0')) & ip2long(_var($$ethX,'NETMASK:0'))).'/'.mask2cidr(_var($$ethX,'NETMASK:0'));
$dev = _var($$ethX,'BRIDGING')=='yes' ? _var($$ethX,'BRNAME') : (_var($$ethX,'BONDING')=='yes' ? _var($$ethX,'BONDNAME') : $ethX);
return [$dev,$net,$$ethX['GATEWAY:0']];
}
function ipv4($ip) {
@@ -146,7 +149,7 @@ function addPeer(&$x) {
$peers[$x] = ['[Interface]']; // [Interface]
if (isset($var['client'])) $peers[$x][] = $var['client']; // #name
if (isset($var['privateKey'])) $peers[$x][] = $var['privateKey']; // PrivateKey
$peers[$x][] = $var['address']??''; // Address
$peers[$x][] = _var($var,'address'); // Address
if (isset($var['listenport'])) $peers[$x][] = $var['listenport']; // ListenPort
if (isset($var['dns'])) $peers[$x][] = $var['dns']; // DNS server
if (isset($var['mtu'])) $peers[$x][] = $var['mtu']; // MTU
@@ -155,10 +158,10 @@ function addPeer(&$x) {
if (isset($var['server'])) $peers[$x][] = $var['server']; // #name
if (isset($var['handshake'])) $peers[$x][] = $var['handshake']; // PersistentKeepalive
if (isset($var['presharedKey'])) $peers[$x][] = $var['presharedKey']; // PresharedKey
$peers[$x][] = $var['publicKey']??''; // PublicKey
$peers[$x][] = _var($var,'publicKey'); // PublicKey
if (isset($var['tunnel'])) $peers[$x][] = $var['tunnel']; // Tunnel address
$peers[$x][] = $var['endpoint'] ?: $var['internet'] ?: ''; // Endpoint
$peers[$x][] = $var['allowedIPs']??''; // AllowedIPs
$peers[$x][] = _var($var,'endpoint') ?: _var($var,'internet'); // Endpoint
$peers[$x][] = _var($var,'allowedIPs'); // AllowedIPs
$x++;
}
function autostart($vtun,$cmd) {
@@ -223,7 +226,7 @@ function createIPs($list) {
return implode(', ',array_map('host',array_filter(array_map('trim',explode(',',$list)))));
}
function parseInput($vtun,&$input,&$x) {
global $conf,$user,$var,$default,$default6,$vpn,$tunip;
global $conf,$user,$var,$default4,$default6,$vpn,$tunip;
$section = 0; $addPeer = false;
foreach ($input as $key => $value) {
if ($key[0]=='#') continue;
@@ -280,13 +283,13 @@ function parseInput($vtun,&$input,&$x) {
$protocol = $value;
$user[] = "$id:0=\"$value\"";
switch ($protocol) {
case '46': $var['default'] = "AllowedIPs=$default, $default6"; break;
case '46': $var['default'] = "AllowedIPs=$default4, $default6"; break;
case '6' : $var['default'] = "AllowedIPs=$default6"; break;
default : $var['default'] = "AllowedIPs=$default"; break;
default : $var['default'] = "AllowedIPs=$default4"; break;
}
break;
case 'TYPE':
$list = $value<4 ? ($value%2==1 ? $var['subnets1'] : $var['subnets2']) : ($value<6 ? ($value%2==1 ? $var['shared1'] : $var['shared2']) : $var['default']);
$list = $value<4 ? ($value%2==1 ? _var($var,'subnets1') : _var($var,'subnets2')) : ($value<6 ? ($value%2==1 ? _var($var,'shared1') : _var($var,'shared2')) : _var($var,'default'));
$var['allowedIPs'] = createIPs($list);
$var['tunnel'] = ($value==2||$value==3) ? $tunnel : false;
$user[] = "$id:$x=\"$value\"";
@@ -321,8 +324,8 @@ function parseInput($vtun,&$input,&$x) {
$var['endpoint'] = $value ? "Endpoint=".ipset($value) : false;
} else {
if ($value) $conf[] = "$id=$value";
$var['listenport'] = $value ? "ListenPort=".explode(ipsplit($value),$value)[1] : false;
if ($var['endpoint'] && strpos($var['endpoint'],ipsplit($var['endpoint']))===false) $var['endpoint'] .= ":".explode(ipsplit($var['internet']),$var['internet'])[1];
$var['listenport'] = $value ? "ListenPort=".(explode(ipsplit($value),$value)[1]??'') : false;
if ($var['endpoint'] && strpos(_var($var,'endpoint'),ipsplit(_var($var,'endpoint')))===false) $var['endpoint'] .= ":".(explode(ipsplit(_var($var,'internet')),_var($var,'internet'))[1]??'');
}
break;
case 'PersistentKeepalive':
@@ -342,9 +345,10 @@ function parseInput($vtun,&$input,&$x) {
}
}
}
$default = '0.0.0.0/0';
$default4 = '0.0.0.0/0';
$default6 = '::/0';
switch ($_POST['#cmd']) {
switch (_var($_POST,'#cmd')) {
case 'keypair':
$private = exec("wg genkey");
$public = exec("wg pubkey <<<'$private'");
@@ -360,19 +364,19 @@ case 'update':
if (!exec("ip6tables -S|grep -om1 'WIREGUARD$'")) {
exec("ip6tables -N WIREGUARD;ip6tables -A FORWARD -j WIREGUARD");
}
$cfg = $_POST['#cfg'];
$wg = $_POST['#wg'];
$name = $_POST['#name'];
$vtun = $_POST['#vtun'];
$gone = explode(',',$_POST['#deleted']);
$cfg = _var($_POST,'#cfg');
$wg = _var($_POST,'#wg');
$name = _var($_POST,'#name');
$vtun = _var($_POST,'#vtun');
$gone = explode(',',_var($_POST,'#deleted'));
$conf = ['[Interface]'];
$user = $peers = $var = [];
$tunip = "";
$var['subnets1'] = "AllowedIPs=".createList($_POST['#subnets1']);
$var['subnets2'] = "AllowedIPs=".createList($_POST['#subnets2']);
$var['shared1'] = "AllowedIPs=".createList($_POST['#shared1']);
$var['shared2'] = "AllowedIPs=".createList($_POST['#shared2']);
$var['internet'] = "Endpoint=".createList($_POST['#internet']);
$var['subnets1'] = "AllowedIPs=".createList(_var($_POST,'#subnets1'));
$var['subnets2'] = "AllowedIPs=".createList(_var($_POST,'#subnets2'));
$var['shared1'] = "AllowedIPs=".createList(_var($_POST,'#shared1'));
$var['shared2'] = "AllowedIPs=".createList(_var($_POST,'#shared2'));
$var['internet'] = "Endpoint=".createList(_var($_POST,'#internet'));
$x = 1; $vpn = 0;
parseInput($vtun,$_POST,$x);
addPeer($x);
@@ -382,7 +386,7 @@ case 'update':
file_put_contents($file,implode("\n",$conf)."\n");
file_put_contents($cfg,implode("\n",$user)."\n");
createPeerFiles($vtun);
if ($upstate) wgState($vtun,'up',$_POST['#type']);
if ($upstate) wgState($vtun,'up',_var($_POST,'#type'));
// if $tunip (with dots to slashes) not found in nginx config, then reload nginx to add it
$nginx = parse_ini_file('/var/local/emhttp/nginx.ini');
if (stripos($nginx['NGINX_CERTNAME'],'.myunraid.net')!==false) {
@@ -394,8 +398,8 @@ case 'update':
$save = false;
break;
case 'toggle':
$vtun = $_POST['#vtun'];
switch ($_POST['#wg']) {
$vtun = _var($_POST,'#vtun');
switch (_var($_POST,'#wg')) {
case 'stop':
wgState($vtun,'down');
echo status($vtun) ? 1 : 0;
@@ -406,7 +410,7 @@ case 'toggle':
exec("ip -4 rule add from $network table $index");
exec("ip -4 route add unreachable default table $index");
}
wgState($vtun,'up',$_POST['#type']??'');
wgState($vtun,'up',_var($_POST,'#type'));
echo status($vtun) ? 0 : 1;
break;
}
@@ -416,9 +420,9 @@ case 'ping':
echo exec("ping -qc1 -W4 $addr|grep -Pom1 '1 received'");
break;
case 'public':
$ip = $_POST['#ip'];
$v4 = $_POST['#prot']!='6';
$v6 = $_POST['#prot']!='';
$ip = _var($_POST,'#ip');
$v4 = _var($_POST,'#prot')!='6';
$v6 = _var($_POST,'#prot')!='';
$context = stream_context_create(['https'=>['timeout'=>12]]);
$int_ipv4 = $v4 ? (preg_match("/^$validIP4$/",$ip) ? $ip : (@dns_get_record($ip,DNS_A)[0]['ip'] ?: '')) : '';
$ext_ipv4 = $v4 ? (@file_get_contents('https://wanip4.unraid.net',false,$context) ?: '') : '';
@@ -428,7 +432,7 @@ case 'public':
break;
case 'addtunnel':
$vtun = vtun();
$name = $_POST['#name'];
$name = _var($_POST,'#name');
touch("$etc/$vtun.conf");
wgState($vtun,'down');
delete_file("$etc/$vtun.cfg");
@@ -436,8 +440,8 @@ case 'addtunnel':
autostart($vtun,'off');
break;
case 'deltunnel':
$vtun = $_POST['#vtun'];
$name = $_POST['#name'];
$vtun = _var($_POST,'#vtun');
$name = _var($_POST,'#name');
$error = delDocker($vtun);
if (!$error) {
wgState($vtun,'down');
@@ -454,9 +458,9 @@ case 'deltunnel':
echo $error ? 1 : 0;
break;
case 'import':
$name = $_POST['#name'];
$name = _var($_POST,'#name');
$user = $peers = $var = $import = $sort = [];
$entries = array_filter(array_map('trim',preg_split('/\[(Interface|Peer)\]/',$_POST['#data'])));
$entries = array_filter(array_map('trim',preg_split('/\[(Interface|Peer)\]/',_var($_POST,'#data'))));
foreach($entries as $key => $entry) {
$i = $key-1;
foreach (explode("\n",$entry) as $row) {
@@ -469,12 +473,12 @@ case 'import':
}
}
}
if ($import['PrivateKey:0'] && !$import['PublicKey:0']) $import['PublicKey:0'] = exec("wg pubkey <<<'{$import['PrivateKey:0']}'");
if (_var($import,'PrivateKey:0') && !_var($import,'PublicKey:0')) $import['PublicKey:0'] = exec("wg pubkey <<<'"._var($import,'PrivateKey:0')."'");
// delete ListenPort and let WG generate a random local port
unset($import['ListenPort:0']);
$import['UPNP:0'] = 'no';
$import['NAT:0'] = 'no';
[$subnet,$mask] = my_explode('/',$import['Address:0']);
[$subnet,$mask] = my_explode('/',_var($import,'Address:0'));
if (ipv4($subnet)) {
$mask = ($mask > 0 && $mask < 32) ? $mask : 24;
$import['Network:0'] = long2ip(ip2long($subnet) & (0x100000000-2**(32-$mask))).'/'.$mask;
@@ -488,18 +492,18 @@ case 'import':
}
$import['Endpoint:0'] = '';
for ($n = 1; $n <= $i; $n++) {
$vpn = array_map('trim',explode(',',$import["AllowedIPs:$n"]));
$vpn = (in_array($default,$vpn) || in_array($default6,$vpn)) ? 8 : 0;
$vpn = array_map('trim',explode(',',_var($import,"AllowedIPs:$n")));
$vpn = (in_array($default4,$vpn) || in_array($default6,$vpn)) ? 8 : 0;
if ($vpn==8) $import["Address:$n"] = '';
$import["TYPE:$n"] = $vpn;
ipfilter($import["AllowedIPs:$n"]);
if ($import["TYPE:$n"]==0) $var['subnets1'] = "AllowedIPs=".$import["AllowedIPs:$n"];
ipfilter(_var($import,"AllowedIPs:$n"));
if (_var($import,"TYPE:$n")==0) $var['subnets1'] = "AllowedIPs="._var($import,"AllowedIPs:$n");
}
foreach ($import as $key => $val) $sort[] = explode(':',$key)[1];
array_multisort($sort,$import);
$x = 1;
$conf = ['[Interface]'];
$var['default'] = $import['PROT:0']=='' ? "AllowedIPs=$default" : "AllowedIPs=$default6";
$var['default'] = _var($import,'PROT:0')=='' ? "AllowedIPs=$default4" : "AllowedIPs=$default6";
$var['internet'] = "Endpoint=unknown";
$vtun = vtun();
parseInput($vtun,$import,$x);
@@ -512,13 +516,13 @@ case 'import':
echo $vtun;
break;
case 'autostart':
autostart($_POST['#vtun'],$_POST['#start']);
autostart(_var($_POST,'#vtun'),_var($_POST,'#start'));
break;
case 'upnp':
$upnp = '/var/tmp/upnp';
if (is_executable('/usr/bin/upnpc')) {
$gw = $_POST['#gw'].':';
$link = $_POST['#link'];
$gw = _var($_POST,'#gw').':';
$link = _var($_POST,'#link');
$xml = @file_get_contents($upnp) ?: '';
if ($xml) {
exec("timeout $t1 stdbuf -o0 upnpc -u $xml -m $link -l 2>&1|grep -qm1 'refused'",$output,$code);
@@ -534,11 +538,11 @@ case 'upnp':
break;
case 'upnpc':
if (!is_executable('/usr/bin/upnpc')) break;
$xml = $_POST['#xml'];
$vtun = $_POST['#vtun'];
$link = $_POST['#link'];
$ip = $_POST['#ip'];
if ($_POST['#wg']=='active') {
$xml = _var($_POST,'#xml');
$vtun = _var($_POST,'#vtun');
$link = _var($_POST,'#link');
$ip = _var($_POST,'#ip');
if (_var($_POST,'#wg')=='active') {
exec("timeout $t1 stdbuf -o0 upnpc -u $xml -m $link -l 2>/dev/null|grep -Po \"^(ExternalIPAddress = \K.+|.+\KUDP.+>$ip:[0-9]+ 'WireGuard-$vtun')\"",$upnp);
[$addr,$upnp] = array_pad($upnp,2,'');
[$type,$rule] = my_explode(' ',$upnp);
+112 -111
View File
@@ -24,7 +24,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'main';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
// remember current language
@@ -38,43 +38,43 @@ function model($id) {
}
function device_info(&$disk,$online) {
global $pools, $var, $crypto;
if (!$online || ($disk['fsStatus']??'')!='Mounted' || (in_array($disk['type'],['Parity','Cache']) && !in_array($disk['name'],$pools))) {
if (!$online || _var($disk,'fsStatus')!='Mounted' || (in_array(_var($disk,'type'),['Parity','Cache']) && !in_array(_var($disk,'name'),$pools))) {
$view = "<a class='view'></a>";
} else {
$dir = $disk['name']=='flash' ? "/boot" : "/mnt/{$disk['name']}";
$dir = _var($disk,'name')=='flash' ? "/boot" : "/mnt/"._var($disk,'name');
$view = "<a class='view' href=\"/Main/Browse?dir=".htmlspecialchars($dir)."\"><i class=\"icon-u-tab\" title=\""._('Browse')." $dir\"></i></a>";
}
$name = $disk['name'];
$name = _var($disk,'name');
$fancyname = compress(_(my_disk($name),3),16,5);
$type = $disk['type']=='Flash' ? $disk['type'] : 'Device';
$action = strpos($disk['color'],'blink')===false ? 'down' : 'up';
switch ($disk['color']) {
$type = _var($disk,'type')=='Flash' ? $disk['type'] : 'Device';
$action = strpos(_var($disk,'color'),'blink')===false ? 'down' : 'up';
switch (_var($disk,'color')) {
case 'green-on': $orb = 'circle'; $color = 'green'; $help = _('Normal operation, device is active'); break;
case 'green-blink': $orb = 'circle'; $color = 'grey'; $help = _('Device is in standby mode (spun-down)'); break;
case 'blue-on': $orb = 'square'; $color = 'blue'; $help = _('New device'); break;
case 'blue-blink': $orb = 'square'; $color = 'grey'; $help = _('New device, in standby mode (spun-down)'); break;
case 'yellow-on': $orb = 'warning'; $color = 'yellow'; $help = $disk['type']=='Parity' ? _('Parity is invalid') : _('Device contents emulated'); break;
case 'yellow-blink': $orb = 'warning'; $color = 'grey'; $help = $disk['type']=='Parity' ? _('Parity is invalid, in standby mode (spun-down)') : _('Device contents emulated, in standby mode (spun-down)'); break;
case 'yellow-on': $orb = 'warning'; $color = 'yellow'; $help = _var($disk,'type')=='Parity' ? _('Parity is invalid') : _('Device contents emulated'); break;
case 'yellow-blink': $orb = 'warning'; $color = 'grey'; $help = _var($disk,'type')=='Parity' ? _('Parity is invalid, in standby mode (spun-down)') : _('Device contents emulated, in standby mode (spun-down)'); break;
case 'red-on':
case 'red-blink': $orb = 'times'; $color = 'red'; $help = $disk['type']=='Parity' ? _('Parity device is disabled') : _('Device is disabled, contents emulated'); break;
case 'red-off': $orb = 'times'; $color = 'red'; $help = $disk['type']=='Parity' ? _('Parity device is missing') : _('Device is missing (disabled), contents emulated'); break;
case 'red-blink': $orb = 'times'; $color = 'red'; $help = _var($disk,'type')=='Parity' ? _('Parity device is disabled') : _('Device is disabled, contents emulated'); break;
case 'red-off': $orb = 'times'; $color = 'red'; $help = _var($disk,'type')=='Parity' ? _('Parity device is missing') : _('Device is missing (disabled), contents emulated'); break;
case 'grey-off': $orb = 'square'; $color = 'grey'; $help = _('Device not present'); break;
}
$ctrl = '';
$disk_status = $disk['status'] ?? '';
if ($var['fsState']=='Started' && $type!='Flash' && strpos($disk_status,'_NP')===false) {
$disk_status = _var($disk,'status');
if (_var($var,'fsState')=='Started' && $type!='Flash' && strpos($disk_status,'_NP')===false) {
$ctrl = " style='cursor:pointer' onclick=\"toggle_state('$type','$name','$action')\"";
$help .= "<br>"._("Click to spin $action device");
}
$status = "<a class='info'><i ".($ctrl?"id='dev-$name' ":"")."class='fa fa-$orb orb $color-orb'$ctrl></i><span>$help</span></a>";
$link = ($disk['type']=='Parity' && strpos($disk_status,'_NP')===false) ||
($disk['type']=='Data' && $disk_status!='DISK_NP') ||
($disk['type']=='Cache' && $disk_status!='DISK_NP') ||
($disk['name']=='flash') || in_array($disk['name'],$pools) ||
$disk['type']=='New' ? "<a href=\"".htmlspecialchars("/Main/Settings/$type?name=$name")."\">$fancyname</a>" : $fancyname;
if ($crypto) switch ($disk['luksState']??0) {
$link = (_var($disk,'type')=='Parity' && strpos($disk_status,'_NP')===false) ||
(_var($disk,'type')=='Data' && $disk_status!='DISK_NP') ||
(_var($disk,'type')=='Cache' && $disk_status!='DISK_NP') ||
(_var($disk,'name')=='flash') || in_array(_var($disk,'name'),$pools) ||
_var($disk,'type')=='New' ? "<a href=\"".htmlspecialchars("/Main/Settings/$type?name=$name")."\">$fancyname</a>" : $fancyname;
if ($crypto) switch (_var($disk,'luksState',0)) {
case 0:
if (!vfs_luks($disk['fsType']??''))
if (!vfs_luks(_var($disk,'fsType')))
$luks = "<i class='nolock fa fa-lock'></i>";
else
$luks = "<a class='info'><i class='padlock fa fa-unlock orange-text'></i><span>"._('Device to be encrypted')."</span></a>";
@@ -99,34 +99,34 @@ function device_info(&$disk,$online) {
}
function device_desc(&$disk) {
global $var;
$size = my_scale(isset($disk['size']) ? $disk['size']*1024 : $disk['sectors']*$disk['sector_size'],$unit,-1);
switch ($disk['type']??'') {
$size = my_scale(_var($disk,'size',0)*1024 ?: _var($disk,'sectors',0)*_var($disk,'sector_size',0),$unit,-1);
switch (_var($disk,'type')) {
case 'Flash': $type = 'usb'; break;
case 'Parity': $type = $disk['rotational'] ? 'disk' : 'nvme'; break;
case 'Parity': $type = _var($disk,'rotational') ? 'disk' : 'nvme'; break;
case 'Data':
case 'Cache': $type = $disk['rotational'] ? ($disk['luksState'] ? 'disk-encrypted' : 'disk') : 'nvme'; break;
case 'Cache': $type = _var($disk,'rotational') ? (_var($disk,'luksState') ? 'disk-encrypted' : 'disk') : 'nvme'; break;
default: $type = 'disk'; break;
}
$log = $var['fsState']=='Started'
? "<a class='info hand' onclick=\"openTerminal('disklog','{$disk['device']}','')\"><i class='icon-$type icon'></i><span>"._('Disk Log Information')."</span></a>"
$log = _var($var,'fsState')=='Started'
? "<a class='info hand' onclick=\"openTerminal('disklog','"._var($disk,'device')."','')\"><i class='icon-$type icon'></i><span>"._('Disk Log Information')."</span></a>"
: "<a class='static'><i class='icon-$type icon'></i></a>";
return $log."<span style='font-family:bitstream'>".my_id($disk['id'])."</span> - $size $unit ({$disk['device']})";
return $log."<span style='font-family:bitstream'>".my_id(_var($disk,'id'))."</span> - $size $unit ("._var($disk,'device').")";
}
function assignment(&$disk) {
global $var, $devs;
$echo = [];
$echo[] = "<form method='POST' id=\"{$disk['name']}Form\" action='/update.htm' target='progressFrame'>";
$echo[] = "<form method='POST' id=\""._var($disk,'name')."Form\" action='/update.htm' target='progressFrame'>";
$echo[] = "<input type='hidden' name='changeDevice' value='apply'>";
$echo[] = "<input type='hidden' name='csrf_token' value='{$var['csrf_token']}'>";
$echo[] = "<select class='slot' name='slotId.{$disk['idx']}' onChange='\$(\"#{$disk['name']}Form\").submit()'>";
$empty = $disk['idSb']!='' ? _('no device') : _('unassigned');
if ($disk['id']!='') {
$echo[] = "<input type='hidden' name='csrf_token' value='"._var($var,'csrf_token')."'>";
$echo[] = "<select class='slot' name='slotId."._var($disk,'idx')."' onChange='\$(\"#"._var($disk,'name')."Form\").submit()'>";
$empty = _var($disk,'idSb')!='' ? _('no device') : _('unassigned');
if (_var($disk,'id')) {
$echo[] = "<option value=\"{$disk['id']}\" selected>".device_desc($disk)."</option>";
$echo[] = "<option value=''>$empty</option>";
} else {
$echo[] = "<option value='' selected>$empty</option>";
}
foreach ($devs as $dev) $echo[] = "<option value=\"{$dev['id']}\">".device_desc($dev)."</option>";
foreach ($devs as $dev) $echo[] = "<option value=\""._var($dev,'id')."\">".device_desc($dev)."</option>";
$echo[] = "</select></form>";
return implode($echo);
}
@@ -140,24 +140,24 @@ function fs_info(&$disk) {
global $display, $pools;
$echo = [];
if (empty($disk['fsStatus']) || $disk['fsStatus']=='-') {
return ($disk['type']=='Cache' && !in_array($disk['name'],$pools)) ? "<td colspan='4'>"._('Device is part of a pool')."</td>" : "<td colspan='5'></td>";
} elseif ($disk['fsStatus']=='Mounted') {
$echo[] = "<td>".vfs_type($disk['fsType']??'')."</td>";
$echo[] = "<td>".my_scale(($disk['fsSize']??0)*1024,$unit,-1)." $unit</td>";
return (_var($disk,'type')=='Cache' && !in_array(_var($disk,'name'),$pools)) ? "<td colspan='4'>"._('Device is part of a pool')."</td>" : "<td colspan='5'></td>";
} elseif (_var($disk,'fsStatus')=='Mounted') {
$echo[] = "<td>".vfs_type(_var($disk,'fsType'))."</td>";
$echo[] = "<td>".my_scale(_var($disk,'fsSize',0)*1024,$unit,-1)." $unit</td>";
if ($display['text']%10==0) {
$echo[] = "<td>".my_scale($disk['fsUsed']*1024,$unit)." $unit</td>";
$echo[] = "<td>".my_scale(_var($disk,'fsUsed',0)*1024,$unit)." $unit</td>";
} else {
$used = isset($disk['fsSize']) && $disk['fsSize']>0 ? 100-round(100*$disk['fsFree']/$disk['fsSize']) : 0;
$echo[] = "<td><div class='usage-disk'><span style='width:$used%' class='".usage_color($disk,$used,false)."'></span><span>".my_scale($disk['fsUsed']*1024,$unit)." $unit</span></div></td>";
$used = _var($disk,'fsSize',0)>0 ? 100-round(100*_var($disk,'fsFree',0)/$disk['fsSize']) : 0;
$echo[] = "<td><div class='usage-disk'><span style='width:$used%' class='".usage_color($disk,$used,false)."'></span><span>".my_scale(_var($disk,'fsUsed',0)*1024,$unit)." $unit</span></div></td>";
}
if ($display['text']<10 ? $display['text']%10==0 : $display['text']%10!=0) {
$echo[] = "<td>".my_scale($disk['fsFree']*1024,$unit)." $unit</td>";
if (_var($display,'text',0)<10 ? _var($display,'text',0)%10==0 : _var($display,'text',0)%10!=0) {
$echo[] = "<td>".my_scale(_var($disk,'fsFree',0)*1024,$unit)." $unit</td>";
} else {
$free = isset($disk['fsSize']) && $disk['fsSize']>0 ? round(100*$disk['fsFree']/$disk['fsSize']) : 0;
$echo[] = "<td><div class='usage-disk'><span style='width:$free%' class='".usage_color($disk,$free,true)."'></span><span>".my_scale($disk['fsFree']*1024,$unit)." $unit</span></div></td>";
$free = _var($disk,'fsSize',0)>0 ? round(100*_var($disk,'fsFree',0)/$disk['fsSize']) : 0;
$echo[] = "<td><div class='usage-disk'><span style='width:$free%' class='".usage_color($disk,$free,true)."'></span><span>".my_scale(_var($disk,'fsFree',0)*1024,$unit)." $unit</span></div></td>";
}
} else {
$echo[] = "<td>".vfs_type($disk['fsType']??'')."</td><td colspan='3' style='text-align:center'>"._($disk['fsStatus'])."</td>";
$echo[] = "<td>".vfs_type(_var($disk,'fsType'))."</td><td colspan='3' style='text-align:center'>"._(_var($disk,'fsStatus'))."</td>";
}
return implode($echo);
}
@@ -167,20 +167,20 @@ function my_diskio($data) {
function array_offline(&$disk, $pool='') {
global $var, $disks;
$echo = []; $warning = '';
if (strpos($var['mdState'],'ERROR:')===false) {
if (strpos(_var($var,'mdState'),'ERROR:')===false) {
$text = "<span class='red-text'><em>"._('All existing data on this device will be OVERWRITTEN when array is Started')."</em></span>";
if ($disk['type']=='Cache') {
if (!empty($disks[$pool]['uuid']) && $disk['status']=='DISK_NEW') $warning = $text;
if (_var($disk,'type')=='Cache') {
if (_var($disks[$pool],'uuid') && _var($disk,'status')=='DISK_NEW') $warning = $text;
} else {
if ($var['mdState']=='NEW_ARRAY') {
if ($disk['type']=='Parity') $warning = $text;
} elseif ($var['mdNumInvalid']<=1) {
if (in_array($disk['status'],['DISK_INVALID','DISK_DSBL_NEW','DISK_WRONG','DISK_NEW'])) $warning = $text;
if (_var($var,'mdState')=='NEW_ARRAY') {
if (_var($disk,'type')=='Parity') $warning = $text;
} elseif (_var($var,'mdNumInvalid',0)<=1) {
if (in_array(_var($disk,'status'),['DISK_INVALID','DISK_DSBL_NEW','DISK_WRONG','DISK_NEW'])) $warning = $text;
}
}
}
$echo[] = "<tr>";
switch ($disk['status']) {
switch (_var($disk,'status')) {
case 'DISK_NP':
case 'DISK_NP_DSBL':
$echo[] = "<td>".device_info($disk,false)."</td>";
@@ -189,7 +189,7 @@ function array_offline(&$disk, $pool='') {
break;
case 'DISK_NP_MISSING':
$echo[] = "<td>".device_info($disk,false)."<br><span class='diskinfo'><em>"._('Missing')."</em></span></td>";
$echo[] = "<td>".assignment($disk)."<em>{$disk['idSb']} - ".my_scale($disk['sizeSb']*1024,$unit)." $unit</em></td>";
$echo[] = "<td>".assignment($disk)."<em>{$disk['idSb']} - ".my_scale(_var($disk,'sizeSb',0)*1024,$unit)." $unit</em></td>";
$echo[] = "<td colspan='8'></td>";
break;
case 'DISK_OK':
@@ -199,24 +199,24 @@ function array_offline(&$disk, $pool='') {
case 'DISK_NEW':
$echo[] = "<td>".device_info($disk,false)."</td>";
$echo[] = "<td>".assignment($disk)."</td>";
$echo[] = "<td>".my_temp($disk['temp'])."</td>";
$echo[] = "<td>".my_temp(_var($disk,'temp','*'))."</td>";
if ($warning) {
$echo[] = "<td colspan='7'>$warning</td>";
} else {
$echo[] = "<td colspan='3'></td>";
$echo[] = "<td>".vfs_type($disk['fsType']??'')."</td>";
$echo[] = "<td>".vfs_type(_var($disk,'fsType'))."</td>";
$echo[] = "<td colspan='3'></td>";
}
break;
case 'DISK_WRONG':
$echo[] = "<td>".device_info($disk,false)."<br><span class='diskinfo'><em>"._('Wrong')."</em></span></td>";
$echo[] = "<td>".assignment($disk)."<em>{$disk['idSb']} - ".my_scale($disk['sizeSb']*1024,$unit)." $unit</em></td>";
$echo[] = "<td>".my_temp($disk['temp'])."</td>";
$echo[] = "<td>".assignment($disk)."<em>{$disk['idSb']} - ".my_scale(_var($disk,'sizeSb',0)*1024,$unit)." $unit</em></td>";
$echo[] = "<td>".my_temp(_var($disk,'temp','*'))."</td>";
if ($warning) {
$echo[] = "<td colspan='7'>$warning</td>";
} else {
$echo[] = "<td colspan='3'></td>";
$echo[] = "<td>".vfs_type($disk['fsType']??'')."</td>";
$echo[] = "<td>".vfs_type(_var($disk,'fsType'))."</td>";
$echo[] = "<td colspan='3'></td>";
}
break;
@@ -227,28 +227,29 @@ function array_offline(&$disk, $pool='') {
function array_online(&$disk, $fstype='') {
global $pools, $sum, $diskio;
$echo = [];
if ($disk['device']!='') {
$data = [0,0];
if (_var($disk,'device')) {
$dev = $disk['device'];
$data = explode(' ',$diskio[$dev] ?? '0 0');
$sum['ioReads'] += $data[0];
$sum['ioWrites'] += $data[1];
}
if (is_numeric($disk['temp'])) {
if (is_numeric(_var($disk,'temp','*'))) {
$sum['count']++;
$sum['temp'] += $disk['temp'];
}
$sum['numReads'] += $disk['numReads'];
$sum['numWrites'] += $disk['numWrites'];
$sum['numErrors'] += $disk['numErrors'];
$sum['numReads'] += _var($disk,'numReads',0);
$sum['numWrites'] += _var($disk,'numWrites',0);
$sum['numErrors'] += _var($disk,'numErrors',0);
if (isset($disk['fsFree'])) {
$sum['fsSize'] += $disk['fsSize'];
$sum['fsUsed'] += $disk['fsUsed'];
$sum['fsFree'] += $disk['fsFree'];
$sum['fsSize'] += _var($disk,'fsSize',0);
$sum['fsUsed'] += _var($disk,'fsUsed',0);
$sum['fsFree'] += _var($disk,'fsFree',0);
}
$echo[] = "<tr>";
switch ($disk['status']) {
switch (_var($disk,'status')) {
case 'DISK_NP':
if (in_array($disk['name'],$pools) || $fstype=='zfs') {
if (in_array(_var($disk,'name'),$pools) || $fstype=='zfs') {
$echo[] = "<td>".device_info($disk,true)."</td>";
$echo[] = "<td><a class='static'><i class='icon-disk icon'></i><span></span></a><em>".($fstype=='zfs' ? _('Not present') : _('Not installed'))."</em></td>";
$echo[] = "<td colspan='4'></td>";
@@ -265,10 +266,10 @@ function array_online(&$disk, $fstype='') {
default:
$echo[] = "<td>".device_info($disk,true)."</td>";
$echo[] = "<td>".device_desc($disk)."</td>";
$echo[] = "<td>".my_temp($disk['temp'])."</td>";
$echo[] = "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number($disk['numReads'])."</span></td>";
$echo[] = "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number($disk['numWrites'])."</span></td>";
$echo[] = "<td>".my_number($disk['numErrors'])."</td>";
$echo[] = "<td>".my_temp(_var($disk,'temp','*'))."</td>";
$echo[] = "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number(_var($disk,'numReads',0))."</span></td>";
$echo[] = "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number(_var($disk,'numWrites',0))."</span></td>";
$echo[] = "<td>".my_number(_var($disk,'numErrors',0))."</td>";
$echo[] = fs_info($disk);
break;
}
@@ -290,7 +291,7 @@ function show_totals($text,$array,$name) {
$echo[] = "<td><span class='diskio'>".my_diskio($sum['ioWrites'])."</span><span class='number'>".my_number($sum['numWrites'])."</span></td>";
$echo[] = "<td>".my_number($sum['numErrors'])."</td>";
$echo[] = "<td></td>";
if ($array && ($var['startMode']=='Normal')) {
if ($array && _var($var,'startMode')=='Normal') {
$echo[] = "<td>".my_scale($sum['fsSize']*1024,$unit,-1)." $unit</td>";
if ($display['text']%10==0) {
$echo[] = "<td>".my_scale($sum['fsUsed']*1024,$unit)." $unit</td>";
@@ -312,15 +313,15 @@ function show_totals($text,$array,$name) {
}
function array_slots() {
global $var;
$min = max($var['sbNumDisks'], 3);
$max = $var['MAX_ARRAYSZ'];
$min = max(_var($var,'sbNumDisks',0),3);
$max = _var($var,'MAX_ARRAYSZ');
$echo = [];
$echo[] = "<form method='POST' action='/update.htm' target='progressFrame'>";
$echo[] = "<input type='hidden' name='csrf_token' value='{$var['csrf_token']}'>";
$echo[] = "<input type='hidden' name='csrf_token' value='"._var($var,'csrf_token')."'>";
$echo[] = "<input type='hidden' name='changeSlots' value='apply'>";
$echo[] = "<select class='narrow' name='SYS_ARRAY_SLOTS' onChange='this.form.submit()'>";
for ($n=$min; $n<=$max; $n++) {
$selected = ($n==$var['SYS_ARRAY_SLOTS']) ? ' selected' : '';
$selected = $n==_var($var,'SYS_ARRAY_SLOTS') ? ' selected' : '';
$echo[] = "<option value='$n'{$selected}>$n</option>";
}
$echo[] = "</select></form>";
@@ -329,10 +330,10 @@ function array_slots() {
function cache_slots($off,$pool,$min,$slots) {
global $var;
$off = $off && $min ? ' disabled' : '';
$max = $var['MAX_CACHESZ'];
$max = _var($var,'MAX_CACHESZ');
$echo = [];
$echo[] = "<form method='POST' action='/update.htm' target='progressFrame'>";
$echo[] = "<input type='hidden' name='csrf_token' value='{$var['csrf_token']}'>";
$echo[] = "<input type='hidden' name='csrf_token' value='"._var($var,'csrf_token')."'>";
$echo[] = "<input type='hidden' name='changeSlots' value='apply'>";
$echo[] = "<input type='hidden' name='poolName' value='$pool'>";
$echo[] = "<select class='narrow' name='poolSlots' onChange='this.form.submit()'{$off}>";
@@ -363,36 +364,36 @@ function update_translation($locale) {
}
}
while (true) {
$var = (array)parse_ini_file("$varroot/var.ini");
$devs = (array)parse_ini_file("$varroot/devs.ini",true);
$disks = (array)parse_ini_file("$varroot/disks.ini",true);
$sec = (array)parse_ini_file("$varroot/sec.ini",true);
$diskio = @(array)parse_ini_file("$varroot/diskload.ini");
$var = @parse_ini_file("$varroot/var.ini") ?: [];
$devs = @parse_ini_file("$varroot/devs.ini",true) ?: [];
$disks = @parse_ini_file("$varroot/disks.ini",true) ?: [];
$sec = @parse_ini_file("$varroot/sec.ini",true) ?: [];
$diskio = @parse_ini_file("$varroot/diskload.ini") ?: [];
$crypto = false;
$pools = pools_filter($disks);
$echo = [];
// check for language changes
extract(parse_plugin_cfg('dynamix',true));
if ($display['locale'] != $locale_init) {
$locale_init = $display['locale'];
if (_var($display,'locale') != $locale_init) {
$locale_init = _var($display,'locale');
update_translation($locale_init);
}
// sort unassigned devices on disk identification
if (count($devs)>1) array_multisort(array_column($devs,'sectors'),SORT_DESC,array_map('model',array_column($devs,'id')),SORT_NATURAL|SORT_FLAG_CASE,array_column($devs,'device'),$devs);
// merge device custom settings
if (file_exists($smartALL)) $var = array_merge($var, parse_ini_file($smartALL));
if (file_exists($smartALL)) $var = array_merge($var,parse_ini_file($smartALL));
if (file_exists($smartONE)) {
$smarts = parse_ini_file($smartONE,true);
foreach ($smarts as $id => $smart) {
if (isset($disks)) {
foreach ($disks as $key => $disk) {
if ($disk['id'] == $id) $disks[$key] = array_merge($disks[$key], $smart);
if (_var($disk,'id')==$id) $disks[$key] = array_merge($disks[$key], $smart);
}
}
if (isset($devs)) {
foreach ($devs as $key => $disk) {
if ($disk['id'] == $id) $devs[$key] = array_merge($devs[$key], $smart);
if (_var($disk,'id')==$id) $devs[$key] = array_merge($devs[$key], $smart);
}
}
}
@@ -402,8 +403,8 @@ while (true) {
$echo[0] = "array_devices\n";
$parity = parity_filter($disks);
$data = data_filter($disks);
foreach ($data as $disk) $crypto |= $disk['luksState']!=0 || vfs_luks($disk['fsType']??'');
if ($var['fsState']=='Stopped') {
foreach ($data as $disk) $crypto |= _var($disk,'luksState',0)!=0 || vfs_luks(_var($disk,'fsType'));
if (_var($var,'fsState')=='Stopped') {
foreach ($parity as $disk) $echo[0] .= array_offline($disk);
$echo[0] .= "<tr class='tr_last'><td style='height:12px' colspan='10'></td></tr>";
foreach ($data as $disk) $echo[0] .= array_offline($disk);
@@ -411,23 +412,23 @@ while (true) {
} else {
foreach ($parity as $disk) if ($disk['status']!='DISK_NP_DSBL') $echo[0] .= array_online($disk);
foreach ($data as $disk) $echo[0] .= array_online($disk);
if ($display['total'] && $var['mdNumDisks']>1) $echo[0] .= show_totals(sprintf(_('Array of %s devices'),my_word($var['mdNumDisks'])),true,'array*');
if (_var($display,'total') && _var($var,'mdNumDisks',0)>1) $echo[0] .= show_totals(sprintf(_('Array of %s devices'),my_word($var['mdNumDisks'])),true,'array*');
}
$echo[1] = "boot_device\n";
$disk = &$disks['flash'];
$data = explode(' ',$diskio[$disk['device']] ?? '0 0');
$data = explode(' ',$diskio[_var($disk,'device')] ?? '0 0');
$flash = &$sec['flash'];
$share = ($var['shareSMBEnabled']=='yes' && $flash['export']=='e' && $flash['security']=='public')
$share = (_var($var,'shareSMBEnabled')=='yes' && _var($flash,'export')=='e' && _var($flash,'security')=='public')
? "&nbsp;<a class='info'><i class='fa fa-warning fa-fw orange-text'></i><span>"._('Flash device is set as public share')."<br>"._('Please change share SMB security')."<br>"._('Click on **FLASH** above this message')."</span></a>"
: "";
$echo[1] .= "<tr>";
$echo[1] .= "<td>".device_info($disk,true).$share."</td>";
$echo[1] .= "<td>".device_desc($disk)."</td>";
$echo[1] .= "<td>*</td>";
$echo[1] .= "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number($disk['numReads'])."</span></td>";
$echo[1] .= "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number($disk['numWrites'])."</span></td>";
$echo[1] .= "<td>".my_number($disk['numErrors'])."</td>";
$echo[1] .= "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number(_var($disk,'numReads',0))."</span></td>";
$echo[1] .= "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number(_var($disk,'numWrites',0))."</span></td>";
$echo[1] .= "<td>".my_number(_var($disk,'numErrors',0))."</td>";
$echo[1] .= fs_info($disk);
$echo[1] .= "</tr>";
@@ -435,25 +436,25 @@ while (true) {
$cache = cache_filter($disks); $n = 2;
foreach ($pools as $pool) {
$echo[$n] = "pool_device".($n-2)."\n";
foreach ($cache as $disk) if (prefix($disk['name'])==$pool) $crypto |= $disk['luksState']!=0 || vfs_luks($disk['fsType']??'');
if ($var['fsState']=='Stopped') {
foreach ($cache as $disk) if (prefix(_var($disk,'name'))==$pool) $crypto |= _var($disk,'luksState',0)!=0 || vfs_luks(_var($disk,'fsType'));
if (_var($var,'fsState')=='Stopped') {
$log = file_exists($pool_log) ? parse_ini_file($pool_log) : [];
$off = false;
foreach ($cache as $disk) if (prefix($disk['name'])==$pool) {
foreach ($cache as $disk) if (prefix(_var($disk,'name'))==$pool) {
$echo[$n] .= array_offline($disk,$pool);
if (isset($log[$disk['name']])) $off |= ($log[$disk['name']]!=$disk['id']); else $log[$disk['name']] = $disk['id'];
if (isset($log[_var($disk,'name')])) $off |= ($log[$disk['name']]!=_var($disk,'id')); else $log[_var($disk,'name')] = _var($disk,'id');
}
$data = []; foreach ($log as $key => $value) $data[] = "$key=\"$value\"";
file_put_contents($pool_log,implode("\n",$data));
$echo[$n] .= "<tr class='tr_last'><td>"._('Slots').":</td><td colspan='8'>".cache_slots($off,$pool,$cache[$pool]['devicesSb'],$cache[$pool]['slots'])."</td><td></td></tr>";
$echo[$n] .= "<tr class='tr_last'><td>"._('Slots').":</td><td colspan='8'>".cache_slots($off,$pool,_var($cache[$pool],'devicesSb'),_var($cache[$pool],'slots',0))."</td><td></td></tr>";
} else {
foreach ($cache as $disk) if (prefix($disk['name'])==$pool) {
if (isset($disk['fsType'])) $fstype = vfs_type($disk['fsType']);
if (substr($cache[$pool]['fsStatus'],0,11)=='Unmountable' && empty($disk['fsStatus'])) $disk['fsStatus'] = $cache[$pool]['fsStatus'];
if (substr(_var($cache[$pool],'fsStatus'),0,11)=='Unmountable' && empty($disk['fsStatus'])) $disk['fsStatus'] = _var($cache[$pool],'fsStatus');
$echo[$n] .= array_online($disk,$fstype);
}
delete_file($pool_log);
if ($display['total'] && $cache[$pool]['devices']>1) $echo[$n] .= show_totals(sprintf(_('Pool of %s devices'),my_word($cache[$pool]['devices'])),false,"$pool*");
if (_var($display,'total') && _var($cache[$pool],'devices',0)>1) $echo[$n] .= show_totals(sprintf(_('Pool of %s devices'),my_word($cache[$pool]['devices'])),false,"$pool*");
$sum = initSum();
}
$n++;
@@ -461,7 +462,7 @@ while (true) {
$echo[$n] = "open_devices\n";
foreach ($devs as $disk) {
$dev = $disk['device'];
$dev = _var($disk,'device');
$data = explode(' ',$diskio[$dev] ?? '0 0 0 0');
$disk['type'] = 'New';
$disk['color'] = $disk['spundown']=="0" ? 'blue-on' : 'blue-blink';
@@ -469,9 +470,9 @@ while (true) {
$echo[$n] .= "<td>".device_info($disk,true)."</td>";
$echo[$n] .= "<td>".device_desc($disk)."</td>";
$echo[$n] .= "<td>".my_temp($disk['temp'])."</td>";
$echo[$n] .= "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number($disk['numReads']??0)."</span></td>";
$echo[$n] .= "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number($disk['numWrites']??0)."</span></td>";
$echo[$n] .= "<td>".my_number($disk['numErrors']??0)."</td>";
$echo[$n] .= "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number(_var($disk,'numReads',0))."</span></td>";
$echo[$n] .= "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number(_var($disk,'numWrites',0))."</span></td>";
$echo[$n] .= "<td>".my_number(_var($disk,'numErrors',0))."</td>";
if (file_exists("/tmp/preclear_stat_$dev")) {
$text = exec("cut -d'|' -f3 /tmp/preclear_stat_$dev|sed 's:\^n:\<br\>:g'");
if (strpos($text,'Total time')===false) $text = _('Preclear in progress').'... '.$text;
@@ -482,10 +483,10 @@ while (true) {
}
$n++;
$echo[$n] = $var['fsState']=='Stopped' ? 1 : 0;
$echo[$n] = _var($var,'fsState')=='Stopped' ? 1 : 0;
publish('devices', implode("\0",$echo));
publish('arraymonitor', $var['fsState']=='Started' ? 1 : 0);
publish('arraymonitor', _var($var,'fsState')=='Started' ? 1 : 0);
sleep(1);
}
?>
+18 -17
View File
@@ -22,13 +22,13 @@ $timer = time();
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/webGui/include/publish.php";
extract(parse_plugin_cfg('dynamix',true));
$dot = $display['number'][0];
// add translations
$_SERVER['REQUEST_URI'] = 'main';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$dot = _var($display,'number','.,')[0];
// remember current language
$locale_init = $locale;
@@ -69,48 +69,49 @@ function create_file($file,...$data) {
}
while (true) {
$var = (array)parse_ini_file("$varroot/var.ini");
$var = @parse_ini_file("$varroot/var.ini") ?: [];
// check for language changes
extract(parse_plugin_cfg('dynamix',true));
if ($display['locale'] != $locale_init) {
$locale_init = $display['locale'];
if (_var($display,'locale') != $locale_init) {
$locale_init = _var($display,'locale');
update_translation($locale_init);
}
$synced = create_sync($stamps);
$sbSynced = array_shift($synced) ?: $var['sbSynced'];
$sbSynced = array_shift($synced) ?: _var($var,'sbSynced',0);
$data = [];
$spot = $var['mdResyncPos'];
$spot = _var($var,'mdResyncPos',0);
if ($spot>0) {
[$size,$delta,$bytes] = [$var['mdResyncSize'],$var['mdResyncDt'],$var['mdResyncDb']];
create_file($resync,$var['mdResyncAction'],$size);
[$size,$delta,$bytes] = [_var($var,'mdResyncSize',0),_var($var,'mdResyncDt',0),_var($var,'mdResyncDb',0)];
create_file($resync,_var($var,'mdResyncAction'),$size);
$data[] = my_scale($size*1024,$unit,-1)." $unit";
$data[] = _(my_clock(floor((time()-$sbSynced)/60)),2).($delta ? '' : ' ('._('paused').')');
$data[] = my_scale($spot*1024,$unit)." $unit (".number_format($spot/($size/100+1),1,$dot,'')." %)";
$data[] = $delta ? my_scale($bytes*1024/$delta,$unit, 1)." $unit/sec" : '---';
$data[] = $bytes ? _(my_clock(round(((($delta*(($size-$spot)/($bytes/100+1)))/100)/60),0)),2) : _('Unknown');
$data[] = $var['sbSyncErrs'];
} elseif ($var['sbSynced'] && $var['sbSynced2']) {
} elseif (_var($var,'sbSynced') && _var($var,'sbSynced2')) {
$timestamp = str_replace(['.0','.'],[' ',' '],date('Y.M.d H:i:s',$var['sbSynced2']));
if (new_parity_log($timestamp)) {
$idle = []; while (count($synced)>1) $idle[] = array_pop($synced)-array_pop($synced);
[$action,$size] = file_exists($resync) ? my_explode(',',file_get_contents($resync)) : [$var['mdResyncAction'],$var['mdResyncSize']];
[$action,$size] = file_exists($resync) ? my_explode(',',file_get_contents($resync)) : [_var($var,'mdResyncAction'),_var($var,'mdResyncSize',0)];
$duration = $var['sbSynced2']-$sbSynced-array_sum($idle);
$status = $var['sbSyncExit'];
$status = _var($var,'sbSyncExit');
$speed = $status==0 ? round($size*1024/$duration) : 0;
$error = $var['sbSyncErrs'];
$error = _var($var,'sbSyncErrs',0);
file_put_contents($log,"$timestamp|$duration|$speed|$status|$error|$action|$size\n",FILE_APPEND);
}
delete_file($stamps,$resync);
}
if ($var['fsState']=='Copying') $fsState = $var['fsCopyPrcnt']."% "._('completed');
elseif ($var['fsState']=='Clearing') $fsState = $var['fsClearPrcnt']."% "._('completed');
elseif (substr($var['fsState'],-3)!='ing') $fsState = 'stop';
if (_var($var,'fsState')=='Copying') $fsState = _var($var,'fsCopyPrcnt')."% "._('completed');
elseif ($var['fsState']=='Clearing') $fsState = _var($var,'fsClearPrcnt')."% "._('completed');
elseif (substr(_var($var,'fsState'),-3)!='ing') $fsState = 'stop';
else $fsState = '';
if ($var['fsState']!='Started') $process = -1;
if (_var($var,'fsState')!="Started") $process = -1;
elseif ($spot>0 && $bytes>0) $process = 1;
elseif (file_exists('/var/run/mover.pid')) $process = 2;
elseif (exec('ps -C btrfs -o cmd=|grep -cv show')>0) $process = 3;
elseif (exec("zpool status|grep -c 'scrub in progress'")>0) $process = 4;
else $process = 0;
publish('parity', implode(';',$data));
+5 -4
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -16,10 +16,11 @@ $docroot = '/usr/local/emhttp';
$varroot = '/var/local/emhttp';
require_once "$docroot/webGui/include/publish.php";
require_once "$docroot/webGui/include/Wrappers.php";
while (true) {
$var = (array)parse_ini_file("$varroot/var.ini");
publish('session', $var['csrf_token'], 0);
$var = @parse_ini_file("$varroot/var.ini") ?: [];
publish('session',_var($var,'csrf_token'),0);
sleep(10);
}
?>
+55 -54
View File
@@ -23,7 +23,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'dashboard/main';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
// remember current language
@@ -123,31 +123,31 @@ function my_unit($value,$unit) {
return ($unit=='F' ? round(9/5*$value+32) : $value)." $unit";
}
function active_disks($disk) {
return substr($disk['status'],0,7)!='DISK_NP' && in_array($disk['type'],['Parity','Data']);
return substr(_var($disk,'status'),0,7)!='DISK_NP' && in_array(_var($disk,'type'),['Parity','Data']);
}
function device_name(&$disk) {
switch ($disk['type']) {
switch (_var($disk,'type')) {
case 'Extra' :
case 'Parity': $type = $disk['rotational'] ? 'disk' : 'nvme'; break;
case 'Parity': $type = _var($disk,'rotational') ? 'disk' : 'nvme'; break;
case 'Data' :
case 'Cache' : $type = $disk['rotational'] ? ($disk['luksState'] ? 'disk-encrypted' : 'disk') : 'nvme'; break;
case 'Cache' : $type = _var($disk,'rotational') ? (_var($disk,'luksState') ? 'disk-encrypted' : 'disk') : 'nvme'; break;
}
$name = my_disk($disk['name']);
$name = my_disk(_var($disk,'name'));
[$p1,$p2] = my_explode(' ',$name);
$name = _($p1).($p2?" $p2":"");
return "<i class='icon-$type f14'></i> <a href=\"".htmlspecialchars("/Dashboard/Main/Settings/Device?name={$disk['name']}")."\" title=\"$name settings\">$name</a>";
return "<i class='icon-$type f14'></i> <a href=\"".htmlspecialchars("/Dashboard/Main/Settings/Device?name="._var($disk,'name'))."\" title=\"$name settings\">$name</a>";
}
function device_status(&$disk, &$error, &$warning) {
global $var;
if ($disk['type']!='Extra' && $var['fsState']=='Stopped') {
if (_var($disk,'type')!='Extra' && _var($var,'fsState')=='Stopped') {
$color = 'green'; $text = 'off-line';
} else switch ($disk['color']) {
} else switch (_var($disk,'color')) {
case 'green-on' : $color = 'green'; $text = 'active'; break;
case 'green-blink' : $color = 'grey'; $text = 'standby'; break;
case 'blue-on' : $color = 'blue'; $text = 'unassigned'; break;
case 'blue-blink' : $color = 'grey'; $text = 'unassigned'; break;
case 'yellow-on' : $color = 'yellow'; $text = $disk['type']=='Parity' ? 'invalid' : 'emulated'; $warning++; break;
case 'yellow-blink': $color = 'grey'; $text = $disk['type']=='Parity' ? 'invalid' : 'emulated'; $warning++; break;
case 'yellow-on' : $color = 'yellow'; $text = _var($disk,'type')=='Parity' ? 'invalid' : 'emulated'; $warning++; break;
case 'yellow-blink': $color = 'grey'; $text = _var($disk,'type')=='Parity' ? 'invalid' : 'emulated'; $warning++; break;
case 'red-on' : $color = 'red'; $text = 'disabled'; $error++; break;
case 'red-blink' : $color = 'grey'; $text = 'disabled'; $error++; break;
case 'red-off' : $color = 'red'; $text = 'faulty'; $error++; break;
@@ -157,10 +157,10 @@ function device_status(&$disk, &$error, &$warning) {
}
function device_temp(&$disk, &$red, &$orange) {
global $display;
$spin = strpos($disk['color'],'blink')===false;
$temp = $disk['temp'];
$hot = $disk['hotTemp'] ?? $display['hot'] ?? 0;
$max = $disk['maxTemp'] ?? $display['max'] ?? 0;
$spin = strpos(_var($disk,'color'),'blink')===false;
$temp = _var($disk,'temp','*');
$max = ($disk['maxTemp'] ?? $display['max'] ?? 0) ?: 0;
$hot = ($disk['hotTemp'] ?? $display['hot'] ?? 0) ?: 0;
$top = $display['top'] ?? 120;
$heat = false; $color = 'green';
if (exceed($temp,$max,$top)) {
@@ -168,13 +168,13 @@ function device_temp(&$disk, &$red, &$orange) {
} elseif (exceed($temp,$hot,$top)) {
$heat = 'fire'; $color = 'orange'; $orange++;
}
return ($spin && $temp>0) ? "<span class='$color-text'>".my_unit($temp,$display['unit'])."</span>".($heat ? "<i class='fa fa-$heat $color-text heat'></i>" : "") : "*";
return ($spin && $temp>0) ? "<span class='$color-text'>".my_unit($temp,_var($display,'unit','C'))."</span>".($heat ? "<i class='fa fa-$heat $color-text heat'></i>" : "") : "*";
}
function device_smart(&$disk, &$fail, &$smart) {
global $numbers,$saved;
if (!$disk['device'] || strpos($disk['color'],'blink')) return "-";
if (!_var($disk,'device') || strpos(_var($disk,'color'),'blink')!==false) return "-";
$failed = ['FAILED','NOK'];
$name = $disk['name'];
$name = _var($disk,'name');
$select = get_value($name,'smSelect',0);
$level = get_value($name,'smLevel',1);
$events = explode('|',get_value($disk,'smEvents',$numbers));
@@ -204,14 +204,14 @@ function device_smart(&$disk, &$fail, &$smart) {
function device_usage(&$disk, &$full, &$high) {
global $display;
$text = $display['text'];
$used = ($disk['type']!='Parity' && $disk['type']!='Extra' && isset($disk['fsStatus']) && $disk['fsStatus']=='Mounted') ? (((isset($disk['fsSize']) && $disk['fsSize']>0) ? round((1-$disk['fsFree']/$disk['fsSize'])*100):0).'%') : false;
$used = (_var($disk,'type')!='Parity' && _var($disk,'type')!='Extra' && _var($disk,'fsStatus')=='Mounted') ? (_var($disk,'fsSize',0)>0 ? round((1-_var($disk,'fsFree',0)/$disk['fsSize'])*100) : 0).'%' : false;
if ($used) {
if ($text==2 || $text==21) {
$load = substr($used,0,-1);
$critical = $disk['critical'] ?: $display['critical'];
$warning = $disk['warning'] ?: $display['warning'];
if ($critical > 0 && $load >= $critical) {$class = 'redbar'; $full++;}
elseif ($warning > 0 && $load >= $warning) {$class = 'orangebar'; $high++;}
$critical = ($disk['critical'] ?? $display['critical'] ?? 0) ?: 0;
$warning = ($disk['warning'] ?? $display['warning'] ?? 0) ?: 0;
if ($critical>0 && $load>=$critical) {$class = 'redbar'; $full++;}
elseif ($warning>0 && $load>=$warning) {$class = 'orangebar'; $high++;}
else $class = 'greenbar';
}
else
@@ -224,7 +224,7 @@ function device_usage(&$disk, &$full, &$high) {
function array_group($type,$pool=false) {
global $disks,$error,$warning,$red,$orange,$fail,$smart,$full,$high;
$echo = [];
foreach ($disks as $disk) if ($disk['type']==$type && strpos($disk['status'],'DISK_NP')===false && (!$pool||$pool==prefix($disk['name']))) {
foreach ($disks as $disk) if (_var($disk,'type')==$type && strpos(_var($disk,'status'),'DISK_NP')===false && (!$pool||$pool==prefix(_var($disk,'name')))) {
$echo[] = "<tr class='updated'><td>";
$echo[] = "<span class='w26'>".device_name($disk)."</span>";
$echo[] = "<span class='w18'>".device_status($disk,$error,$warning)."</span>";
@@ -239,9 +239,9 @@ function extra_group() {
global $devs,$error,$warning,$red,$orange,$fail,$smart,$full,$high;
$echo = [];
foreach ($devs as $disk) {
$name = $disk['name'];
$name = _var($disk,'name');
$disk['type'] = "Extra";
$disk['color'] = $disk['spundown']=="0" ? 'blue-on' : 'blue-blink';
$disk['color'] = _var($disk,'spundown')==0 ? 'blue-on' : 'blue-blink';
$echo[] = "<tr class='updated'><td>";
$echo[] = "<span class='w26'>".device_name($disk)."</span>";
$echo[] = "<span class='w18'>".device_status($disk,$error,$warning)."</span>";
@@ -278,19 +278,19 @@ function print_error($error) {
}
while (true) {
$var = (array)parse_ini_file("$varroot/var.ini");
$devs = (array)parse_ini_file("$varroot/devs.ini",true);
$disks = (array)parse_ini_file("$varroot/disks.ini",true);
$saved = @(array)parse_ini_file("$varroot/monitor.ini",true);
$var = @parse_ini_file("$varroot/var.ini") ?: [];
$devs = @parse_ini_file("$varroot/devs.ini",true) ?: [];
$disks = @parse_ini_file("$varroot/disks.ini",true) ?: [];
$saved = @parse_ini_file("$varroot/monitor.ini",true) ?: [];
$echo = [];
$size = $var['mdResyncSize'];
$spot = $var['mdResyncPos'];
$size = _var($var,'mdResyncSize');
$spot = _var($var,'mdResyncPos');
require "$docroot/webGui/include/CustomMerge.php";
require "$docroot/webGui/include/Preselect.php";
// check for language changes
extract(parse_plugin_cfg('dynamix',true));
if ($display['locale'] != $locale_init) {
$locale_init = $display['locale'];
if (_var($display,'locale') != $locale_init) {
$locale_init = _var($display,'locale');
update_translation($locale_init);
}
//array devices
@@ -300,7 +300,8 @@ while (true) {
$echo[0] .= "\0".($error+$warning)."\0".($red+$orange)."\0".($fail+$smart)."\0".($full+$high);
//pool devices
$echo[1] = '';
foreach (pools_filter($disks) as $pool) if ($disks[$pool]['devices']) {
foreach (pools_filter($disks) as $pool) {
if (empty($disks[$pool]['devices'])) continue;
$error = $warning = $red = $orange = $fail = $smart = $full = $high = 0;
$echo[1] .= array_group('Cache',$pool);
$echo[1] .= "\0".($error+$warning)."\0".($red+$orange)."\0".($fail+$smart)."\0".($full+$high)."\r";
@@ -316,12 +317,12 @@ while (true) {
$parity_slots = count($disks);
$parity_disabled = $parity_invalid = 0;
foreach ($disks as $disk) {
if (strpos($disk['status'],"DISK_NP")===0) $parity_disabled++;
elseif (strpos($disk['status'],"DISK_INVALID")===0) $parity_invalid++;
if (strpos(_var($disk,'status'),"DISK_NP")===0) $parity_disabled++;
elseif (strpos(_var($disk,'status'),"DISK_INVALID")===0) $parity_invalid++;
}
if ($spot) {
$number = $display['number'];
$action = preg_split('/\s+/',$var['mdResyncAction']);
$number = _var($display,'number','.,');
$action = preg_split('/\s+/',_var($var,'mdResyncAction'));
switch ($action[0]) {
case "recon": $mode = $action[1]=='P' ? 'Parity-Sync' : 'Data-Rebuild'; break;
case "check": $mode = count($action)>1 ? 'Parity-Check' : 'Read-Check'; break;
@@ -348,23 +349,23 @@ while (true) {
}
// parity schedule
[$delta,$bytes] = [$var['mdResyncDt'],$var['mdResyncDb']];
[$delta,$bytes] = [_var($var,'mdResyncDt',0),_var($var,'mdResyncDb',0)];
$synced = create_sync($stamps);
$sbSynced = array_shift($synced) ?: $var['sbSynced'];
$sbUpdate = $delta ? $sbSynced : $var['sbUpdated'];
$sbSynced = array_shift($synced) ?: _var($var,'sbSynced');
$sbUpdate = $delta ? $sbSynced : _var($var,'sbUpdated');
if ($spot) {
$echo[4] = sprintf(_('Current operation %s on **%s**'),($delta?_('started'):_('paused')),_(my_time($sbUpdate).day_count($sbUpdate),0));
$echo[4].= "<br><i class='fa fa-fw fa-clock-o'></i> "._('Elapsed time').": "._(my_clock(floor((time()-$sbSynced)/60)),2);
$echo[4].= "<br><i class='fa fa-fw fa-flag-checkered'></i> "._('Estimated finish').': '.($bytes ? _(my_clock(round(((($delta*(($size-$spot)/($bytes/100+1)))/100)/60),0)),2) : _('Unknown'));
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error($var['sbSyncErrs']);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error(_var($var,'sbSyncErrs',0));
$echo[4] .= "\0";
} else {
[$date,$duration,$speed,$status,$error,$action,$size] = last_parity_log();
if ($var['sbSyncExit']!=0) {
$echo[4] = sprintf(_('Last check incomplete on **%s**'),_(my_time($var['sbSynced2']).day_count($var['sbSynced2']),0));
$echo[4].= "<br><i class='fa fa-fw fa-dot-circle-o'></i> "._('Error code').": ".my_error($var['sbSyncExit']);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error($var['sbSyncErrs']);
} elseif ($var['sbSynced']==0) {
if (_var($var,'sbSyncExit',0)!=0) {
$echo[4] = sprintf(_('Last check incomplete on **%s**'),_(my_time(_var($var,'sbSynced2',0)).day_count(_var($var,'sbSynced2',0)),0));
$echo[4].= "<br><i class='fa fa-fw fa-dot-circle-o'></i> "._('Error code').": ".my_error(_var($var,'sbSyncExit'));
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error(_var($var,'sbSyncErrs',0));
} elseif (_var($var,'sbSynced',0)==0) {
if (!$date) {
$echo[4] = _('Parity has not been checked yet');
} elseif ($status==0) {
@@ -376,20 +377,20 @@ while (true) {
$echo[4].= "<br><i class='fa fa-fw fa-dot-circle-o'></i> "._('Error code').": ".my_error($status);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error($error);
}
} elseif ($var['sbSynced2']==0) {
} elseif (_var($var,'sbSynced2',0)==0) {
if ($status==0) {
$echo[4] = sprintf(_('Last checked on **%s**'),_(my_time($var['sbSynced']).day_count($var['sbSynced']),0));
$echo[4] = sprintf(_('Last checked on **%s**'),_(my_time(_var($var,'sbSynced',0)).day_count(_var($var,'sbSynced',0)),0));
$echo[4].= "<br><i class='fa fa-fw fa-clock-o'></i> "._('Duration').": ".my_check($duration,$speed);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error($error);
} else {
$echo[4] = sprintf(_('Last check incomplete on **%s**'),_(my_time($var['sbSynced']).day_count($var['sbSynced']),0));
$echo[4] = sprintf(_('Last check incomplete on **%s**'),_(my_time(_var($var,'sbSynced',0)).day_count(_var($var,'sbSynced',0)),0));
$echo[4].= "<br><i class='fa fa-fw fa-dot-circle-o'></i> "._('Error code').": ".my_error($status);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error($error);
}
} else {
$echo[4] = sprintf(_('Last check completed on **%s**'),_(my_time($var['sbSynced2']).day_count($var['sbSynced2']),0));
$echo[4] = sprintf(_('Last check completed on **%s**'),_(my_time(_var($var,'sbSynced2',0)).day_count(_var($var,'sbSynced2',0)),0));
$echo[4].= "<br><i class='fa fa-fw fa-clock-o'></i> "._('Duration').': '.my_check($duration,$speed);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error($var['sbSyncErrs']);
$echo[4].= "<br><i class='fa fa-fw fa-search'></i> ".print_error(_var($var,'sbSyncErrs',0));
}
[$m,$h] = explode(' ', $parity['hour']);
$time = time();
@@ -455,7 +456,7 @@ while (true) {
}
$echo[4] .= "\0";
if ($check) {
$frmt = $display['date'].($display['date']!='%c' ? ", {$display['time']}" : "");
$frmt = _var($display,'date').(_var($display,'date')!='%c' ? ", "._var($display,'time') : "");
$echo[4] .= sprintf(_('Next check scheduled on **%s**'),_(my_date($frmt,$time+$t),0));
$echo[4] .= "<br><i class='fa fa-fw fa-clock-o'></i> "._('Due in').": "._(my_clock(floor($t/60)),2);
} else {
+5 -5
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -26,7 +26,7 @@ if (!function_exists('_')) {
}
function ports() {
global $net;
exec("ls $net|grep -Po '^(lo|(bond|eth)\d+)$'",$ports);
exec("ls --indicator-style=none $net|grep -Po '^(lo|(bond|eth)\d+)$'",$ports);
return $ports;
}
@@ -49,8 +49,8 @@ while (true) {
$rx = (float)port_get_contents("$net/$port/statistics/rx_bytes");
$tx = (float)port_get_contents("$net/$port/statistics/tx_bytes");
if ($ts > 0) {
$rxd = ($rx-$data[$port]['rx']??0)/$ts*8;
$txd = ($tx-$data[$port]['tx']??0)/$ts*8;
$rxd = ($rx-_var($data[$port],'rx',0))/$ts*8;
$txd = ($tx-_var($data[$port],'tx',0))/$ts*8;
$rx_speed = my_scale($rxd,$unit,1,-1).' '.str_replace('B','b',$unit).'ps';
$tx_speed = my_scale($txd,$unit,1,-1).' '.str_replace('B','b',$unit).'ps';
} else {
+3 -3
View File
@@ -21,7 +21,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'settings';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
// remember current language
@@ -65,8 +65,8 @@ function update_translation($locale) {
while (true) {
// check for language changes
extract(parse_plugin_cfg('dynamix',true));
if ($display['locale'] != $locale_init) {
$locale_init = $display['locale'];
if (_var($display,'locale') != $locale_init) {
$locale_init = _var($display,'locale');
update_translation($locale_init);
}
unset($status,$rows,$power,$load,$freq,$output,$volt);
+3 -3
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2021, Lime Technology
* Copyright 2012-2021, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -16,7 +16,7 @@ $docroot = '/usr/local/emhttp';
require_once "$docroot/webGui/include/publish.php";
function my_scale($value, &$unit) {
$units = [' ','Ki','Mi','Gi','Ti','Pi','Ei','Zi','Yi'];
$units = ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi','Yi'];
$size = count($units);
$base = $value ? floor(log($value, 1024)) : 0;
if ($base>$size) $base = $size-1;
+68 -67
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -20,14 +20,22 @@
// all data: diagnostics -a
$opt = getopt('a',['all']);
$all = isset($opt['a']) || isset($opt['all']);
$zip = $all ? $argv[2]??"" : $argv[1]??"";
$zip = $all ? ($argv[2]??'') : ($argv[1]??'');
$cli = empty($zip);
$get = "/var/local/emhttp";
$var = (array)@parse_ini_file("$get/var.ini");
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
$folders = ['/boot','/boot/config','/boot/config/plugins','/boot/syslinux','/var/log','/var/log/plugins','/boot/extra','/var/log/packages','/var/lib/pkgtools/packages','/tmp'];
require_once "$docroot/webGui/include/Wrappers.php";
// global variables
$path = "/var/local/emhttp";
$var = @parse_ini_file("$path/var.ini") ?: [];
$disks = @parse_ini_file("$path/disks.ini",true) ?: [];
$pools = pools_filter($disks);
require_once "$docroot/webGui/include/CustomMerge.php";
function write(...$messages){
$com = curl_init();
curl_setopt_array($com,[
@@ -56,13 +64,13 @@ function newline($file) {
function shareDisks($share) {
return str_replace(',',', ',exec("shopt -s dotglob; getfattr --no-dereference --absolute-names --only-values -n system.LOCATIONS ".escapeshellarg("/mnt/user/$share")." 2>/dev/null") ?: "");
}
function anonymize($text,$select) {
global $all,$pools,$customShares,$unraid_vars;
function anonymize($text, $select) {
global $all,$var,$pools,$customShares;
if ($all) return $text;
switch ($select) {
case 1:
// remove any stray references to the GUID that may wind up in .ini files (notably Unassigned Devices)
$guid = explode("-",$unraid_vars['regGUID']);
$guid = explode('-',_var($var,'regGUID'));
$text = str_replace(end($guid),"...",$text);
$rows = explode("\n", $text);
$pool = implode('|',$pools) ?: 'cache';
@@ -93,7 +101,7 @@ function prefix($key) {
return preg_replace('/\d+$/','',$key);
}
function cache_only($disk) {
return $disk['type']=='Cache';
return _var($disk,'type')=='Cache';
}
function cache_filter($disks) {
return array_filter($disks,'cache_only');
@@ -146,7 +154,7 @@ function geturls_certdetails($file, $hostname, $ip="") {
// replace wildcard with hostname
$cn = str_replace('*', $hostname, $cn);
$cn_priv = $cn;
if (strpos($data??'', "Self-signed") !== false){
if (strpos($data, "Self-signed") !== false){
$type = 'self-signed';
} else {
$type = 'user-provided';
@@ -169,17 +177,17 @@ function geturls_checkhost($host, $hostpriv, $expectedip, $dnsserver) {
return '';
}
function geturls() {
$var = parse_ini_file('/var/local/emhttp/var.ini');
extract(parse_ini_file('/var/local/emhttp/network.ini',true));
$nginx = parse_ini_file('/var/local/emhttp/nginx.ini');
$internalip = $internalip_priv = $internalip_msg = $eth0['IPADDR:0'];
$dnsserver = $eth0['DNS_SERVER1'];
global $var,$path;
extract(@parse_ini_file("$path/network.ini",true));
$nginx = @parse_ini_file("$path/nginx.ini");
$internalip = $internalip_priv = $internalip_msg = _var($eth0,'IPADDR:0');
$dnsserver = _var($eth0,'DNS_SERVER1');
if (filter_var($internalip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$internalip_priv = "ipaddress";
$internalip_msg = "redacted (FYI - this system has a routable IP address, ensure it is behind a firewall)";
}
$host_tld_msg = $var['LOCAL_TLD'] ? '': '[blank] (FYI - a blank TLD can cause issues for Mac and Linux clients)';
$isLegacyCert = preg_match('/.*\.unraid\.net$/', $nginx['NGINX_CERTNAME']);
$host_tld_msg = _var($var,'LOCAL_TLD') ? '' : '[blank] (FYI - a blank TLD can cause issues for Mac and Linux clients)';
$isLegacyCert = preg_match('/.*\.unraid\.net$/',_var($nginx,'NGINX_CERTNAME'));
$rebindtesturl = $isLegacyCert ? "rebindtest.unraid.net" : "rebindtest.myunraid.net";
$rebindtestdomain = $isLegacyCert ? "unraid.net" : "myunraid.net";
$rebindip = "192.168.42.42";
@@ -187,26 +195,27 @@ function geturls() {
$rebind_msg = ($rebindtest_ip != $rebindip) ? "is enabled, $rebindtestdomain urls will not work" : "is disabled, $rebindtestdomain urls will work";
// show raw data from config files
$urls = '';
$urls .= "Server Name: {$var['NAME']}\n";
$urls .= "Local TLD: {$var['LOCAL_TLD']}{$host_tld_msg}\n";
$urls .= "HTTP port: {$var['PORT']}\n";
$urls .= "HTTPS port: {$var['PORTSSL']}\n";
$urls .= "Server Name: "._var($var,'NAME','tower')."\n";
$urls .= "Local TLD: "._var($var,'LOCAL_TLD').$host_tld_msg."\n";
$urls .= "HTTP port: "._var($var,'PORT',80)."\n";
$urls .= "HTTPS port: "._var($var,'PORTSSL',443)."\n";
$urls .= "Internal IP: {$internalip_msg}\n";
$urls .= "DNS 1: {$dnsserver}\n";
$urls .= "USE SSL: {$var['USE_SSL']}\n";
$urls .= "USE SSL: "._var($var,'USE_SSL','no')."\n";
$urls .= "DNS Rebinding Protection {$rebind_msg} on this network\n\n";
$urls .= "Available URLs:\n (the URL marked with an asterisk is the primary url for this server)\n";
// calculate variables
$cert_path = "/boot/config/ssl/certs/";
$host_name = $var['NAME'];
$host_tld = $var['LOCAL_TLD'] ? ".{$var['LOCAL_TLD']}" : '';
$cert_path = "/boot/config/ssl/certs/";
$host_name = _var($var,'NAME','tower');
$host_tld = _var($var,'LOCAL_TLD') ? ".{$var['LOCAL_TLD']}" : '';
$use_ssl = _var($var,'USE_SSL','no');
$http_port = _var($var,'PORT',80)!=80 ? ":{$var['PORT']}" : '';
$https_port = _var($var,'PORTSSL',443)!=443 ? ":{$var['PORTSSL']}" : '';
$https_1_cert = "{$host_name}_unraid_bundle.pem";
$https_2_cert = 'certificate_bundle.pem';
$http_primary = $https_1_primary = $https_2_primary = $http_msg = $https_1_msg = $https_2_msg = '';
$expected_host = "{$host_name}{$host_tld}";
$http_port = $var['PORT'] != 80 ? ":{$var['PORT']}" : '';
$https_port = $var['PORTSSL'] != 443 ? ":{$var['PORTSSL']}" : '';
$https_1_cert = "{$var['NAME']}_unraid_bundle.pem";
$https_2_cert = 'certificate_bundle.pem';
$http_primary = $https_1_primary = $https_2_primary = $http_msg = $https_1_msg = $https_2_msg = '';
switch($var['USE_SSL']) {
switch ($use_ssl) {
case "no":
$http_primary = '*';
break;
@@ -229,8 +238,8 @@ function geturls() {
$urls .= geturls_checkhost($expected_host, $expected_host, $internalip, $dnsserver);
// calculate https url - self-signed or user-provided in tower_unraid_bundle.pem
// this is available when USE_SSL != no, and the certificate file exists
if ($var['USE_SSL'] != "no" && file_exists("{$cert_path}{$https_1_cert}")) {
[$https_1_host, $https_1_hostpriv, $https_1_type] = geturls_certdetails("{$cert_path}{$https_1_cert}", $var['NAME']);
if ($use_ssl != "no" && file_exists("{$cert_path}{$https_1_cert}")) {
[$https_1_host, $https_1_hostpriv, $https_1_type] = geturls_certdetails("{$cert_path}{$https_1_cert}", $host_name);
$https_1_url = "https://{$https_1_hostpriv}{$https_port}";
$urls .= "{$https_1_primary}HTTPS url 1 ($https_1_type): {$https_1_url}{$https_1_msg}\n";
$urls .= geturls_checkhost($https_1_host, $https_1_hostpriv, $internalip, $dnsserver);
@@ -246,7 +255,7 @@ function geturls() {
// this is available if the certificate file exists, regardless of the USE_SSL setting
// this is usually a (my)unraid.net LE cert, but it can also be a user-provided cert
if (file_exists("{$cert_path}{$https_2_cert}")) {
[$https_2_host, $https_2_hostpriv, $https_2_type] = geturls_certdetails("{$cert_path}{$https_2_cert}", $var['NAME'], $internalip);
[$https_2_host, $https_2_hostpriv, $https_2_type] = geturls_certdetails("{$cert_path}{$https_2_cert}", $host_name, $internalip);
$https_2_url = "https://{$https_2_hostpriv}{$https_port}";
$urls .= "{$https_2_primary}HTTPS url 2 ({$https_2_type}): {$https_2_url}{$https_2_msg}\n";
$urls .= geturls_checkhost($https_2_host, $https_2_hostpriv, $internalip, $dnsserver);
@@ -254,19 +263,19 @@ function geturls() {
$urls .= " ERROR: the certificate Subject CN in {$https_2_cert} should be {$expected_host}\n";
}
}
if ($var['USE_SSL'] != "no") {
$telnet_disabled = ($var['USE_TELNET'] == "no") ? " (disabled)" : "";
$ssh_disabled = ($var['USE_SSH'] == "no") ? " (disabled)" : "";
if ($use_ssl != "no") {
$telnet_disabled = _var($var,'USE_TELNET')=="no" ? " (disabled)" : "";
$ssh_disabled = _var($var,'USE_SSH')=="no" ? " (disabled)" : "";
$urls .= "\nTip: if DNS goes down and you lose access to the webgui, use telnet{$telnet_disabled}, ";
$urls .= "ssh{$ssh_disabled}, or a local keyboard/monitor to run:\n";
$urls .= " use_ssl no\n";
$urls .= "to enable 'HTTP IP url' and make 'HTTP url' the primary url for the system. ";
if ($var['USE_SSL'] == "auto") {
if ($use_ssl == "auto") {
$urls .= "Or:\n";
$urls .= " use_ssl yes\n";
$urls .= "to make 'HTTPS url 1' the primary.";
}
$urls .= "\nOnce DNS has been restored, navigate to Settings -> Management Access and set 'Use SSL' back to '{$var['USE_SSL']}'\n";
$urls .= "\nOnce DNS has been restored, navigate to Settings -> Management Access and set 'Use SSL' back to '$use_ssl'\n";
}
// get a list of the certificate files on the flash drive
$dirlisting[0] = "{$cert_path}";
@@ -296,14 +305,10 @@ if ($cli) {
$date = "{$split[2]}-{$split[3]}";
}
// global variables
$disks = (array)@parse_ini_file("$get/disks.ini",true);
$pools = pools_filter($disks);
// don't anonymize system share names
$vardomain = (array)@parse_ini_file('/boot/config/domain.cfg');
$vardocker = (array)@parse_ini_file('/boot/config/docker.cfg');
$showshares = [];
$vardomain = @parse_ini_file('/boot/config/domain.cfg') ?: [];
$vardocker = @parse_ini_file('/boot/config/docker.cfg') ?: [];
$showshares = [];
$customShares = '';
if (!empty($vardomain['IMAGE_FILE'])) $showshares[] = current(array_slice(explode('/',$vardomain['IMAGE_FILE']),3,1));
if (!empty($vardomain['DOMAINDIR'])) $showshares[] = current(array_slice(explode('/',$vardomain['DOMAINDIR']),3,1));
@@ -323,29 +328,28 @@ run("top -bn1 -o%CPU 2>/dev/null|todos >".escapeshellarg("/$diag/system/top.txt"
// make Unraid version reference
$unraid = parse_ini_file('/etc/unraid-version');
$unraid_vars = parse_ini_file('/var/local/emhttp/var.ini');
file_put_contents("/$diag/unraid-".$unraid['version'].".txt",$unraid['version']."\r\n");
// add bz*.sha256 values
run("tail /boot/bz*.sha256 >> ".escapeshellarg("/$diag/unraid-".$unraid['version'].".txt"));
// copy ini variables
foreach (glob("$get/*.ini") as $file) {
foreach (glob("$path/*.ini") as $file) {
$ini = basename($file,".ini");
// skip users file in anonymized mode
if ($all || $ini != "users") file_put_contents("/$diag/system/vars.txt",preg_replace(["/\n/","/^Array/"],["\r\n",$ini],anonymize(print_r(parse_ini_file($file,true),true),1)),FILE_APPEND);
}
// Create loads.txt
$cpuload = run("uptime")." Cores: ".run("nproc")."\r\n".(string)@file_get_contents("$get/cpuload.ini")."\r\n";
$cpuload = run("uptime")." Cores: ".run("nproc")."\r\n".(string)@file_get_contents("$path/cpuload.ini")."\r\n";
$loadTxt = [];
if (file_exists("$get/diskload.ini")){
$diskload = (array)@file("$get/diskload.ini");
if (file_exists("$path/diskload.ini")){
$diskload = file("$path/diskload.ini");
foreach ($diskload as $loadLine) {
$load = explode('=',$loadLine);
foreach ($disks as $disk) {
if ($load[0]==$disk['device']) {
$loadTxt[] = "{$disk['device']} ({$disk['name']})=".trim($load[1]);
if ($load[0]==_var($disk,'device')) {
$loadTxt[] = _var($disk,'device')." ("._var($disk,'name').")=".trim($load[1]);
break;
}
}
@@ -417,10 +421,10 @@ foreach ($files as $file) {
file_put_contents("/$diag/shares/shareDisks.txt",implode($shareDisk));
// create default user shares information
$shares = (array)@parse_ini_file("$get/shares.ini", true);
$shares = @parse_ini_file("$path/shares.ini", true) ?: [];
foreach ($shares as $share) {
$name = $share['name'];
if (!in_array("/boot/config/shares/$name.cfg",$files)) {
$name = _var($share,'name');
if ($name && !in_array("/boot/config/shares/$name.cfg",$files)) {
$home = shareDisks($name);
$home = $home ? "# Share exists on $home\r\n" : "# Share does not exist\r\n";
$file = anonymize("/$diag/shares/$name.cfg",2);
@@ -460,31 +464,28 @@ if (file_exists($docker)) {
}
// create SMART reports (suppress errors)
$disks = (array)@parse_ini_file("$get/disks.ini", true);
include_once "$docroot/webGui/include/CustomMerge.php";
include_once "$docroot/webGui/include/Wrappers.php";
run("ls -l /dev/disk/by-id/[asun]* 2>/dev/null|sed '/-part/d;s|^.*/by-id/[^-]*-||;s|-> ../../||;s|:|-|'", $devices);
foreach ($devices as $device) {
list($name,$port) = explode(' ',$device);
$diskName = ''; $type = '';
[$name,$port] = array_pad(explode(' ',$device),2,'');
$diskName = $type = '';
foreach ($disks as $find) {
if ($find['device']==$port) {
$diskName = $find['name'];
if (_var($find,'device')==$port) {
$diskName = _var($find,'name');
$type = get_value($find,'smType','');
get_ctlr_options($type, $find);
$port = $find['smDevice'] ?? $port;
$port = _var($find,'smDevice',$port);
break;
}
}
$port = port_name($port);
$status = $find['status'] == "DISK_OK" ? "" : " - {$find['status']}";
$status = _var($find,'status')=="DISK_OK" ? "" : " - "._var($find,'status');
run("smartctl -x $type ".escapeshellarg("/dev/$port")." 2>/dev/null|todos >".escapeshellarg("/$diag/smart/$name-$date $diskName ($port)$status.txt"));
}
// create btrfs pool information
foreach ($pools as $pool) {
if (strpos($disks[$pool]['fsType']??'','btrfs')!==false) {
$dev = $disks[$pool]['device'];
if (strpos(_var($disks[$pool],'fsType'),'btrfs')!==false) {
$dev = _var($disks[$pool],'device');
run("echo 'Pool: $pool'|todos >>".escapeshellarg("/$diag/system/btrfs-usage.txt"));
run("/sbin/btrfs filesystem usage -T /mnt/$pool 2>/dev/null|todos >>".escapeshellarg("/$diag/system/btrfs-usage.txt"));
newline("/$diag/system/btrfs-usage.txt");
+13 -10
View File
@@ -1,14 +1,17 @@
#!/usr/bin/php
#!/usr/bin/php -q
<?PHP
require_once "/usr/local/emhttp/webGui/include/publish.php";
function emhttp_command($cmd)
{
$var = parse_ini_file("/var/local/emhttp/var.ini");
$cmd .= "&csrf_token={$var['csrf_token']}";
return curl_socket("/var/run/emhttpd.socket", "http://localhost/update", $cmd);
function emhttp_command($cmd) {
$var = @parse_ini_file("/var/local/emhttp/var.ini") ?: [];
$cmd .= "&csrf_token=".($var['csrf_token']??'');
return curl_socket("/var/run/emhttpd.socket", "http://localhost/update", $cmd);
}
$result = emhttp_command($argv[1]);
if ($result == "") exit(0);
echo "$result".PHP_EOL;
exit(1);
$error = !empty($argv[1]) ? emhttp_command($argv[1]) : '';
if ($error) {
echo "$error\n";
exit(1);
}
exit(0);
?>
+3 -3
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -19,7 +19,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = '';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$var = parse_ini_file('state/var.ini');
+2 -2
View File
@@ -6,12 +6,12 @@
// if no user(s) specified, deletes the config file
$config_file = "/boot/config/vsftpd.user_list";
if (trim($argv[2]))
if (isset($argv[2]))
file_put_contents($config_file, implode("\n", explode(' ', trim($argv[2])))."\n");
else
@unlink($config_file);
$state = $argv[1] ? "'s/^#\(ftp.*vsftpd\)\$/\\1/'" : "'s/^\(ftp.*vsftpd\)\$/#\\1/'";
$state = !empty($argv[1]) ? "'s/^#\(ftp.*vsftpd\)\$/\\1/'" : "'s/^\(ftp.*vsftpd\)\$/#\\1/'";
exec("sed -i $state /etc/inetd.conf");
exec("killall -HUP inetd");
?>
+2 -2
View File
@@ -1,6 +1,6 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
/* Copyright 2005-2023, Lime Technology
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -26,7 +26,7 @@ function write(...$messages){
curl_close($com);
}
$url = rawurldecode($argv[1]);
$url = rawurldecode($argv[1]??'');
$host = parse_url($url)['host'];
if (in_array($host,['keys.lime-technology.com','lime-technology.com'])) {
+30 -29
View File
@@ -21,9 +21,9 @@ if (!function_exists('_')) {
// Exit when settings are not yet initialized
if (!file_exists("/var/local/emhttp/var.ini")) exit;
$var = (array)parse_ini_file("/var/local/emhttp/var.ini");
$devs = (array)parse_ini_file("/var/local/emhttp/devs.ini",true);
$disks = (array)parse_ini_file("/var/local/emhttp/disks.ini",true);
$var = @parse_ini_file("/var/local/emhttp/var.ini") ?: [];
$devs = @parse_ini_file("/var/local/emhttp/devs.ini",true) ?: [];
$disks = @parse_ini_file("/var/local/emhttp/disks.ini",true) ?: [];
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/webGui/include/Preselect.php";
@@ -35,19 +35,19 @@ $notify = "$docroot/webGui/scripts/notify";
$ram = "/var/local/emhttp/monitor.ini";
$rom = "/boot/config/plugins/dynamix/monitor.ini";
$saved = @parse_ini_file($ram,true);
$high1 = $display['critical'];
$high2 = $display['warning'];
$server = strtoupper($var['NAME']);
$high1 = _var($display,'critical',0);
$high2 = _var($display,'warning',0);
$server = strtoupper(_var($var,'NAME','tower'));
$pools = pools_filter($disks);
$errors = [];
$top = 120;
function check_temp(&$disk,$text,$info) {
global $notify,$saved,$server,$display,$top;
$name = $disk['name'];
$temp = $disk['temp'];
$hot = $disk['hotTemp'] ?? $display['hot'] ?? 0;
$max = $disk['maxTemp'] ?? $display['max'] ?? 0;
$name = _var($disk,'name');
$temp = _var($disk,'temp','*');
$max = ($disk['maxTemp'] ?? $display['max'] ?? 0) ?: 0;
$hot = ($disk['hotTemp'] ?? $display['hot'] ?? 0) ?: 0;
$warn = exceed($temp,$max,$top) ? 'alert' : (exceed($temp,$hot,$top) ? 'warning' : false);
$item = 'temp';
$last = $saved[$item][$name] ?? 0;
@@ -65,7 +65,7 @@ function check_temp(&$disk,$text,$info) {
}
function check_smart(&$disk,$port,$text,$info) {
global $notify,$saved,$server,$numbers;
$name = $disk['name'];
$name = _var($disk,'name');
$select = get_value($disk,'smSelect',0);
$level = get_value($disk,'smLevel',1);
$events = explode('|',get_value($disk,'smEvents',$numbers));
@@ -122,9 +122,9 @@ function check_smart(&$disk,$port,$text,$info) {
function check_usage(&$disk,$used,$text,$info) {
global $notify,$saved,$server,$display;
if ($used == -1) return;
$name = $disk['name'];
$warning = is_numeric($disk['warning']) ? $disk['warning'] : $display['warning'];
$critical = is_numeric($disk['critical']) ? $disk['critical'] : $display['critical'];
$name = _var($disk,'name');
$critical = ($disk['critical'] ?? $display['critical'] ?? 0) ?: 0;
$warning = ($disk['warning'] ?? $display['warning'] ?? 0) ?: 0;
$warn = exceed($used,$critical) ? 'alert' : (exceed($used,$warning) ? 'warning' : false);
$item = 'used';
$last = $saved[$item][$name] ?? 0;
@@ -143,25 +143,26 @@ function check_usage(&$disk,$used,$text,$info) {
// check array devices
foreach ($disks as $disk) {
$name = $disk['name'];
if ($name=='flash' || substr($disk['status'],-3)=='_NP') continue;
$name = _var($disk,'name');
if ($name=='flash' || substr(_var($disk,'status'),-3)=='_NP') continue;
$text = my_disk($name).(in_array($name,$pools)||$name=='parity'?' disk':'');
$info = !empty($disk['id']) ? "{$disk['id']} ({$disk['device']})" : "No device identification ({$disk['device']})";
$device = _var($disk,'device');
$info = !empty($disk['id']) ? "{$disk['id']} ($device)" : "No device identification ($device)";
// process disk temperature notifications
check_temp($disk,$text,$info);
// process disk SMART notifications
check_smart($disk,port_name($disk['smDevice'] ?? $disk['device']),$text,$info);
check_smart($disk,port_name($disk['smDevice'] ?? $device),$text,$info);
// process disk usage notifications
check_usage($disk,isset($disk['fsSize'])&&$disk['fsSize']>0?100-round(100*$disk['fsFree']/$disk['fsSize']):-1,$text,$info);
check_usage($disk,_var($disk,'fsSize',0)>0?100-round(100*_var($disk,'fsFree',0)/$disk['fsSize']):-1,$text,$info);
// process disk operation notifications
$warn = strtok($disk['color'],'-');
$warn = strtok(_var($disk,'color'),'-');
$item = 'disk';
$last = $saved[$item][$name] ?? '';
switch ($warn) {
case 'red':
if ($warn!=$last) {
if ($var['fsState']!='Stopped') {
$status = strtolower(str_replace(['NP_','_'],['',' '],$disk['status']));
if (_var($var,'fsState')!='Stopped') {
$status = strtolower(str_replace(['NP_','_'],['',' '],_var($disk,'status')));
exec("$notify -l '/Main' -e ".escapeshellarg("Unraid $text error")." -s ".escapeshellarg("Alert [$server] - $text in error state ($status)")." -d ".escapeshellarg("$info")." -i \"alert\" 2>/dev/null");
}
$saved[$item][$name] = $warn;
@@ -169,7 +170,7 @@ foreach ($disks as $disk) {
break;
case 'yellow':
if ($warn!=$last) {
if ($var['fsState']!='Stopped') {
if (_var($var,'fsState')!='Stopped') {
$status = $name=='parity' ? "parity-sync in progress" : " is being reconstructed and is available for normal operation";
exec("$notify -l '/Main' -e ".escapeshellarg("Unraid $text message")." -s ".escapeshellarg("Notice [$server] - $text, $status")." -d ".escapeshellarg("$info")." 2>/dev/null");
}
@@ -178,19 +179,19 @@ foreach ($disks as $disk) {
break;
default:
if ($last) {
if ($var['fsState']!='Stopped') {
if (_var($var,'fsState')!='Stopped') {
exec("$notify -l '/Main' -e ".escapeshellarg("Unraid $text message")." -s ".escapeshellarg("Notice [$server] - $text returned to normal operation")." -d ".escapeshellarg("$info")." 2>/dev/null");
}
unset($saved[$item][$name]);
}
break;}
// count disk errors
if ($disk['numErrors']>0) $errors[] = "$text - $info (errors {$disk['numErrors']})";
if (_var($disk,'numErrors',0)>0) $errors[] = "$text - $info (errors {$disk['numErrors']})";
// check file system of cache pool
$item = 'pool';
if (in_array($name,$pools) && strpos($disk['fsType']??'','btrfs')!==false) {
if (in_array($name,$pools) && strpos(_var($disk,'fsType'),'btrfs')!==false) {
$attr = 'missing';
if (exec("/sbin/btrfs filesystem show {$disk['uuid']} 2>/dev/null|grep -c 'missing'")>0) {
if (exec("/sbin/btrfs filesystem show "._var($disk,'uuid')." 2>/dev/null|grep -c 'missing'")>0) {
if (empty($saved[$item][$attr])) {
exec("$notify -l '/Main' -e ".escapeshellarg("Unraid $text message")." -s ".escapeshellarg("Warning [$server] - Cache pool BTRFS missing device(s)")." -d ".escapeshellarg("$info")." -i \"warning\" 2>/dev/null");
$saved[$item][$attr] = 1;
@@ -208,8 +209,8 @@ foreach ($disks as $disk) {
// check unassigned devices
foreach ($devs as $dev) {
$name = $dev['name'];
$id = $dev['id'];
$name = _var($dev,'name','no name');
$id = _var($dev,'id');
$port = port_name($name);
$text = "device $name";
$info = !empty($id) ? "$id ($name)": "No device identification ($name)";
+5 -5
View File
@@ -1,6 +1,6 @@
#!/usr/bin/php -q
<?
# Copyright 2005-2022, Lime Technology
# Copyright 2005-2023, Lime Technology
#
# Usage: newperms [dir] [owner] [group]
# Recursively changes the ownership and permissions of the directory and all files/subdirs
@@ -42,8 +42,8 @@ function write(...$messages){
}
function process($path) {
global $argv;
$owner = $argv[2] ?: 'nobody';
$group = $argv[3] ?: 'users';
$owner = $argv[2] ?? 'nobody';
$group = $argv[3] ?? 'users';
if (is_dir($path)) {
write("Processing: $path\n", "... chmod -R u-x,go-rwx,go+u,ugo+X $path\n");
exec("chmod -R u-x,go-rwx,go+u,ugo+X ".escapeshellarg($path));
@@ -57,7 +57,7 @@ function process($path) {
$startTime = time();
if ($argv[1]) {
if ($argv[1]??'') {
$paths = explode('*',rawurldecode($argv[1]));
foreach ($paths as $path) process($path);
} else {
@@ -69,7 +69,7 @@ if ($argv[1]) {
$time = time()-$startTime;
$hours = floor($time/3600);
$mins = floor($time/60%60);
$mins = floor($time/60)%60;
$secs = floor($time%60);
write("Completed, elapsed time: ".sprintf('%02d:%02d:%02d', $hours, $mins, $secs)."\n");
+4 -7
View File
@@ -51,16 +51,13 @@ EOT;
function generate_email($event, $subject, $description, $importance, $message, $recipients, $fqdnlink) {
global $ssmtp;
$rcpt = $ssmtp['RcptTo'];
if (!$recipients)
$to = implode(',', explode(' ', trim($rcpt)));
else
$to = $recipients;
if (empty($to)) return;
$subj = "{$ssmtp['Subject']}$subject";
$headers = [];
$headers[] = "MIME-Version: 1.0";
$headers[] = "X-Mailer: PHP/".phpversion();
@@ -72,7 +69,6 @@ function generate_email($event, $subject, $description, $importance, $message, $
$headers[] = "X-Mms-Priority: High";
}
$headers[] = "";
$body = [];
if (!empty($fqdnlink)) {
$body[] = "Link: $fqdnlink";
@@ -88,7 +84,6 @@ function generate_email($event, $subject, $description, $importance, $message, $
$body[] = $line;
}
$body[] = "";
return mail($to, $subj, implode("\n", $body), implode("\n", $headers));
}
@@ -104,8 +99,10 @@ function safe_filename($string) {
if ($argc == 1) exit(usage());
extract(parse_plugin_cfg("dynamix",true));
$unread = "{$notify['path']}/unread";
$archive = "{$notify['path']}/archive";
$path = _var($notify,'path','/tmp/notifications');
$unread = "$path/unread";
$archive = "$path/archive";
$agents_dir = "/boot/config/plugins/dynamix/notifications/agents";
if (is_dir($agents_dir)) {
$agents = [];
+2 -2
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
+1 -1
View File
@@ -19,7 +19,7 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'main';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$month = [' Jan '=>'-01-',' Feb '=>'-02-',' Mar '=>'-03-',' Apr '=>'-04-',' May '=>'-05-',' Jun '=>'-06-',' Jul '=>'-07-',' Aug '=>'-08-',' Sep '=>'-09-',' Oct '=>'-10-',' Nov '=>'-11-',' Dec '=>'-12-'];
+3 -3
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -19,7 +19,7 @@ $last = "\e[0m";
$color = ['text' => $last, 'error' => "\e[91m", 'warn' => "\e[93m", 'system' => "\e[96m", 'array' => "\e[92m", 'login' => "\e[95m"];
$call = ['tail','docker','grep'];
if (!in_array($argv[1],$call)) exit;
if (!in_array($argv[1]??'',$call)) exit;
$dummy = array_shift($argv);
$files = array_pop($argv);
+5 -6
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2022, Lime Technology
* Copyright 2012-2022, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -19,13 +19,12 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'dashboard';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$boot = "/boot/config/plugins/dynamix";
$file = $argv[1];
$exist = is_file("$boot/$file");
$cmodel = $exist ? file_get_contents("$boot/$file") : '';
$cmodel = is_file("$boot/$file") ? file_get_contents("$boot/$file") : '';
$style = ["<style>"];
$style[] = "div.case-list{float:left;padding:10px;margin:0 45px 64px 0;height:128px;width:128px;text-align:center;cursor:pointer}";
@@ -54,7 +53,7 @@ $script[] = "}";
$script[] = "</script>";
$html = ["<div>"];
$cases = explode("\n",file_get_contents("$docroot/webGui/styles/default-cases.css"));
$cases = file("$docroot/webGui/styles/default-cases.css",FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
foreach ($cases as $case) if (substr($case,0,6)=='.case-') $models[] = substr($case,1,strpos($case,':')-1);
natsort($models);
for ($i=0; $i < count($models); $i++) {
+2 -3
View File
@@ -13,14 +13,13 @@
?>
<?
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
// Get the webGui configuration preferences
require_once "$docroot/webGui/include/Wrappers.php";
extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'settings';
$login_locale = $display['locale']??'';
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
function write(...$messages){
+58 -65
View File
@@ -1,7 +1,7 @@
#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2018, Lime Technology
* Copyright 2012-2018, Bergware International.
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
@@ -12,41 +12,37 @@
*/
?>
<?
$var = parse_ini_file("/var/local/emhttp/var.ini");
$disks = parse_ini_file("/var/local/emhttp/disks.ini",true);
$var = @parse_ini_file("/var/local/emhttp/var.ini") ?: [];
$disks = @parse_ini_file("/var/local/emhttp/disks.ini",true) ?: [];
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Wrappers.php";
require_once "$docroot/webGui/include/CustomMerge.php";
$notify = "$docroot/webGui/scripts/notify";
$unraid = parse_plugin_cfg("dynamix",true);
$output = $unraid['notify']['report'];
$server = strtoupper($var['NAME']);
$script = "$docroot/webGui/scripts/notify";
extract(parse_plugin_cfg("dynamix",true));
$output = _var($notify,'report');
$server = strtoupper(_var($var,'NAME','tower'));
$data = [];
$parity = false;
$cache = false;
$error0 = 0;
$error1 = 0;
$error2 = 0;
$error3 = 0;
$parity = $pools = false;
$error0 = $error1 = $error2 = $error3 = 0;
function plus($val, $word, $last) {
return $val>0 ? (($val || $last) ? ($val.' '.$word.($val!=1?'s':'').($last ?'':', ')) : '') : '';
}
function my_temp($value) {
global $unraid;
global $display;
if ($value=='*') return ' - standby';
$unit = $unraid['display']['unit'];
return ' - active '.($unit=='F' ? round(9/5*$value+32) : str_replace('.', $unraid['display']['number'][0], $value)).' '.$unit;
$unit = _var($display,'unit','C');
return ' - active '.($unit=='F' ? round(9/5*$value+32) : str_replace('.',_var($display,'number','.,')[0], $value)).' '.$unit;
}
function my_disk($name) {
return ucfirst(preg_replace('/(\d+)$/',' $1',$name));
}
function my_scale($value, &$unit, $precision = NULL) {
global $unraid;
$scale = $unraid['display']['scale'];
$number = $unraid['display']['number'];
global $display;
$scale = _var($display,'scale',-1);
$number = _var($display,'number','.,');
$units = ['B','KB','MB','GB','TB','PB'];
if ($scale==0 && $precision===NULL) {
$unit = '';
@@ -65,13 +61,13 @@ function my_check($time,$speed) {
$days = floor($time/86400);
$hmss = $time-$days*86400;
$hour = floor($hmss/3600);
$mins = $hmss/60%60;
$mins = floor($hmss/60)%60;
$secs = $hmss%60;
return plus($days,'day',($hour|$mins|$secs)==0).plus($hour,'hour',($mins|$secs)==0).plus($mins,'minute',$secs==0).plus($secs,'second',true).". Average speed: $speed";
}
function my_time($time) {
global $unraid;
$date = my_date($unraid['display']['date'].($unraid['display']['date']!='%c' ? ", {$unraid['display']['time']}" : ""), $time);
global $display;
$date = my_date(_var($display,'date').(_var($display,'date')!='%c' ? ", "._var($display,'time') : ""), $time);
$now = new DateTime("@".intval(time()/86400)*86400);
$last = new DateTime("@".intval($time/86400)*86400);
$days = date_diff($last,$now)->format('%a');
@@ -89,90 +85,87 @@ function my_time($time) {
function my_clock($time) {
if (!$time) return 'less than a minute';
$days = floor($time/1440);
$hour = $time/60%24;
$hour = floor($time/60)%24;
$mins = $time%60;
return plus($days,'day',($hour|$mins)==0).plus($hour,'hour',$mins==0).plus($mins,'minute',true);
}
function my_array(&$disk) {
global $data,$unraid,$error0,$error1,$error2,$error3;
$name = $disk['name'];
$hot = $disk['hotTemp'] ?? $unraid['display']['hot'] ?? 0;
$max = $disk['maxTemp'] ?? $unraid['display']['max'] ?? 0;
if (strpos($disk['status'],'_NP')!==false) return false;
$temp = $disk['temp'];
if ($temp>=$max) {
global $data,$display,$error0,$error1,$error2,$error3;
$name = _var($disk,'name');
$max = $disk['maxTemp'] ?? $display['max'] ?? 0;
$hot = $disk['hotTemp'] ?? $display['hot'] ?? 0;
if (strpos(_var($disk,'status'),'_NP')!==false) return false;
$temp = _var($disk,'temp','*');
if ($max>0 && $temp>=$max) {
$fail = ' (disk is overheated';
$error0++;
} elseif ($temp>=$hot) {
} elseif ($hot>0 && $temp>=$hot) {
$fail = ' (disk is hot';
$error1++;
} else {
$fail = '';
}
if ($disk['numErrors']>0) {
if (_var($disk,'numErrors',0)>0) {
if ($fail) $fail .= ', '; else $fail = ' (';
$fail .= 'disk has read errors';
$error2++;
}
if ($fail) $fail .= ')';
$status = $fail ? ' [NOK]' : ' [OK]';
$color = strtok($disk['color'],'-');
if ($color=='red'||$color=='yellow') { $error3++; $status = ' ['.str_replace(['NP_','_'],['',' '],$disk['status']).']'; }
$info = "{$disk['id']} ({$disk['device']})";
$color = strtok(_var($disk,'color'),'-');
if ($color=='red'||$color=='yellow') {$error3++; $status = ' ['.str_replace(['NP_','_'],['',' '],_var($disk,'status')).']';}
$info = _var($disk,'id')." ("._var($disk,'device').")";
if ($info==" ()") $info = 'No device identification present';
$data[] = my_disk($name)." - $info".my_temp($temp).$fail.$status;
return true;
}
// generate report of array devices
foreach ($disks as $disk) if ($disk['type']=='Parity') $parity |= my_array($disk);
foreach ($disks as $disk) if ($disk['type']=='Data') my_array($disk);
foreach ($disks as $disk) if ($disk['type']=='Cache') $cache |= my_array($disk);
foreach ($disks as $disk) if (_var($disk,'type')=='Parity') $parity |= my_array($disk);
foreach ($disks as $disk) if (_var($disk,'type')=='Data') my_array($disk);
foreach ($disks as $disk) if (_var($disk,'type')=='Cache') $pools |= my_array($disk);
$size = count($data);
// generate parity report
$data[] = "";
$mdResync = $var['mdResync'];
$data[] = '';
$mdResync = _var($var,'mdResync',0);
$action = preg_split('/\s+/',_var($var,'mdResyncAction'));
if ($mdResync>0) {
$mdResyncPos = $var['mdResyncPos'];
$mdResyncDb = $var['mdResyncDb'];
$mdResyncDt = $var['mdResyncDt'];
$mode = '';
if (strstr($var['mdResyncAction'],"recon")) {
$mode = 'Parity sync / Data rebuild';
} elseif (strstr($var['mdResyncAction'],"clear")) {
$mode = 'Disk clear';
} elseif ($var['mdResyncAction']=="check") {
$mode = 'Read check';
} elseif (strstr($var['mdResyncAction'],"check")) {
$mode = 'Parity check';
$mdResyncPos = _var($var,'mdResyncPos',0);
$mdResyncDb = _var($var,'mdResyncDb',0);
$mdResyncDt = _var($var,'mdResyncDt',0);
switch ($action[0]) {
case "recon": $mode = $action[1]=='P' ? 'Parity-Sync' : 'Data-Rebuild'; break;
case "check": $mode = count($action)>1 ? 'Parity-Check' : 'Read-Check'; break;
case "clear": $mode = 'Disk-Clear'; break;
default : $mode = 'Unknown'; break;
}
$data[] = $mode." in progress.";
$data[] = "Total size: ".my_scale($mdResync*1024, $unit)." $unit";
$data[] = "Elapsed time: ".my_clock(floor((time()-$var['sbUpdated'])/60));
$data[] = "Elapsed time: ".my_clock(floor((time()-_var($var,'sbUpdated',0))/60));
$data[] = "Current position: ".my_scale($mdResyncPos*1024, $unit)." $unit (".number_format(($mdResyncPos/($mdResync/100+1)),1,$unraid['display']['number'][0],'')." %)";
$data[] = "Estimated speed: ".my_scale($mdResyncDb/$mdResyncDt*1024, $unit, 1)." $unit/sec";
$data[] = "Estimated finish: ".my_clock(round(((($mdResyncDt*(($mdResync-$mdResyncPos)/($mdResyncDb/100+1)))/100)/60),0));
$data[] = "Sync errors ".($var['mdResyncCorr']==0 ? 'detected: ' : 'corrected: ').$var['sbSyncErrs'];
$data[] = "Sync errors ".(_var($var,'mdResyncCorr',0)==0 ? 'detected: ' : 'corrected: ')._var($var,'sbSyncErrs',0);
} else {
$sbSynced = $var['sbSynced'];
$sbSynced2 = $var['sbSynced2'];
$sbSyncErrs = $var['sbSyncErrs'];
if ($var['sbSyncExit']!=0) {
$sbSynced = _var($var,'sbSynced',0);
$sbSynced2 = _var($var,'sbSynced2',0);
$sbSyncErrs = _var($var,'sbSyncErrs',0);
if (_var($var,'sbSyncExit',0)!=0) {
$data[] = "Last check incomplete on ".my_time($sbSynced2).", finding $sbSyncErrs error".($sbSyncErrs==1?'.':'s.');
$data[] = "Error code: ".$var['sbSyncExit'];
} elseif ($sbSynced==0) {
$data[] = "Parity has not been checked yet";
} elseif ($sbSynced2>0) {
if (strstr($var['mdResyncAction'],"recon")) {
$data[] = 'Parity or Data is invalid';
if ($action[0]=='recon') {
$data[] = $action[1]=='P' ? 'Parity is invalid' : 'Data-Rebuild is invalid';
} else {
$data[] = 'Parity is valid';
}
$duration = $sbSynced2 - $sbSynced;
$speed = my_scale($var['mdResyncSize']*1024/$duration,$unit,1)." $unit/s";
$duration = Max($sbSynced2-$sbSynced,1);
$speed = my_scale(_var($var,'mdResyncSize',0)*1024/$duration,$unit,1)." $unit/s";
$data[] = "Last checked on ".my_time($sbSynced2).", finding $sbSyncErrs error".($sbSyncErrs==1?'.':'s.');
$data[] = "Duration: ".my_check($duration,$speed);
}
@@ -181,9 +174,9 @@ if ($mdResync>0) {
$word = $size==1 ? "" : "including ";
$warn = ($error0 || $error3) ? "alert" : (($error1 || $error2) ? "warning" : "normal");
$stat = $warn=="normal" ? "[PASS]" : "[FAIL]";
$info = "Array has $size disk".($size==1 ? "" : "s").($parity ? " ({$word}parity".($cache ? " & cache)" : ")") : ($cache ? " ({$word}cache)" : ""));
$info = "Array has $size disk".($size==1 ? "" : "s").($parity ? " ({$word}parity".($pools ? " & pools)" : ")") : ($pools ? " ({$word}pools)" : ""));
$message = implode('\n', $data);
exec("$notify -s ".escapeshellarg("Notice [$server] - array health report $stat")." -d ".escapeshellarg("$info")." -m ".escapeshellarg("$message")." -i ".escapeshellarg("$warn $output")." -l '/Main'");
exec("$script -s ".escapeshellarg("Notice [$server] - array health report $stat")." -d ".escapeshellarg("$info")." -m ".escapeshellarg("$message")." -i ".escapeshellarg("$warn $output")." -l '/Main'");
exit(0);
?>
+7 -7
View File
@@ -19,11 +19,11 @@ extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = '';
$login_locale = $display['locale'];
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
function dmidecode($key, $n, $all=true) {
$entries = array_filter(explode($key,shell_exec("dmidecode -qt$n")??""));
$entries = array_filter(explode($key,shell_exec("dmidecode -qt$n")?:''));
$properties = [];
foreach ($entries as $entry) {
$property = [];
@@ -36,8 +36,8 @@ function dmidecode($key, $n, $all=true) {
return $all ? $properties : $properties[0]??null;
}
$var = parse_ini_file('state/var.ini');
$model = empty($var['SYS_MODEL']) ? _('N/A') : $var['SYS_MODEL'];
$var = @parse_ini_file('state/var.ini') ?: [];
$model = _var($var,'SYS_MODEL',_('N/A'));
$board = dmidecode('Base Board Information',2,0);
$bios = dmidecode('BIOS Information',0,0);
$cpu = dmidecode('Processor Information',4,0);
@@ -126,7 +126,7 @@ foreach ($memory_array as $device) {
[$size, $unit] = my_explode(' ',$device['Maximum Capacity']);
$base = array_search($unit,$sizes);
if ($base>=1) $memory_maximum += $size*pow(1024,$base);
if (!$ecc && isset($device['Error Correction Type']) && $device['Error Correction Type']!='None') $ecc = ($device['Error Correction Type']??'')." ";
if (!$ecc && isset($device['Error Correction Type']) && $device['Error Correction Type']!='None') $ecc = $device['Error Correction Type']." ";
}
if ($memory_installed >= 1024) {
$memory_installed = round($memory_installed/1024);
@@ -152,8 +152,8 @@ $list[] = "<tr><td>$memory</td><td>$memory_installed $unit $memory_type $ecc("._
foreach ($memory_devices as $device) {
if (empty($device['Type']) || $device['Type']=='Unknown') continue;
$size = preg_replace('/( .)B$/','$1iB',$device['Size']??'0');
$list[] = "<tr class='ram'><td></td><td>".$device['Locator'].": ".($device['Manufacturer']??'')." ".($device['Part Number']??'').", $size ".($device['Type']??'')." @ ".($device['Configured Memory Speed']??'')."</td></tr>";
$size = preg_replace('/( .)B$/','$1iB',_var($device,'Size',0));
$list[] = "<tr class='ram'><td></td><td>".$device['Locator'].": "._var($device,'Manufacturer')." "._var($device,'Part Number').", $size "._var($device,'Type')." @ "._var($device,'Configured Memory Speed')."</td></tr>";
}
exec("ls --indicator-style=none /sys/class/net|grep -Po '^(bond|eth)\d+$'",$sPorts);

Some files were not shown because too many files have changed in this diff Show More