Dashboard: boxed apps

This commit is contained in:
bergware
2019-01-10 21:28:46 +01:00
parent 13bcdc7a2c
commit f5459a1e1f
7 changed files with 226 additions and 198 deletions
+119 -51
View File
@@ -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>
-77
View File
@@ -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>
+97 -68
View File
@@ -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);
+2
View File
@@ -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}
+3 -1
View File
@@ -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}
+2
View File
@@ -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}
+3 -1
View File
@@ -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}