arr['btn'] = ''; if($status == 'working') { $html->get('restart', 'sections/control/buttons'); $html->set('id', $id); $html->pack('btn'); return $html->arr['btn']; } return ''; } public static function resources($id) { global $sql; include(LIB.'ssh.php'); $aData = array( 'cpu' => '0%', 'ram' => '0%', 'hdd' => '0%' ); $sql->query('SELECT `address`, `passwd` FROM `control` WHERE `id`="'.$id.'" LIMIT 1'); $ctrl = $sql->get(); if(!$ssh->auth($ctrl['passwd'], $ctrl['address'])) sys::outjs($aData); $data = $ssh->get('echo `cat /proc/meminfo | grep MemTotal | awk \'{print $2}\'; cat /proc/meminfo | grep MemFree | awk \'{print $2}\'; cat /proc/meminfo | grep Buffers | awk \'{print $2}\'; cat /proc/meminfo | grep Cached | grep -v SwapCached | awk \'{print $2}\'`'); $aData['ram'] = ceil(ctrl::ram_load($data)).'%'; $aData['hdd'] = trim($ssh->get('df -h | awk \'/rootfs/ {print $5}\'')); $aData['cpu'] = ctrl::cpu_load($ssh->get('echo "`ps -A -o pcpu | tail -n+2 | paste -sd+ | bc | awk \'{print $0}\'` `cat /proc/cpuinfo | grep processor | wc -l | awk \'{print $1}\'`"')).'%'; sys::outjs($aData); } public static function update_info($id) { global $sql; include(LIB.'ssh.php'); $aData = array( 'cpu' => 'произошла ошибка', 'ram' => 'произошла ошибка', 'hdd' => 'произошла ошибка' ); $sql->query('SELECT `address`, `passwd` FROM `control` WHERE `id`="'.$id.'" LIMIT 1'); $ctrl = $sql->get(); if(!$ssh->auth($ctrl['passwd'], $ctrl['address'].':22')) sys::outjs($aData); $data = $ssh->get('cat /proc/meminfo | grep MemTotal | cut -d \' \' -f 2-'); $aData['ram'] = $data.' ('.(round(sys::int($data)/1024/1024, 2)).'Gb)'; $aData['hdd'] = trim($ssh->get('df -h | awk \'/rootfs/ {print $2}\'')); $aCPU = explode("\n", trim($ssh->get('cat /proc/cpuinfo | grep -c processor && cat /proc/cpuinfo | grep "MHz" | awk \'{print $4}\' | head -n 1'))); $aData['cpu'] = $aCPU[0].'x'.round($aCPU[1], 0).' MHz ['.trim($ssh->get('cat /proc/cpuinfo | grep -m 1 "model name" | cut -d \' \' -f 3-')).']'; sys::outjs($aData); } public static function update_status($id, $ssh = false) { global $cfg, $sql, $start_point, $mcache; if(!$ssh) include(LIB.'ssh.php'); $sql->query('SELECT `address`, `passwd`, `time`, `overdue`, `block`, `status` FROM `control` WHERE `id`="'.$id.'" LIMIT 1'); $ctrl = $sql->get(); $status = $ctrl['status']; if($ctrl['status'] == 'blocked' && $ctrl['block'] < $start_point) $sql->query('UPDATE `control` set `block`="0", `status`="working" WHERE `id`="'.$id.'" LIMIT 1'); if($ctrl['status'] == 'blocked') return 'blocked'; // Если аренда закончилась и сервер просрочен длительное время if($ctrl['time'] < $start_point && $ctrl['status'] == 'overdue' && ($ctrl['overdue']+$cfg['control_delete']*86400) < $start_point) { $sql->query('UPDATE `control` set `user`="-1" WHERE `id`="'.$id.'" LIMIT 1'); return 'delete'; } // Если аренда закончилась, а услуга не просрочена if($ctrl['time'] < $start_point && !in_array($ctrl['status'], array('overdue', 'blocked'))) { $sql->query('UPDATE `control` set `status`="overdue" WHERE `id`="'.$id.'" LIMIT 1'); $status = 'overdue'; } // Если аренда не закончилась, а услуга просрочена if($ctrl['time'] > $start_point && $ctrl['status'] == 'overdue') $sql->query('UPDATE `control` set `status`="working" WHERE `id`="'.$id.'" LIMIT 1'); if(in_array($ctrl['status'], array('working', 'error'))) { $status = 'working'; if(!$ssh->auth($ctrl['passwd'], $ctrl['address'])) $status = 'error'; $sql->query('UPDATE `control` set `status`="'.$status.'" WHERE `id`="'.$id.'" LIMIT 1'); } if($ctrl['status'] == 'reboot' && !$mcache->get('reboot_control_'.$id)) { if($ssh->auth($ctrl['passwd'], $ctrl['address'])) { $sql->query('UPDATE `control` set `status`="working" WHERE `id`="'.$id.'" LIMIT 1'); $status = 'working'; } } $time_end = $ctrl['status'] == 'overdue' ? 'Удаление через: '.sys::date('min', $ctrl['overdue']+$cfg['control_delete']*86400) : 'Осталось: '.sys::date('min', $ctrl['time']); $aData = array( 'time' => sys::today($ctrl['time']), 'time_end' => $time_end, 'buttons' => ctrl::buttons($id, $status), 'status' => ctrl::status($status) ); return $aData; } public static function ram_load($data) { $aData = explode(' ', $data); return ceil(($aData[0]-($aData[1]+$aData[2]+$aData[3]))*100/$aData[0]); } public static function cpu_load($data) { $aData = explode(' ', $data); $load = ceil($aData[0]/$aData[1]); return $load > 100 ? 100 : $load; } public static function nav($server, $id, $sid, $active) { global $cfg, $html, $sql, $mcache, $start_point; $aUnit = array('index', 'console', 'settings', 'plugins', 'filetp', 'copy', 'boost'); $html->get('gmenu', 'sections/control/servers/'.$server['game']); $html->set('id', $id); $html->set('server', $sid); $html->set('home', $cfg['http']); foreach($aUnit as $unit) if($unit == $active) $html->unit($unit, 1); else $html->unit($unit); $html->pack('main'); $html->get('vmenu', 'sections/control/servers/'.$server['game']); $html->set('id', $id); $html->set('server', $sid); $html->set('home', $cfg['http']); foreach($aUnit as $unit) if($unit == $active) $html->unit($unit, 1); else $html->unit($unit); $html->pack('vmenu'); return NULL; } public static function route($server, $inc, $go) { global $device, $start_point; if(in_array($server['status'], array('install', 'reinstall', 'update', 'recovery'))) { if($go) sys::out('Раздел недоступен'); return SEC.'control/servers/noaccess.php'; } if(!file_exists(SEC.'control/servers/'.$server['game'].'/'.$inc.'.php')) return SEC.'control/servers/'.$server['game'].'/index.php'; return SEC.'control/servers/'.$server['game'].'/'.$inc.'.php'; } public static function cpulist($unit, $core, $count = false) { global $device, $start_point; include(LIB.'ssh.php'); if(!$ssh->auth($unit['passwd'], $unit['address'])) { if($count) return 1; $out = $core ? '' : ''; sys::outjs(array('core_fix' => $core)); } $n = sys::int($ssh->get('cat /proc/cpuinfo | grep "cpu MHz" | wc -l')); if($count) return $n; $list = ''; for($i = 1; $i <= $n; $i+=1) $list .= ''; sys::outjs(array('core_fix' => str_replace($core.'"', $core.'" selected="select"', $list))); } public static function iptables($id, $action, $source, $dest, $unit, $snw = false, $ssh = false) { global $cfg, $sql, $start_point; if(!$ssh) { $sql->query('SELECT `address`, `passwd` FROM `control` WHERE `id`="'.$unit.'" LIMIT 1'); $unit = $sql->get(); include(LIB.'ssh.php'); if(!$ssh->auth($unit['passwd'], $unit['address'])) return array('e' => sys::text('all', 'ssh')); } switch($action) { case 'block': if(sys::valid($source, 'ip')) return array('e' => sys::text('servers', 'firewall')); // Если подсеть if($snw) { $source = sys::whois($source); if($source == 'не определена') return array('e' => 'Не удалось определить подсеть для указанного адреса.'); } $sql->query('SELECT `id` FROM `control_firewall` WHERE `sip`="'.$source.'" AND `server`="'.$id.'" LIMIT 1'); // Если такое правило уже добавлено или указан адрес сайта (ПУ) if($sql->num() || ($source == $cfg['ip'] || $source == $cfg['subnet'])) return array('s' => 'ok'); $sql->query('INSERT INTO `control_firewall` set `sip`="'.$source.'", `dest`="'.$dest[0].':'.$dest[1].'", `server`="'.$id.'", `time`="'.$start_point.'"'); $line = $sql->id(); $rule = 'iptables -I INPUT -s '.$source.' -p udp -d '.$dest[0].' --dport '.$dest[1].' -j DROP;'; $ssh->set($rule.' echo -e "#'.$line.';\n'.$rule.'" >> /root/'.$cfg['iptables']); return array('s' => 'ok'); case 'unblock': if(!is_numeric($source) AND sys::valid($source, 'ip')) return array('e' => sys::text('servers', 'firewall')); if(is_numeric($source)) { $sql->query('SELECT `id`, `sip` FROM `control_firewall` WHERE `id`="'.$source.'" AND `server`="'.$id.'" LIMIT 1'); // Если такое правило отсутствует if(!$sql->num()) return array('s' => 'ok'); }else{ $sql->query('SELECT `id`, `sip` FROM `control_firewall` WHERE `sip`="'.$source.'" AND `server`="'.$id.'" LIMIT 1'); // Если одиночный адрес не найден, проверить на блокировку подсети if(!$sql->num()) { $source = sys::whois($source); $sql->query('SELECT `id` FROM `control_firewall` WHERE `sip`="'.$source.'" AND `server`="'.$id.'" LIMIT 1'); if($sql->num()) { $firewall = $sql->get(); return array('i' => 'Указанный адрес входит в заблокированную подсеть, разблокировать подсеть?', 'id' => $firewall['id']); } return array('s' => 'ok'); } } $firewall = $sql->get(); $ssh->set('iptables -D INPUT -s '.$firewall['sip'].' -p udp -d '.$dest[0].' --dport '.$dest[1].' -j DROP;' .'sed "`nl '.$cfg['iptables'].' | grep \"#'.$firewall['id'].'\" | awk \'{print $1","$1+1}\'`d" '.$cfg['iptables'].' > '.$cfg['iptables'].'_temp; cat '.$cfg['iptables'].'_temp > '.$cfg['iptables'].'; rm '.$cfg['iptables'].'_temp'); $sql->query('DELETE FROM `control_firewall` WHERE `id`="'.$firewall['id'].'" LIMIT 1'); return array('s' => 'ok'); case 'remove': $sql->query('SELECT `id`, `sip`, `dest` FROM `control_firewall` WHERE `server`="'.$id.'"'); $aRule = array(); while($firewall = $sql->get()) { list($ip, $port) = explode(':', $firewall['dest']); $aRule[$firewall['id']] = 'iptables -D INPUT -s '.$firewall['sip'].' -p udp -d '.$ip.' --dport '.$port.' -j DROP;'; } $nRule = count($aRule); if(!$nRule) return NULL; $cmd = ''; foreach($aRule as $line => $rule) $cmd .= $rule.'sed "`nl '.$cfg['iptables'].' | grep "#'.$line.'" | awk \'{print $1","$1+1}\'`d" '.$cfg['iptables'].' > '.$cfg['iptables'].'_temp; cat '.$cfg['iptables'].'_temp > '.$cfg['iptables'].'; rm '.$cfg['iptables'].'_temp'; $ssh->set($cmd); $sql->query('DELETE FROM `control_firewall` WHERE `server`="'.$id.'" LIMIT '.$nRule); return array('s' => 'ok'); } } public static function crontab($id, $cid, $data = array()) { global $cfg; if($data['allhour']) $time = '0 * * * '; else{ $hour = array( '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23' ); $minute = array( '00', '05', '10', '15', '20', '25', '30', '35', '40', '45', '50', '55' ); if(!in_array($data['hour'], $hour)) $data['hour'] = '00'; if(!in_array($data['minute'], $minute)) $data['minute'] = '00'; $time = $data['minute'].' '.$data['hour'].' * * '; } $week = array(); $week[1] = isset($data['week']['\'1\'']) ? 1 : 0; $week[2] = isset($data['week']['\'2\'']) ? 2 : 0; $week[3] = isset($data['week']['\'3\'']) ? 3 : 0; $week[4] = isset($data['week']['\'4\'']) ? 4 : 0; $week[5] = isset($data['week']['\'5\'']) ? 5 : 0; $week[6] = isset($data['week']['\'6\'']) ? 6 : 0; $week[7] = isset($data['week']['\'7\'']) ? 7 : 0; $check = 0; foreach($week as $index => $val) $check+= $val; if($check == 28 || !$check) $week = '*'; else{ $weeks = $week[1].','.$week[2].','.$week[3].','.$week[4].','.$week[5].','.$week[6].','.$week[7]; $weeks = str_replace(array(',0', '0'), '', $weeks); $week = $weeks{0} == ',' ? substr($weeks, 1) : $weeks; } $cron_task = $time.$week.' screen -dmS s'.$id.' bash -c \'cd /var/enginegp && php cron.php '.$cfg['cron_key'].' control_server_cron '.$id.' '.$cid.'\''; return $cron_task; } } ?>