mirror of
https://github.com/unraid/webgui.git
synced 2026-04-22 18:19:14 -05:00
Dashboard: boxed apps
This commit is contained in:
+119
-51
@@ -40,6 +40,9 @@ function data_devices($disk) {
|
||||
function cache_devices($disk) {
|
||||
return $disk['type']=='Cache';
|
||||
}
|
||||
|
||||
$dockerd = pgrep('dockerd');
|
||||
$libvirtd = pgrep('libvirtd');
|
||||
$started = $var['fsState']=='Started';
|
||||
$array_size = $array_used = 0;
|
||||
$cache_size = $cache_used = 0;
|
||||
@@ -133,10 +136,30 @@ if ($memory_installed >= 1024) {
|
||||
$low = $memory_maximum < $memory_installed;
|
||||
if ($low) $memory_maximum = pow(2,ceil(log($memory_installed)/log(2)));
|
||||
?>
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.ui.css')?>">
|
||||
<style>
|
||||
.switch-button-label{float:left;cursor:pointer}
|
||||
.switch-button-background{float:left;position:relative;top:12px;background:#ccc;border:1px solid #aaa;margin:0 10px;border-radius:4px;cursor:pointer}
|
||||
.switch-button-button{position:absolute;left:-1px;top:-1px;background:#fafafa;border:1px solid #aaa;border-radius:4px}
|
||||
img,i.img{width:32px;height:32px;margin-right:10px}
|
||||
i.started{color:#009900}
|
||||
i.stopped{color:#ef3d47}
|
||||
i.paused{color:#f0dd33}
|
||||
span.update{color:#3b5998}
|
||||
span.outer{float:left;margin-bottom:20px;margin-right:20px;cursor:pointer}
|
||||
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
||||
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
||||
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
||||
span.inner{width:135px;display:inline-block;vertical-align:top}
|
||||
span.state{font-size:1.1rem;margin-left:7px}
|
||||
</style>
|
||||
<script src="<?autov('/webGui/javascript/jquery.switchbutton.js')?>"></script>
|
||||
<script src="<?autov('/plugins/dynamix.docker.manager/javascript/docker.js')?>"></script>
|
||||
<script src="<?autov('/plugins/dynamix.vm.manager/javascript/vmmanager.js')?>"></script>
|
||||
|
||||
<div style='float:left;margin:14px 0 36px 0'>
|
||||
<table class='share_status dashboard box1'>
|
||||
<thead><tr><td></td><td colspan='3'><?=$var['NAME']?><i class='fa blue-text chevron mt0' id='sys_view' onclick='toggleChevron("sys_view",0)'></i></td><td></td></tr></thead>
|
||||
|
||||
<tbody class='sys_view' style='display:none'>
|
||||
<tr><td></td><td colspan='2' class='top'>
|
||||
<span class='header'>Description</span><br>
|
||||
@@ -153,13 +176,11 @@ if ($low) $memory_maximum = pow(2,ceil(log($memory_installed)/log(2)));
|
||||
<input type='button' value='Edit' onclick='openBox("/webGui/include/SelectCase.php?file=<?=$myfile?>&csrf=<?=$var['csrf_token']?>","Select Case Model",600,900,true,"setCase");return false' style='margin:12px 0 0 0;padding:5px 10px'>
|
||||
</td><td></td></tr>
|
||||
</tbody>
|
||||
|
||||
<tbody>
|
||||
<tr><td></td><td colspan='3' class='next'><i class='icon-motherboard'></i><div class='section'>Motherboard<br><span id='mb-temp'></span><br><br></div>
|
||||
<i class='fa blue-text chevron' id='mb_view' onclick='toggleChevron("mb_view",0)'></i></td><td></td></tr>
|
||||
<tr class='mb_view' style='display:none'><td></td><td colspan='3'><?=$board?><br><?=$bios?><br><?=$biosdate?></td><td></td></tr>
|
||||
</tbody>
|
||||
|
||||
<tbody>
|
||||
<tr><td></td><td colspan='3' class='next'><i class='icon-cpu'></i><div class='section'>Processor<br>
|
||||
<span style='display:inline-block;width:80px'>Load: <span class='cpu'>0%</span></span><span id='cpu-temp'></span><br><br></div>
|
||||
@@ -180,7 +201,6 @@ foreach ($cpus as $pair) {
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
|
||||
<tbody>
|
||||
<tr><td></td><td colspan='3' class='next'><i class='icon-ram'></i><div class='section'>Memory<br><span><?="$memory_installed $unit $memory_type $ecc"?><span style='margin-left:20px'>Utilization: <span class='sys0'>0%</span></span><br><br></div>
|
||||
<i class='fa blue-text chevron' id='mem_view' onclick='toggleChevron("mem_view",0)'></i></td><td></td></tr>
|
||||
@@ -189,7 +209,6 @@ foreach ($cpus as $pair) {
|
||||
<tr class='mem_view' style='display:none'><td></td><td>Usable size: <?=my_scale($total,$unit,1,null,1024)." $unit"?></td><td><i>Log: </i><span class='sys2'>0%</span><div class='usage-disk sys mm'><span id='sys2' style='width:0'></span></div></td>
|
||||
<td><?if (exec("df /var/lib/docker|grep -om1 '^/'")):?><i>Docker: </i><span class='sys3'>0%</span><div class='usage-disk sys mm'><span id='sys3' style='width:0'></span></div><?endif;?></td><td></td></tr>
|
||||
</tbody>
|
||||
|
||||
<tbody>
|
||||
<tr><td></td><td colspan='3' class='next'><i class='icon-ethernet'></i><div class='section'>Interface<br>
|
||||
<select name="port_select" size="1" onchange="portSelect(this.value)">
|
||||
@@ -226,7 +245,6 @@ foreach ($ports as $port) {
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
|
||||
<?if ($fans>0) {
|
||||
echo "<tbody>";
|
||||
echo "<tr><td></td><td colspan='3' class='next'><i class='icon-fan'></i><div class='section'>Airflow<br><span>Fan count: $fans</span><br><br></div><i class='fa blue-text chevron' id='fan_view' onclick='toggleChevron(\"fan_view\",0)'></i></td><td></td></tr>";
|
||||
@@ -238,41 +256,21 @@ foreach ($ports as $port) {
|
||||
}?>
|
||||
</table>
|
||||
|
||||
<table class='share_status dashboard box2'>
|
||||
<thead><tr><td></td><td colspan='5'>Parity<i class='fa blue-text chevron mt0' id='parity_view' onclick='toggleChevron("parity_view",0)'></i><span class='info title'></span></td><td></td></tr></thead>
|
||||
|
||||
<tbody class='parity_view' style='display:none'>
|
||||
<tr><td></td><td colspan='5' id='parity'></td><td></td></tr>
|
||||
<tr><td></td><td colspan='5' id='program'></td><td></td></tr>
|
||||
</tbody>
|
||||
|
||||
<thead><tr><td></td><td colspan='5' class='next'>Array<?if (!$started):?> not started<?endif;?><i class='fa blue-text chevron mt0' id='array_view' onclick='toggleChevron("array_view",0)'></i>
|
||||
<?if ($started):?><span class='info'><?=my_scale($array_used*1024,$unit)." $unit"?> used of <?=my_scale($array_size*1024,$unit,-1,-1)." $unit"?> (<?=$array_percent?> %)</span><?endif;?>
|
||||
</td><td></td></tr>
|
||||
<tr style='display:none'><td></td><td id='array_info' colspan='5'></td><td></td></tr>
|
||||
<tr id='array_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
||||
</thead>
|
||||
<tbody class='array_view' id='array_list' style='display:none'></tbody>
|
||||
|
||||
<thead><tr><td></td><td colspan='5' class='next'>Cache<?if (!$started):?> not started<?endif;?><i class='fa blue-text chevron mt0' id='cache_view' onclick='toggleChevron("cache_view",0)'></i>
|
||||
<?if ($started):?><span class='info'><?=my_scale($cache_used*1024,$unit)." $unit"?> used of <?=my_scale($cache_size*1024,$unit,-1,-1)." $unit"?> (<?=$cache_percent?> %)</span><?endif;?>
|
||||
</td><td></td></tr>
|
||||
<tr style='display:none'><td></td><td id='cache_info' colspan='5'></td><td></td></tr>
|
||||
<tr id='cache_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
||||
</thead>
|
||||
<tbody class='cache_view' id='cache_list' style='display:none'></tbody>
|
||||
|
||||
<?if ($devs):?>
|
||||
<thead><tr><td></td><td colspan='5' class='next'>Extra<i class='fa blue-text chevron mt0' id='extra_view' onclick='toggleChevron("extra_view",0)'></i><span class='info'></span></td><td></td></tr>
|
||||
<tr style='display:none'><td></td><td id='extra_info' colspan='5'></td><td></td></tr>
|
||||
<tr id='extra_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
||||
</thead>
|
||||
<tbody class='extra_view' id='extra_list' style='display:none'></tbody>
|
||||
<?endif;?>
|
||||
</table>
|
||||
|
||||
<table class='share_status dashboard box3'>
|
||||
<thead><tr><td></td><td colspan='4'>Shares<i class='fa blue-text chevron mt0' id='shares_view' onclick='toggleChevron("shares_view",4)'></i>
|
||||
<?if ($display['dashapps']!='none'):?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='docker'):?>
|
||||
<thead><tr><td></td><td colspan='4'>Docker Containers<i class='fa blue-text chevron mt0' id='docker_view' onclick='toggleChevron("docker_view",0)'></i><span class='info apps'><input type='checkbox' id='apps'></span></td><td></td></tr></thead>
|
||||
<tbody class='docker_view' style='display:none'>
|
||||
</tbody>
|
||||
<?endif;?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='vms'):?>
|
||||
<thead><tr><td></td><td colspan='4' class='next'>Virtual Machines<i class='fa blue-text chevron mt0' id='vm_view' onclick='toggleChevron("vm_view",0)'></i><span class='info vms'><input type='checkbox' id='vms'></span></td><td></td></tr></thead>
|
||||
<tbody class='vm_view' style='display:none'>
|
||||
</tbody>
|
||||
<?endif;?>
|
||||
<tbody class='split'><tr><td colspan='6'></td></tr></tbody>
|
||||
<?endif;?>
|
||||
<thead><tr><td></td><td colspan='4' class='next'>Shares<i class='fa blue-text chevron mt0' id='shares_view' onclick='toggleChevron("shares_view",4)'></i>
|
||||
<span class='info'>Share count: <?=count($shares)?> with <?=$cache_only?> cache only and <?=$encrypted?> encrypted</span>
|
||||
<?if ($group):?>
|
||||
<select name="enter_share" size="1" onchange="changeMode(this.value)">
|
||||
@@ -290,7 +288,6 @@ foreach ($ports as $port) {
|
||||
</td><td></td></tr>
|
||||
<tr id='shares_view_on' style='display:none'><td></td><td>Name</td><td>Description</td><td>Security</td><td>Streams</td><td></td></tr>
|
||||
</thead>
|
||||
|
||||
<?if ($var['shareSMBEnabled']=='yes'):?>
|
||||
<tbody class='smb share share1' style='display:none'><?
|
||||
$i = 0;
|
||||
@@ -306,7 +303,6 @@ foreach ($shares as $name => $share) {
|
||||
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<?if ($var['shareAFPEnabled']=='yes'):?>
|
||||
<tbody class='afp share share2' style='display:none'><?
|
||||
foreach ($shares as $name => $share) {
|
||||
@@ -320,7 +316,6 @@ foreach ($shares as $name => $share) {
|
||||
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<?if ($var['shareNFSEnabled']=='yes'):?>
|
||||
<tbody class='nfs share share3' style='display:none'><?
|
||||
foreach ($shares as $name => $share) {
|
||||
@@ -334,7 +329,6 @@ foreach ($shares as $name => $share) {
|
||||
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<?if (!$group):?>
|
||||
<tbody><?
|
||||
foreach ($shares as $name => $share) {
|
||||
@@ -347,10 +341,9 @@ foreach ($shares as $name => $share) {
|
||||
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<thead><tr><td></td><td class='next' colspan='4'>Users<i class='fa blue-text chevron mt0' id='users_view' onclick='toggleChevron("users_view",3)'></i><span class='info'>User count: <?=count($users)?> with <?=$nopass?> unprotected</span>
|
||||
<tbody class='split'><tr><td colspan='6'></td></tr></tbody>
|
||||
<thead><tr><td></td><td colspan='4'>Users<i class='fa blue-text chevron mt0' id='users_view' onclick='toggleChevron("users_view",3)'></i><span class='info'>User count: <?=count($users)?> with <?=$nopass?> unprotected</span>
|
||||
</td><td></td></tr><tr id='users_view_on' style='display:none'><td></td><td>Name</td><td>Description</td><td>Write</td><td>Read</td><td></td></tr></thead>
|
||||
|
||||
<?if ($var['shareSMBEnabled']=='yes'):?>
|
||||
<tbody class='smb user user1' style='display:none'><?
|
||||
foreach ($users as $user) {
|
||||
@@ -370,7 +363,6 @@ foreach ($users as $user) {
|
||||
}
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<?if ($var['shareAFPEnabled']=='yes'):?>
|
||||
<tbody class='afp user user2' style='display:none'><?
|
||||
foreach ($users as $user) {
|
||||
@@ -390,7 +382,6 @@ foreach ($users as $user) {
|
||||
}
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<?if ($var['shareNFSEnabled']=='yes'):?>
|
||||
<tbody class='nfs user user3' style='display:none'><?
|
||||
foreach ($users as $user) {
|
||||
@@ -402,7 +393,6 @@ foreach ($users as $user) {
|
||||
}
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
|
||||
<?if (!$group):?>
|
||||
<tbody><?
|
||||
foreach ($users as $user) {
|
||||
@@ -414,7 +404,39 @@ foreach ($users as $user) {
|
||||
?></tbody>
|
||||
<?endif;?>
|
||||
</table>
|
||||
|
||||
<table class='share_status dashboard box2'>
|
||||
<thead><tr><td></td><td colspan='5'>Parity<i class='fa blue-text chevron mt0' id='parity_view' onclick='toggleChevron("parity_view",0)'></i><span class='info title'></span></td><td></td></tr></thead>
|
||||
<tbody class='parity_view' style='display:none'>
|
||||
<tr><td></td><td colspan='5' id='parity'></td><td></td></tr>
|
||||
<tr><td></td><td colspan='5' id='program'></td><td></td></tr>
|
||||
</tbody>
|
||||
<thead><tr><td></td><td colspan='5' class='next'>Array<?if (!$started):?> not started<?endif;?><i class='fa blue-text chevron mt0' id='array_view' onclick='toggleChevron("array_view",0)'></i>
|
||||
<?if ($started):?><span class='info'><?=my_scale($array_used*1024,$unit)." $unit"?> used of <?=my_scale($array_size*1024,$unit,-1,-1)." $unit"?> (<?=$array_percent?> %)</span><?endif;?>
|
||||
</td><td></td></tr>
|
||||
<tr style='display:none'><td></td><td id='array_info' colspan='5'></td><td></td></tr>
|
||||
<tr id='array_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
||||
</thead>
|
||||
<tbody class='array_view' id='array_list' style='display:none'></tbody>
|
||||
<?if (isset($disks['cache'])):?>
|
||||
<thead><tr><td></td><td colspan='5' class='next'>Cache<?if (!$started):?> not started<?endif;?><i class='fa blue-text chevron mt0' id='cache_view' onclick='toggleChevron("cache_view",0)'></i>
|
||||
<?if ($started):?><span class='info'><?=my_scale($cache_used*1024,$unit)." $unit"?> used of <?=my_scale($cache_size*1024,$unit,-1,-1)." $unit"?> (<?=$cache_percent?> %)</span><?endif;?>
|
||||
</td><td></td></tr>
|
||||
<tr style='display:none'><td></td><td id='cache_info' colspan='5'></td><td></td></tr>
|
||||
<tr id='cache_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
||||
</thead>
|
||||
<tbody class='cache_view' id='cache_list' style='display:none'></tbody>
|
||||
<?endif;?>
|
||||
<?if ($devs):?>
|
||||
<thead><tr><td></td><td colspan='5' class='next'>Extra<i class='fa blue-text chevron mt0' id='extra_view' onclick='toggleChevron("extra_view",0)'></i><span class='info'></span></td><td></td></tr>
|
||||
<tr style='display:none'><td></td><td id='extra_info' colspan='5'></td><td></td></tr>
|
||||
<tr id='extra_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
||||
</thead>
|
||||
<tbody class='extra_view' id='extra_list' style='display:none'></tbody>
|
||||
<?endif;?>
|
||||
</table>
|
||||
</div>
|
||||
<div id="iframe-popup" style="display:none;-webkit-overflow-scrolling:touch"></div>
|
||||
<script>
|
||||
var timer30 = null;
|
||||
var orange = 70;
|
||||
@@ -422,6 +444,38 @@ var red = 90;
|
||||
var timestamp = 0, rx_bytes = 0, tx_bytes = 0;
|
||||
var port_select = $.cookie('port_select')||'<?=$ports[0]?>';
|
||||
|
||||
function noApps() {
|
||||
if ($('span.outer.apps:visible').length==0) $('#no_apps').show(); else $('#no_apps').hide();
|
||||
}
|
||||
function noVMs() {
|
||||
if ($('span.outer.vms:visible').length==0) $('#no_vms').show(); else $('#no_vms').hide();
|
||||
}
|
||||
function loadlist(init) {
|
||||
if (init) {
|
||||
$('#apps').switchButton({show_labels:false, checked:$.cookie('my_apps')=='startedOnly'});
|
||||
$('#vms').switchButton({show_labels:false, checked:$.cookie('my_vms')=='startedOnly'});
|
||||
$('#apps').change(function(){
|
||||
$('span.outer.apps.stopped').finish().toggle('fast',function(){noApps();})
|
||||
$('#apps').is(':checked') ? $.cookie('my_apps','startedOnly',{expires:3650}) : $.removeCookie('my_apps');
|
||||
});
|
||||
$('#vms').change(function(){
|
||||
$('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?>',vm:'<?=$libvirtd?>'},function(d) {
|
||||
var data = d.split(/\0/);
|
||||
$('.docker_view').html(data[0]);
|
||||
$('.vm_view').html(data[1]);
|
||||
var script = document.createElement('script');
|
||||
script.innerHTML = data[2];
|
||||
document.head.appendChild(script);
|
||||
if ($.cookie('my_apps')!=null) $('span.apps.stopped').hide(0,function(){noApps();});
|
||||
if ($.cookie('my_vms')!=null) $('span.vms.stopped').hide(0,function(){noVMs();});
|
||||
context.init({preventDoubleContext:false,left:true,above:false});
|
||||
});
|
||||
}
|
||||
function setCase() {
|
||||
$.post('/webGui/include/SelectCase.php',{mode:'get',file:'<?=$myfile?>'},function(model){
|
||||
if (model) {
|
||||
@@ -651,6 +705,14 @@ function toggleView(field,init,view) {
|
||||
var off = $('#'+field+'_off');
|
||||
if (visible) {on.show(); off.hide();} else {off.show(); on.hide();}
|
||||
break;
|
||||
case 'docker_view':
|
||||
if (visible) $('span.apps').show(); else $('span.apps').hide();
|
||||
if (init) setTimeout(noApps,200); else noApps();
|
||||
break;
|
||||
case 'vm_view':
|
||||
if (visible) $('span.vms').show(); else $('span.vms').hide();
|
||||
if (init) setTimeout(noVMs,200); else noVMs();
|
||||
break;
|
||||
}
|
||||
if (init) {
|
||||
var chevron = visible ? 'fa-chevron-up' : 'fa-chevron-down';
|
||||
@@ -693,6 +755,12 @@ $(function() {
|
||||
toggleView('port_view',true);
|
||||
<?if ($fans>0):?>
|
||||
toggleView('fan_view',true);
|
||||
<?endif;?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='docker'):?>
|
||||
toggleView('docker_view',true);
|
||||
<?endif;?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='vms'):?>
|
||||
toggleView('vm_view',true);
|
||||
<?endif;?>
|
||||
toggleView('parity_view',true);
|
||||
toggleView('array_view',true);
|
||||
@@ -703,7 +771,7 @@ $(function() {
|
||||
toggleView('users_view',true);
|
||||
toggleView('shares_view',true);
|
||||
portMenu();
|
||||
context.init({preventDoubleContext:false,left:true,above:false});
|
||||
loadlist(true);
|
||||
cpuload.start();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
Menu="Dashboard:1"
|
||||
Title="Apps"
|
||||
Tag="map"
|
||||
Cond="(((pgrep('dockerd')!==false) || (pgrep('libvirtd')!==false)) && ($display['dashapps']!='none'))"
|
||||
Markdown="false"
|
||||
---
|
||||
<?
|
||||
$width = strstr('white,black',$display['theme']) ? -58: -44;
|
||||
?>
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.ui.css')?>">
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.switchbutton.css')?>">
|
||||
<style>
|
||||
body{-webkit-overflow-scrolling:touch}
|
||||
label{display:inline}
|
||||
iframe{overflow:scroll;-webkit-overflow-scrolling:touch}
|
||||
h2{color:#625D5D;letter-spacing:0;font-size:3.2rem;line-height:1.2em;font-weight:300;padding:0 0 20px;margin:0}
|
||||
.iconstatus{position:absolute;z-index:2;bottom:-4px;right:-4px;font-size:1.4rem;text-shadow:0 0 2px #FFF}
|
||||
img.started{opacity:1.0}
|
||||
img.stopped{opacity:0.3}
|
||||
img.paused{opacity:0.6}
|
||||
.started{color:#009900}
|
||||
.stopped{color:#EF3D47}
|
||||
.paused{color:#F0DD33}
|
||||
.update{color:#3300FF}
|
||||
.show{display:block}
|
||||
div.Panel{float:none;display:inline-block;margin:0 18px 15px 0;height:90px;overflow:hidden;vertical-align:top;width:94px;word-wrap:break-word;border:none}
|
||||
div.Panel:hover{overflow:visible;z-index:10;background-color:unset}
|
||||
#noapps{display:none;font-style:italic;font-size:1.4rem;opacity:0.5;padding:5px}
|
||||
.switch-button-label.off{color:inherit}
|
||||
.switch-button-label.on{color:#009900}
|
||||
</style>
|
||||
<form method="POST" id="formStartStop" action="/update.php" target="progressFrame">
|
||||
<input type="hidden" id="cmdStartStop" name="#command" value="">
|
||||
<input type="hidden" id="cmdArg1" name="#arg[1]" value="">
|
||||
<input type="hidden" id="cmdArg2" name="#arg[2]" value="">
|
||||
</form>
|
||||
<form method="POST" id="formAutostart" action="/plugins/dynamix.docker.manager/include/UpdateConfig.php" target="progressFrame">
|
||||
<input type="hidden" name="action" value="autostart" />
|
||||
<input type="hidden" name="container" value="none" />
|
||||
</form>
|
||||
<div id="dialog-confirm" style="display:none;" title="Dialog Title"></div>
|
||||
<div id="iframe-popup" style="display:none;-webkit-overflow-scrolling:touch;"></div>
|
||||
<span class="status" style="margin-top:<?=$width?>px;margin-right:0"><input type="checkbox" class="appview"></span>
|
||||
<div id="apps_icons" style="display:none"></div><div id="noapps">No apps available to show</div>
|
||||
|
||||
<script src="<?autov('/webGui/javascript/jquery.switchbutton.js')?>"></script>
|
||||
<script src="<?autov('/plugins/dynamix.docker.manager/javascript/docker.js')?>"></script>
|
||||
<script src="<?autov('/plugins/dynamix.vm.manager/javascript/vmmanager.js')?>"></script>
|
||||
<script>
|
||||
function loadlist() {
|
||||
$.post('/webGui/include/DashboardApps.php',{display:'<?=$display['dashapps']?>'},function(d) {
|
||||
var data = d.split(/\0/);
|
||||
$('#apps_icons').html(data[0]);
|
||||
$('head').append('<script>'+data[1]+'<\/script>');
|
||||
if ($.cookie('dashapps_view_mode')=='startedonly') {
|
||||
$('.Panel.stopped').hide();
|
||||
if ($('.Panel.started').length===0 && $('.Panel.paused').length===0) $('#noapps').show();
|
||||
}
|
||||
if ($('.Panel').length===0) $('#noapps').show();
|
||||
$('#apps_icons').slideDown('fast');
|
||||
context.init({preventDoubleContext:false,left:true,above:false});
|
||||
});
|
||||
}
|
||||
$(function() {
|
||||
$('.appview').switchButton({labels_placement:"left", on_label:'Started Only', off_label:'All Apps', checked:$.cookie('dashapps_view_mode') == 'startedonly'});
|
||||
$('.appview').change(function() {
|
||||
$('.Panel.stopped').finish().toggle('fast');
|
||||
if ($('.Panel').length===0 || ($('.appview').is(':checked') && $('.Panel.started').length===0 && $('.Panel.paused').length===0)) {
|
||||
$('#noapps').slideDown('fast');
|
||||
} else {
|
||||
$('#noapps').slideUp('fast');
|
||||
}
|
||||
$.cookie('dashapps_view_mode',$('.appview').is(':checked') ? 'startedonly':'allapps',{expires:3650});
|
||||
});
|
||||
loadlist();
|
||||
});
|
||||
</script>
|
||||
@@ -13,80 +13,109 @@
|
||||
?>
|
||||
<?
|
||||
$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";
|
||||
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
|
||||
|
||||
$display = $_POST['display'];
|
||||
$menu = [];
|
||||
|
||||
if (pgrep('dockerd')!==false && ($display=='icons' || $display=='docker')) {
|
||||
$user_prefs = $dockerManPaths['user-prefs'];
|
||||
$DockerClient = new DockerClient();
|
||||
$DockerTemplates = new DockerTemplates();
|
||||
$containers = $DockerClient->getDockerContainers();
|
||||
$allInfo = $DockerTemplates->getAllInfo();
|
||||
|
||||
if (file_exists($user_prefs)) {
|
||||
$prefs = parse_ini_file($user_prefs); $sort = [];
|
||||
foreach ($containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
|
||||
array_multisort($sort,SORT_NUMERIC,$containers);
|
||||
}
|
||||
|
||||
foreach ($containers as $ct) {
|
||||
$name = $ct['Name'];
|
||||
$id = $ct['Id'];
|
||||
$info = &$allInfo[$name];
|
||||
$running = $info['running'] ? 1:0;
|
||||
$paused = $info['paused'] ? 1:0;
|
||||
$is_autostart = $info['autostart'] ? 'true':'false';
|
||||
$updateStatus = $info['updated']=='true'||$info['updated']=='undef' ? 'true':'false';
|
||||
$template = $info['template'];
|
||||
$shell = $info['shell'];
|
||||
$webGui = html_entity_decode($info['url']);
|
||||
$support = html_entity_decode($info['Support']);
|
||||
$project = html_entity_decode($info['Project']);
|
||||
$menu[] = sprintf("addDockerContainerContext('%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));
|
||||
$shape = $running ? ($paused ? 'pause' : 'play') : 'square';
|
||||
$status = $running ? ($paused ? 'paused' : 'started') : 'stopped';
|
||||
$icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png';
|
||||
echo "<div id='$id' class='Panel $status' style='cursor:pointer'>";
|
||||
echo "<div style='display:block'><div style='position:relative;width:48px;height:48px;margin:0px auto;'>";
|
||||
echo "<img src='$icon' class='$status' style='position:absolute;top:0;bottom:0;left:0;right:0;width:48px;height:48px;'><i class='fa iconstatus fa-$shape $status' title='$status'></i></div></div>";
|
||||
echo "<div class='PanelText'><span class='PanelText ".($updateStatus=='false'?'update':$status)."'>$name</span></div></div>";
|
||||
}
|
||||
}
|
||||
|
||||
if (pgrep('libvirtd')!==false && ($display=='icons' || $display=='vms')) {
|
||||
$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
|
||||
$vms = $lv->get_domains();
|
||||
if (file_exists($user_prefs)) {
|
||||
$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);
|
||||
}
|
||||
foreach ($vms as $vm) {
|
||||
$res = $lv->get_domain_by_name($vm);
|
||||
$uuid = libvirt_domain_get_uuid_string($res);
|
||||
$dom = $lv->domain_get_info($res);
|
||||
$id = $lv->domain_get_id($res);
|
||||
$state = $lv->domain_state_translate($dom['state']);
|
||||
$vncport = $lv->domain_get_vnc_port($res);
|
||||
$vnc = '';
|
||||
if ($vncport > 0) {
|
||||
$wsport = $lv->domain_get_ws_port($res);
|
||||
$vnc = '/plugins/dynamix.vm.manager/vnc.html?autoconnect=true&host='.$_SERVER['HTTP_HOST'].'&port=&path=/wsproxy/'.$wsport.'/';
|
||||
} else {
|
||||
$vncport = ($vncport < 0) ? "auto" : "";
|
||||
if ($display=='icons' || $display=='docker') {
|
||||
echo "<tr><td></td><td colspan='4'>";
|
||||
if ($_POST['docker']) {
|
||||
$user_prefs = $dockerManPaths['user-prefs'];
|
||||
$DockerClient = new DockerClient();
|
||||
$DockerTemplates = new DockerTemplates();
|
||||
$containers = $DockerClient->getDockerContainers();
|
||||
$allInfo = $DockerTemplates->getAllInfo();
|
||||
if (file_exists($user_prefs)) {
|
||||
$prefs = parse_ini_file($user_prefs); $sort = [];
|
||||
foreach ($containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
|
||||
array_multisort($sort,SORT_NUMERIC,$containers);
|
||||
}
|
||||
$template = $lv->_get_single_xpath_result($res, '//domain/metadata/*[local-name()=\'vmtemplate\']/@name');
|
||||
if (empty($template)) $template = 'Custom';
|
||||
$log = (is_file("/var/log/libvirt/qemu/$vm.log") ? "libvirt/qemu/$vm.log" : '');
|
||||
$menu[] = sprintf("addVMContext('%s','%s','%s','%s','%s','%s');", addslashes($vm), addslashes($uuid), addslashes($template), $state, addslashes($vnc), addslashes($log));
|
||||
$vmicon = $lv->domain_get_icon_url($res);
|
||||
echo renderVMContentIcon($uuid, $vm, $vmicon, $state, true);
|
||||
foreach ($containers as $ct) {
|
||||
$name = $ct['Name'];
|
||||
$id = $ct['Id'];
|
||||
$info = &$allInfo[$name];
|
||||
$running = $info['running'] ? 1:0;
|
||||
$paused = $info['paused'] ? 1:0;
|
||||
$is_autostart = $info['autostart'] ? 'true':'false';
|
||||
$updateStatus = $info['updated']=='true'||$info['updated']=='undef' ? 'true':'false';
|
||||
$template = $info['template'];
|
||||
$shell = $info['shell'];
|
||||
$webGui = html_entity_decode($info['url']);
|
||||
$support = html_entity_decode($info['Support']);
|
||||
$project = html_entity_decode($info['Project']);
|
||||
$menu[] = sprintf("addDockerContainerContext('%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));
|
||||
$shape = $running ? ($paused ? 'pause' : 'play') : 'square';
|
||||
$status = $running ? ($paused ? 'paused' : 'started') : 'stopped';
|
||||
$update = $updateStatus=='false' ? 'update' : '';
|
||||
$icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png';
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
echo "<span id='$id' class='outer apps $status'>$image<span class='inner'><span class='$update'>$name</span><br><i class='fa fa-$shape $status'></i><span class='state'>$status</span></span></span>";
|
||||
}
|
||||
$none = count($containers) ? "No running docker containers" : "No docker containers defined";
|
||||
echo "<span id='no_apps' style='display:none'>$none<br><br></span>";
|
||||
} else {
|
||||
echo "Docker service not running<br><br>";
|
||||
}
|
||||
echo "</td><td></td></tr>";
|
||||
}
|
||||
echo "\0".implode($menu);
|
||||
echo "\0";
|
||||
if ($display=='icons' || $display=='vms') {
|
||||
echo "<tr><td></td><td colspan='4'>";
|
||||
if ($_POST['vm']) {
|
||||
$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
|
||||
$vms = $lv->get_domains();
|
||||
if (file_exists($user_prefs)) {
|
||||
$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);
|
||||
}
|
||||
foreach ($vms as $vm) {
|
||||
$res = $lv->get_domain_by_name($vm);
|
||||
$uuid = libvirt_domain_get_uuid_string($res);
|
||||
$dom = $lv->domain_get_info($res);
|
||||
$id = $lv->domain_get_id($res);
|
||||
$state = $lv->domain_state_translate($dom['state']);
|
||||
$vncport = $lv->domain_get_vnc_port($res);
|
||||
$vnc = '';
|
||||
if ($vncport > 0) {
|
||||
$wsport = $lv->domain_get_ws_port($res);
|
||||
$vnc = '/plugins/dynamix.vm.manager/vnc.html?autoconnect=true&host='.$_SERVER['HTTP_HOST'].'&port=&path=/wsproxy/'.$wsport.'/';
|
||||
} else {
|
||||
$vncport = ($vncport < 0) ? "auto" : "";
|
||||
}
|
||||
$template = $lv->_get_single_xpath_result($res, '//domain/metadata/*[local-name()=\'vmtemplate\']/@name');
|
||||
if (empty($template)) $template = 'Custom';
|
||||
$log = (is_file("/var/log/libvirt/qemu/$vm.log") ? "libvirt/qemu/$vm.log" : '');
|
||||
$menu[] = sprintf("addVMContext('%s','%s','%s','%s','%s','%s');", addslashes($vm), addslashes($uuid), addslashes($template), $state, addslashes($vnc), addslashes($log));
|
||||
$icon = $lv->domain_get_icon_url($res);
|
||||
switch ($state) {
|
||||
case 'running':
|
||||
$shape = 'play';
|
||||
$status = 'started';
|
||||
break;
|
||||
case 'paused':
|
||||
case 'pmsuspended':
|
||||
$shape = 'pause';
|
||||
$status = 'paused';
|
||||
break;
|
||||
default:
|
||||
$shape = 'square';
|
||||
$status = 'stopped';
|
||||
break;
|
||||
}
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
echo "<span id='vm-$uuid' class='outer vms $status'>$image<span class='inner'>$vm<br><i class='fa fa-$shape $status'></i><span class='state'>$status</span></span></span>";
|
||||
}
|
||||
$none = count($vms) ? "No running virtual machines" : "No virtual machines defined";
|
||||
echo "<span id='no_vms' style='display:none'>$none<br><br></span>";
|
||||
} else {
|
||||
echo "VM service not running<br><br>";
|
||||
}
|
||||
echo "</td><td></td></tr>";
|
||||
}
|
||||
echo "\0";
|
||||
echo implode($menu);
|
||||
|
||||
@@ -162,6 +162,8 @@ table.share_status.dashboard tbody tr>td{border-top:1px solid #f3f0f4}
|
||||
table.share_status.dashboard tbody tr>td:first-child{border-top:none}
|
||||
table.share_status.dashboard tbody tr>td:last-child{border-top:none}
|
||||
table.share_status.dashboard tbody tr>td.next{border-top:1px solid #606e7f}
|
||||
table.share_status.dashboard tbody.split{border-top:1px solid #606e7f;border-bottom:1px solid #606e7f;background-color:#e4e2e4}
|
||||
table.share_status.dashboard tbody.split td{border-left:1px solid #e4e2e4;border-right:1px solid #e4e2e4;height:normal;line-height:normal}
|
||||
table.share_status.dashboard tr>td:first-child{width:3.5%}
|
||||
table.share_status.dashboard tr>td:last-child{width:3.5%}
|
||||
table.share_status.dashboard tr>td{padding-left:4px}
|
||||
|
||||
@@ -150,11 +150,13 @@ table.share_status.share tr td:last-child{width:4%;text-align:right;padding-righ
|
||||
table.share_status.fixed tr>td+td{min-width:39px;font-size:1.1rem;text-align:center;padding:0}
|
||||
table.share_status.table{margin-top:36px}
|
||||
table.share_status.table tr>td{width:50%}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #2b2b2b;box-shadow:3px 3px 12px #202020}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #2b2b2b}
|
||||
table.share_status.dashboard thead tr:last-child{border-bottom:none}
|
||||
table.share_status.dashboard thead tr:first-child>td{background-color:transparent;height:4rem;line-height:4rem;font-size:1.6rem;font-weight:bold;letter-spacing:1.8px;text-transform:capitalize;vertical-align:middle}
|
||||
table.share_status.dashboard tbody tr:nth-child(even){background-color:transparent}
|
||||
table.share_status.dashboard tbody td{padding-top:5px;padding-bottom:5px}
|
||||
table.share_status.dashboard tbody.split{border-top:1px solid #2b2b2b;border-bottom:1px solid #2b2b2b;background-color:#1c1b1b}
|
||||
table.share_status.dashboard tbody.split td{border-left:1px solid #1c1b1b;border-right:1px solid #1c1b1b;height:10px}
|
||||
table.share_status.dashboard tbody.parity_view tr:last-child>td{padding-bottom:20px}
|
||||
table.share_status.dashboard tbody.array_view tr:last-child>td{padding-bottom:20px}
|
||||
table.share_status.dashboard tbody.cache_view tr:last-child>td{padding-bottom:20px}
|
||||
|
||||
@@ -162,6 +162,8 @@ table.share_status.dashboard tbody tr>td{border-top:1px solid #0c0f0b}
|
||||
table.share_status.dashboard tbody tr>td:first-child{border-top:none}
|
||||
table.share_status.dashboard tbody tr>td:last-child{border-top:none}
|
||||
table.share_status.dashboard tbody tr>td.next{border-top:1px solid #606e7f}
|
||||
table.share_status.dashboard tbody.split{border-top:1px solid #606e7f;border-bottom:1px solid #606e7f;background-color:#1b1d1b}
|
||||
table.share_status.dashboard tbody.split td{border-left:1px solid #1b1d1b;border-right:1px solid #1b1d1b;height:normal;line-height:normal}
|
||||
table.share_status.dashboard tr>td:first-child{width:3.5%}
|
||||
table.share_status.dashboard tr>td:last-child{width:3.5%}
|
||||
table.share_status.dashboard tr>td{padding-left:4px}
|
||||
|
||||
@@ -150,11 +150,13 @@ table.share_status.share tr td:last-child{width:4%;text-align:right;padding-righ
|
||||
table.share_status.fixed tr>td+td{min-width:39px;font-size:1.1rem;text-align:center;padding:0}
|
||||
table.share_status.table{margin-top:36px}
|
||||
table.share_status.table tr>td{width:50%}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #e3e3e3;box-shadow:3px 3px 12px #dfdfdf}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #e3e3e3}
|
||||
table.share_status.dashboard thead tr:last-child{border-bottom:none}
|
||||
table.share_status.dashboard thead tr:first-child>td{background-color:transparent;height:4rem;line-height:4rem;font-size:1.6rem;font-weight:bold;letter-spacing:1.8px;text-transform:capitalize;vertical-align:middle}
|
||||
table.share_status.dashboard tbody tr:nth-child(even){background-color:transparent}
|
||||
table.share_status.dashboard tbody td{padding-top:5px;padding-bottom:5px}
|
||||
table.share_status.dashboard tbody.split{border-top:1px solid #e3e3e3;border-bottom:1px solid #e3e3e3;background-color:#f2f2f2}
|
||||
table.share_status.dashboard tbody.split td{border-left:1px solid #f2f2f2;border-right:1px solid #f2f2f2;height:10px}
|
||||
table.share_status.dashboard tbody.parity_view tr:last-child>td{padding-bottom:20px}
|
||||
table.share_status.dashboard tbody.array_view tr:last-child>td{padding-bottom:20px}
|
||||
table.share_status.dashboard tbody.cache_view tr:last-child>td{padding-bottom:20px}
|
||||
|
||||
Reference in New Issue
Block a user