CC-2363: Diagnostic screen in Web UI
-everything working
This commit is contained in:
parent
3a2eaecad8
commit
046f98db8f
9 changed files with 345 additions and 102 deletions
|
@ -657,13 +657,14 @@ class ApiController extends Zend_Controller_Action
|
||||||
"platform"=>Application_Model_Systemstatus::GetPlatformInfo(),
|
"platform"=>Application_Model_Systemstatus::GetPlatformInfo(),
|
||||||
"airtime_version"=>Application_Model_Systemstatus::GetAirtimeVersion(),
|
"airtime_version"=>Application_Model_Systemstatus::GetAirtimeVersion(),
|
||||||
"services"=>array(
|
"services"=>array(
|
||||||
Application_Model_Systemstatus::GetIcecastStatus(),
|
"icecast2"=>Application_Model_Systemstatus::GetIcecastStatus(),
|
||||||
Application_Model_Systemstatus::GetRabbitMqStatus(),
|
"rabbitmq"=>Application_Model_Systemstatus::GetRabbitMqStatus(),
|
||||||
Application_Model_Systemstatus::GetPypoStatus(),
|
"pypo"=>Application_Model_Systemstatus::GetPypoStatus(),
|
||||||
Application_Model_Systemstatus::GetLiquidsoapStatus(),
|
"liquidsoap"=>Application_Model_Systemstatus::GetLiquidsoapStatus(),
|
||||||
Application_Model_Systemstatus::GetShowRecorderStatus(),
|
"show_recorder"=>Application_Model_Systemstatus::GetShowRecorderStatus(),
|
||||||
Application_Model_Systemstatus::GetMediaMonitorStatus()
|
"media_monitor"=>Application_Model_Systemstatus::GetMediaMonitorStatus()
|
||||||
)
|
),
|
||||||
|
"partitions"=>Application_Model_Systemstatus::GetDiskInfo()
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->view->status = $status;
|
$this->view->status = $status;
|
||||||
|
|
|
@ -8,11 +8,12 @@ class SystemstatusController extends Zend_Controller_Action
|
||||||
$baseUrl = $request->getBaseUrl();
|
$baseUrl = $request->getBaseUrl();
|
||||||
|
|
||||||
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/status/status.js','text/javascript');
|
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/status/status.js','text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/sprintf/sprintf-0.7-beta1.js','text/javascript');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function indexAction()
|
public function indexAction()
|
||||||
{
|
{
|
||||||
$status = array(
|
$services = array(
|
||||||
"pypo"=>Application_Model_Systemstatus::GetPypoStatus(),
|
"pypo"=>Application_Model_Systemstatus::GetPypoStatus(),
|
||||||
"liquidsoap"=>Application_Model_Systemstatus::GetLiquidsoapStatus(),
|
"liquidsoap"=>Application_Model_Systemstatus::GetLiquidsoapStatus(),
|
||||||
"show-recorder"=>Application_Model_Systemstatus::GetShowRecorderStatus(),
|
"show-recorder"=>Application_Model_Systemstatus::GetShowRecorderStatus(),
|
||||||
|
@ -21,7 +22,12 @@ class SystemstatusController extends Zend_Controller_Action
|
||||||
"icecast2"=>Application_Model_Systemstatus::GetIcecastStatus()
|
"icecast2"=>Application_Model_Systemstatus::GetIcecastStatus()
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->view->status = $status;
|
$partitions = Application_Model_Systemstatus::GetDiskInfo();
|
||||||
|
|
||||||
|
$this->view->status = new StdClass;
|
||||||
|
$this->view->status->services = $services;
|
||||||
|
$this->view->status->partitions = $partitions;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLogFileAction()
|
public function getLogFileAction()
|
||||||
|
|
|
@ -222,8 +222,7 @@ class MusicDir {
|
||||||
->find();
|
->find();
|
||||||
|
|
||||||
foreach($dirs as $dir) {
|
foreach($dirs as $dir) {
|
||||||
$tmp = new MusicDir($dir);
|
$result[] = new MusicDir($dir);
|
||||||
$result[] = $tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
|
|
|
@ -14,10 +14,14 @@ class Application_Model_Systemstatus
|
||||||
$result = curl_exec($ch);
|
$result = curl_exec($ch);
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
|
|
||||||
|
$docRoot = null;
|
||||||
|
if ($result != ""){
|
||||||
$xmlDoc = new DOMDocument();
|
$xmlDoc = new DOMDocument();
|
||||||
$xmlDoc->loadXML($result);
|
$xmlDoc->loadXML($result);
|
||||||
|
$docRoot = $xmlDoc->documentElement;
|
||||||
|
}
|
||||||
|
|
||||||
return $xmlDoc->documentElement;
|
return $docRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function ExtractServiceInformation($p_docRoot, $p_serviceName){
|
public static function ExtractServiceInformation($p_docRoot, $p_serviceName){
|
||||||
|
@ -25,20 +29,20 @@ class Application_Model_Systemstatus
|
||||||
$starting = array(
|
$starting = array(
|
||||||
"name"=>"",
|
"name"=>"",
|
||||||
"process_id"=>"STARTING...",
|
"process_id"=>"STARTING...",
|
||||||
"uptime_seconds"=>"STARTING...",
|
"uptime_seconds"=>"-1",
|
||||||
"status"=>true,
|
"status"=>true,
|
||||||
"memory_perc"=>"UNKNOWN",
|
"memory_perc"=>"0%",
|
||||||
"memory_kb"=>"UNKNOWN",
|
"memory_kb"=>"0",
|
||||||
"cpu_perc"=>"UNKNOWN");
|
"cpu_perc"=>"0%");
|
||||||
|
|
||||||
$notRunning = array(
|
$notRunning = array(
|
||||||
"name"=>"",
|
"name"=>$p_serviceName,
|
||||||
"process_id"=>"FAILED",
|
"process_id"=>"FAILED",
|
||||||
"uptime_seconds"=>"FAILED",
|
"uptime_seconds"=>"-1",
|
||||||
"status"=>false,
|
"status"=>false,
|
||||||
"memory_perc"=>"UNKNOWN",
|
"memory_perc"=>"0%",
|
||||||
"memory_kb"=>"UNKNOWN",
|
"memory_kb"=>"0",
|
||||||
"cpu_perc"=>"UNKNOWN"
|
"cpu_perc"=>"0%"
|
||||||
);
|
);
|
||||||
$data = $notRunning;
|
$data = $notRunning;
|
||||||
|
|
||||||
|
@ -174,6 +178,32 @@ class Application_Model_Systemstatus
|
||||||
public static function GetAirtimeVersion(){
|
public static function GetAirtimeVersion(){
|
||||||
return AIRTIME_VERSION;
|
return AIRTIME_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function GetDiskInfo(){
|
||||||
|
/* First lets get all the watched directories. Then we can group them
|
||||||
|
* into the same paritions by comparing the partition sizes. */
|
||||||
|
$musicDirs = MusicDir::getWatchedDirs();
|
||||||
|
$musicDirs[] = MusicDir::getStorDir();
|
||||||
|
|
||||||
|
|
||||||
|
$partions = array();
|
||||||
|
|
||||||
|
foreach($musicDirs as $md){
|
||||||
|
$totalSpace = disk_total_space($md->getDirectory());
|
||||||
|
|
||||||
|
if (!isset($partitions[$totalSpace])){
|
||||||
|
$partitions[$totalSpace] = new StdClass;
|
||||||
|
$partitions[$totalSpace]->totalSpace = $totalSpace;
|
||||||
|
$partitions[$totalSpace]->totalFreeSpace = disk_free_space($md->getDirectory());
|
||||||
|
}
|
||||||
|
|
||||||
|
$partitions[$totalSpace]->dirs[] = $md->getDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values($partitions);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,11 @@
|
||||||
<!--
|
|
||||||
<?php foreach($this->status as $key=>$value): ?>
|
|
||||||
<div>
|
|
||||||
<?php echo $key; ?>
|
|
||||||
<?php echo "PID: ".$value["process_id"]; ?>
|
|
||||||
<?php echo "UPTIME: ".$value["uptime_seconds"]; ?>
|
|
||||||
|
|
||||||
<?php if (true): ?>
|
|
||||||
<a href="systemstatus/get-log-file/id/<?php echo $key ?>">Log file</a>
|
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<table width="60%" cellpadding="0" cellspacing="0" border="0" class="statustable">
|
<table width="60%" cellpadding="0" cellspacing="0" border="0" class="statustable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="ui-state-default strong">
|
<tr class="ui-state-default strong">
|
||||||
<td>Service</td>
|
<td>Service</td>
|
||||||
<td>Status</td>
|
<td>Status</td>
|
||||||
<td>Uptime</td>
|
<td>Uptime</td>
|
||||||
|
<td>CPU</td>
|
||||||
|
<td>Memory</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -29,46 +17,17 @@
|
||||||
</tr>
|
</tr>
|
||||||
-->
|
-->
|
||||||
<?php $i=0; ?>
|
<?php $i=0; ?>
|
||||||
<?php foreach($this->status as $key=>$value): ?>
|
<?php foreach($this->status->services as $key=>$value): ?>
|
||||||
<tr class="<?php echo ($i&1) == 0 ? "even":"odd"; $i++; ?>" id="<?php echo $value["name"]; ?>">
|
<tr class="<?php echo ($i&1) == 0 ? "even":"odd"; $i++; ?>" id="<?php echo $value["name"]; ?>">
|
||||||
<td><?php echo $value["name"]; ?></td>
|
<td><?php echo $value["name"]; ?></td>
|
||||||
<td><span class="<?php echo $value["status"] ? "checked-icon" : "not-available-icon" ?>"> </span></td>
|
<td><span></span></td>
|
||||||
<td><?php echo $value["uptime_seconds"]; ?></td>
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
<tr class="even">
|
<tr id="partitions" class="even">
|
||||||
<th colspan="3">Disk Space</th>
|
<th colspan="5">Disk Space</th>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><span class="strong">Disk #1</span> (/dev/sda)
|
|
||||||
<ul>
|
|
||||||
<li>/home/bob</li>
|
|
||||||
<li>/srv/airtime/stor</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
<td>12GB of 128GB</td>
|
|
||||||
<td>
|
|
||||||
<div class="big">
|
|
||||||
<div class="diskspace" style="width:10%;">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>10% in use</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><span class="strong">Disk #2</span> (/dev/sdb)
|
|
||||||
<ul>
|
|
||||||
<li>/home/external/audio</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
<td>90GB of 450GB</td>
|
|
||||||
<td>
|
|
||||||
<div class="big">
|
|
||||||
<div class="diskspace" style="width:20%;">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>20% in use</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -11,6 +11,23 @@ function popup(mylink){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function convertSecondsToDaysHoursMinutesSeconds(seconds){
|
||||||
|
if (seconds < 0)
|
||||||
|
seconds = 0;
|
||||||
|
|
||||||
|
seconds = parseInt(seconds, 10);
|
||||||
|
|
||||||
|
var days = parseInt(seconds / 86400);
|
||||||
|
seconds -= days*86400;
|
||||||
|
|
||||||
|
var hours = parseInt(seconds / 3600);
|
||||||
|
seconds -= hours*3600;
|
||||||
|
|
||||||
|
var minutes = parseInt(seconds / 60);
|
||||||
|
seconds -= minutes*60;
|
||||||
|
|
||||||
|
return {days:days, hours:hours, minutes:minutes, seconds:seconds};
|
||||||
|
}
|
||||||
|
|
||||||
/* Takes an input parameter of milliseconds and converts these into
|
/* Takes an input parameter of milliseconds and converts these into
|
||||||
* the format HH:MM:SS */
|
* the format HH:MM:SS */
|
||||||
|
|
|
@ -1,12 +1,60 @@
|
||||||
|
function generatePartitions(partitions){
|
||||||
|
|
||||||
|
var rowTemplate =
|
||||||
|
'<tr class="partition-info">'+
|
||||||
|
'<td><span class="strong">Disk #%s</span>'+
|
||||||
|
'<ul id="watched-dir-list-%s">'+
|
||||||
|
'</ul>'+
|
||||||
|
'</td>'+
|
||||||
|
'<td>%sGB of %sGB</td>'+
|
||||||
|
'<td colspan="3">'+
|
||||||
|
'<div class="big">'+
|
||||||
|
'<div class="diskspace" style="width:%s%%;">'+
|
||||||
|
'</div>'+
|
||||||
|
'</div>'+
|
||||||
|
'<div>%s%% in use</div>'+
|
||||||
|
'</td>'+
|
||||||
|
'</tr>';
|
||||||
|
|
||||||
|
$(".partition-info").remove();
|
||||||
|
var lastElement = $('#partitions');
|
||||||
|
for (var i=0; i<partitions.length; i++){
|
||||||
|
var spaceUsed = partitions[i].totalSpace-partitions[i].totalFreeSpace;
|
||||||
|
var totalSpace = partitions[i].totalSpace;
|
||||||
|
var percUsed = sprintf("%01.1f", spaceUsed/totalSpace*100);
|
||||||
|
|
||||||
|
var spaceUsedGb = sprintf("%01.1f", spaceUsed/Math.pow(10, 9));
|
||||||
|
var totalSpaceGb = sprintf("%01.1f", totalSpace/Math.pow(10, 9));
|
||||||
|
|
||||||
|
var row = sprintf(rowTemplate, i, i, spaceUsedGb, totalSpaceGb, percUsed, percUsed);
|
||||||
|
var tr = $(row);
|
||||||
|
lastElement.after(tr);
|
||||||
|
|
||||||
|
var watched_dirs_ul = $('#watched-dir-list-'+i);
|
||||||
|
for (var j=0; j<partitions[i].dirs.length; j++){
|
||||||
|
watched_dirs_ul.append('<li>'+partitions[i].dirs[j]+'</li>');
|
||||||
|
}
|
||||||
|
lastElement = tr;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function success(data, textStatus, jqXHR){
|
function success(data, textStatus, jqXHR){
|
||||||
var services = data.status.services;
|
var services = data.status.services;
|
||||||
|
|
||||||
for (var i=0; i<services.length; i++){
|
console.log(data.status);
|
||||||
var children = $("#"+services[i].name).children();
|
|
||||||
console.log(services[i].status);
|
for (var key in services){
|
||||||
$($(children[1]).children()[0]).attr("class", services[i].status ? "checked-icon": "not-available-icon");
|
var s = services[key];
|
||||||
$(children[2]).text(services[i].uptime_seconds);
|
var children = $("#"+s.name).children();
|
||||||
|
$(children[0]).text(s.name);
|
||||||
|
$($(children[1]).children()[0]).attr("class", s.status ? "checked-icon": "not-available-icon");
|
||||||
|
$(children[2]).text(sprintf('%(days)sd %(hours)sh %(minutes)sm %(seconds)ss', convertSecondsToDaysHoursMinutesSeconds(s.uptime_seconds)));
|
||||||
|
$(children[3]).text(s.cpu_perc);
|
||||||
|
$(children[4]).text(sprintf('%01.1fMB (%s)', parseInt(s.memory_kb)/1000, s.memory_perc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generatePartitions(data.status.partitions);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateStatus(){
|
function updateStatus(){
|
||||||
|
|
183
airtime_mvc/public/js/sprintf/sprintf-0.7-beta1.js
Normal file
183
airtime_mvc/public/js/sprintf/sprintf-0.7-beta1.js
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
/**
|
||||||
|
sprintf() for JavaScript 0.7-beta1
|
||||||
|
http://www.diveintojavascript.com/projects/javascript-sprintf
|
||||||
|
|
||||||
|
Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of sprintf() for JavaScript nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Changelog:
|
||||||
|
2010.09.06 - 0.7-beta1
|
||||||
|
- features: vsprintf, support for named placeholders
|
||||||
|
- enhancements: format cache, reduced global namespace pollution
|
||||||
|
|
||||||
|
2010.05.22 - 0.6:
|
||||||
|
- reverted to 0.4 and fixed the bug regarding the sign of the number 0
|
||||||
|
Note:
|
||||||
|
Thanks to Raphael Pigulla <raph (at] n3rd [dot) org> (http://www.n3rd.org/)
|
||||||
|
who warned me about a bug in 0.5, I discovered that the last update was
|
||||||
|
a regress. I appologize for that.
|
||||||
|
|
||||||
|
2010.05.09 - 0.5:
|
||||||
|
- bug fix: 0 is now preceeded with a + sign
|
||||||
|
- bug fix: the sign was not at the right position on padded results (Kamal Abdali)
|
||||||
|
- switched from GPL to BSD license
|
||||||
|
|
||||||
|
2007.10.21 - 0.4:
|
||||||
|
- unit test and patch (David Baird)
|
||||||
|
|
||||||
|
2007.09.17 - 0.3:
|
||||||
|
- bug fix: no longer throws exception on empty paramenters (Hans Pufal)
|
||||||
|
|
||||||
|
2007.09.11 - 0.2:
|
||||||
|
- feature: added argument swapping
|
||||||
|
|
||||||
|
2007.04.03 - 0.1:
|
||||||
|
- initial release
|
||||||
|
**/
|
||||||
|
|
||||||
|
var sprintf = (function() {
|
||||||
|
function get_type(variable) {
|
||||||
|
return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
|
||||||
|
}
|
||||||
|
function str_repeat(input, multiplier) {
|
||||||
|
for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
|
||||||
|
return output.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
var str_format = function() {
|
||||||
|
if (!str_format.cache.hasOwnProperty(arguments[0])) {
|
||||||
|
str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
|
||||||
|
}
|
||||||
|
return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
str_format.format = function(parse_tree, argv) {
|
||||||
|
var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
|
||||||
|
for (i = 0; i < tree_length; i++) {
|
||||||
|
node_type = get_type(parse_tree[i]);
|
||||||
|
if (node_type === 'string') {
|
||||||
|
output.push(parse_tree[i]);
|
||||||
|
}
|
||||||
|
else if (node_type === 'array') {
|
||||||
|
match = parse_tree[i]; // convenience purposes only
|
||||||
|
if (match[2]) { // keyword argument
|
||||||
|
arg = argv[cursor];
|
||||||
|
for (k = 0; k < match[2].length; k++) {
|
||||||
|
if (!arg.hasOwnProperty(match[2][k])) {
|
||||||
|
throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
|
||||||
|
}
|
||||||
|
arg = arg[match[2][k]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (match[1]) { // positional argument (explicit)
|
||||||
|
arg = argv[match[1]];
|
||||||
|
}
|
||||||
|
else { // positional argument (implicit)
|
||||||
|
arg = argv[cursor++];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
|
||||||
|
throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
|
||||||
|
}
|
||||||
|
switch (match[8]) {
|
||||||
|
case 'b': arg = arg.toString(2); break;
|
||||||
|
case 'c': arg = String.fromCharCode(arg); break;
|
||||||
|
case 'd': arg = parseInt(arg, 10); break;
|
||||||
|
case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
|
||||||
|
case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
|
||||||
|
case 'o': arg = arg.toString(8); break;
|
||||||
|
case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
|
||||||
|
case 'u': arg = Math.abs(arg); break;
|
||||||
|
case 'x': arg = arg.toString(16); break;
|
||||||
|
case 'X': arg = arg.toString(16).toUpperCase(); break;
|
||||||
|
}
|
||||||
|
arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
|
||||||
|
pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
|
||||||
|
pad_length = match[6] - String(arg).length;
|
||||||
|
pad = match[6] ? str_repeat(pad_character, pad_length) : '';
|
||||||
|
output.push(match[5] ? arg + pad : pad + arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output.join('');
|
||||||
|
};
|
||||||
|
|
||||||
|
str_format.cache = {};
|
||||||
|
|
||||||
|
str_format.parse = function(fmt) {
|
||||||
|
var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
|
||||||
|
while (_fmt) {
|
||||||
|
if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
|
||||||
|
parse_tree.push(match[0]);
|
||||||
|
}
|
||||||
|
else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
|
||||||
|
parse_tree.push('%');
|
||||||
|
}
|
||||||
|
else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
|
||||||
|
if (match[2]) {
|
||||||
|
arg_names |= 1;
|
||||||
|
var field_list = [], replacement_field = match[2], field_match = [];
|
||||||
|
if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
|
||||||
|
field_list.push(field_match[1]);
|
||||||
|
while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
|
||||||
|
if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
|
||||||
|
field_list.push(field_match[1]);
|
||||||
|
}
|
||||||
|
else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
|
||||||
|
field_list.push(field_match[1]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw('[sprintf] huh?');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw('[sprintf] huh?');
|
||||||
|
}
|
||||||
|
match[2] = field_list;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
arg_names |= 2;
|
||||||
|
}
|
||||||
|
if (arg_names === 3) {
|
||||||
|
throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
|
||||||
|
}
|
||||||
|
parse_tree.push(match);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw('[sprintf] huh?');
|
||||||
|
}
|
||||||
|
_fmt = _fmt.substring(match[0].length);
|
||||||
|
}
|
||||||
|
return parse_tree;
|
||||||
|
};
|
||||||
|
|
||||||
|
return str_format;
|
||||||
|
})();
|
||||||
|
|
||||||
|
var vsprintf = function(fmt, argv) {
|
||||||
|
argv.unshift(fmt);
|
||||||
|
return sprintf.apply(null, argv);
|
||||||
|
};
|
|
@ -69,30 +69,30 @@ class AirtimeCheck {
|
||||||
self::output_status("TOTAL_MEMORY_MBYTES", $p_status->platform->memory);
|
self::output_status("TOTAL_MEMORY_MBYTES", $p_status->platform->memory);
|
||||||
self::output_status("TOTAL_SWAP_MBYTES", $p_status->platform->swap);
|
self::output_status("TOTAL_SWAP_MBYTES", $p_status->platform->swap);
|
||||||
self::output_status("AIRTIME_VERSION", $p_status->airtime_version);
|
self::output_status("AIRTIME_VERSION", $p_status->airtime_version);
|
||||||
self::output_status("PLAYOUT_ENGINE_PROCESS_ID", $p_status->pypo->process_id);
|
self::output_status("PLAYOUT_ENGINE_PROCESS_ID", $p_status->services->pypo->process_id);
|
||||||
self::output_status("PLAYOUT_ENGINE_RUNNING_SECONDS", $p_status->pypo->uptime_seconds);
|
self::output_status("PLAYOUT_ENGINE_RUNNING_SECONDS", $p_status->services->pypo->uptime_seconds);
|
||||||
self::output_status("PLAYOUT_ENGINE_MEM_PERC", $p_status->pypo->memory_perc);
|
self::output_status("PLAYOUT_ENGINE_MEM_PERC", $p_status->services->pypo->memory_perc);
|
||||||
self::output_status("PLAYOUT_ENGINE_CPU_PERC", $p_status->pypo->cpu_perc);
|
self::output_status("PLAYOUT_ENGINE_CPU_PERC", $p_status->services->pypo->cpu_perc);
|
||||||
self::output_status("LIQUIDSOAP_PROCESS_ID", $p_status->liquidsoap->process_id);
|
self::output_status("LIQUIDSOAP_PROCESS_ID", $p_status->services->liquidsoap->process_id);
|
||||||
self::output_status("LIQUIDSOAP_RUNNING_SECONDS", $p_status->liquidsoap->uptime_seconds);
|
self::output_status("LIQUIDSOAP_RUNNING_SECONDS", $p_status->services->liquidsoap->uptime_seconds);
|
||||||
self::output_status("LIQUIDSOAP_MEM_PERC", $p_status->liquidsoap->memory_perc);
|
self::output_status("LIQUIDSOAP_MEM_PERC", $p_status->services->liquidsoap->memory_perc);
|
||||||
self::output_status("LIQUIDSOAP_CPU_PERC", $p_status->liquidsoap->cpu_perc);
|
self::output_status("LIQUIDSOAP_CPU_PERC", $p_status->services->liquidsoap->cpu_perc);
|
||||||
self::output_status("MEDIA_MONITOR_PROCESS_ID", $p_status->media_monitor->process_id);
|
self::output_status("MEDIA_MONITOR_PROCESS_ID", $p_status->services->media_monitor->process_id);
|
||||||
self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", $p_status->media_monitor->uptime_seconds);
|
self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", $p_status->services->media_monitor->uptime_seconds);
|
||||||
self::output_status("MEDIA_MONITOR_MEM_PERC", $p_status->media_monitor->memory_perc);
|
self::output_status("MEDIA_MONITOR_MEM_PERC", $p_status->services->media_monitor->memory_perc);
|
||||||
self::output_status("MEDIA_MONITOR_CPU_PERC", $p_status->media_monitor->cpu_perc);
|
self::output_status("MEDIA_MONITOR_CPU_PERC", $p_status->services->media_monitor->cpu_perc);
|
||||||
self::output_status("SHOW_RECORDER_PROCESS_ID", $p_status->show_recorder->process_id);
|
self::output_status("SHOW_RECORDER_PROCESS_ID", $p_status->services->show_recorder->process_id);
|
||||||
self::output_status("SHOW_RECORDER_RUNNING_SECONDS", $p_status->show_recorder->uptime_seconds);
|
self::output_status("SHOW_RECORDER_RUNNING_SECONDS", $p_status->services->show_recorder->uptime_seconds);
|
||||||
self::output_status("SHOW_RECORDER_MEM_PERC", $p_status->show_recorder->memory_perc);
|
self::output_status("SHOW_RECORDER_MEM_PERC", $p_status->services->show_recorder->memory_perc);
|
||||||
self::output_status("SHOW_RECORDER_CPU_PERC", $p_status->show_recorder->cpu_perc);
|
self::output_status("SHOW_RECORDER_CPU_PERC", $p_status->services->show_recorder->cpu_perc);
|
||||||
self::output_status("ICECAST_PROCESS_ID", $p_status->icecast2->process_id);
|
self::output_status("ICECAST_PROCESS_ID", $p_status->services->icecast2->process_id);
|
||||||
self::output_status("ICECAST_RUNNING_SECONDS", $p_status->icecast2->uptime_seconds);
|
self::output_status("ICECAST_RUNNING_SECONDS", $p_status->services->icecast2->uptime_seconds);
|
||||||
self::output_status("ICECAST_MEM_PERC", $p_status->icecast2->memory_perc);
|
self::output_status("ICECAST_MEM_PERC", $p_status->services->icecast2->memory_perc);
|
||||||
self::output_status("ICECAST_CPU_PERC", $p_status->icecast2->cpu_perc);
|
self::output_status("ICECAST_CPU_PERC", $p_status->services->icecast2->cpu_perc);
|
||||||
self::output_status("RABBITMQ_PROCESS_ID", $p_status->rabbitmq->process_id);
|
self::output_status("RABBITMQ_PROCESS_ID", $p_status->services->rabbitmq->process_id);
|
||||||
self::output_status("RABBITMQ_RUNNING_SECONDS", $p_status->rabbitmq->uptime_seconds);
|
self::output_status("RABBITMQ_RUNNING_SECONDS", $p_status->services->rabbitmq->uptime_seconds);
|
||||||
self::output_status("RABBITMQ_MEM_PERC", $p_status->rabbitmq->memory_perc);
|
self::output_status("RABBITMQ_MEM_PERC", $p_status->services->rabbitmq->memory_perc);
|
||||||
self::output_status("RABBITMQ_CPU_PERC", $p_status->rabbitmq->cpu_perc);
|
self::output_status("RABBITMQ_CPU_PERC", $p_status->services->rabbitmq->cpu_perc);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue