1
0
Fork 0
mirror of https://github.com/DanielnetoDotCom/YouPHPTube synced 2025-10-03 01:39:24 +02:00
Oinktube/plugin/Meet/checkServers.php
2024-04-02 13:44:59 -03:00

374 lines
No EOL
17 KiB
PHP

<?php
if (!isset($global['systemRootPath'])) {
$configFile = '../../videos/configuration.php';
if (file_exists($configFile)) {
require_once $configFile;
}
}
$obj = AVideoPlugin::getObjectDataIfEnabled("Meet");
//_error_log(json_encode($_SERVER));
if (empty($obj)) {
die("Plugin disabled");
}
if (!User::isAdmin()) {
forbiddenPage("You can not do this");
exit;
}
if (!empty($_GET['newServer'])) {
$p = AVideoPlugin::loadPluginIfEnabled("Meet");
$p->setDataObjectParameter("server->value", preg_replace("/[^0-1a-z.]/i", "", $_GET['newServer']));
}
$m = AVideoPlugin::loadPlugin("Meet");
$emptyObject = $m->getEmptyDataObject();
$timeouts = 2000;
$_page = new Page(array('Check Meet Servers'));
?>
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<a href="<?php echo $global['webSiteRootURL']; ?>plugin/Meet/" class="btn btn-default" data-toggle="tooltip" title="<?php echo __("Create a Meet"); ?> " data-placement="bottom">
<i class="fas fa-comments"></i> <?php echo __("Create a Meet"); ?>
</a>
</div>
<div class="panel-body tabbable-line">
<div class="row">
<?php
foreach ($emptyObject->server->type as $key => $value) {
if ($key == "custom") {
?>
<div class="col-xs-6">
<div class="panel panel-default" id="panel<?php echo $newKey; ?>">
<div class="panel-heading ">
<?php
echo "<b>{$value} ({$obj->CUSTOM_JITSI_DOMAIN})</b> ";
if ($obj->server->value !== $key) {
?>
<a href="<?php echo $global['webSiteRootURL']; ?>plugin/Meet/?newServer=<?php echo $key; ?>" data-toggle="tooltip" data-placement="bottom" title="Change to (<?php echo $value; ?>) server">
<i class="fas fa-random"></i>
</a>
<?php
} else {
?>
<a href="<?php echo $global['webSiteRootURL']; ?>plugin/Meet/" data-toggle="tooltip" data-placement="bottom" title="Stay on (<?php echo $value; ?>)">
<i class="fas fa-check"></i>
</a>
<?php
} ?>
</div>
</div>
</div>
<?php
} else {
$newKey = str_replace(".", "_", $key); ?>
<div class="col-xs-6">
<div class="panel panel-default" id="panel<?php echo $newKey; ?>">
<div class="panel-heading ">
<?php
echo "<b>{$value}</b> ";
if ($obj->server->value !== $key) {
?>
<a href="<?php echo $global['webSiteRootURL']; ?>plugin/Meet/?newServer=<?php echo $key; ?>" data-toggle="tooltip" data-placement="bottom" title="Change to (<?php echo $value; ?>) server">
<i class="fas fa-random"></i>
</a>
<?php
} else {
?>
<a href="<?php echo $global['webSiteRootURL']; ?>plugin/Meet/" data-toggle="tooltip" data-placement="bottom" title="Stay on (<?php echo $value; ?>)">
<i class="fas fa-check"></i>
</a>
<?php
} ?>
<span class="label label-primary grade pull-right" id="grade<?php echo $newKey; ?>">
<i class="fas fa-cog"></i>
</span>
</div>
<div class="panel-body">
<ul class="list-group">
<li class="list-group-item">
<i class="fas fa-download"></i> Download Speed
<small class="text-muted" id='gradespeed<?php echo $newKey; ?>'></small>
<span class="badge" id='speed<?php echo $newKey; ?>'>
<i class="fas fa-cog"></i>
</span>
</li>
<li class="list-group-item">
<i class="fas fa-upload"></i> Upload Speed
<small class="text-muted" id='gradeUspeed<?php echo $newKey; ?>'></small>
<span class="badge" id='Uspeed<?php echo $newKey; ?>'>
<i class="fas fa-cog"></i>
</span>
</li>
<li class="list-group-item">
<i class="fas fa-stopwatch"></i> Response Time
<small class="text-muted" id='graderesponse<?php echo $newKey; ?>'></small>
<span class="badge" id='response<?php echo $newKey; ?>'>
<i class="fas fa-cog"></i>
</span>
</li>
<li class="list-group-item">
<i class="fas fa-network-wired"></i> Sites Active
<small class="text-muted" id='gradetotalSitesActive<?php echo $newKey; ?>'></small>
<span class="badge" id='totalSitesActive<?php echo $newKey; ?>'>
<i class="fas fa-cog"></i>
</span>
</li>
<li class="list-group-item">
<i class="fas fa-video"></i> Streamers Services
<small class="text-muted" id='gradeStreamersServices<?php echo $newKey; ?>'></small>
<span class="badge" id='StreamersServices<?php echo $newKey; ?>'>
<i class="fas fa-cog"></i>
</span>
</li>
</ul>
</div>
</div>
</div>
<?php
}
}
?>
</div>
<div class="row">
<div class="col-sm-12">
<div class="alert alert-info">
Before Change the server make sure you do not have any meeting running.
Other users may not able to connect after you change it.
</div>
</div>
<div class="col-sm-12">
<div class="alert alert-info">
Higher grade, means the server is better for a meeting.
</div>
</div>
</div>
</div>
</div>
<script>
var roundedDecimals = 2;
var bytesInAKilobyte = 1024;
var tries = 1;
var timeouts = <?php echo $timeouts; ?>;
function speed(bitsPerSecond) {
var Kbps = (bitsPerSecond / bytesInAKilobyte).toFixed(roundedDecimals);
if (Kbps <= 1)
return {
value: bitsPerSecond,
units: "Bps"
};
var MBps = (Kbps / bytesInAKilobyte).toFixed(roundedDecimals);
//if (MBps <= 1)
return {
value: Kbps,
units: "Kbps",
text: Kbps + " Kbps",
bitsPerSecond: bitsPerSecond
};
//else
//return {value: MBps, units: "MBps", text: MBps + " MBps", bitsPerSecond: bitsPerSecond};
}
function checkSpeed(server) {
var imageAddr = "https://" + server + "/jesus.png?n=" + Math.random();
var startTime, endTime;
var downloadSize = 3881702; //3.70 MB
var download = new Image();
var serverId = server.replace(/[.]/g, "_");
var speedId = '#speed' + serverId;
var gradespeedId = '#gradespeed' + serverId;
download.onload = function() {
endTime = (new Date()).getTime();
var duration = (endTime - startTime) / 1000;
var bitsLoaded = downloadSize * 8;
var speedBps = (bitsLoaded / duration).toFixed(roundedDecimals);
var response = speed(speedBps);
console.log(speedBps);
$(gradespeedId).html("+" + (speedBps / 1000000).toFixed(2));
sitesGrade[server] += (speedBps / 1000000);
animateValue('speed' + serverId, 0, response.value, timeouts * 2, "", response.units);
}
download.onerror = function() {
$(speedId).html(response.text);
}
startTime = (new Date()).getTime();
download.src = imageAddr;
}
function checkServerUsage(server) {
var ajaxTime = new Date().getTime();
$.ajax({
url: "https://" + server + "/api/info.json.php",
}).done(function(response) {
var totalTime = new Date().getTime() - ajaxTime;
var serverId = server.replace(/[.]/g, "_");
animateValue('response' + serverId, 0, totalTime, timeouts * 2, "", "ms");
animateValue('totalSitesActive' + serverId, 0, response.totalSitesActive, timeouts * 2, "", "/" + (response.totalSitesActive + response.totalSitesInactive));
animateValue('StreamersServices' + serverId, 0, response.totalOnlineLiveStreamersServices, timeouts * 2, "", "/" + (response.totalLiveStreamersServices));
// calculate grade
sitesGrade[server] -= (response.totalOnlineLiveStreamersServices * 10);
sitesGrade[server] -= (response.totalLiveStreamersServices);
sitesGrade[server] -= (response.totalSitesActive);
sitesGrade[server] -= (totalTime / 50);
$('#graderesponse' + serverId).html("-" + (totalTime / 50).toFixed(2));
$('#gradetotalSitesActive' + serverId).html("-" + (response.totalSitesActive).toFixed(2));
$('#gradeStreamersServices' + serverId).html("-" + ((response.totalOnlineLiveStreamersServices * 10) + (response.totalLiveStreamersServices)).toFixed(2));
// Here I want to get the how long it took to load some.php and use it further
}).fail(function(jqXHR, textStatus) {
tries++;
setTimeout(function() {
checkServerUsage(server);
}, tries * timeouts);
});
}
function check(server) {
checkSpeed(server);
checkServerUsage(server);
}
function checkGrades() {
bestGrade = -1;
bestGradeServer = '';
for (const server in sitesGrade) {
if (bestGrade < sitesGrade[server]) {
bestGrade = sitesGrade[server];
bestGradeServer = server;
}
var serverId = server.replace(/[.]/g, "_");
$('#grade' + serverId).html("Grade: " + (sitesGrade[server].toFixed(2)));
}
var serverId = bestGradeServer.replace(/[.]/g, "_");
$('.grade').not('#grade' + serverId).removeClass('label-success');
$('.grade').not('#grade' + serverId).addClass('label-primary');
$('#grade' + serverId).addClass('label-success');
$('#grade' + serverId).removeClass('label-primary');
}
function checkUploadSpeed(server, iterations, update) {
var average = 0,
index = 0,
timer = window.setInterval(check, 5000);
check();
function check() {
var xhr = new XMLHttpRequest(),
url = 'https://' + server + '?cache=' + Math.floor(Math.random() * 10000), //prevent url cache
data = getRandomString(1), //1 meg POST size handled by all servers
startTime,
speed = 0;
xhr.onreadystatechange = function(event) {
if (xhr.readyState == 4) {
speed = Math.round(1024 / ((new Date() - startTime) / 1000));
average == 0 ?
average = speed :
average = Math.round((average + speed) / 2);
update(speed, average);
index++;
if (index == iterations) {
window.clearInterval(timer);
};
};
};
xhr.open('POST', url, true);
startTime = new Date();
xhr.send(data);
};
function getRandomString(sizeInMb) {
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+`-=[]\{}|;':,./<>?", //random data prevents gzip effect
iterations = sizeInMb * 1024 * 1024, //get byte count
result = '';
for (var index = 0; index < iterations; index++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
};
return result;
};
}
function runAll(server) {
var serverId = server.replace(/[.]/g, '_');
$('#panel' + serverId + " .fa-cog").addClass('fa-spin');
sitesGrade[server] = 100;
check(server);
checkUploadSpeed(server, 1, function(speed, average) {
var serverId = server.replace(/[.]/g, '_');
animateValue('Uspeed' + serverId, 0, average, timeouts * 2, "", "Kbps");
if (previewsGrade[server]) {
sitesGrade[server] -= previewsGrade[server];
}
previewsGrade[server] = (average / 50);
sitesGrade[server] += previewsGrade[server];
$('#gradeUspeed' + serverId).html('+' + previewsGrade[server].toFixed(2));
});
}
function animateValue(id, start, end, duration, prepend, postpend) {
// assumes integer values for start and end
var obj = document.getElementById(id);
var range = end - start;
// no timer shorter than 50ms (not really visible any way)
var minTimer = 50;
// calc step time to show all interediate values
var stepTime = Math.abs(Math.floor(duration / range));
// never go below minTimer
stepTime = Math.max(stepTime, minTimer);
// get current time and calculate desired end time
var startTime = new Date().getTime();
var endTime = startTime + duration;
var timer;
function run() {
var now = new Date().getTime();
var remaining = Math.max((endTime - now) / duration, 0);
var value = Math.round(end - (remaining * range));
obj.innerHTML = prepend + " " + value + " " + postpend;
if (value == end) {
clearInterval(timer);
}
}
timer = setInterval(run, stepTime);
run();
}
var previewsGrade = {};
var sitesGrade = {};
$(document).ready(function() {
<?php
$count = 0;
foreach ($emptyObject->server->type as $key => $value) {
if ($key == 'custom') {
continue;
}
$count++;
echo "setTimeout(function(){runAll('{$key}')}," . ($count * $timeouts) . ");";
}
?>
setInterval(function() {
checkGrades();
}, 1000);
});
</script>
</div>
<?php
$_page->print();
?>