2023-03-04 23:45:46 +00:00
< ? php
if ( ! DEFINED ( 'EGP' ))
2023-03-05 13:59:34 +00:00
exit ( header ( 'Refresh: 0; URL=http://' . $_SERVER [ 'SERVER_NAME' ] . '/404' ));
2023-03-04 23:45:46 +00:00
class web
{
public static function install ( $aData = array (), $mcache )
{
2023-03-05 13:59:34 +00:00
global $cfg , $sql , $start_point ;
include ( DATA . 'web.php' );
if ( ! $aWeb [ $aData [ 'server' ][ 'game' ]][ $aData [ 'type' ]])
sys :: outjs ( array ( 'e' => 'Дополнительная услуга недоступна для установки.' ), $mcache );
// Проверка на наличие уже установленной выбранной услуги
if ( $sql -> num ( web :: stack ( $aData , '`id`' )))
sys :: outjs ( array ( 'i' => 'Дополнительная услуга уже установлена.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Проверка на наличие уже установленной подобной услуги
switch ( $aWebInstall [ $aData [ 'server' ][ 'game' ]][ $aData [ 'type' ]])
{
case 'server' :
foreach ( $aWebOne [ $aData [ 'server' ][ 'game' ]][ $aData [ 'type' ]] as $type )
{
$sql -> query ( 'SELECT `id` FROM `web` WHERE `type`="' . $type . '" AND `server`="' . $aData [ 'server' ][ 'id' ] . '" LIMIT 1' );
if ( $sql -> num ())
sys :: outjs ( array ( 'i' => 'Подобная услуга уже установлена.' , 'type' => $type ), $mcache );
}
break ;
case 'user' :
foreach ( $aWebOne [ $aData [ 'server' ][ 'game' ]][ $aData [ 'type' ]] as $type )
{
$sql -> query ( 'SELECT `id` FROM `web` WHERE `type`="' . $type . '" AND `user`="' . $aData [ 'server' ][ 'user' ] . '" LIMIT 1' );
if ( $sql -> num ())
sys :: outjs ( array ( 'i' => 'Подобная услуга уже установлена.' , 'type' => $type ), $mcache );
}
break ;
case 'unit' :
foreach ( $aWebOne [ $aData [ 'server' ][ 'game' ]][ $aData [ 'type' ]] as $type )
{
$sql -> query ( 'SELECT `id` FROM `web` WHERE `type`="' . $type . '" AND `user`="' . $aData [ 'server' ][ 'user' ] . '" AND `unit`="' . $aData [ 'server' ][ 'unit' ] . '" LIMIT 1' );
if ( $sql -> num ())
sys :: outjs ( array ( 'i' => 'Подобная услуга уже установлена.' , 'type' => $type ), $mcache );
}
}
// Проверка валидности поддомена
if ( sys :: valid ( $aData [ 'subdomain' ], 'other' , " /^[a-z0-9]+ $ / " ))
sys :: outjs ( array ( 'e' => 'Адрес должен состоять из букв a-z и цифр.' ), $mcache );
// Проверка длины поддомена
if ( ! isset ( $aData [ 'subdomain' ]{ 3 }) || isset ( $aData [ 'subdomain' ]{ 15 }))
sys :: outjs ( array ( 'e' => 'Длина адреса не должна превышать 16-и символов и быть не менее 4-х символов.' ), $mcache );
// Проверка запрещенного поддомена
if ( in_array ( $aData [ 'subdomain' ], $aWebUnit [ 'subdomains' ]))
sys :: outjs ( array ( 'e' => 'Нельзя создать данный адрес, придумайте другой.' ), $mcache );
// Проверка наличия домена
if ( ! in_array ( $aData [ 'domain' ], $aWebUnit [ 'domains' ]))
sys :: outjs ( array ( 'e' => 'Выбранный домен не найден.' ), $mcache );
// Проверка поддомена на занятость
$sql -> query ( 'SELECT `id` FROM `web` WHERE `domain`="' . $aData [ 'subdomain' ] . '.' . $aData [ 'domain' ] . '" LIMIT 1' );
if ( $sql -> num ())
sys :: outjs ( array ( 'e' => 'Данный адрес уже занят.' ), $mcache );
// Проверка наличия шаблона
if ( ! array_key_exists ( $aData [ 'desing' ], $aWebParam [ $aData [ 'type' ]][ 'desing' ]))
sys :: outjs ( array ( 'e' => 'Выбранный шаблон не найден.' ), $mcache );
if ( isset ( $aData [ 'passwd' ]))
{
// Если не указан пароль сгенерировать
if ( $aData [ 'passwd' ] == '' )
$aData [ 'passwd' ] = sys :: passwd ( $aWebParam [ $aData [ 'type' ]][ 'passwd' ]);
// Проверка длинны пароля
if ( ! isset ( $aData [ 'passwd' ]{ 5 }) || isset ( $aData [ 'passwd' ]{ 15 }))
sys :: outjs ( array ( 'e' => 'Необходимо указать пароль длинной не менее 6-и символов и не более 16-и.' ), $mcache );
// Проверка валидности пароля
if ( sys :: valid ( $aData [ 'passwd' ], 'other' , " /^[A-Za-z0-9] { 6,16} $ / " ))
sys :: outjs ( array ( 'e' => 'Пароль должен состоять из букв a-z и цифр.' ), $mcache );
}
include ( LIB . 'ssh.php' );
$unit = web :: unit ( $aWebUnit , $aData [ 'type' ], $aData [ 'server' ][ 'unit' ]);
if ( ! $ssh -> auth ( $unit [ 'passwd' ], $unit [ 'address' ]))
sys :: outjs ( array ( 'e' => sys :: text ( 'error' , 'ssh' )), $mcache );
// Директория файлов услуги
$path = $aWebUnit [ 'path' ][ $aWebUnit [ 'unit' ][ $aData [ 'type' ]]][ $aData [ 'type' ]] . $aData [ 'desing' ];
// Директория дополнительной услуги
$install = $aWebUnit [ 'install' ][ $aWebUnit [ 'unit' ][ $aData [ 'type' ]]][ $aData [ 'type' ]] . $aData [ 'subdomain' ] . '.' . $aData [ 'domain' ];
$sql -> query ( 'INSERT INTO `web` set `type`="' . $aData [ 'type' ] . '", `server`="' . $aData [ 'server' ][ 'id' ] . '", `user`="' . $aData [ 'server' ][ 'user' ] . '", `unit`="' . $aData [ 'server' ][ 'unit' ] . '", `config`=""' );
$wid = $sql -> id ();
$uid = $wid + 10000 ;
$sql -> query ( 'SELECT `mail` FROM `users` WHERE `id`="' . $aData [ 'server' ][ 'user' ] . '" LIMIT 1' );
if ( ! $sql -> num ())
{
$sql -> query ( 'DELETE FROM `web` WHERE `id`="' . $wid . '" LIMIT 1' );
sys :: outjs ( array ( 'e' => 'Необходимо указать пользователя сервера.' ), $mcache );
}
$u = $sql -> get ();
// Данные
$login = 'w' . $uid ;
$passwd = sys :: passwd ( 10 );
$ip = sys :: first ( explode ( ':' , $unit [ 'address' ]));
$host = $aWebUnit [ 'unit' ][ $aData [ 'type' ]] == 'local' ? '127.0.0.1' : $ip ;
$conf = array (
'address' => $aData [ 'server' ][ 'address' ],
'install' => $install ,
'login' => $login ,
'passwd' => $passwd ,
'host' => $host ,
'url' => $cfg [ 'http' ],
'domain' => $aData [ 'subdomain' ] . '.' . $aData [ 'domain' ]
);
$aData [ 'config_sql' ] = sys :: updtext ( $aData [ 'config_sql' ], $conf );
if ( isset ( $aWebdbConf [ $aData [ 'type' ]]))
{
$aData [ 'config_php' ] = sys :: updtext ( $aData [ 'config_php' ], $conf );
$temp = sys :: temp ( $aData [ 'config_php' ]);
$ssh -> setfile ( $temp , $path . $aWebdbConf [ $aData [ 'type' ]][ 'file' ], $aWebdbConf [ $aData [ 'type' ]][ 'chmod' ]);
unlink ( $temp );
}
if ( isset ( $aWebothPath [ $aData [ 'type' ]]))
{
$aData [ 'config_oth' ] = sys :: updtext ( $aData [ 'config_oth' ], $conf );
$temp = sys :: temp ( $aData [ 'config_oth' ]);
$ssh -> setfile ( $temp , $path . $aWebothPath [ $aData [ 'type' ]][ 'file' ], $aWebothPath [ $aData [ 'type' ]][ 'chmod' ]);
unlink ( $temp );
}
// Создание поддомена
$result = json_decode ( file_get_contents ( sys :: updtext ( $aWebUnit [ 'isp' ][ 'domain' ][ 'create' ], array ( 'subdomain' => $aData [ 'subdomain' ], 'ip' => $ip , 'domain' => $aData [ 'domain' ]))), true );
if ( ! isset ( $result [ 'result' ]) || strtolower ( $result [ 'result' ]) != 'ok' )
{
$sql -> query ( 'DELETE FROM `web` WHERE `id`="' . $wid . '" LIMIT 1' );
sys :: outjs ( array ( 'e' => 'Н е удалось создать поддомен, обратитесь в тех.поддержку.' ), $mcache );
}
// Создание задания crontab
if ( isset ( $aWebUnit [ 'isp' ][ 'crontab' ][ $aData [ 'type' ]][ 'install' ]))
{
$result = json_decode ( file_get_contents ( sys :: updtext ( $aWebUnit [ 'isp' ][ 'crontab' ][ $aData [ 'type' ]][ 'install' ], array ( 'subdomain' => $aData [ 'subdomain' ], 'domain' => $aData [ 'domain' ]))), true );
if ( ! isset ( $result [ 'result' ]) || strtolower ( $result [ 'result' ]) != 'ok' )
{
$sql -> query ( 'DELETE FROM `web` WHERE `id`="' . $wid . '" LIMIT 1' );
sys :: outjs ( array ( 'e' => 'Н е удалось создать задание, обратитесь в тех.поддержку.' ), $mcache );
}
}
$a2 = '<VirtualHost ' . $ip . ':80>' . PHP_EOL
. ' ServerName ' . $aData [ 'subdomain' ] . '.' . $aData [ 'domain' ] . PHP_EOL
. ' DocumentRoot ' . $install . PHP_EOL
. ' AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml' . PHP_EOL
. ' AddType application/x-httpd-php-source .phps' . PHP_EOL
. '</VirtualHost>' ;
// Смена прав на файлы/папки
$chmod = isset ( $aWebChmod [ $aData [ 'type' ]]) ? $aWebChmod [ $aData [ 'type' ]] : '' ;
$sql_q = '' ;
if ( isset ( $aWebSQL [ $aData [ 'type' ]]))
{
$sql_q .= 'mysql --login-path=local -e "CREATE DATABASE ' . $login . ';'
. " CREATE USER ' " . $login . " '@'%' IDENTIFIED BY ' " . $passwd . " '; "
. 'GRANT ALL PRIVILEGES ON ' . $login . ' . * TO \'' . $login . '\'@\'%\';";'
. 'mysql --login-path=local ' . $login . ' < ' . $aWebUnit [ 'path' ][ $aWebUnit [ 'unit' ][ $aData [ 'type' ]]][ $aData [ 'type' ]] . 'dump.sql;' ;
if ( isset ( $aWebSQL [ $aData [ 'type' ]][ 'install' ]))
foreach ( $aWebSQL [ $aData [ 'type' ]][ 'install' ] as $query )
$sql_q .= " mysql --login-path=local " . $login . " -e \" " . sys :: updtext ( $query ,
array (
'url' => $cfg [ 'http' ],
'passwd' => $aData [ 'passwd' ],
'mail' => $u [ 'mail' ],
'folder' => $install )
) . " \" ; " ;
}
// Установка
$ssh -> set ( 'echo "' . $a2 . '" > /etc/apache2/sites-enabled/' . $aData [ 'subdomain' ] . '.' . $aData [ 'domain' ] . ';' // Настроки апач
. 'mkdir -p ' . $install . ';' // Создание директории
. 'useradd -d ' . $install . ' -g web -u ' . $uid . ' web' . $uid . ';' // Создание пользователя услуги на локации
. 'chown -R web' . $uid . ':999 ' . $install . ';' // Изменение владельца и группы директории
. 'cd ' . $install . ' && sudo -u web' . $uid . ' screen -dmS i_w_' . $uid . ' sh -c "cp -r ' . $path . '/. .; ' . $chmod . '";' // Копирование файлов услуги
. 'screen -dmS apache_reload_' . $uid . ' service apache2 reload;' // Перезагрузить конфигурации апач
. $sql_q ); // sql запросы
$aData [ 'passwd' ] = isset ( $aData [ 'passwd' ]) ? $aData [ 'passwd' ] : '' ;
// Обновление данных
$sql -> query ( 'UPDATE `web` set `uid`="' . $uid . '", `desing`="' . $aData [ 'desing' ] . '", '
. '`domain`="' . $aData [ 'subdomain' ] . '.' . $aData [ 'domain' ] . '", '
. '`passwd`="' . $aData [ 'passwd' ] . '", `config`="' . base64_encode ( $aData [ 'config_sql' ]) . '", '
. '`login`="' . $login . '", `date`="' . $start_point . '" '
. 'WHERE `id`="' . $wid . '" LIMIT 1' );
sys :: outjs ( array ( 's' => 'ok' ), $mcache );
2023-03-04 23:45:46 +00:00
}
2023-03-05 13:59:34 +00:00
public static function update ( $aData = array (), $mcache )
{
global $sql , $start_point ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( DATA . 'web.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$stack = web :: stack ( $aData , '`id`, `uid`, `unit`, `login`, `desing`, `domain`, `update`' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $sql -> num ( $stack ))
sys :: outjs ( array ( 'e' => 'Дополнительная услуга не установлена.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$web = $sql -> get ( $stack );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Проверка времени последнего обновления
include ( LIB . 'games/games.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$upd = $web [ 'update' ] + 86400 ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( $upd > $start_point )
sys :: outjs ( array ( 'e' => 'Для повторного обновления должно пройти: ' . games :: date ( 'max' , $upd )));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( LIB . 'ssh.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$unit = web :: unit ( $aWebUnit , $aData [ 'type' ], $web [ 'unit' ]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $ssh -> auth ( $unit [ 'passwd' ], $unit [ 'address' ]))
sys :: outjs ( array ( 'e' => sys :: text ( 'error' , 'ssh' )), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$install = $aWebUnit [ 'install' ][ $aWebUnit [ 'unit' ][ $aData [ 'type' ]]][ $aData [ 'type' ]] . $web [ 'domain' ];
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$path = $aWebUnit [ 'path' ][ $aWebUnit [ 'unit' ][ $aData [ 'type' ]]][ $aData [ 'type' ]] . $web [ 'desing' ];
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'SELECT `mail` FROM `users` WHERE `id`="' . $aData [ 'server' ][ 'user' ] . '" LIMIT 1' );
if ( ! $sql -> num ())
sys :: outjs ( array ( 'e' => 'Необходимо указать пользователя сервера.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$u = $sql -> get ();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// sql запросы
$sql_q = '' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( isset ( $aWebSQL [ $aData [ 'type' ]][ 'update' ]))
foreach ( $aWebSQL [ $aData [ 'type' ]][ 'update' ] as $query )
$sql_q .= " mysql --login-path=local " . $web [ 'login' ] . " -e \" " . sys :: updtext ( $query , array ( 'passwd' => $aData [ 'passwd' ], 'mail' => $u [ 'mail' ])) . " \" ; " ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$cat = isset ( $aWebdbConf [ $aData [ 'type' ]]) ? 'cat ' . $install . $aWebdbConf [ $aData [ 'type' ]][ 'file' ] . ' > ' . $path . $aWebdbConf [ $aData [ 'type' ]][ 'file' ] . ';' : '' ;
$chmod = isset ( $aWebChmod [ $aData [ 'type' ]]) ? $aWebChmod [ $aData [ 'type' ]] : '' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh -> set ( $cat
. 'cd ' . $install . ' && sudo -u web' . $web [ 'uid' ] . ' screen -dmS u_w_' . $web [ 'uid' ] . ' sh -c "YES | cp -rf ' . $path . '/. .; ' . $chmod . '";'
. $sql_q ); // sql запрос
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'UPDATE `web` set `update`="' . $start_point . '" WHERE `id`="' . $web [ 'id' ] . '" LIMIT 1' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys :: outjs ( array ( 's' => 'ok' ), $mcache );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function delete ( $aData = array (), $mcache )
2023-03-04 23:45:46 +00:00
{
2023-03-05 13:59:34 +00:00
global $sql ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( DATA . 'web.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$stack = web :: stack ( $aData , '`id`, `uid`, `unit`, `domain`, `login`' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $sql -> num ( $stack ))
sys :: outjs ( array ( 'e' => 'Дополнительная услуга не установлена.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$web = $sql -> get ( $stack );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( LIB . 'ssh.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$unit = web :: unit ( $aWebUnit , $aData [ 'type' ], $web [ 'unit' ]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $ssh -> auth ( $unit [ 'passwd' ], $unit [ 'address' ]))
sys :: outjs ( array ( 'e' => sys :: text ( 'error' , 'ssh' )), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Директория дополнительной услуги
$delete = '' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( $web [ 'domain' ] != '' )
$delete = 'screen -dmS r_w_' . $web [ 'uid' ] . ' rm -r ' . $aWebUnit [ 'install' ][ $aWebUnit [ 'unit' ][ $aData [ 'type' ]]][ $aData [ 'type' ]] . $web [ 'domain' ] . ';' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ip = sys :: first ( explode ( ':' , $unit [ 'address' ]));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$aDomain = explode ( '.' , $web [ 'domain' ]);
$zone = array_pop ( $aDomain );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Удаление поддомена
if ( $aData [ 'type' ] != 'mysql' )
{
$result = json_decode ( file_get_contents ( sys :: updtext ( $aWebUnit [ 'isp' ][ 'domain' ][ 'delete' ], array ( 'subdomain' => $web [ 'domain' ], 'domain' => end ( $aDomain ) . '.' . $zone , 'ip' => $ip ))), true );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! isset ( $result [ 'result' ]) || strtolower ( $result [ 'result' ]) != 'ok' )
sys :: outjs ( array ( 'e' => 'Н е удалось удалить поддомен, обратитесь в тех.поддержку.' ), $mcache );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Удаление задания crontab
if ( isset ( $aWebUnit [ 'isp' ][ 'crontab' ][ $aData [ 'type' ]][ 'delete' ]) && isset ( $aData [ 'cron' ]))
{
$result = json_decode ( file_get_contents ( sys :: updtext ( $aWebUnit [ 'isp' ][ 'crontab' ][ $aData [ 'type' ]][ 'delete' ], array ( 'data' => $aData [ 'cron' ]))), true );
if ( ! isset ( $result [ 'result' ]) || strtolower ( $result [ 'result' ]) != 'ok' )
sys :: outjs ( array ( 'e' => 'Н е удалось удалить задание, обратитесь в тех.поддержку.' ), $mcache );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql_q = isset ( $aWebSQL [ $aData [ 'type' ]]) ? " mysql --login-path=local -e \" DROP DATABASE IF EXISTS " . $web [ 'login' ] . " ; DROP USER " . $web [ 'login' ] . " \" " : '' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh -> set ( 'rm /etc/apache2/sites-enabled/' . $web [ 'domain' ] . ';' // Удаление настроек апач
. $delete // Удаление файлов
. 'userdel web' . $web [ 'uid' ] . ';' // Удаление пользователя
. 'screen -dmS apache_reload_' . $web [ 'uid' ] . ' service apache2 reload;' // Перезагрузить конфигурации апач
. $sql_q ); // sql запрос
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'DELETE FROM `web` WHERE `id`="' . $web [ 'id' ] . '" LIMIT 1' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys :: outjs ( array ( 's' => 'ok' ), $mcache );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function connect ( $aData = array (), $mcache )
2023-03-04 23:45:46 +00:00
{
2023-03-05 13:59:34 +00:00
global $cfg , $sql , $start_point ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( DATA . 'web.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'SELECT `id`, `uid`, `unit`, `game`, `user`, `tarif`, `address`, `status`, `name` FROM `servers` WHERE `id`="' . $aData [ 'server' ] . '" AND `user`="' . $aData [ 'user' ] . '" LIMIT 1' );
if ( ! $sql -> num ())
sys :: outjs ( array ( 'e' => 'Игровой сервер не найден.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$server = $sql -> get ();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Проверка статуса игрового сервера
if ( ! in_array ( $server [ 'status' ], array ( 'working' , 'off' , 'start' , 'restart' , 'change' )))
sys :: outjs ( array ( 'e' => 'Игровой сервер недоступен для подключения.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Проверка установки плагина
$sql -> query ( 'SELECT `id` FROM `plugins_install` WHERE `server`="' . $server [ 'id' ] . '" AND `plugin`="' . $aWebConnect [ $aData [ 'type' ]][ $server [ 'game' ]] . '" LIMIT 1' );
if ( ! $sql -> num ())
sys :: outjs ( array ( 'i' => 'Для подключения, необходимо установить плагин.' , 'pid' => $aWebConnect [ $aData [ 'type' ]][ $server [ 'game' ]]), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$aData [ 'server' ] = array_merge ( $server , array ( 'id' => $aData [ 'server' ]));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$stack = web :: stack ( $aData , '`config`, `unit`, `login`' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $sql -> num ( $stack ))
sys :: outjs ( array ( 'e' => 'Дополнительная услуга не установлена.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$web = $sql -> get ( $stack );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( LIB . 'ssh.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'SELECT `passwd`, `address` FROM `units` WHERE `id`="' . $server [ 'unit' ] . '" LIMIT 1' );
$unit = $sql -> get ();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $ssh -> auth ( $unit [ 'passwd' ], $unit [ 'address' ]))
sys :: outjs ( array ( 'e' => sys :: text ( 'error' , 'ssh' )), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'SELECT `install` FROM `tarifs` WHERE `id`="' . $server [ 'tarif' ] . '" LIMIT 1' );
$tarif = $sql -> get ();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Директория игр. сервера
$dir = $tarif [ 'install' ] . $server [ 'uid' ] . '/' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Взять rcon_password
$get = explode ( ' ' , str_replace ( '"' , '' , trim ( $ssh -> get ( 'cat ' . $dir . $aData [ 'cfg' ] . ' | grep rcon_password' ))));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$rcon = trim ( end ( $get ));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! isset ( $rcon { 0 }))
sys :: outjs ( array ( 'r' => 'Необходимо установить rcon пароль (rcon_password).' , 'url' => $cfg [ 'http' ] . 'servers/id/' . $server [ 'id' ] . '/section/settings/subsection/server' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$temp = sys :: temp ( sys :: updtext ( base64_decode ( $web [ 'config' ]), $aData [ 'orcfg' ]));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh -> setfile ( $temp , $dir . $aData [ 'file' ], 0644 );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$unit = web :: unit ( $aWebUnit , $aData [ 'type' ], $web [ 'unit' ]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $ssh -> auth ( $unit [ 'passwd' ], $unit [ 'address' ]))
sys :: outjs ( array ( 'e' => sys :: text ( 'error' , 'ssh' )), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// sql запросы
$sql_q = '' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
list ( $ip , $port ) = explode ( ':' , $server [ 'address' ]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( isset ( $aWebSQL [ $aData [ 'type' ]][ 'connect' ]))
foreach ( $aWebSQL [ $aData [ 'type' ]][ 'connect' ] as $query )
$sql_q .= " mysql --login-path=local " . $web [ 'login' ] . " -e \" " . sys :: updtext ( $query ,
array_merge ( array ( 'id' => $aData [ 'server' ][ 'id' ], 'rcon' => $rcon , 'address' => $server [ 'address' ], 'ip' => $ip , 'port' => $port , 'name' => $server [ 'name' ], 'time' => $start_point ), $aData [ 'orsql' ])) . " \" ; " ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh -> set ( 'chown server' . $server [ 'uid' ] . ':servers ' . $dir . $aData [ 'file' ] . ';' // Смена владельца файла
. $sql_q ); // sql запросы
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
unlink ( $temp );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys :: outjs ( array ( 's' => 'ok' ), $mcache );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function passwd ( $aData = array (), $mcache )
{
global $sql ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( DATA . 'web.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$stack = web :: stack ( $aData );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $sql -> num ( $stack ))
sys :: outjs ( array ( 'e' => 'Дополнительная услуга не установлена.' ), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$web = $sql -> get ( $stack );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$passwd = sys :: passwd ( $aWebParam [ $aData [ 'type' ]][ 'passwd' ]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( LIB . 'ssh.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$unit = web :: unit ( $aWebUnit , $aData [ 'type' ], $web [ 'unit' ]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( ! $ssh -> auth ( $unit [ 'passwd' ], $unit [ 'address' ]))
sys :: outjs ( array ( 'e' => sys :: text ( 'error' , 'ssh' )), $mcache );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql_q = '' ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( isset ( $aWebSQL [ $aData [ 'type' ]][ 'passwd' ]))
foreach ( $aWebSQL [ $aData [ 'type' ]][ 'passwd' ] as $query )
$sql_q .= " mysql --login-path=local " . $web [ 'login' ] . " -e \" " . sys :: updtext ( $query , array ( 'passwd' => $passwd )) . " \" ; " ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh -> set ( $sql_q );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql -> query ( 'UPDATE `web` set `passwd`="' . $passwd . '" WHERE `id`="' . $web [ 'id' ] . '" LIMIT 1' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys :: outjs ( array ( 's' => 'ok' ), $mcache );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function stack ( $aData , $select = '`id`, `unit`, `login`' )
{
global $sql ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include ( DATA . 'web.php' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
switch ( $aWebInstall [ $aData [ 'server' ][ 'game' ]][ $aData [ 'type' ]])
{
case 'server' :
return $sql -> query ( 'SELECT ' . $select . ' FROM `web` WHERE `type`="' . $aData [ 'type' ] . '" AND `server`="' . $aData [ 'server' ][ 'id' ] . '" LIMIT 1' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
case 'user' :
return $sql -> query ( 'SELECT ' . $select . ' FROM `web` WHERE `type`="' . $aData [ 'type' ] . '" AND `user`="' . $aData [ 'server' ][ 'user' ] . '" LIMIT 1' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
case 'unit' :
return $sql -> query ( 'SELECT ' . $select . ' FROM `web` WHERE `type`="' . $aData [ 'type' ] . '" AND `user`="' . $aData [ 'server' ][ 'user' ] . '" AND `unit`="' . $aData [ 'server' ][ 'unit' ] . '" LIMIT 1' );
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return NULL ;
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function unit ( $aWebUnit , $type , $id )
{
global $sql ;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if ( $aWebUnit [ 'unit' ][ $type ] == 'local' )
{
$sql -> query ( 'SELECT `address`, `passwd` FROM `units` WHERE `id`="' . $id . '" LIMIT 1' );
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return $sql -> get ();
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return array ( 'address' => $aWebUnit [ 'address' ], 'passwd' => $aWebUnit [ 'passwd' ]);
}
2023-03-04 23:45:46 +00:00
}
?>