Files
redl-gamepanel/panel/application/models/servers.php
T
redl 6ee2744e3a Сборка REDL: панель на PHP 8, капча-тумблер, закрытые уязвимости, установщики в один клик
- панель работает на PHP 8.4 (оригинал под PHP 7.0): elFinder utf8_encode, apache_get_modules, warnings
- капча выключена и управляется из админки (флаг captcha_enable + блок настроек)
- закрыты две SQL-инъекции без авторизации (createAuthLog: пароль из POST и CF-Connecting-IP)
- убрано хранение паролей в открытом виде в authlog, XSS в поле ref
- установщики install-panel.sh и install-node.sh (оригинальный затирал sources.list репозиториями Debian 9)
- современный Dockerfile (оригинальный на debian:stretch больше не собирается)
- планировщик и автозапуск работают без systemd
- брендинг REDL.IO, год 2026, ссылки на redl.io
- документация на русском: ИЗМЕНЕНИЯ, БЕЗОПАСНОСТЬ, ИНСТРУКЦИЯ
2026-07-30 02:00:01 +00:00

1671 lines
60 KiB
PHP

<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
serversModel:
- Игровые сервера
- Планировщик задач
- Друзья
- Firewall
- Автоустановка модов
- Репозиторий
- Статистика игровых серверов
- Логи игрового сервера
*/
class serversModel extends Model {
/* =================== Игровые сервера =================== */
public function createServer($data) {
$sql = "INSERT INTO `servers` SET ";
$sql .= "`user_id` = '" . (int)$data['user_id'] . "', ";
$sql .= "`game_id` = '" . (int)$data['game_id'] . "', ";
$sql .= "`location_id` = '" . (int)$data['location_id'] . "', ";
$sql .= "`server_mysql` = '0', ";
$sql .= "`server_slots` = '" . (int)$data['server_slots'] . "', ";
$sql .= "`server_port` = '" . (int)$data['server_port'] . "', ";
$sql .= "`server_password` = '" . $this->db->escape($data['server_password']) . "', ";
$sql .= "`server_status` = '" . (int)$data['server_status'] . "', ";
$sql .= "`server_work` = '1', ";
$sql .= "server_date_reg = NOW(), ";
if($data['test_periud'] == false){
$sql .= "server_date_end = NOW() + INTERVAL " . (int)$data['server_days'] . " DAY";
}
elseif($data['test_periud'] == true) {
$sql .= "`server_date_end` = NOW() + INTERVAL 3 DAY";
$this->db->query("UPDATE `users` SET `test_server` = '2' WHERE `user_id` = '{$this->user->getId()}'");
}
$this->db->query($sql);
$return=$this->db->getLastId();
return $return;
}
public function promisedServer($serverid) {
$this->action($serverid, "updatepassm");
$this->action($serverid, "updatepass");
$this->db->query("UPDATE `servers` SET server_date_end = server_date_end +INTERVAL 3 DAY WHERE server_id = '" . (int)$serverid . "'");
$this->updateServer($serverid, array('server_status' => 1));
return array('status' => 'success');
}
public function deleteServer($serverid) {
$this->db->query("DELETE FROM `servers` WHERE server_id = '" . (int)$serverid . "'");
}
public function blockServer($serverid) {
$sql = "DELETE FROM `servers` WHERE server_id = '" . (int)$serverid . "'";
$this->db->query($sql);
}
public function updateServer($serverid, $data = array()) {
$sql = "UPDATE `servers`";
if(!empty($data)) {
$count = count($data);
$sql .= " SET";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= ",";
}
}
$sql .= " WHERE `server_id` = '" . (int)$serverid . "'";
$query = $this->db->query($sql);
}
public function getServers($data = array(), $joins = array(), $sort = array(), $options = array()) {
$sql = "SELECT * FROM `servers`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "users":
$sql .= " ON servers.user_id=users.user_id";
break;
case "games":
$sql .= " ON servers.game_id=games.game_id";
break;
case "locations":
$sql .= " ON servers.location_id=locations.location_id";
break;
}
}
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if ($options['start'] < 0) {
$options['start'] = 0;
}
if ($options['limit'] < 1) {
$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)$options['start'] . "," . (int)$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getServerById($serverid, $joins = array()) {
$sql = "SELECT * FROM `servers`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "users":
$sql .= " ON servers.user_id=users.user_id";
break;
case "games":
$sql .= " ON servers.game_id=games.game_id";
break;
case "locations":
$sql .= " ON servers.location_id=locations.location_id";
break;
}
}
$sql .= " WHERE `server_id` = '" . (int)$serverid . "' LIMIT 1";
$query = $this->db->query($sql);
return $query->row;
}
public function getTotalServerOwners($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers_owners`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
public function getTotalServers($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
public function getServerNewPort($locationid, $min, $max) {
for($i = $min; $i < $max; $i += 2) {
$sql = "SELECT COUNT(*) AS total FROM `servers` WHERE location_id = '" . (int)$locationid . "' AND server_port = '" . (int)$i . "' LIMIT 1";
$query = $this->db->query($sql);
if($query->row['total'] == 0) {
return $i;
}
}
return null;
}
public function getGameServerPortList($locationid, $min, $max) {
for($i = $min; $i < $max; $i += 2) {
$query = $this->db->query("SELECT COUNT(*) AS count FROM `servers` WHERE location_id = '" . (int)$locationid . "' AND server_port = '" . (int)$i . "'");
if(!$query->row['count']) {
$ports[] = $i;
}
}
return $ports;
}
public function getServerSystemLoad($serverid) {
$this->load->library('ssh2');
$ssh2Lib = new ssh2Library();
$server = $this->getServerById($serverid, array('users', 'locations', 'games'));
$link = $ssh2Lib->connect($server["location_ip"], $server["location_user"], $server["location_password"]);
$stats = @explode(' ', explode(PHP_EOL, $ssh2Lib->execute($link, 'docker stats --all --no-stream gs' . $server['server_id'] . ' | awk \'{print $3" "$7}\''))[1]);
$cpu = @$stats[0];
$ram = @$stats[1];
$output['ssd'] = 0;
$ssd = $ssh2Lib->execute($link, 'du -scm /home/gs' . $server['server_id'] . ' | tail -1 | sed \'s/[^0-9]//g\'');
if($ssd) {
$output['ssd'] = $ssd;
}
$output['ram'] = $ram;
$output['cpu'] = $cpu;
$output['ssd'] = $output['ssd'];
$ssh2Lib->disconnect($link);
return $output;
}
public function extendServer($serverid, $month, $fromCurrent) {
$sql = "UPDATE `servers` SET server_date_end = ";
if($fromCurrent)
$sql .= "NOW()";
else
$sql .= "server_date_end";
$sql .= "+INTERVAL " . (int)$month . " DAY WHERE server_id = '" . (int)$serverid . "'";
$this->db->query($sql);
}
public function slotsServer($serverid, $slots) {
$sql = "UPDATE `servers` SET server_slots = '" . (int)$slots . "' WHERE server_id = '" . (int)$serverid . "'";
$this->db->query($sql);
}
public function getHDD($serverid) {
$this->load->library('ssh2');
$ssh2Lib = new ssh2Library();
$server = $this->getServerById($serverid, array('users', 'locations', 'games'));
$link = $ssh2Lib->connect($server['location_ip'], $server['location_user'], $server['location_password']);
$output = (int)$ssh2Lib->execute($link, "du -scm /home/gs".$server['server_id']." | tail -1 | sed 's/[^0-9]//g'");
$ssh2Lib->disconnect($link);
return $output;
}
public function gameConfigs($serverid) {
$this->load->library('ssh2');
$ssh2Lib = new ssh2Library();
$server = $this->getServerById($serverid, array('users', 'locations', 'games'));
$link = $ssh2Lib->connect($server['location_ip'], $server['location_user'], $server['location_password']);
$configs = array();
if($server['game_query'] == 'samp') {
$configs = array(
array(
'File' => '/server.cfg',
'ExecPattern' => false,
'Required' => 1,
'Values' => array(
array(
'Pattern' => 'maxplayers <value>',
'Value' => $server['server_slots'],
'Required' => 1
),
array(
'Pattern' => 'bind <value>',
'Value' => $server['location_ip'],
'Required' => 1
),
array(
'Pattern' => 'port <value>',
'Value' => $server['server_port'],
'Required' => 1
),
array(
'Pattern' => 'rcon_password <value>',
'Value' => $server['rcon_password'],
'Required' => 1
)
)
)
);
} else if($server['game_code'] == 'cs') {
if($server['server_fps'] == 0) {
$server_fps = 300;
} else {
$server_fps = $server['server_fps'];
}
$configs = array(
array(
'File' => '/cstrike/server.cfg',
'ExecPattern' => 'exec <value>',
'Required' => 1,
'Values' => array(
array(
'Pattern' => 'rcon_password "<value>',
'Value' => ''.$server['rcon_password'].'"',
'Required' => 1
),
array(
'Pattern' => 'sys_ticrate "<value>',
'Value' => ''.$server_fps.'"',
'Required' => 1
)
)
)
);
} else if($server['game_code'] == 'css') {
$configs = array(
array(
'File' => '/cstrike/cfg/server.cfg',
'ExecPattern' => 'exec <value>',
'Required' => 1,
'Values' => array(
array(
'Pattern' => 'rcon_password "<value>',
'Value' => ''.$server['rcon_password'].'"',
'Required' => 1
)
)
)
);
} else if($server['game_code'] == 'csgo') {
$configs = array(
array(
'File' => '/csgo/cfg/server.cfg',
'ExecPattern' => 'exec <value>',
'Required' => 1,
'Values' => array(
array(
'Pattern' => 'rcon_password "<value>',
'Value' => ''.$server['rcon_password'].'"',
'Required' => 1
)
)
)
);
} else if($server['game_code'] == 'mcpe') {
$configs = array(
array(
'File' => '/server.properties',
'Required' => 1,
'Values' => array(
array(
'Pattern' => 'max-players=<value>',
'Value' => $server['server_slots'],
'Required' => 1
),
array(
'Pattern' => 'server-port=<value>',
'Value' => $server['server_port'],
'Required' => 1
),
array(
'Pattern' => 'memory-limit=<value>',
'Value' => $server['game_ram'] . 'M',
'Required' => 1
),
array(
'Pattern' => 'rcon.password=<value>',
'Value' => $server['rcon_password'],
'Required' => 1
),
array(
'Pattern' => 'server-ip=<value>',
'Value' => $server['location_ip'],
'Required' => 1
)
)
)
);
} else if($server['game_code'] == 'mine') {
$configs = array(
array(
'File' => '/server.properties',
'ExecPattern' => false,
'Required' => 2,
'Values' => array(
array(
'Pattern' => 'max-players=<value>',
'Value' => $server['server_slots'],
'Required' => 1
),
array(
'Pattern' => 'server-ip=<value>',
'Value' => $server['location_ip'],
'Required' => 1
),
array(
'Pattern' => 'server-port=<value>',
'Value' => $server['server_port'],
'Required' => 1
),
array(
'Pattern' => 'online-mode=<value>',
'Value' => 'true',
'Required' => 1
),
array(
'Pattern' => 'enable-query=<value>',
'Value' => 'true',
'Required' => 1
)
)
)
);
} else if($server['game_query'] == 'mtasa') {
$http_port = $server['server_port'] + 1;
$configs = array(
array(
'File' => '/mods/deathmatch/mtaserver.conf',
'ExecPattern' => false,
'Required' => 1,
'Values' => array(
array(
'Pattern' => '<serverip><value>',
'Value' => ''.$server['location_ip'].'</serverip>',
'Required' => 1
),
array(
'Pattern' => '<serverport><value>',
'Value' => ''.$server['server_port'].'</serverport>',
'Required' => 1
),
array(
'Pattern' => '<maxplayers><value>',
'Value' => ''.$server['server_slots'].'</maxplayers>',
'Required' => 1
),
array(
'Pattern' => '<httpport><value>',
'Value' => ''.$http_port.'</httpport>',
'Required' => 1
),
array(
'Pattern' => '<bandwidth_reduction><value>',
'Value' => 'medium</bandwidth_reduction>',
'Required' => 0
),
array(
'Pattern' => '<fpslimit><value>',
'Value' => '36</fpslimit>',
'Required' => 0
)
)
)
);
} else if($server['game_code'] == 'ragemp') {
$configs = array(
array(
'File' => '/conf.json',
'ExecPattern' => false,
'Required' => 1,
'Values' => array(
array(
'Pattern' => '"bind" : "<value>',
'Value' => ''.$server['location_ip'].'",',
'Required' => 1
),
array(
'Pattern' => '"port" : <value>',
'Value' => ''.$server['server_port'].',',
'Required' => 1
),
array(
'Pattern' => '"maxplayers" : <value>',
'Value' => ''.$server['server_slots'].',',
'Required' => 1
)
)
)
);
} else {
return array('status' => 'error', 'description' => 'Для данной игры не найдены настройки конфигурации!');
}
$this->load->library('sftp');
$sftpLib = new sftpLibrary();
$sftpLink = $sftpLib->connect($server['location_ip'], $server['location_user'], $server['location_password']);
foreach($configs as $cfg) {
$file = $sftpLib->open($sftpLink, '/home/gs' . $serverid . '/' . $cfg['File']);
if(empty($file) && $cfg['Required'] == 1) {
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/files/' . $server['game_code'] .'/'. $cfg['File'] . ' /home/gs' . $serverid . '/');
$ssh2Lib->execute($link, 'chown gs' . $serverid . ':gameservers -Rf /home/gs' . $serverid .'/'. $cfg['File']);
}
}
foreach($configs as $cfg) {
$file = $sftpLib->open($sftpLink, '/home/gs' . $serverid . '/' . $cfg['File']);
if(empty($file) && $cfg['Required'] == 1) {
return array('status' => 'error', 'description' => 'Ошибка конфигурации!');
}
foreach($cfg['Values'] as $value) {
$pattern = str_replace('<value>', '(.*)', $value['Pattern']);
$replace = str_replace('<value>', $value['Value'], $value['Pattern']);
if($value['Required'] == 1 && !preg_match('/' . $pattern . '/', $file)) {
$file .= "\r\n" . $pattern;
} else if($value['Required'] == -1 && preg_match('/' . $pattern . '/', $file)) {
return False;
}
$file = preg_replace('/' . $pattern . '/', $replace, $file);
}
if($file != null) $sftpLib->write($sftpLink, '/home/gs' . $serverid . '/' . $cfg['File'], $file);
}
$ssh2Lib->disconnect($link);
}
public function gameFiles($serverid) {
$server = $this->getServerById($serverid, array('users', 'locations', 'games'));
if($server['game_code'] == 'samp') {
$check_files = 'samp03svr announce samp-npc';
} else if($server['game_code'] == 'crmp') {
$check_files = 'samp03svr-cr announce samp-npc';
} else if($server['game_code'] == 'crmp037') {
$check_files = 'samp03svr-cr announce adap-npc';
} else if($server['game_code'] == 'unit') {
$check_files = 'samp03svr-u2 announu2 adap-npc';
} else if($server['game_code'] == 'cs') {
$check_files = 'hlds_run hlds_linux';
} else if($server['game_code'] == 'css') {
$check_files = 'srcds_linux srcds_run';
} else if($server['game_code'] == 'csgo') {
$check_files = 'srcds_linux srcds_run';
} else if($server['game_code'] == 'mcpe') {
if($server['server_binary_version'] == '7.0' || $server['server_binary_version'] == '7.2' || $server['server_binary_version'] == '7.3') {
$check_files = 'bin/php7/bin/php PocketMine-MP.phar';
} else if($server['server_binary_version'] == 'Java') {
$check_files = 'Java/bin/java src/nukkit/nukkit.jar';
} else if ($server['server_binary_version'] == 'VanillaCpp') {
$check_files = 'bedrock_server';
}
} else if($server['game_code'] == 'mine') {
$check_files = 'Java/bin/java minecraft.jar';
} else if($server['game_code'] == 'mta') {
$check_files = 'mta-server';
} else if($server['game_code'] == 'ragemp') {
$check_files = 'server';
}
return $check_files;
}
public function gameBin($serverid) {
$server = $this->getServerById($serverid, array('users', 'locations', 'games'));
if($server['game_code'] == 'mcpe') {
if($server['server_binary_version'] == '7.0') {
$bin = 'php7.0/bin';
} else if($server['server_binary_version'] == '7.2') {
$bin = 'php7.2/bin';
} else if($server['server_binary_version'] == '7.3') {
$bin = 'php7.3/bin';
} else if($server['server_binary_version'] == 'Java') {
$bin = 'Java';
}
} else if($server['game_code'] == 'mine') {
if($server['server_binary_version'] == 'Java') {
$bin = 'Java';
}
}
return $bin;
}
public function action($serverid, $action = "", $data = array()) {
$this->load->library('ssh2');
$ssh2Lib = new ssh2Library();
$server = $this->getServerById($serverid, array('users', 'locations', 'games'));
$link = $ssh2Lib->connect($server['location_ip'], $server['location_user'], $server['location_password']);
$action = mb_strtolower($action);
switch($action) {
case "start": {
$cores_loc = $ssh2Lib->execute($link, 'lscpu | grep -E \'^CPU\(\' | awk \'{print $2}\'');
if(round($cores_loc, 2) < $server['game_cores']) {
return array('status' => 'error', 'description' => 'Для сервера указан слишком большой процент CPU, превышающий рамки игровой локации. Обратитесь к администрации хостинга для устранения проблемы.');
}
if($server['game_code'] == 'cs' || $server['game_code'] == 'css' || $server['game_code'] == 'csgo' || $server['game_query'] == 'samp') {
if(empty($server['rcon_password'])) return array('status' => 'error', 'description' => 'Вы не указали rcon пароль в параметрах запуска сервера!');
}
$this->gameConfigs($serverid);
if($server['game_code'] == 'samp') {
$execCmd = './samp03svr';
} else if($server['game_code'] == 'crmp') {
$execCmd = './samp03svr-cr';
} else if($server['game_code'] == 'crmp037') {
$execCmd = './samp03svr-cr';
} else if($server['game_code'] == 'unit') {
$execCmd = './samp03svr-u2';
} else if($server['game_code'] == 'cs') {
if($server['server_fps'] == 0) {
$server_fps = 300;
} else {
$server_fps = $server['server_fps'];
}
$execCmd = './hlds_run -debug -game cstrike -norestart -sys_ticrate '. $server_fps .' +servercfgfile server.cfg +sys_ticrate '. $server_fps .' +map de_dust2 +maxplayers '.$server['server_slots'].' +ip '. $server['location_ip'] .' +port '.$server['server_port'].' +sv_lan 0';
} else if($server['game_code'] == 'css') {
if($server['server_tickrate'] == 0) {
$server_tickrate = 66;
} else {
$server_tickrate = $server['server_tickrate'];
}
$execCmd = './srcds_run -debug -game cstrike -norestart -tickrate '. $server['server_tickrate'] .' +map de_dust2 +maxplayers '.$server['server_slots'].' +ip '. $server['location_ip'] .' +port '.$server['server_port'].' -sv_lan 0';
} else if($server['game_code'] == 'csgo') {
if($server['server_tickrate'] == 0) {
$server_tickrate = 64;
} else {
$server_tickrate = $server['server_tickrate'];
}
$execCmd = './srcds_run -debug -game csgo -norestart -usercon -tickrate '. $server_tickrate .' +map de_dust2 -maxplayers_override '.$server['server_slots'].' +ip '. $server['location_ip'] .' +net_public_adr '. $server['location_ip'] .' +port '.$server['server_port'].' -sv_lan 0';
} else if($server['game_code'] == 'mcpe') {
if($server['server_binary_version'] == '7.0') {
$execCmd = './bin/php7/bin/php ./PocketMine-MP.phar';
} else if($server['server_binary_version'] == '7.2') {
$execCmd = './bin/php7/bin/php ./PocketMine-MP.phar';
} else if($server['server_binary_version'] == '7.3') {
$execCmd = './bin/php7/bin/php ./PocketMine-MP.phar';
} else if($server['server_binary_version'] == 'Java') {
$execCmd = './Java/bin/java -jar nukkit.jar';
} else if ($server['server_binary_version'] == 'VanillaCpp') {
$execCmd = './bedrock_server';
}
} else if($server['game_code'] == 'mine') {
$execCmd = './Java/bin/java -Xmx' . $server['game_ram'] . 'M -Xms' . $server['game_ram'] . 'M -jar ./minecraft.jar';
} else if($server['game_code'] == 'mta') {
$execCmd = './mta-server';
} else if($server['game_code'] == 'ragemp') {
$execCmd = './server';
}
$user = explode(':', $ssh2Lib->execute($link, 'cat /etc/passwd | grep gs' . $serverid . ':'));
$ssh2Lib->execute($link, 'docker create --tty --rm --name=gs' . $serverid . ' --network=host --cpus="' . $server['game_cores'] . '" --memory=' . $server['game_ram'] . 'M --memory-swap=-1 --volume="/home/gs' . $serverid . '/:/home/container/" --workdir=/home/container debian:stretch > /dev/null 2>&1');
$ssh2Lib->execute($link, 'docker start gs' . $serverid . ' > /dev/null 2>&1');
$ssh2Lib->execute($link, 'docker exec gs' . $serverid . ' groupadd -g ' . $user[3] . ' gameservers > /dev/null 2>&1');
$ssh2Lib->execute($link, 'docker exec gs' . $server['server_id'] . ' useradd -u ' . $user[2] . ' -g gameservers -p ' . crypt(mt_rand(111111111, 999999999), 'tlas') . ' -d /home/container/ gs' . $server['server_id'] . ' > /dev/null 2>&1');
if($server['game_code'] == 'cs' || $server['game_code'] == 'css' || $server['game_code'] == 'csgo') {
if($server['server_vac'] == 1) {
$execCmd .= ' -secure';
} else {
$execCmd .= ' -insecure';
}
if($server['fastdl_status'] == 1) {
$this->action($serverid, "fastdl_on");
$execCmd .= ' +exec fastdl.cfg';
}
}
if($server['game_query'] == 'mtasa' || $server['game_code'] == 'mcpe') {
$ssh2Lib->execute($link, 'docker exec gs' . $serverid . ' su -lc "screen -AmdS gameserver ' . $execCmd . '" gs' . $serverid. ' > /dev/null 2>&1');
} else {
$ssh2Lib->execute($link, 'docker exec gs' . $serverid . ' su -lc "screen -L -AmdS gameserver ' . $execCmd . '" gs' . $serverid. ' > /dev/null 2>&1');
}
$this->deleteTask(array('task_name' => 'enable', 'server_id' => $serverid));
$result = array('status' => 'success');
break;
}
case "stop": {
$ssh2Lib->execute($link, 'docker stop gs'. $serverid. '');
if($server['game_code'] == 'cs' || $server['game_code'] == 'css' || $server['game_code'] == 'csgo') {
if($server['fastdl_status'] = 1) {
if($server['game_code'] == 'csgo') {
$folder = "csgo/cfg";
} else if($server['game_code'] == 'css') {
$folder = "cstrike/cfg";
} else if($server['game_code'] == 'cs') {
$folder = "cstrike";
}
$ssh2Lib->execute($link, 'rm /home/gs' . $serverid . '/' . $folder . '/fastdl.cfg');
$ssh2Lib->execute($link, 'rm /var/nginx/fastdl_gs' . $serverid . '');
}
}
if(!empty($data['restart'])) return $this->action($serverid, 'start');
else {
$this->deleteTask(array('task_name' => 'disable', 'server_id' => $serverid));
$this->deleteTask(array('task_name' => 'restart', 'server_id' => $serverid));
}
$result = array('status' => 'success');
break;
}
case "restart": {
return $this->action($serverid, 'stop', array('restart' => true));
break;
}
case "fastdl_on": {
$txt = "sv_downloadurl 'http://" . $server['location_ip'] . ":8080/fastdl_gs" . $serverid . "'\n";
$txt .= "sv_consistency 1\n";
$txt .= "sv_allowupload 1\n";
$txt .= "sv_allowdownload 1\n";
if($server['game_code'] == 'csgo') {
$folder = "csgo/cfg";
$folder_web = "csgo";
} else if($server['game_code'] == 'css') {
$folder = "cstrike/cfg";
$folder_web = "cstrike";
} else if($server['game_code'] == 'cs') {
$folder = "cstrike";
$folder_web = "cstrike";
}
$ssh2Lib->execute($link, 'echo "' . $txt . '" > /home/gs' . $serverid . '/' . $folder . '/fastdl.cfg');
$ssh2Lib->execute($link, 'ln -s /home/gs' . $serverid . '/' . $folder_web . ' /var/nginx/fastdl_gs' . $serverid . '');
$ssh2Lib->execute($link, 'chmod 644 /home/gs' . $serverid . '/' . $folder . '/fastdl.cfg');
$ssh2Lib->execute($link, 'chown gs' . $serverid . ':gameservers /home/gs' . $serverid . '/' . $folder . '/fastdl.cfg');
$result = array('status' => 'success');
break;
}
case "block": {
$random = mt_rand(11111111, 99999999);
$random2 = mt_rand(11111111, 99999999);
$ssh2Lib->execute($link, 'usermod -p ' . crypt($random, 'tlas') . ' gs' . $serverid);
$ssh2Lib->execute($link, 'mysql -e "grant usage on *.* to gs' . $serverid . '@\'%\' identified by \'' . $random2 . '\'"');
$ssh2Lib->execute($link, 'mysql -e "grant all privileges on gs' . $serverid . '.* to \'gs' . $serverid . '\'@\'%\' identified by \'' . $random2 . '\'"');
$result = array('status' => 'success');
break;
}
case "install": {
$ssh2Lib->execute($link, 'useradd -m -g gameservers -p ' . crypt($server['server_password'], 'tlas') . ' gs' . $serverid);
if($server['game_code'] == 'mcpe' || $server['game_code'] == 'mine') {
$corebinary = $this->game_settings->cores[$server['game_code']]['latest_core']['corebinary'];
$this->updateServer($serverid, array('server_binary' => $this->game_settings->cores[$server['game_code']]['latest_core']['corepath'], 'server_binary_version' => $corebinary));
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/files/' . $server['game_code'] . '/* /home/gs' . $serverid . '/; cp /home/cp/gameservers/cores/' . $server['game_code'] . '/' . $this->game_settings->cores[$server['game_code']]['latest_core']['corepath'] . '/' . $this->game_settings->cores[$server['game_code']]['latest_core']['corename'] . ' /home/gs' . $serverid . '/');
if($corebinary == '7.0' || $corebinary == '7.2' || $corebinary == '7.3' || $corebinary == 'Java') {
$ssh2Lib->execute($link, 'cp -Rp /home/binaries/' . $this->gameBin($serverid) . '* /home/gs' . $serverid . '/');
}
} else if($server['game_code'] == 'cs') {
$this->updateServer($serverid, array('server_binary' => $this->game_settings->builds[$server['game_code']]['latest_build']['buildpath']));
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/cores/' . $server['game_code'] . '/' . $this->game_settings->builds[$server['game_code']]['latest_build']['buildpath'] . '/* /home/gs' . $serverid . '/');
} else {
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/files/' . $server['game_code'] . '/* /home/gs' . $serverid . '/;');
}
$ssh2Lib->execute($link, 'chown gs' . $serverid . ' -Rf /home/gs' . $serverid);
$files = explode(' ', $this->gameFiles($serverid));
foreach($files as $item){
$ssh2Lib->execute($link, 'chmod 700 /home/gs' . $serverid . '/' . $item);
$ssh2Lib->execute($link, 'chown gs' . $serverid . ':gameservers /home/gs' . $serverid . '/' . $item);
}
$ssh2Lib->execute($link, 'chown -Rf gs' . $serverid . ':gameservers /home/gs' . $serverid . '');
$ssh2Lib->execute($link, 'chmod -R 700 /home/gs' . $serverid);
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr +i ' . $this->gameFiles($serverid));
$this->gameConfigs($serverid);
$this->updateServer($serverid, array('server_status' => 1));
$result = array('status' => 'success');
break;
}
case "reinstall": {
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr -i ' . $this->gameFiles($serverid));
$ssh2Lib->execute($link, 'rm -Rf /home/gs' . $serverid . '/*');
if($server['game_code'] == 'mcpe' || $server['game_code'] == 'mine') {
$this->updateServer($serverid, array('server_binary' => $this->game_settings->cores[$server['game_code']]['latest_core']['corepath'], 'server_binary_version' => $this->game_settings->cores[$server['game_code']]['latest_core']['corebinary']));
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/files/' . $server['game_code'] . '/* /home/gs' . $serverid . '/; cp /home/cp/gameservers/cores/' . $server['game_code'] . '/' . $this->game_settings->cores[$server['game_code']]['latest_core']['corepath'] . '/' . $this->game_settings->cores[$server['game_code']]['latest_core']['corename'] . ' /home/gs' . $serverid . '/');
if($server['server_binary_version'] == '7.0' || $server['server_binary_version'] == '7.2' || $server['server_binary_version'] == '7.3' || $server['server_binary_version'] == 'Java') {
$ssh2Lib->execute($link, 'cp -Rp /home/binaries/' . $this->gameBin($serverid) . '* /home/gs' . $serverid . '/');
}
} else if($server['game_code'] == 'cs') {
$this->updateServer($serverid, array('server_binary' => $this->game_settings->builds[$server['game_code']]['latest_build']['buildpath']));
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/cores/' . $server['game_code'] . '/' . $this->game_settings->builds[$server['game_code']]['latest_build']['buildpath'] . '/* /home/gs' . $serverid . '/');
} else {
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/files/' . $server['game_code'] . '/* /home/gs' . $serverid . '/;');
}
$ssh2Lib->execute($link, 'chown gs' . $serverid . ' -Rf /home/gs' . $serverid);
$files = explode(' ', $this->gameFiles($serverid));
foreach($files as $item){
$ssh2Lib->execute($link, 'chmod 700 /home/gs' . $serverid . '/' . $item);
$ssh2Lib->execute($link, 'chown gs' . $serverid . ':gameservers /home/gs' . $serverid . '/' . $item);
}
$ssh2Lib->execute($link, 'chown -Rf gs' . $serverid . ':gameservers /home/gs' . $serverid . '');
$ssh2Lib->execute($link, 'chmod -R 700 /home/gs' . $serverid);
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr +i ' . $this->gameFiles($serverid));
$this->gameConfigs($serverid);
$this->updateServer($serverid, array('server_status' => 1));
$result = array('status' => 'success');
break;
}
case "updatepass": {
$ssh2Lib->execute($link, 'usermod -p ' . crypt($server['server_password'], 'tlas') . ' gs' . $serverid);
$result = array('status' => 'success');
break;
}
case "updatepassm": {
$ssh2Lib->execute($link, 'mysql -e "grant usage on *.* to gs' . $serverid . '@\'%\' identified by \'' . $server['db_pass'] . '\'"');
$ssh2Lib->execute($link, 'mysql -e "grant all privileges on gs' . $serverid . '.* to \'gs' . $serverid . '\'@\'%\' identified by \'' . $server['db_pass'] . '\'"');
$result = array('status' => 'success');
break;
}
case "create_mysql": {
$chars="qazxswedcvfrtgbnhyujmkiolp1234567890QAZXSWEDCVFRTGBNHYUJMKIOLP";
$max=10;
$size=StrLen($chars)-1;
$dbpass=null;
while($max--)
$dbpass.=$chars[rand(0,$size)];
$ssh2Lib->execute($link, 'mysql -e "create database gs' . $serverid . '"');
$ssh2Lib->execute($link, 'mysql -e "grant usage on *.* to gs' . $serverid . '@\'%\' identified by \'' . $dbpass . '\'"');
$ssh2Lib->execute($link, 'mysql -e "grant all privileges on gs' . $serverid . '.* to \'gs' . $serverid . '\'@\'%\' identified by \'' . $dbpass . '\'"');
$this->updateServer($serverid, array('db_pass' => $dbpass));
$result = array('status' => 'success');
break;
}
case "delete_mysql": {
$ssh2Lib->execute($link, 'mysql -e "DROP DATABASE gs' . $serverid . ';"');
$ssh2Lib->execute($link, 'mysql -e "DROP USER \'gs' . $serverid . '\'@\'%\';"');
$result = array('status' => 'success');
break;
}
case "sendcommand": {
if($data['command'] == 'unsetFiles') {
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr -i ' . $this->gameFiles($serverid));
} else if($data['command'] == 'setFiles') {
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr +i ' . $this->gameFiles($serverid));
} else if($data['command'] == 'installNewCore') {
$ssh2Lib->execute($link, 'rm -Rf /home/gs' . $serverid . '/*');
$ssh2Lib->execute($link, "rm -Rf /home/cp/backups/gs" . $serverid . ".tar");
if($server['server_binary_version'] == '7.0' || $server['server_binary_version'] == '7.2' || $server['server_binary_version'] == '7.3' || $server['server_binary_version'] == 'Java') {
$ssh2Lib->execute($link, 'cp -Rp /home/binaries/' . $this->gameBin($serverid) . '* /home/gs' . $serverid . '/');
}
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/files/' . $server['game_code'] . '/* /home/gs' . $serverid . '/; cp /home/cp/gameservers/cores/' . $server['game_code'] . '/' . $this->game_settings->cores[$server['game_code']][$server['server_binary']]['corepath'] . '/' . $this->game_settings->cores[$server['game_code']][$server['server_binary']]['corename'] . ' /home/gs' . $serverid . '/');
$ssh2Lib->execute($link, 'chown gs' . $serverid . ' -Rf /home/gs' . $serverid);
$files = explode(' ', $this->gameFiles($serverid));
foreach($files as $item){
$ssh2Lib->execute($link, 'chmod 700 /home/gs' . $serverid . '/' . $item);
$ssh2Lib->execute($link, 'chown gs' . $serverid . ':gameservers /home/gs' . $serverid . '/' . $item);
}
$ssh2Lib->execute($link, 'chown -Rf gs' . $serverid . ':gameservers /home/gs' . $serverid . '');
$ssh2Lib->execute($link, 'chmod -R 700 /home/gs' . $serverid);
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr +i ' . $this->gameFiles($serverid));
$this->gameConfigs($serverid);
$this->updateServer($serverid, array('server_status' => 1));
} else if($data['command'] == 'installNewBuild') {
$ssh2Lib->execute($link, 'rm -Rf /home/gs' . $serverid . '/*');
$ssh2Lib->execute($link, "rm -Rf /home/cp/backups/gs" . $serverid . ".tar");
$ssh2Lib->execute($link, 'cp -Rp /home/cp/gameservers/cores/' . $server['game_code'] . '/' . $this->game_settings->builds[$server['game_code']][$server['server_binary']]['buildpath'] . '/* /home/gs' . $serverid . '/');
$ssh2Lib->execute($link, 'chown gs' . $serverid . ' -Rf /home/gs' . $serverid);
$files = explode(' ', $this->gameFiles($serverid));
foreach($files as $item){
$ssh2Lib->execute($link, 'chmod 700 /home/gs' . $serverid . '/' . $item);
$ssh2Lib->execute($link, 'chown gs' . $serverid . ':gameservers /home/gs' . $serverid . '/' . $item);
}
$ssh2Lib->execute($link, 'chown -Rf gs' . $serverid . ':gameservers /home/gs' . $serverid . '');
$ssh2Lib->execute($link, 'chmod -R 700 /home/gs' . $serverid);
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr +i ' . $this->gameFiles($serverid));
$this->gameConfigs($serverid);
$this->updateServer($serverid, array('server_status' => 1));
} else if($data['command'] == 'loadModuleJS') {
$ssh2Lib->execute($link, '
cd /home/gs' . $serverid . ';
mkdir node_modules;
cd /home/gs' . $serverid . '/node_modules;
rm -rf ' . $this->game_settings->node_modules[$server['game_code']][$data['module']]['modulepath'] . ';
mkdir ' . $this->game_settings->node_modules[$server['game_code']][$data['module']]['modulepath'] . ';
cd ' . $this->game_settings->node_modules[$server['game_code']][$data['module']]['modulepath'] . ';
wget ' . $this->game_settings->node_modules[$server['game_code']][$data['module']]['moduleurl'] . $this->game_settings->node_modules[$server['game_code']][$data['module']]['modulearchive'] . ';
unzip ' . $this->game_settings->node_modules[$server['game_code']][$data['module']]['modulearchive'] . ';
rm ' . $this->game_settings->node_modules[$server['game_code']][$data['module']]['modulearchive'] . ';
chown -Rf gs' . $serverid . ':gameservers /home/gs' . $serverid . '/node_modules;
chmod -R 700 /home/gs' . $serverid . '/node_modules;
');
} else {
$ssh2Lib->execute($link, "docker exec -d gs" . $serverid . " su -lc \"screen -p 0 -r gameserver -X stuff ' ".$data['command']."\\n'\" gs".$serverid);
}
$result = array('status' => 'success');
break;
}
case "createbackup": {
if($server['server_mysql'] == 1 || $server['server_mysql'] == 2) {
$ssh2Lib->execute($link, "cd /home/gs" . $serverid . "; mkdir backup_mysql; cd backup_mysql; mysqldump -Q -c -e -ugs".$serverid." -h".$server['location_ip']." -p".$server['db_pass']." gs".$serverid." > database.sql; cd;");
}
$ssh2Lib->execute($link, "tar --totals -cvf /home/cp/backups/gs" . $serverid . ".tar /home/gs" . $serverid);
if($server['server_mysql'] == 1 || $server['server_mysql'] == 2) {
$ssh2Lib->execute($link, "rm -rf /home/gs" . $serverid . "/backup_mysql");
}
$this->updateServer($serverid, array('server_status' => 1));
$result = array('status' => 'success');
break;
}
case "installbackup": {
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr -i ' . $this->gameFiles($serverid));
$ssh2Lib->execute($link, "rm -Rf /home/gs" . $serverid . "/*");
$ssh2Lib->execute($link, "tar -C \"/home/gs" . $serverid . "\" -xvf /home/cp/backups/gs" . $serverid . ".tar");
$ssh2Lib->execute($link, "cp -rp /home/gs" . $serverid . "/home/gs" . $serverid . "/* /home/gs" . $serverid . "/");
$ssh2Lib->execute($link, "rm -Rf /home/gs" . $serverid . "/home");
$ssh2Lib->execute($link, 'chown gs' . $serverid . ' -Rf /home/gs' . $serverid);
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr +i ' . $this->gameFiles($serverid));
$this->gameConfigs($serverid);
$this->updateServer($serverid, array('server_status' => 1));
$result = array('status' => 'success');
break;
}
case "delete_backup": {
$ssh2Lib->execute($link, "rm -Rf /home/cp/backups/gs" . $serverid . ".tar");
$result = array('status' => 'success');
break;
}
case "delete": {
$ssh2Lib->execute($link, "userdel -rf gs" . $serverid);
$ssh2Lib->execute($link, 'cd /home/gs' . $serverid . '/ && chattr -i ' . $this->gameFiles($serverid));
$ssh2Lib->execute($link, "rm -Rf /home/gs" . $serverid);
$ssh2Lib->execute($link, "rm -Rf /home/cp/backups/gs" . $serverid . ".tar");
foreach($this->getTasks(array('server_id' => $serverid)) as $task) {
$this->deleteTask(array('task_id' => $task['task_id']));
}
$result = array('status' => 'success');
break;
}
case "server_status": {
$status = $ssh2Lib->execute($link, 'docker ps --all | grep gs' . $server['server_id'] . ' | awk \'{print $1}\'');
if($status) {
$status = 2;// Контейнер запущен
} else {
$status = 1;// Контейнер не запущен
}
$result = $status;
break;
}
}
$ssh2Lib->disconnect($link);
return $result;
}
/* ================== Планировщик задач ================== */
public function createTask($data) {
$sql = "INSERT INTO `servers_tasks` SET ";
$sql .= "`server_id` = '" . (int)$data['server_id'] . "', ";
$sql .= "`task_name` = '" . $this->db->escape($data['task_name']) . "', ";
$sql .= "`task_type` = '" . $this->db->escape($data['task_type']) . "', ";
$sql .= "`task_time` = '" . $this->db->escape($data['task_time']) . "', ";
if(!empty($data['isSystemTask'])) $sql .= "`isSystemTask` = '" . (int)$data['isSystemTask'] . "', ";
$sql .= "`task_lead_time` = " . $data['task_lead_time'];
$this->db->query($sql);
return $this->db->getLastId();
}
public function deleteTask($data) {
if(!empty($data)) {
$sql = "DELETE FROM `servers_tasks`";
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
$this->db->query($sql);
}
}
public function updateTask($taskid, $data = array()) {
$sql = "UPDATE `servers_tasks`";
if(!empty($data)) {
$count = count($data);
$sql .= " SET";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= ",";
}
}
$sql .= " WHERE `task_id` = '" . (int)$taskid . "'";
$query = $this->db->query($sql);
}
public function getTasks($data = array(), $joins = array(), $sort = array(), $options = array()) {
$sql = "SELECT * FROM `servers_tasks`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "servers":
$sql .= " ON servers.server_id=servers_tasks.server_id";
break;
}
}
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if (@$options['start'] < 0) {
@$options['start'] = 0;
}
if (@$options['limit'] < 1) {
@$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)@$options['start'] . "," . (int)@$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getTaskById($taskid, $joins = array()) {
$sql = "SELECT * FROM `servers_tasks`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "servers":
$sql .= " ON servers.server_id=servers_tasks.server_id";
break;
}
}
$sql .= " WHERE `task_id` = '" . (int)$taskid . "' LIMIT 1";
$query = $this->db->query($sql);
return $query->row;
}
/* ======================================================= */
/* ===================== Совладельцы ===================== */
public function createOwner($data) {
$sql = "INSERT INTO `servers_owners` SET ";
$sql .= "server_id = '" . $data['server_id'] . "', ";
$sql .= "user_id = '" . $data['user_id'] . "', ";
$sql .= "owner_status = '" . $data['owner_status'] . "', ";
$sql .= "owner_add = NOW()";
$this->db->query($sql);
return $this->db->getLastId();
}
public function deleteOwner($ownerid) {
$this->db->query("DELETE FROM `servers_owners` WHERE owner_id = '".(int)$ownerid."'");
return true;
}
public function deleteserverOwners($serverid)
{
$sql = "DELETE FROM `servers_owners` WHERE server_id = '".(int)$serverid."'";
$this->db->query($sql);
}
public function updateOwner($ownerid, $data = array()) {
$sql = "UPDATE `servers_owners`";
if(!empty($data)) {
$count = count($data);
$sql .= " SET";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= ",";
}
}
$sql .= " WHERE `owner_id` = '" . (int)$ownerid . "'";
$query = $this->db->query($sql);
return true;
}
public function getOwners($data = array(), $joins = array(), $sort = array(), $options = array()) {
$sql = "SELECT * FROM `servers_owners`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "users":
$sql .= " ON servers_owners.user_id=users.user_id";
break;
case "servers":
$sql .= " ON servers_owners.server_id=servers.server_id";
break;
case "games":
$sql .= " ON servers.game_id=games.game_id";
break;
case "locations":
$sql .= " ON servers.location_id=locations.location_id";
break;
}
}
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if ($options['start'] < 0) {
$options['start'] = 0;
}
if ($options['limit'] < 1) {
$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)$options['start'] . "," . (int)$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getOwnerById($ownerid) {
$query = $this->db->query("SELECT * FROM `servers_owners` WHERE `owner_id` = '".(int)$ownerid."' LIMIT 1");
return $query->row;
}
public function getTotalOwners($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers_owners`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
/* ======================================================= */
/* ====================== Firewall ====================== */
public function createFirewall($data) {
$sql = "INSERT INTO `servers_firewalls` SET ";
$sql .= "server_id = '" . $data['server_id'] . "', ";
$sql .= "server_ip = '" . $this->db->escape($data['server_ip']) . "', ";
$sql .= "firewall_add = NOW()";
$this->db->query($sql);
return $this->db->getLastId();
}
public function deleteFirewallDB($firewallid) {
$this->db->query("DELETE FROM `servers_firewalls` WHERE firewall_id = '".(int)$firewallid."'");
return true;
}
public function addFirewall($firewallid) {
$this->load->library('ssh2');
$this->load->model('servers');
$Firewall = $this->getFirewallById($firewallid);
$server = $this->serversModel->getServerById($Firewall['server_id'], array('locations'));
$ssh2Lib = new ssh2Library();
$link = $ssh2Lib->connect($server['location_ip'], $server['location_user'], $server['location_password']);
$ssh2Lib->execute($link, "iptables -I INPUT -s ".$Firewall['server_ip']." -p udp -d ".$server['location_ip']." --dport ".$server['server_port']." -j DROP;");
$ssh2Lib->execute($link, "iptables -I INPUT -s ".$Firewall['server_ip']." -p tcp -d ".$server['location_ip']." --dport ".$server['server_port']." -j DROP;");
$ssh2Lib->disconnect($link);
return true;
}
public function deleteFirewall($firewallid) {
$this->load->library('ssh2');
$this->load->model('servers');
$Firewall = $this->getFirewallById($firewallid);
$server = $this->serversModel->getServerById($Firewall['server_id'], array('locations'));
$ssh2Lib = new ssh2Library();
$link = $ssh2Lib->connect($server['location_ip'], $server['location_user'], $server['location_password']);
$ssh2Lib->execute($link, "iptables -D INPUT -s ".$Firewall['server_ip']." -p udp -d ".$server['location_ip']." --dport ".$server['server_port']." -j DROP;");
$ssh2Lib->execute($link, "iptables -D INPUT -s ".$Firewall['server_ip']." -p tcp -d ".$server['location_ip']." --dport ".$server['server_port']." -j DROP;");
$ssh2Lib->disconnect($link);
$this->deleteFirewallDB($firewallid);
return true;
}
public function getFirewalls($data = array(), $sort = array(), $options = array()) {
$sql = "SELECT * FROM `servers_firewalls`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if ($options['start'] < 0) {
$options['start'] = 0;
}
if ($options['limit'] < 1) {
$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)$options['start'] . "," . (int)$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getFirewallById($firewallid) {
$query = $this->db->query("SELECT * FROM `servers_firewalls` WHERE `firewall_id` = '".(int)$firewallid."' LIMIT 1");
return $query->row;
}
public function getFirewallsById($serverid) {
$query = $this->db->query("SELECT * FROM `servers_firewalls` WHERE `server_id` = '".(int)$serverid."'");
return $query->rows;
}
public function getTotalFirewalls($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers_firewalls`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
/* ======================================================= */
/* ================= Автоустановка модов ================= */
public function createMod($data) {
$sql = "INSERT INTO `servers_mods` SET ";
$sql .= "`game_id` = '" . (int)$data['game_id'] . "', ";
$sql .= "`mod_url` = '" . $data['mod_url'] . "', ";
$sql .= "`mod_name` = '" . $data['mod_name'] . "', ";
$sql .= "`mod_status` = '" . (int)$data['mod_status'] . "', ";
$sql .= "`mod_arch` = '" . $data['mod_arch'] . "', ";
$sql .= "`mod_textx` = '" . strip_tags(htmlspecialchars_decode($this->db->escape($data['mod_textx'])), '<img><span><ul><ol><pre><li><div><em><strong><sup><code>') . "', ";
$sql .= "`mod_img` = '" . $data['mod_img'] . "', ";
$sql .= "`mod_price` = '" . $data['mod_price'] . "'";
$this->db->query($sql);
$return=$this->db->getLastId();
return $return;
}
public function deleteMod($modid) {
$sql = "DELETE FROM `servers_mods` WHERE mod_id = '" . (int)$modid . "'";
$this->db->query($sql);
}
public function updateMod($modid, $data = array()) {
$sql = "UPDATE `servers_mods`";
if(!empty($data)) {
$count = count($data);
$sql .= " SET";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= ",";
}
}
$sql .= " WHERE `mod_id` = '" . (int)$modid . "'";
$query = $this->db->query($sql);
}
public function getMods($data = array(), $joins = array(),$sort = array(), $options = array()) {
$sql = "SELECT * FROM `servers_mods`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "games":
$sql .= " ON servers_mods.game_id=games.game_id";
break;
}
}
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if ($options['start'] < 0) {
$options['start'] = 0;
}
if ($options['limit'] < 1) {
$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)$options['start'] . "," . (int)$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getModById($modid, $joins = array()) {
$sql = "SELECT * FROM `servers_mods`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "games":
$sql .= " ON servers_mods.game_id=games.game_id";
break;
}
}
$sql .= " WHERE `mod_id` = '" . (int)$modid . "' LIMIT 1";
$query = $this->db->query($sql);
return $query->row;
}
public function getTotalMods($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers_mods`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
/* ======================================================= */
/* ===================== Репозиторий ===================== */
public function createRepo($data) {
$sql = "INSERT INTO `servers_repo` SET ";
$sql .= "`game_id` = '" . (int)$data['game_id'] . "', ";
$sql .= "`repo_url` = '" . $data['repo_url'] . "', ";
$sql .= "`repo_name` = '" . $data['repo_name'] . "', ";
$sql .= "`repo_status` = '" . (int)$data['repo_status'] . "', ";
$sql .= "`repo_textx` = '" . strip_tags(htmlspecialchars_decode($this->db->escape($data['repo_textx'])), '<img><span><ul><ol><pre><li><div><em><strong><sup><code>') . "', ";
$sql .= "`repo_img` = '" . $data['repo_img'] . "', ";
$sql .= "`repo_price` = '" . $data['repo_price'] . "'";
$this->db->query($sql);
$return=$this->db->getLastId();
return $return;
}
public function deleteRepo($repoid) {
$sql = "DELETE FROM `servers_repo` WHERE repo_id = '" . (int)$repoid . "'";
$this->db->query($sql);
}
public function updateRepo($repoid, $data = array()) {
$sql = "UPDATE `servers_repo`";
if(!empty($data)) {
$count = count($data);
$sql .= " SET";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= ",";
}
}
$sql .= " WHERE `repo_id` = '" . (int)$repoid . "'";
$query = $this->db->query($sql);
}
public function getRepos($data = array(), $joins = array(),$sort = array(), $options = array()) {
$sql = "SELECT * FROM `servers_repo`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "games":
$sql .= " ON servers_repo.game_id=games.game_id";
break;
}
}
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if ($options['start'] < 0) {
$options['start'] = 0;
}
if ($options['limit'] < 1) {
$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)$options['start'] . "," . (int)$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getRepoById($repoid, $joins = array()) {
$sql = "SELECT * FROM `servers_repo`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "games":
$sql .= " ON servers_repo.game_id=games.game_id";
break;
}
}
$sql .= " WHERE `repo_id` = '" . (int)$repoid . "' LIMIT 1";
$query = $this->db->query($sql);
return $query->row;
}
public function getTotalRepos($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers_repo`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
/* ======================================================= */
/* ============= Статистика игровых серверов ============= */
public function createServerStats($data) {
$sql = "INSERT INTO `servers_stats` SET ";
$sql .= "server_id = '" . (int)$data['server_id'] . "', ";
$sql .= "server_stats_date = NOW(), ";
$sql .= "server_stats_cpu = '" . (int)$data['server_stats_cpu'] . "', ";
$sql .= "server_stats_ram = '" . (int)$data['server_stats_ram'] . "', ";
$sql .= "server_stats_hdd = '" . (int)$data['server_stats_hdd'] . "', ";
$sql .= "server_stats_players = '" . (int)$data['server_stats_players'] . "'";
$this->db->query($sql);
return $this->db->getLastId();
}
public function clearServersStats() {
$sql = "DELETE FROM `servers_stats` WHERE server_stats_date < NOW() - INTERVAL 7 DAY";
$this->db->query($sql);
}
public function deleteServerStats($serverid) {
$sql = "DELETE FROM `servers_stats` WHERE server_id = '" . (int)$serverid . "'";
$this->db->query($sql);
}
public function getServerStats($serverid, $start, $end) {
$sql = "SELECT * FROM `servers_stats` WHERE server_id = '" . (int)$serverid . "' AND server_stats_date BETWEEN " . $start . " AND " . $end . " ORDER BY server_stats_date";
$query = $this->db->query($sql);
return $query->rows;
}
public function getTotalServerStats($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `servers_stats`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
public function getStatisticsPlayers() {
$sql = "SELECT sum(`server_stats_players`) , DATE_FORMAT(`server_stats_date`, '%d.%m.%Y %H:%i') mydate FROM servers_stats GROUP BY mydate order by 'server_stats_date'";
$query = $this->db->query($sql);
return $query->rows;
}
public function getStatisticsLoad()
{
$sql = 'SELECT sum(`server_stats_cpu`), sum(`server_stats_ram`), sum(`server_stats_hdd`), DATE_FORMAT(`server_stats_date`, \'%d.%m.%Y %H:%i\') mydate FROM servers_stats GROUP BY mydate order by \'server_stats_date\'';
$query = $this->db->query($sql);
return $query->rows;
}
/* ======================================================= */
/* ================ Логи игрового сервера ================ */
public function createLog($data) {
$sql = "INSERT INTO `serverlog` SET ";
$sql .= "`reason` = '" . $data['reason'] . "', ";
$sql .= "`status` = '" . (int)$data['status'] . "', ";
$sql .= "`server_id` = '" . (int)$data['server_id'] . "', ";
$sql .= "`date` = NOW()";
$this->db->query($sql);
$return=$this->db->getLastId();
return $return;
}
public function deleteLog($logid) {
$sql = "DELETE FROM `serverlog` WHERE log_id = '" . (int)$logid . "'";
$this->db->query($sql);
}
public function getLogs($data = array(), $joins = array(), $sort = array(), $options = array()) {
$sql = "SELECT * FROM `serverlog`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "servers":
$sql .= " ON serverlog.server_id=servers.server_id";
break;
}
}
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
if(!empty($sort)) {
$count = count($sort);
$sql .= " ORDER BY";
foreach($sort as $key => $value) {
$sql .= " $key " . $value;
$count--;
if($count > 0) $sql .= ",";
}
}
if(!empty($options)) {
if ($options['start'] < 0) {
$options['start'] = 0;
}
if ($options['limit'] < 1) {
$options['limit'] = 20;
}
$sql .= " LIMIT " . (int)$options['start'] . "," . (int)$options['limit'];
}
$query = $this->db->query($sql);
return $query->rows;
}
public function getServerLogById($logid, $joins = array()) {
$sql = "SELECT * FROM `serverlog`";
foreach($joins as $join) {
$sql .= " LEFT JOIN $join";
switch($join) {
case "servers":
$sql .= " ON serverlog.server_id=servers.server_id";
break;
}
}
$sql .= " WHERE `log_id` = '" . (int)$logid . "' LIMIT 1";
$query = $this->db->query($sql);
return $query->row;
}
public function getTotalLogs($data = array()) {
$sql = "SELECT COUNT(*) AS count FROM `serverlog`";
if(!empty($data)) {
$count = count($data);
$sql .= " WHERE";
foreach($data as $key => $value) {
$sql .= " $key = '" . $this->db->escape($value) . "'";
$count--;
if($count > 0) $sql .= " AND";
}
}
$query = $this->db->query($sql);
return $query->row['count'];
}
/* ======================================================= */
}
?>