mirror of
https://github.com/unraid/webgui.git
synced 2026-05-15 00:30:16 -05:00
Merge pull request #1276 from bergware/master
Miscellaneous updates and fixes
This commit is contained in:
@@ -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> _(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> _(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])):?> (<?=pow(2,32-explode('/',$dockercfg[$docker_dhcp])[1])?> _(hosts)_)<?endif;?>
|
||||
**_(DHCP pool)_:** <?=_var($dockercfg,$docker_dhcp) ?: "_(not set)_"?><?if (isset($dockercfg[$docker_dhcp])):?> (<?=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):?> (<?=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 "'" doesn't show up in email
|
||||
return str_replace("'","'",$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 "'" doesn't show up in email
|
||||
$event = str_replace("'","'",_("Language")." - $lang [$new]");
|
||||
$subject = str_replace("'","'",sprintf(_("Notice [%s] - Version update %s"),$server,$new));
|
||||
$description = str_replace("'","'",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 "'" doesn't show up in email
|
||||
return str_replace("'","'",$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);
|
||||
|
||||
@@ -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&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>";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -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);
|
||||
?>
|
||||
|
||||
@@ -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'> </td></tr>";
|
||||
endforeach;
|
||||
if ($display['total']) echo "<tr class='tr_last'><td colspan='11'> </td></tr>";
|
||||
if (_var($display,'total')) echo "<tr class='tr_last'><td colspan='11'> </td></tr>";
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
:main_array_devices_help:
|
||||
|
||||
<?if ($var['fsState'] == "Stopped"):?>
|
||||
<?if (_var($var,'fsState')=="Stopped"):?>
|
||||
<div></div>
|
||||
:main_slots_help:
|
||||
<?endif;?>
|
||||
|
||||
@@ -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)_. <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> • ".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> • ".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,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>
|
||||
|
||||
@@ -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;?>
|
||||
|
||||
@@ -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) ?: ' ';
|
||||
$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) ?: ' ';
|
||||
$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,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,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,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
@@ -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'])?> (<?=$dev?>)
|
||||
: <?=my_id(_var($disk,'id'))?> (<?=$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'])?>
|
||||
: <?=_(_var($disk,'fsStatus'))?>
|
||||
|
||||
<?$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)_ (%):
|
||||
|
||||
: <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)_:
|
||||
|
||||
|
||||
: <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> _(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">
|
||||
|
||||
|
||||
: <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> _(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>
|
||||
|
||||
|
||||
@@ -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')?>">
|
||||
|
||||
|
||||
: <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')?>">
|
||||
|
||||
|
||||
: <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?>">
|
||||
|
||||
|
||||
: <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> _(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>
|
||||
|
||||
|
||||
: <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')?>">
|
||||
|
||||
|
||||
: <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')?>">
|
||||
|
||||
|
||||
: <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')?>">
|
||||
|
||||
|
||||
: <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')?>">
|
||||
|
||||
|
||||
: <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)_ (°<?=$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)_ (°<?=_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)_ (°<?=$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)_ (°<?=_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++):?>
|
||||
|
||||
: <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;?>
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)_ (°<?=$display['unit']?>):
|
||||
: <input type="number" min="0" max="300" name="display_hot" class="narrow" value="<?=displayTemp($display['hot'])?>">
|
||||
_(Default warning disk temperature threshold)_ (°<?=_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)_ (°<?=$display['unit']?>):
|
||||
: <input type="number" min="0" max="300" name="display_max" class="narrow" value="<?=displayTemp($display['max'])?>">
|
||||
_(Default critical disk temperature threshold)_ (°<?=_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)_ (°<?=$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++):?>
|
||||
|
||||
: <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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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)_ ("A-Z", "a-z", and "0-9"), dashes ("-"), and dots ("."); _(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)_ ("A-Z", "a-z", and "0-9"), dashes ("-"), and dots ("."); _(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:
|
||||
|
||||
|
||||
@@ -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 = ' ';
|
||||
|
||||
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?>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;?>
|
||||
});
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
: <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)_: <span id="logsize"></span>
|
||||
: <input type="submit" value="_(Apply)_" disabled><input type="button" value="_(Done)_" onclick="done()">
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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)_");
|
||||
|
||||
@@ -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,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>
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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,'','<'._('custom').'>','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:
|
||||
|
||||
@@ -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> _(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
@@ -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="Address:<?=$i?>"]')"<?=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="Address6:<?=$i?>"]')"<?=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="gui:Endpoint:<?=$i?>"]')"<?=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
@@ -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="Address:<?=$i?>"]')"<?=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="Address6:<?=$i?>"]')"<?=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="gui:Endpoint:<?=$i?>"]')"<?=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:
|
||||
|
||||
|
||||
@@ -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');?>
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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']!='')? "•<span class='blue strong'>{$var['fsProgress']}</span>" : '';
|
||||
switch ($var['fsState']) {
|
||||
$progress = (_var($var,'fsProgress')!='')? "•<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 += "•<span class='orange strong'>"+action.replace('.','<?=$display['number'][0]?>');
|
||||
status += "•<span class='orange strong'>"+action.replace('.','<?=_var($display,'number','.,')[0]?>');
|
||||
if (ini['mdResyncDt']==0) status += " • <?=_('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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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> $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>";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>";
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -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));
|
||||
?>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
?>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -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
@@ -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')
|
||||
? " <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);
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
?>
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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");
|
||||
?>
|
||||
|
||||
@@ -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'])) {
|
||||
|
||||
@@ -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)";
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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 = [];
|
||||
|
||||
@@ -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'] = '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-'];
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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);
|
||||
?>
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user