Обновление сайта(файлов) php js

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>
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
А что надо-то? Ну вроде это какая-то панель управления, написанная любителем, вчера прочитавшим книжку про PHP, причем до главы про безопасность не дочитавшим. Что-то там по ssh делает, при этом явно надо sudoers определенным образом настроить, да еще и screen там зачем-то. Уязвимости практически в каждой второй строчке, да еще и рута ей давай :)

Единственный совет, который можно дать - выбросить это недоразумение куда подальше.

Какую задачу-то решаешь? Откуда взял это недоразумение? Что на самом деле сделать надо?
 

root123

Новичок
А что надо-то? Ну вроде это какая-то панель управления, написанная любителем, вчера прочитавшим книжку про PHP, причем до главы про безопасность не дочитавшим. Что-то там по ssh делает, при этом явно надо sudoers определенным образом настроить, да еще и screen там зачем-то. Уязвимости практически в каждой второй строчке, да еще и рута ей давай :)

Единственный совет, который можно дать - выбросить это недоразумение куда подальше.

Какую задачу-то решаешь? Откуда взял это недоразумение? Что на самом деле сделать надо?
Это админка ) панели управления игровыми серверами. данный код это модуль который выводит обновления с другого сервера. вопрос в том как он определяет файл название и тд.
$json = json_decode(file_get_contents($cfg['api_url'].'update/api/'.$lic['api'].'/version/3'.$sort), true);
это путь к файлу а к какому в каком формате?) json
 

Вложения

fixxxer

К.О.
Партнер клуба
А че, всякие там сервера контры всякой в докеры не завернули до сих пор, что ли?

UPD: погуглил, завернули, просто люди фигней страдают какой-то.
 

Squats

Новичок
а что тут помогать не пойму?
Ну чтобы помочь ему "понять систему данного модуля. "
Только модулем это не назвать.
А переписывать за него, не ну если хочешь, переписывай и объясняй ему " систему данного модуля. "
 
Сверху