root123
Новичок
Доброе время суток, помогите понять систему данного модуля. Какой файл должен быть на стороне сервера? Или как сделать более удобней.
PHP:
<?php
if(!DEFINED('OGP'))
exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));
$sql->query('SELECT `api` FROM `jmapi` WHERE `domain`="'.$cfg['url'].'" LIMIT 1');
$lic = $sql->get();
if($go)
{
if($url['update'])
{
$aData = [];
$aData['id'] = isset($_POST['id']) ? $_POST['id'] : 0;
$aData['status'] = isset($_POST['status']) ? $_POST['status'] : 0;
$aData['address'] = isset($_POST['address']) ? $_POST['address'] : '';
$aData['passwd'] = isset($_POST['passwd']) ? $_POST['passwd'] : '';
$aData['type'] = isset($_POST['type']) ? $_POST['type'] : '';
$aData['location'] = isset($_POST['location']) ? $_POST['location'] : '';
$aData['url'] = isset($_POST['url']) ? $_POST['url'] : '';
$aData['filename'] = isset($_POST['filename']) ? $_POST['filename'] : '';
$aData['cmd'] = isset($_POST['cmd']) ? base64_decode($_POST['cmd']) : '';
include(LIB.'ssh.php');
if($aData['type'] == 1)
{
$sql->query('SELECT `address`, `passwd` FROM `units` WHERE `id`="'.$aData['location'].'" LIMIT 1');
$unit = $sql->get();
if(!$ssh->auth($unit['passwd'], $unit['address']))
sys::outjs(array('e' => 'Не удалось подключиться к Локации!'));
$ssh->set('cd /var/www && sudo -u root screen -dmS bspanelupdate_'.$start_point.' sh -c "echo \'Идёт установка\' > install.txt; wget http://'.$aData['url'].'; unzip -o '.$aData['filename'].'; rm '.$aData['filename'].'; rm install.txt"; '.$aData['cmd']);
$sql->query('SELECT `id` FROM `update` WHERE `upd`="'.$aData['id'].'" LIMIT 1');
if($sql->num())
$sql->query('UPDATE `update` set `upd`="'.$aData['id'].'", `status`="'.$aData['status'].'" LIMIT 1');
else
$sql->query('INSERT INTO `update` set'
.'`upd`="'.$aData['id'].'",'
.'`status`="'.$aData['status'].'"');
sys::outjs(array('s' => 'Установка запущена, проверьте файл install.txt в директории /var/www, если файл отсутствует установка завершилась успешно, а если файл существует, то установка до сих пор идёт.'));
} else {
if(!$ssh->auth($aData['passwd'], $aData['address']))
sys::outjs(array('e' => 'Не удалось создать соединение с оборудованием!'));
$ssh->set('cd /var/www && sudo -u root screen -dmS bspanelupdate_'.$start_point.' sh -c "echo \'Идёт установка\' > install.txt; wget http://'.$aData['url'].'; unzip -o '.$aData['filename'].'; rm '.$aData['filename'].'; rm install.txt"; '.$aData['cmd']);
$sql->query('INSERT INTO `update` set'
.'`upd`="'.$aData['id'].'",'
.'`status`="'.$aData['status'].'"');
sys::outjs(array('s' => 'Установка запущена, проверьте файл install.txt в директории /var/www, если файл отсутствует установка завершилась успешно, а если файл существует, то установка до сих пор идёт.'));
}
}
if($url['update_check'])
{
$sort = isset($_GET['sort']) ? '/sort/'.$_GET['sort'] : '';
$json = json_decode(file_get_contents($cfg['api_url'].'update/api/'.$lic['api'].'/version/3'.$sort), true);
$html->get('list', 'sections/update');
$html->set('updates', htmlspecialchars_decode($json['html']));
$html->pack('update_check');
$html_NoUpdate = '<tr><td colspan="5"><div class="informer blue">В данный момент нет новых обновлений...</div></td></tr>';
sys::out(isset($json['html']) ? $html->arr['update_check'] : $html_NoUpdate);
}
}
$sql->query('SELECT `id`, `name`, `address` FROM `units` ORDER BY `id` ASC');
while($unit = $sql->get())
$units .= '<option value="'.$unit['id'].'">#'.$unit['id'].' '.$unit['name'].' ('.$unit['address'].')</option>';
if($id)
{
$status = isset($url['status']) ? 'AND `status`="'.$url['status'].'"' : '';
$upds = $sql->query('SELECT `id`, `upd`, `status` FROM `update` WHERE `upd`="'.$id.'" '.$status.' LIMIT 1');
$upd = $sql->get();
$sql->num($upds) ? sys::outjs(array('upd' => 1, 'status' => $upd['status'])) : sys::outjs(array('upd' => false, 'status' => false));
}
if($url['updates_check'])
{
$aURL = file_get_contents($cfg['api_url'].'update/api/'.$lic['api'].'/version/3/updates_all');
$numbn = [];
foreach(explode(',', $aURL) as $numbs)
{
$sql->query('SELECT `id`, `upd`, `status` FROM `update` WHERE `upd`="'.$numbs.'" LIMIT 1');
if(!$sql->num())
$numbn[] = $numbs;
}
sys::out('available:'.count($numbn));
}
$html->get('index', 'sections/update');
$html->set('units', $units);
$html->set('sort', isset($url['sort']) ? $url['sort'] : 'asc');
$html->pack('main');
?>
HTML:
<style type="text/css">
.available_new__update {
position: relative;
box-shadow: rgb(0, 0, 0) 0px 0px 60px 0px;
animation: color-me-in 8s infinite;
}
@keyframes color-me-in {
0% {
box-shadow: rgb(0, 0, 0) 0px 0px 60px 0px;
}
100% {
box-shadow: rgba(0, 0, 0, 0.05) 0px 0px 60px 0px;
}
}
</style>
<div id="available">
<div class="space"></div>
<div class="informer">Доступные</div>
<table class="inputs inputs-max">
<thead>
<th>ID <span id="sorting"><i class="fa fa-sort-numeric-asc" onclick="return sorting('desc')"></i></span></th>
<th>Инфо</th>
<th>Ссылка</th>
<th>Название файла</th>
<th>Дата</th>
<th>SSH команды</th>
<th></th>
<th><a href="javascript:void(sorting('asc', true))" style="color: #abb7bf">обновить список</a></th>
</thead>
<tbody id="update">
</tbody>
</table>
</div>
<div id="available_info" style="display: none;font-size: 120px;margin: 0 auto;text-align: center;"></div>
<div id="not_available">
<div class="space"></div>
<div class="informer">Установленные</div>
<table>
<thead>
<th>ID</th>
<th>Инфо</th>
<th>Ссылка</th>
<th>Название файла</th>
<th>Дата</th>
<th></th>
<th></th>
<th></th>
</thead>
<tbody id="update_install"></tbody>
</table>
</div>
<script type="text/javascript">
$(document).ready(function(){
var bspanel_update = {
button_cmd: true
};
$.get(home+'update/go/section/update_check?sort=[sort]', function(data){$('#update').html(data);});
var getURL = function getURL(sParam) {
var sPageURL = window.location.search.substring(1),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
}
}
};
if(getURL('available') == 'yes')
{
$('#available').addClass('available_new__update');
$('#not_available').hide();
setTimeout(function(){$('#available').removeClass('available_new__update'); $("#not_available").css({'display': 'block', 'opacity': 0}).animate({'margin-top':'50%', "margin-top": "0%", opacity: 1}); $('#available_info').hide(); window.history.pushState({url: '[acp]update'}, '', '[acp]update')}, 7500);
$('#available_info').show();
$('#available_info').text('Всего '+getURL('available_upd'));
}
});
function sorting(type, upd = false)
{
if(upd)
{
$('#update').html('<tr><td colspan="5">Loading <i class="fa fa-spinner fa-pulse fa-1x fa-fw margin-bottom" style="font-size: 20px;"></i></td></tr>');
$.get(home+'update/go/section/update_check?sort='+type, function(data){setTimeout(function(){$('#update').html(data);}, 1000);});
} else {
$.get(home+'update/go/section/update_check?sort='+type, function(data){$('#update').html(data);});
if(type == 'desc')
$('#sorting').html('<i class="fa fa-sort-numeric-desc" onclick="return sorting(\'asc\')"></i>');
else
$('#sorting').html('<i class="fa fa-sort-numeric-asc" onclick="return sorting(\'desc\')"></i>');
}
}
function b64DecodeUnicode(str) {
return decodeURIComponent(atob(str).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
function callback(id, status, text = false, html = false, func = false)
{
html != '' ? b64DecodeUnicode(html) : '';
text != '' ? b64DecodeUnicode(text) : 'Информация #'+id;
bootbox.dialog('<h3>'+text+'</h3>'+html,
[{
"label" : "Продолжить",
callback : function()
{
b64DecodeUnicode(func);
}
},{
"label" : "Закрыть"
}]
);
}
function text(b64text, id)
{
var result = b64DecodeUnicode(b64text);
bootbox.dialog('<h3>Обновления #'+id+'</h3> '+result,
[{
'label' : 'OK'
}]
);
}
function install(url, name, id, status, cmd)
{
$.getJSON(home+'update/id/'+id, function(data)
{
if(data['upd'] == 1)
bootbox.dialog('<h3 class="red">Внимание!</h3> Обновления #'+id+' уже установлена!',
[{
"label" : "OK",
}]
);
else{
bootbox.dialog('<h3>Установка обновления #'+id+'</h3><table class="inputs inputs-max"><tbody><tr><td colspan="5"><center><select id="type" id="type" onchange="updata()"><option value="0">Указать данные вручную</option><option value="1">Брать данные с Локации</option> </select></center></td></tr><tr id="data" style="display: none"><td class="text-right">Данные</td><td width="50%"><input type="text" id="address" placeholder="IP адрес"></td><td width="50%"><input type="text" id="passwd" placeholder="Пароль"></td></tr><tr id="location" style="display: none"><td class="text-right">Локация:</td><td width="100%"><select id="locations">[units]</select></td></tr><tr style="display: none"><td><input type="hidden" id="url" value="'+url+'"></td><td><input type="hidden" id="filename" value="'+name+'"></td></tr><tr id="dataInfo"><td colspan="5">• Внимание! <br> Необходимо указать данные от машины где установлена Панель управления BSPanel.</td></tr></tbody></table>',
[{
"label" : "Установить",
"class" : "btn-green",
callback : function(){return installGo(id, status, cmd);}
},{
"label" : "Закрыть",
"class" : "btn-red"
}]
);
updata();
}
});
}
function installGo(id, status, cmd)
{
$.ajax({
type: 'POST',
url: home+'update/go/section/update',
data: 'id='+id+'&status='+status+'&type='+$('#type').val()+'&passwd='+$('#passwd').val()+'&address='+$('#address').val()+'&location='+$('#locations').val()+'&filename='+$('#filename').val()+'&url='+$('#url').val()+'&cmd='+cmd,
dataType: 'json',
success: function(data)
{
$.each(data, function(i, val)
{
if(i == 'e')
bootbox.dialog('<h3>Ошибка</h3>'+val,
[{
"label" : "OK",
callback : function(){return install()}
}]
);
if(i == 's')
bootbox.dialog('<h3>Внимание!</h3>'+val,
[{
"label" : "OK"
}]
);
});
}
})
}
$('#form').ajaxForm({
dataType: 'json',
success: function(data)
{
$.each(data, function(i, val)
{
if(i == 'e')
bootbox.dialog('<h3 class="red">Внимание!</h3><div style="text-align: initial;">'+val+'</div>',
[{
"label" : "OK"
}]
);
if(i == 's')
bootbox.dialog('<h3 class="green">Внимание!</h3><div style="text-align: initial;">'+val+'</div>',
[{
"label" : "Продолжить"
}]
);
});
loading(0)
}
});
function updata()
{
if($('#type').val() == 0){
$('#location').hide();
$('#data').show();
} else {
$('#location').show();
$('#data').hide();
}
}
</script>
Последнее редактирование: