Created
November 29, 2022 12:25
-
-
Save stefanpejcic/a0c58a053a0125ee41eee888cf8bf0d3 to your computer and use it in GitHub Desktop.
Virtualizor crack /usr/local/virtualizor/main/functions.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php if( !defined("VIRTUALIZOR") ) | |
{ | |
exit( "Hacking Attempt" ); | |
} | |
class ArrayToXML | |
{ | |
public function toXML($data, $rootNodeName = "ResultSet", $xml = NULL) | |
{ | |
if( ini_get("zend.ze1_compatibility_mode") == 1 ) | |
{ | |
ini_set("zend.ze1_compatibility_mode", 0); | |
} | |
if( is_null($xml) ) | |
{ | |
$xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><" . $rootNodeName . " />"); | |
} | |
foreach( $data as $key => $value ) | |
{ | |
$numeric = false; | |
if( is_numeric($key) ) | |
{ | |
$numeric = 1; | |
$key = $rootNodeName; | |
} | |
$key = preg_replace("/[^a-z0-9\\-\\_\\.\\:]/i", "", $key); | |
if( is_array($value) ) | |
{ | |
$node = (ArrayToXML::isAssoc($value) || $numeric ? $xml->addChild($key) : $xml); | |
if( $numeric ) | |
{ | |
$key = "anon"; | |
} | |
ArrayToXML::toXml($value, $key, $node); | |
} | |
else | |
{ | |
$value = htmlentities($value); | |
$xml->addChild($key, $value); | |
} | |
} | |
return $xml->asXML(); | |
} | |
public function toArray($xml) | |
{ | |
if( is_string($xml) ) | |
{ | |
$xml = new SimpleXMLElement($xml); | |
} | |
$children = $xml->children(); | |
if( !$children ) | |
{ | |
return (string) $xml; | |
} | |
$arr = array( ); | |
foreach( $children as $key => $node ) | |
{ | |
$node = ArrayToXML::toArray($node); | |
if( $key == "anon" ) | |
{ | |
$key = count($arr); | |
} | |
if( isset($arr[$key]) ) | |
{ | |
if( !is_array($arr[$key]) || $arr[$key][0] == NULL ) | |
{ | |
$arr[$key] = array( $arr[$key] ); | |
} | |
$arr[$key][] = $node; | |
} | |
else | |
{ | |
$arr[$key] = $node; | |
} | |
} | |
return $arr; | |
} | |
public function isAssoc($array) | |
{ | |
return is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))); | |
} | |
} | |
function microtime_float() | |
{ | |
list($usec, $sec) = explode(" ", microtime()); | |
return (double) $usec + (double) $sec; | |
} | |
function datify($timestamp, $today = true, $adjust = true, $format = false) | |
{ | |
global $l; | |
global $user; | |
global $globals; | |
if( !empty($adjust) ) | |
{ | |
$timestamp = max(0, $timestamp - (@date("Z", @time()) / 3600 - $globals["pgtimezone"]) * 3600); | |
} | |
if( !empty($format) ) | |
{ | |
return date($format, $timestamp); | |
} | |
$todaytime = max(0, time() - (@date("Z", @time()) / 3600 - $globals["pgtimezone"]) * 3600); | |
if( $today && date("F j, Y", $timestamp) == date("F j, Y", $todaytime) ) | |
{ | |
$time = date("g:i a", $timestamp); | |
return $l["today"] . $time; | |
} | |
return @date("F j, Y, g:i a", $timestamp); | |
} | |
function datetime($datetime) | |
{ | |
if( empty($datetime) ) | |
{ | |
return NULL; | |
} | |
$year = substr($datetime, 0, 4); | |
$month = substr($datetime, 4, 2); | |
$day = substr($datetime, 6, 2); | |
$ret = $day . "/" . $month . "/" . $year; | |
if( 8 < strlen($datetime) ) | |
{ | |
$hour = substr($datetime, 8, 2); | |
$min = substr($datetime, 10, 2); | |
$ret = $ret . " " . $hour . ":" . $min; | |
} | |
return $ret; | |
} | |
function rand_num($val) | |
{ | |
for( $i = 0; $i < $val; $i++ ) | |
{ | |
$number .= rand(1, 9); | |
} | |
return $number; | |
} | |
function generateRandStr($length) | |
{ | |
$randstr = ""; | |
for( $i = 0; $i < $length; $i++ ) | |
{ | |
$randnum = mt_rand(0, 61); | |
if( $randnum < 10 ) | |
{ | |
$randstr .= chr($randnum + 48); | |
} | |
else | |
{ | |
if( $randnum < 36 ) | |
{ | |
$randstr .= chr($randnum + 55); | |
} | |
else | |
{ | |
$randstr .= chr($randnum + 61); | |
} | |
} | |
} | |
return strtolower($randstr); | |
} | |
function inputsec($string) | |
{ | |
if( !get_magic_quotes_gpc() ) | |
{ | |
$string = addslashes($string); | |
} | |
else | |
{ | |
$string = stripslashes($string); | |
$string = addslashes($string); | |
} | |
return $string; | |
} | |
function xss($val) | |
{ | |
return escapeshellarg($val); | |
} | |
function xsscmd($cmd) | |
{ | |
return escapeshellcmd($cmd); | |
} | |
function htmlizer($string) | |
{ | |
global $globals; | |
$string = htmlentities($string, ENT_QUOTES, $globals["charset"]); | |
preg_match_all("/(&#(\\d{1,7}|x[0-9a-fA-F]{1,6});)/", $string, $matches); | |
foreach( $matches[1] as $mk => $mv ) | |
{ | |
$tmp_m = entity_check($matches[2][$mk]); | |
$string = str_replace($matches[1][$mk], $tmp_m, $string); | |
} | |
return $string; | |
} | |
function entity_check($string) | |
{ | |
$num = (substr($string, 0, 1) === "x" ? hexdec(substr($string, 1)) : (int) $string); | |
$string = (1114111 < $num || 55296 <= $num && $num <= 57343 || $num < 32 ? "" : "&#" . $num . ";"); | |
return $string; | |
} | |
function cleanVARS($var) | |
{ | |
if( is_string($var) ) | |
{ | |
$var = array( $var ); | |
} | |
foreach( $var as $k => $v ) | |
{ | |
if( is_array($v) ) | |
{ | |
$var[$k] = cleanVARS($v); | |
continue; | |
} | |
if( get_magic_quotes_gpc() ) | |
{ | |
$v = stripslashes($v); | |
} | |
$v = htmlizer($v); | |
$var[$k] = $v; | |
} | |
return $var; | |
} | |
function cexplode($chars, $str, $int = 0, $clean = 0) | |
{ | |
$r = explode($chars, $str); | |
foreach( $r as $k => $v ) | |
{ | |
if( $int ) | |
{ | |
$r[$k] = (int) trim($v); | |
} | |
else | |
{ | |
$r[$k] = trim($v); | |
} | |
} | |
if( !empty($clean) ) | |
{ | |
foreach( $r as $k => $v ) | |
{ | |
if( empty($v) ) | |
{ | |
unset($r[$k]); | |
} | |
} | |
} | |
return $r; | |
} | |
function rawGPC($v) | |
{ | |
if( get_magic_quotes_gpc() ) | |
{ | |
$v = stripslashes($v); | |
} | |
return $v; | |
} | |
function v_ksort($a, $b) | |
{ | |
return strlen($b) - strlen($a); | |
} | |
function makequery($query, $token_vals = array( ), $ret = 0) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $theme; | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
try | |
{ | |
$pdo = $globals["pdo_conn"]; | |
$stmt = $pdo->prepare($query); | |
if( !empty($token_vals) && is_array($token_vals) ) | |
{ | |
$token_vals = clean_pdo_vals($token_vals); | |
$stmt_result = $stmt->execute($token_vals); | |
} | |
else | |
{ | |
$stmt_result = $stmt->execute(); | |
} | |
if( !$stmt_result && empty($ret) && !empty($globals["pdo_conn"]) ) | |
{ | |
$errinf = $stmt->errorInfo(); | |
if( $errinf[1] == 2006 ) | |
{ | |
try | |
{ | |
$globals["pdo_conn"] = new PDO("mysql:host=" . $globals["dbhost"] . ";dbname=" . $globals["db"] . ";charset=utf8", $globals["dbuser"], $globals["dbpass"]); | |
} | |
catch( PDOException $e ) | |
{ | |
exit( "Error!: " . $e->getMessage() ); | |
} | |
return makequery($query, $token_vals, $ret); | |
} | |
echo "Could not make the Query.<br />" . $query; | |
r_print($errinf); | |
exit(); | |
} | |
$result = $stmt; | |
} | |
catch( PDOException $e ) | |
{ | |
echo "Error : <br />" . $query; | |
r_print($e->getMessage()); | |
exit(); | |
} | |
} | |
else | |
{ | |
if( !empty($token_vals) ) | |
{ | |
uksort($token_vals, "v_ksort"); | |
foreach( $token_vals as $k => $v ) | |
{ | |
if( strpos($v, "'") !== false ) | |
{ | |
$v = addslashes($v); | |
} | |
$query = str_replace($k, "'" . $v . "'", $query); | |
} | |
} | |
$result = mysql_query($query, $globals["conn"]); | |
if( !$result && empty($ret) ) | |
{ | |
if( mysql_errno($globals["conn"]) == 2006 ) | |
{ | |
$globals["conn"] = @mysql_connect($globals["dbhost"], $globals["dbuser"], $globals["dbpass"], true); | |
@mysql_select_db($globals["db"], $globals["conn"]) or exit( "Unable to select database" ); | |
return makequery($query, $token_vals, $ret); | |
} | |
exit( "Could not make the Query.<br /><br /><br />" . $query . "<br /><br />MySQL Error No : " . mysql_errno($globals["conn"]) . "<br /><br />MySQL Error : " . mysql_error($globals["conn"]) ); | |
} | |
} | |
return $result; | |
} | |
function insert_and_id($q, $token_vals = array( )) | |
{ | |
global $globals; | |
$res = makequery($q, $token_vals); | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
return $globals["pdo_conn"]->lastInsertId(); | |
} | |
return @mysql_insert_id($globals["conn"]); | |
} | |
function update_query($q, $token_vals = array( )) | |
{ | |
global $globals; | |
$res = makequery($q, $token_vals); | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
$aff = (int) $res->rowCount(); | |
} | |
else | |
{ | |
$aff = (int) @mysql_affected_rows($globals["conn"]); | |
} | |
if( $aff < 1 ) | |
{ | |
return false; | |
} | |
return $aff; | |
} | |
function clean_pdo_vals($token_vals) | |
{ | |
$tmp = array( ); | |
foreach( $token_vals as $k => $v ) | |
{ | |
if( is_null($v) ) | |
{ | |
$token_vals[$k] = ""; | |
} | |
} | |
return $token_vals; | |
} | |
function vsql_affected_rows($res) | |
{ | |
global $globals; | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
return (int) $res->rowCount(); | |
} | |
return (int) @mysql_affected_rows($globals["conn"]); | |
} | |
function vsql_fetch_assoc($res) | |
{ | |
global $globals; | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
return $res->fetch(PDO::FETCH_ASSOC); | |
} | |
return mysql_fetch_assoc($res); | |
} | |
function vsql_fetch_array($res) | |
{ | |
global $globals; | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
return $res->fetch(PDO::FETCH_NUM); | |
} | |
return mysql_fetch_array($res); | |
} | |
function vsql_num_rows($res) | |
{ | |
global $globals; | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
return $res->rowCount(); | |
} | |
return mysql_num_rows($res); | |
} | |
function vsql_get_client_info() | |
{ | |
global $globals; | |
if( class_exists("PDO") && !empty($globals["pdo_conn"]) ) | |
{ | |
return $globals["pdo_conn"]->getAttribute(PDO::ATTR_CLIENT_VERSION); | |
} | |
if( function_exists("mysql_get_client_info") ) | |
{ | |
return mysql_get_client_info(); | |
} | |
return "-"; | |
} | |
function emailvalidation($email) | |
{ | |
if( !preg_match("/^([a-zA-Z0-9\\+._-])*@([a-zA-Z0-9_-])+([.])+([a-zA-Z0-9\\.]+[a-zA-Z])+\$/", $email) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function stringLimit($string, $length = 50, $ellipsis = "...") | |
{ | |
if( $length < strlen($string) ) | |
{ | |
return substr($string, 0, $length - strlen($ellipsis)) . $ellipsis; | |
} | |
return $string; | |
} | |
function get_page($get = "page", $resperpage = 50) | |
{ | |
$resperpage = (!empty($_REQUEST["reslen"]) && is_numeric($_REQUEST["reslen"]) ? (int) optREQ("reslen") : $resperpage); | |
if( optGET($get) ) | |
{ | |
$pg = (int) optGET($get); | |
$pg = $pg - 1; | |
$page = $pg * $resperpage; | |
$page = ($page <= 0 ? 0 : $page); | |
} | |
else | |
{ | |
$page = 0; | |
} | |
return $page; | |
} | |
function _mail($array, $mail_type = "plain") | |
{ | |
global $user; | |
global $globals; | |
global $theme; | |
global $conn; | |
global $dbtables; | |
include_once($globals["mainfiles"] . "/functions/mail_functions.php"); | |
return _mail_fn($array, "", $mail_type); | |
} | |
function array_insert(&$array, $position, $insert_array) | |
{ | |
$first_array = array_splice($array, 0, $position); | |
$array = array_merge($first_array, $insert_array, $array); | |
} | |
function find_pos($array, $index) | |
{ | |
$keys = array_keys($array); | |
$key = array_search($index, $keys); | |
return $key + 1; | |
} | |
function unhtmlentities($string) | |
{ | |
$string = preg_replace("~&#x([0-9a-f]+);~ei", "chr(hexdec(\"\\1\"))", $string); | |
$string = preg_replace("~&#([0-9]+);~e", "chr(\"\\1\")", $string); | |
$trans_tbl = get_html_translation_table(HTML_ENTITIES); | |
$trans_tbl = array_flip($trans_tbl); | |
return strtr($string, $trans_tbl); | |
} | |
function redirect($location, $header = true, $raw = false) | |
{ | |
global $globals; | |
global $redirect; | |
$redirect = true; | |
$prefix = (empty($raw) ? $globals["index"] : ""); | |
if( $header ) | |
{ | |
header("Location: " . $prefix . $location); | |
} | |
else | |
{ | |
echo "<meta http-equiv=\"Refresh\" content=\"0;url=" . $prefix . $location . "\">"; | |
} | |
} | |
function APIredirect($location, $raw = false) | |
{ | |
$GLOBALS["api"]["redirect"] = ((empty($raw) ? $globals["index"] : "")) . $location; | |
} | |
function can_gzip() | |
{ | |
global $isbot; | |
if( headers_sent() || connection_aborted() || !empty($isbot) ) | |
{ | |
return 0; | |
} | |
if( strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "x-gzip") !== false ) | |
{ | |
return "x-gzip"; | |
} | |
if( strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false ) | |
{ | |
return "gzip"; | |
} | |
return 0; | |
} | |
function virtualizor_buffer($buffer) | |
{ | |
global $globals; | |
global $redirect; | |
if( !empty($redirect) ) | |
{ | |
return NULL; | |
} | |
if( !empty($globals["stop_buffer_process"]) ) | |
{ | |
return $buffer; | |
} | |
if( preg_match("/\\<html(.*?)/is", $buffer) ) | |
{ | |
if( empty($globals["lictype"]) ) | |
{ | |
if( !preg_match("/" . preg_quote(unhtmlentities(strrev(";tg&a/;tl&.cnI suolucatfoS;tg&;touq&moc.suolucatfos.www//:ptth;touq&=ferh a;tl& 9002 ;ypoc;pma& ;tg&a/;tl&0.1 suolucatfoS eerF yB derewoP;tg&;touq&moc.suolucatfos.www//:ptth;touq&=ferh a;tl&")), "/") . "/", $buffer) ) | |
{ | |
return NULL; | |
} | |
} | |
else | |
{ | |
if( !preg_match("/" . preg_quote(unhtmlentities(strrev(";tg&a/;tl&.cnI suolucatfoS;tg&;touq&moc.suolucatfos.www//:ptth;touq&=ferh a;tl& 9002 ;ypoc;pma& ;tg&a/;tl&0.1 suolucatfoS yB derewoP;tg&;touq&moc.suolucatfos.www//:ptth;touq&=ferh a;tl&")), "/") . "/", $buffer) ) | |
{ | |
return NULL; | |
} | |
} | |
} | |
if( $globals["gzip"] && extension_loaded("zlib") && @ini_get("zlib.output_compression") !== "1" && can_gzip() ) | |
{ | |
$buffer = ob_gzhandler($buffer, 1); | |
} | |
return $buffer; | |
} | |
function load_lang($file) | |
{ | |
global $theme; | |
global $globals; | |
global $l; | |
global $user; | |
$file = $file . "_lang.php"; | |
$language = $globals["language"]; | |
if( !empty($user["language"]) ) | |
{ | |
$language = $user["language"]; | |
} | |
$path = $globals["path"] . "/languages/" . $language . "/" . $file; | |
if( (empty($file) || !include_once($path)) && !include_once($globals["path"] . "/languages/english/" . $file) ) | |
{ | |
reporterror("", "Unable to load the language files."); | |
return false; | |
} | |
return true; | |
} | |
function lang_vars($str, $array) | |
{ | |
$string = ""; | |
$str = preg_replace("/&soft-(\\d{1,2});/i", "&soft-\\1;", $str); | |
$count = 0; | |
foreach( $array as $v ) | |
{ | |
$count++; | |
$str = str_replace("&soft-" . $count . ";", $v, $str); | |
} | |
return $str; | |
} | |
function lang_vars_name($str, $array) | |
{ | |
foreach( $array as $k => $v ) | |
{ | |
$str = str_replace("{{" . $k . "}}", $v, $str); | |
} | |
return $str; | |
} | |
function parse_lang($str) | |
{ | |
global $l; | |
foreach( $l as $k => $v ) | |
{ | |
$v = addslashes($v); | |
$str = str_replace("{{" . $k . "}}", $v, $str); | |
} | |
return $str; | |
} | |
function email_templates($temp = "", $langfileprefix = "") | |
{ | |
global $globals; | |
global $emailtemps; | |
global $l; | |
$emailtemps = array( "addvs" => array( "title" => "mail_addvs_sub", "body" => "mail_addvs" ), "admin_addvs" => array( "title" => "admin_mail_addvs_sub", "body" => "admin_mail_addvs" ), "admin_addvs_err" => array( "title" => "admin_mail_addvs_err_sub", "body" => "admin_mail_addvs_err" ), "deletevs" => array( "title" => "admin_mail_del_vs_sub", "body" => "admin_mail_del_vs" ), "admin_del_vs_err" => array( "title" => "admin_mail_del_vs_err_sub", "body" => "admin_mail_del_vs_err" ), "admin_rebuild_vs" => array( "title" => "admin_mail_rebuild_vs_sub", "body" => "admin_mail_rebuild_vs" ), "admin_rebuild_vs_err" => array( "title" => "admin_mail_rebuild_vs_err_sub", "body" => "admin_mail_rebuild_vs_err" ), "createtemplate" => array( "title" => "createtemplate_sub", "body" => "createtemplate_vs" ), "createtemplate_err" => array( "title" => "createtemplate_err_sub", "body" => "createtemplate_vs_err" ), "reset_pass" => array( "title" => "login_mail_sub", "body" => "login_mail_body" ), "suspend_vps" => array( "title" => "suspend_vps_sub", "body" => "suspend_vps_body" ), "unsuspend_vps" => array( "title" => "unsuspend_vps_sub", "body" => "unsuspend_vps_body" ), "suspend_vps_net" => array( "title" => "suspend_vps_net_sub", "body" => "suspend_vps_net_body" ), "unsuspend_vps_net" => array( "title" => "unsuspend_vps_net_sub", "body" => "unsuspend_vps_net_body" ), "suspend_users" => array( "title" => "suspend_users_sub", "body" => "suspend_users_body" ), "unsuspend_users" => array( "title" => "unsuspend_users_sub", "body" => "unsuspend_users_body" ), "billing_warn_abusers" => array( "title" => "billing_warn_abusers_sub", "body" => "billing_warn_abusers_body" ), "billing_warn_users" => array( "title" => "billing_warn_users_sub", "body" => "billing_warn_users_body" ), "billing_invoice_created" => array( "title" => "billing_invoice_created_sub", "body" => "billing_invoice_created_body" ), "rebuildvs" => array( "title" => "mail_rebuildvs_sub", "body" => "mail_rebuildvs" ), "install_webuzo" => array( "title" => "install_webuzo_sub", "body" => "install_webuzo_body" ), "admin_install_webuzo_vs" => array( "title" => "admin_install_webuzo_vs_sub", "body" => "admin_install_webuzo_vs_body" ), "admin_install_webuzo_err" => array( "title" => "admin_install_webuzo_err_sub", "body" => "admin_install_webuzo_err_body" ) ); | |
if( empty($temp) || empty($emailtemps[$temp]) ) | |
{ | |
return true; | |
} | |
$ll["title"] = $l[$emailtemps[$temp]["title"]]; | |
$ll["body"] = $l[$emailtemps[$temp]["body"]]; | |
if( file_exists($globals["path"] . "/conf/" . $temp . ".lang") ) | |
{ | |
$ser = file_get_contents($globals["path"] . "/conf/" . $temp . ".lang"); | |
$tmp = _unserialize($ser); | |
} | |
$ll["mail_type"] = "plain"; | |
if( !empty($tmp) ) | |
{ | |
$ll["title"] = $tmp["title"]; | |
$ll["body"] = $tmp["body"]; | |
$ll["mail_type"] = (!empty($tmp["mail_type"]) ? "html" : "plain"); | |
} | |
return $ll; | |
} | |
function init_theme($file, $theme_file_name) | |
{ | |
global $theme; | |
global $globals; | |
global $l; | |
if( !include_once($theme["path"] . "/" . $file . "_theme.php") && !include_once($globals["themes"] . "/default/" . $file . "_theme.php") ) | |
{ | |
reporterror($l["init_theme_error_t"], lang_vars($l["init_theme_error"], array( $theme_file_name ))); | |
return false; | |
} | |
return true; | |
} | |
function init_theme_func($function_r, $theme_file_name) | |
{ | |
global $theme; | |
global $globals; | |
global $act; | |
global $load_hf; | |
global $l; | |
for( $i = 0; $i < count($function_r); | |
$i++ ) | |
{ | |
if( !function_exists($function_r[$i]) ) | |
{ | |
reporterror($l["init_theme_func_error_t"], lang_vars($l["init_theme_func_error"], array( $theme_file_name ))); | |
return false; | |
} | |
} | |
return true; | |
} | |
function load_theme_settings($folder) | |
{ | |
global $user; | |
global $conn; | |
global $dbtables; | |
global $logged_in; | |
global $globals; | |
global $l; | |
global $theme; | |
global $softpanel; | |
global $act; | |
global $load_hf; | |
$skins = array( ); | |
$skin = array( ); | |
$load_hf = true; | |
$theme["path"] = $globals["themes"] . "/" . $folder; | |
if( !include_once($theme["path"] . "/theme_settings.php") ) | |
{ | |
$theme["path"] = $globals["themes"] . "/default"; | |
$globals["runtime_theme"] = "default"; | |
if( !include_once($theme["path"] . "/theme_settings.php") ) | |
{ | |
reporterror("", $l["load_theme_settings_error"]); | |
$load_hf = false; | |
return false; | |
} | |
} | |
return true; | |
} | |
function reporterror($title, $text, $heading = "", $icon = "") | |
{ | |
global $theme; | |
global $globals; | |
global $act; | |
global $errortitle; | |
global $errormessage; | |
global $errorheading; | |
global $erroricon; | |
$act = "error_break"; | |
$errortitle = $title; | |
$errormessage = $text; | |
$errorheading = $heading; | |
$erroricon = $icon; | |
$globals["stop_buffer_process"] = true; | |
return true; | |
} | |
function reportmessage($title, $heading, $icon, $text) | |
{ | |
global $theme; | |
global $globals; | |
global $act; | |
global $messagetitle; | |
global $messagetext; | |
global $messageheading; | |
global $messageicon; | |
$act = "error_break"; | |
$messagetitle = $title; | |
$messagetext = $text; | |
$messageheading = $heading; | |
$messageicon = $icon; | |
return true; | |
} | |
function copyright() | |
{ | |
global $globals; | |
if( !empty($globals["copyright"]) ) | |
{ | |
return unhtmlentities($globals["copyright"]); | |
} | |
if( empty($globals["lictype"]) ) | |
{ | |
return "<a href=\"https://www.virtualizor.com\">Powered By Virtualizor " . $globals["version"] . "</a> © " . datify(time(), 1, 0, "Y") . " <a href=\"https://www.softaculous.com\">Softaculous Ltd.</a>"; | |
} | |
return "<a href=\"https://www.virtualizor.com\">Powered By Virtualizor " . $globals["version"] . "</a> © " . datify(time(), 1, 0, "Y") . " <a href=\"https://www.softaculous.com\">Softaculous Ltd.</a>"; | |
} | |
function getallGET($notreq) | |
{ | |
$to_return = array( ); | |
foreach( $_GET as $k => $v ) | |
{ | |
if( !in_array($k, $notreq) ) | |
{ | |
$to_return[] = $k . "=" . $v; | |
} | |
} | |
return implode("&", $to_return); | |
} | |
function compress($path, $name, $method) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/compress_functions.php"); | |
return compress_fn($path, $name, $method); | |
} | |
function decompress($file, $destination, $overwrite = 0, $include = array( ), $exclude = array( )) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/compress_functions.php"); | |
return decompress_fn($file, $destination, $overwrite, $include, $exclude); | |
} | |
function unzip($file, $destination, $overwrite = 0, $include = array( ), $exclude = array( )) | |
{ | |
global $globals; | |
global $unzip_inc; | |
global $unzip_exc; | |
if( !empty($include) ) | |
{ | |
foreach( $include as $ik => $iv ) | |
{ | |
if( empty($iv) ) | |
{ | |
unset($include[$ik]); | |
continue; | |
} | |
$include[$ik] = preg_quote($iv, "/"); | |
$include[$ik] = str_replace("\\*", "([a-zA-Z0-9\\._-])*", $include[$ik]); | |
} | |
} | |
if( !empty($exclude) ) | |
{ | |
foreach( $exclude as $ek => $ev ) | |
{ | |
if( empty($ev) ) | |
{ | |
unset($exclude[$ek]); | |
continue; | |
} | |
$exclude[$ek] = preg_quote($ev, "/"); | |
$exclude[$ek] = str_replace("\\*", "([a-zA-Z0-9\\._-])*", $exclude[$ek]); | |
} | |
} | |
$unzip_inc = $include; | |
$unzip_exc = $exclude; | |
if( !class_exists("PclZip") ) | |
{ | |
include_once($globals["mainfiles"] . "/classes/pclzip.php"); | |
} | |
$archive = new PclZip($file); | |
$result = $archive->extract(PCLZIP_OPT_PATH, $destination, PCLZIP_CB_PRE_EXTRACT, "inc_exc", PCLZIP_OPT_REPLACE_NEWER); | |
if( $result == 0 ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function inc_exc($p_event, &$v) | |
{ | |
global $globals; | |
global $unzip_inc; | |
global $unzip_exc; | |
$include = $unzip_inc; | |
$exclude = $unzip_exc; | |
if( !empty($include) ) | |
{ | |
foreach( $include as $ik => $iv ) | |
{ | |
if( !preg_match("/^" . $iv . "\$/is", $v["stored_filename"]) ) | |
{ | |
return 0; | |
} | |
} | |
} | |
if( !empty($exclude) ) | |
{ | |
foreach( $exclude as $ek => $ev ) | |
{ | |
if( preg_match("/^" . $ev . "\$/is", $v["stored_filename"]) ) | |
{ | |
return 0; | |
} | |
} | |
} | |
return 1; | |
} | |
function decompress_zip($file, $destination, $overwrite = 0, $include, $exclude) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/compress_functions.php"); | |
return decompress_zip_fn($file, $destination, $overwrite, $include, $exclude); | |
} | |
function decompress_tgz($file, $destination, $overwrite = 0) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/compress_functions.php"); | |
return decompress_tgz_fn($file, $destination, $overwrite); | |
} | |
function decompress_tar($file, $destination, $overwrite = 0) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/compress_functions.php"); | |
return decompress_tar_fn($file, $destination, $overwrite); | |
} | |
function decompress_tbz($file, $destination, $overwrite = 0) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/compress_functions.php"); | |
return decompress_tbz_fn($file, $destination, $overwrite); | |
} | |
function read_file($file) | |
{ | |
return implode("", file($file)); | |
} | |
function writefile($file, $data, $overwrite = 0, $chmod = 0, $dchmod = 0) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
return writefile_fn($file, $data, $overwrite, $chmod, $dchmod); | |
} | |
function filelist($startdir = "./", $searchSubdirs = 1, $directoriesonly = 0, $maxlevel = "all", $level = 1) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
return filelist_fn($startdir, $searchSubdirs, $directoriesonly, $maxlevel, $level); | |
} | |
function mkdir_recursive($pathname, $mode) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
return mkdir_recursive_fn($pathname, $mode); | |
} | |
function rmdir_recursive($path) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
return rmdir_recursive_fn($path); | |
} | |
function get_web_file($url, $writefilename = "") | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
return get_web_file_fn($url, $writefilename); | |
} | |
function save_web_file($url, $path) | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
return save_web_file_fn($url, $path); | |
} | |
function getremotesize($url) | |
{ | |
$size = 0; | |
$headers = get_headers($url, 1); | |
if( $headers === false ) | |
{ | |
$curl = curl_init(); | |
curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_HEADER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_NOBODY => true )); | |
$_headers = explode("\n", curl_exec($curl)); | |
foreach( $_headers as $k => $v ) | |
{ | |
$v = explode(":", trim($v)); | |
if( empty($v[1]) ) | |
{ | |
continue; | |
} | |
$headers[trim($v[0])] = trim($v[1]); | |
} | |
curl_close($curl); | |
if( !empty($headers["Content-Length"]) ) | |
{ | |
$size = (double) trim($headers["Content-Length"]); | |
} | |
} | |
else | |
{ | |
foreach( $headers as $k => $v ) | |
{ | |
if( strtolower($k) == "content-length" ) | |
{ | |
if( is_array($v) ) | |
{ | |
$size = (double) trim(end($v)); | |
} | |
else | |
{ | |
$size = (double) trim($v); | |
} | |
} | |
} | |
} | |
return $size; | |
} | |
function r_print($array) | |
{ | |
echo "<pre>"; | |
print_r($array); | |
echo "</pre>"; | |
} | |
function _strlen($string) | |
{ | |
global $globals; | |
return strlen(utf8_decode($string)); | |
} | |
function _substr($string, $start, $length = NULL) | |
{ | |
global $globals; | |
$r = preg_split("/(.)/" . (($globals["charset"] == "UTF-8" ? "u" : "")), $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); | |
if( $length === NULL ) | |
{ | |
return implode("", array_slice($r, $start)); | |
} | |
return implode("", array_slice($r, $start, $length)); | |
} | |
function _strtolower($string) | |
{ | |
global $globals; | |
global $lower_upper; | |
global $upper_lower; | |
if( $globals["charset"] != "UTF-8" ) | |
{ | |
return strtolower($string); | |
} | |
if( function_exists("mb_strtolower") ) | |
{ | |
return mb_strtolower($string, $globals["charset"]); | |
} | |
include_once($globals["mainfiles"] . "/functions/utf8_functions.php"); | |
return _strtolower_fn($string); | |
} | |
function _strtoupper($string) | |
{ | |
global $globals; | |
global $upper_lower; | |
global $lower_upper; | |
if( $globals["charset"] != "UTF-8" ) | |
{ | |
return strtoupper($string); | |
} | |
if( function_exists("mb_strtoupper") ) | |
{ | |
return mb_strtoupper($string, $globals["charset"]); | |
} | |
include_once($globals["mainfiles"] . "/functions/utf8_functions.php"); | |
return _strtoupper_fn($string); | |
} | |
function _ucfirst($string) | |
{ | |
global $globals; | |
if( $globals["charset"] != "UTF-8" ) | |
{ | |
return ucfirst($string); | |
} | |
return _strtoupper(_substr($string, 0, 1)) . _substr($string, 1); | |
} | |
function _strpos($haystack, $needle, $offset = 0) | |
{ | |
$c = 0; | |
$length = NULL; | |
while( is_null($length) || $length < $offset ) | |
{ | |
$pos = strpos($haystack, $needle, $offset + $c); | |
if( $pos === false ) | |
{ | |
return false; | |
} | |
$length = _strlen(substr($haystack, 0, $pos)); | |
if( $length < $offset ) | |
{ | |
$c = $pos - $length; | |
} | |
} | |
return $length; | |
} | |
function _unserialize($str) | |
{ | |
$var = @unserialize($str); | |
if( empty($var) ) | |
{ | |
preg_match_all("!s:(\\d+):\"(.*?)\";!s", $str, $matches); | |
foreach( $matches[2] as $mk => $mv ) | |
{ | |
$tmp_str = "s:" . strlen($mv) . ":\"" . $mv . "\";"; | |
$str = str_replace($matches[0][$mk], $tmp_str, $str); | |
} | |
$var = @unserialize($str); | |
} | |
if( empty($var) ) | |
{ | |
return false; | |
} | |
return $var; | |
} | |
function POST($name, $e, $isset = 1) | |
{ | |
global $error; | |
if( $isset && (!isset($_POST[$name]) || strlen(trim($_POST[$name])) < 1) || empty($isset) && empty($_POST[$name]) ) | |
{ | |
$error[$name] = $e; | |
} | |
else | |
{ | |
return inputsec(htmlizer(trim($_POST[$name]))); | |
} | |
} | |
function iPOST($name, $e, $isset = 1) | |
{ | |
global $error; | |
if( $isset && (!isset($_POST[$name]) || strlen(trim($_POST[$name])) < 1) || empty($isset) && empty($_POST[$name]) ) | |
{ | |
$error[$name] = $e; | |
} | |
else | |
{ | |
return inputsec(trim($_POST[$name])); | |
} | |
} | |
function optPOST($name, $default = "") | |
{ | |
global $error; | |
if( isset($_POST[$name]) ) | |
{ | |
return inputsec(htmlizer(trim($_POST[$name]))); | |
} | |
return $default; | |
} | |
function optREQ($name, $default = "") | |
{ | |
global $error; | |
if( isset($_REQUEST[$name]) ) | |
{ | |
return inputsec(htmlizer(trim($_REQUEST[$name]))); | |
} | |
return $default; | |
} | |
function REQUEST($name, $e) | |
{ | |
global $error; | |
if( !isset($_REQUEST[$name]) || strlen(trim($_REQUEST[$name])) < 1 ) | |
{ | |
$error[$name] = $e; | |
} | |
else | |
{ | |
return inputsec(htmlizer(trim($_REQUEST[$name]))); | |
} | |
} | |
function checkbox($name) | |
{ | |
global $error; | |
if( isset($_POST[$name]) ) | |
{ | |
return true; | |
} | |
return false; | |
} | |
function GET($name, $e) | |
{ | |
global $error; | |
if( !isset($_GET[$name]) || strlen(trim($_GET[$name])) < 1 ) | |
{ | |
$error[$name] = $e; | |
} | |
else | |
{ | |
return inputsec(htmlizer(trim($_GET[$name]))); | |
} | |
} | |
function optGET($name, $default = "") | |
{ | |
global $error; | |
if( isset($_GET[$name]) ) | |
{ | |
return inputsec(htmlizer(trim($_GET[$name]))); | |
} | |
return $default; | |
} | |
function POSTval($name, $default = "") | |
{ | |
return (!empty($_POST) ? (!isset($_POST[$name]) ? "" : $_POST[$name]) : $default); | |
} | |
function aPOSTval($name, $default = "") | |
{ | |
return (!empty($_POST) ? (!isset($_POST[$name]) ? "" : inputsec(htmlizer($_POST[$name]))) : $default); | |
} | |
function POSTchecked($name, $default = false) | |
{ | |
return (!empty($_POST) ? (isset($_POST[$name]) ? "checked=\"checked\"" : "") : (!empty($default) ? "checked=\"checked\"" : "")); | |
} | |
function POSTradio($name, $val, $default = false) | |
{ | |
return (!empty($_POST) ? ($_POST[$name] == $val ? "checked=\"checked\"" : "") : ($default == $val ? "checked=\"checked\"" : "")); | |
} | |
function POSTselect($name, $value, $default = false) | |
{ | |
if( empty($_POST) ) | |
{ | |
if( !empty($default) ) | |
{ | |
return "selected=\"selected\""; | |
} | |
} | |
else | |
{ | |
if( isset($_POST[$name]) && trim($_POST[$name]) == $value ) | |
{ | |
return "selected=\"selected\""; | |
} | |
} | |
} | |
function ex_POSTselect($name, $value, $default = NULL) | |
{ | |
if( empty($_POST) ) | |
{ | |
if( !is_null($default) ) | |
{ | |
return ($default == $value ? "selected=\"selected\"" : ""); | |
} | |
} | |
else | |
{ | |
if( isset($_POST[$name]) && trim($_POST[$name]) == $value ) | |
{ | |
return "selected=\"selected\""; | |
} | |
} | |
} | |
function REQval($name, $default = "") | |
{ | |
return (!empty($_REQUEST) ? (!isset($_REQUEST[$name]) ? "" : $_REQUEST[$name]) : $default); | |
} | |
function load_raw_config($path) | |
{ | |
include($path); | |
return $globals; | |
} | |
function saveglobals($rawdata = array( ), $reload = false) | |
{ | |
global $globals; | |
global $user; | |
$final_data = load_raw_config($globals["path"] . "/_universal.php"); | |
foreach( $rawdata as $k => $v ) | |
{ | |
if( !isset($final_data[$k]) ) | |
{ | |
$final_data[$k] = $v; | |
} | |
} | |
$data = "<?php\n\n"; | |
foreach( $final_data as $k => $v ) | |
{ | |
if( isset($rawdata[$k]) ) | |
{ | |
$final_data[$k] = $rawdata[$k]; | |
} | |
else | |
{ | |
$final_data[$k] = (isset($globals[$k]) ? $globals[$k] : ""); | |
} | |
if( is_string($final_data[$k]) ) | |
{ | |
$data .= "\$globals['" . $k . "'] = '" . $final_data[$k] . "';" . "\n"; | |
} | |
else | |
{ | |
if( is_int($final_data[$k]) || is_float($final_data[$k]) ) | |
{ | |
$data .= "\$globals['" . $k . "'] = " . $final_data[$k] . ";" . "\n"; | |
} | |
else | |
{ | |
if( is_bool($final_data[$k]) ) | |
{ | |
$data .= "\$globals['" . $k . "'] = " . (($final_data[$k] ? "true" : "false")) . ";" . "\n"; | |
} | |
} | |
} | |
} | |
$data .= "\n?>"; | |
$path = str_replace($globals["path"], $final_data["path"], $globals["path"]); | |
writefile($path . "/universal.php", $data, 1); | |
if( !empty($reload) ) | |
{ | |
include($path . "/universal.php"); | |
} | |
return true; | |
} | |
function add_cron($time) | |
{ | |
global $globals; | |
global $l; | |
if( empty($time) ) | |
{ | |
$time = $globals["cron_time"]; | |
} | |
$emps_time = $globals["emps_cron_time"]; | |
if( empty($emps_time) ) | |
{ | |
$first_day = rand(1, 10); | |
$second_day = $first_day + 15; | |
$emps_time = rand(0, 59) . " " . rand(0, 23) . " " . $first_day . "," . $second_day . " * *"; | |
} | |
$data = $time . " root " . $globals["com"]["php"] . " " . $globals["path"] . "/scripts/cron.php >> " . logdir() . "cron 2>&1" . "\n"; | |
$data .= "1 * * * * root " . $globals["com"]["php"] . " " . $globals["path"] . "/scripts/cronh.php >> " . logdir() . "cronh 2>&1" . "\n"; | |
$data .= "*/8 * * * * root " . $globals["com"]["php"] . " " . $globals["path"] . "/scripts/cronm.php >> " . logdir() . "cronm 2>&1" . "\n"; | |
$data .= $emps_time . " root " . $globals["com"]["php"] . " " . $globals["path"] . "/scripts/emps.php upgrade >> " . logdir() . "emps 2>&1" . "\n"; | |
$data .= rand(1, 59) . " " . rand(1, 23) . " */2 * * root " . $globals["com"]["php"] . " " . $globals["path"] . "/scripts/cron2.php >> " . logdir() . "cron2 2>&1" . "\n"; | |
$data = str_replace("\r", "", $data); | |
writefile("/etc/cron.d/virtualizor", $data, 1); | |
@chmod("/etc/cron.d/virtualizor", 420); | |
$power_data = "* * * * * root /usr/local/emps/bin/php " . $globals["path"] . "/scripts/powercron.php >> " . logdir() . "powercron 2>&1" . "\n"; | |
writefile("/etc/cron.d/virtualizor-powercron", $power_data, 1); | |
@chmod("/etc/cron.d/virtualizor-powercron", 420); | |
return true; | |
} | |
function del_cron() | |
{ | |
global $globals; | |
global $l; | |
@unlink("/etc/cron.d/softaculous"); | |
return true; | |
} | |
function updatevirtualizor($mode = 0) | |
{ | |
global $globals; | |
global $info; | |
global $l; | |
global $kernel; | |
global $cluster; | |
global $uerror; | |
$report["status"] = false; | |
$report["log"] = array( ); | |
$report["log"]["info"] = $l["getting_info"]; | |
if( empty($info) ) | |
{ | |
$data = get_softaculous_file("https://www.virtualizor.com/updates.php?version=" . $globals["version"] . "&tree=" . $globals["update"] . "&patch=" . $globals["patch"]); | |
$info = @_unserialize($data); | |
} | |
if( empty($info["version"]) ) | |
{ | |
$report["log"]["info"] .= $l["error_getting_latest"]; | |
return $report; | |
} | |
$report["log"]["info"] .= $l["got_info"]; | |
if( $mode == 1 && $info["mode"] == 0 ) | |
{ | |
$report["log"]["mode"] = $l["manual_mode"]; | |
return $report; | |
} | |
if( empty($info["link"]) ) | |
{ | |
$report["log"]["no_updates"] = $l["no_updates"]; | |
return $report; | |
} | |
$report["log"]["get"] = $l["fetch_upgrade"]; | |
$upgradefile = $globals["path"] . "/VIRT(" . $info["version"] . ").zip"; | |
$data = get_softaculous_file($info["link"], $upgradefile); | |
if( !is_file($upgradefile) ) | |
{ | |
$report["log"]["get"] .= $l["error_fetch_upgrade"]; | |
return $report; | |
} | |
$report["log"]["get"] .= $l["got_upgrade"]; | |
$report["log"]["unzip"] = $l["unzip_upgrade"]; | |
if( !unzip($upgradefile, $globals["path"] . "/", 1) ) | |
{ | |
$report["log"]["unzip"] .= $l["error_unzip_upgrade"]; | |
return $report; | |
} | |
$report["log"]["unzip"] .= $l["unzipped_upgrade"]; | |
$report["log"]["upgrade"] = $l["running_upgrade"]; | |
if( is_file($globals["path"] . "/upgrade.php") ) | |
{ | |
include_once($globals["path"] . "/upgrade.php"); | |
if( function_exists("_upgrade") ) | |
{ | |
call_user_func("_upgrade", $globals["version"]); | |
} | |
} | |
@unlink($upgradefile); | |
@unlink($globals["path"] . "/upgrade.php"); | |
if( !empty($uerror) ) | |
{ | |
$report["log"]["upgrade"] .= "\n\n" . $l["error_upgrade"] . "\n\n" . implode("\n\n", $uerror); | |
return $report; | |
} | |
$report["log"]["upgrade"] .= $l["succ_upgrade"]; | |
$report["status"] = true; | |
return $report; | |
} | |
function get_softaculous_file($url, $path = "") | |
{ | |
global $globals; | |
if( strstr($url, "?") ) | |
{ | |
$url = $url . "&license=" . $globals["license"] . "&soft_email=" . rawurlencode($globals["soft_email"]) . "&kernel=" . rawurlencode($globals["kernel"]); | |
} | |
else | |
{ | |
$url = $url . "?license=" . $globals["license"] . "&soft_email=" . rawurlencode($globals["soft_email"]) . "&kernel=" . rawurlencode($globals["kernel"]); | |
} | |
if( empty($path) ) | |
{ | |
return get_web_file($url); | |
} | |
return save_web_file($url, $path); | |
} | |
function fastestmirror($url = "") | |
{ | |
global $globals; | |
$lic_updated = time() - filemtime($globals["path"] . "/license.php"); | |
$lic_edit = time() - $globals["last_edit"]; | |
if( !empty($globals["override_fast_mirror"]) && $lic_updated <= 86400 && (3600 <= $lic_edit || empty($globals["last_edit"])) ) | |
{ | |
$mirror = $globals["override_fast_mirror"]; | |
return $mirror; | |
} | |
if( !empty($globals["fast_mirrors"]) && $lic_updated <= 86400 && (3600 <= $lic_edit || empty($globals["last_edit"])) ) | |
{ | |
$mirror = $globals["fast_mirrors"][array_rand($globals["fast_mirrors"])]; | |
} | |
if( !empty($mirror) ) | |
{ | |
return $mirror; | |
} | |
if( !empty($url) ) | |
{ | |
return $url; | |
} | |
return "http://api.virtualizor.com"; | |
} | |
function loadlicense($update = false) | |
{ | |
global $globals; | |
global $l; | |
if( file_exists($globals["path"] . "/license2.php") ) | |
{ | |
vexec("chattr -i -a " . $globals["path"] . "/license2.php"); | |
} | |
if( !defined("LIC_URL") ) | |
{ | |
@define("LIC_URL", "https://www.virtualizor.com/license2.php?"); | |
} | |
if( !file_exists($globals["path"] . "/license2.php") || $update ) | |
{ | |
$activevps = 0; | |
if( !empty($globals["conn"]) || !empty($globals["pdo_conn"]) ) | |
{ | |
$res = makequery("SELECT COUNT(vpsid) AS num FROM `vps`\n\t\t\t\t\t\tWHERE serid = 0"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$activevps = $row["num"]; | |
} | |
} | |
$data = get_softaculous_file(LIC_URL . "activevps=" . $activevps . "&version=" . $globals["version"]); | |
if( !empty($data) && @sm_decode($data) ) | |
{ | |
writefile($globals["path"] . "/license2.php", $data, 1); | |
} | |
} | |
$license = @file_get_contents($globals["path"] . "/license2.php"); | |
if( empty($license) ) | |
{ | |
reporterror("", $l["no_license"], ""); | |
return false; | |
} | |
$license = @trim(@sm_decode($license)); | |
$license = json_decode($license, true); | |
// print_r($globals["path"] . "/license2.php"); | |
// print_r($license); | |
// exit(); | |
if( !empty($license) && is_array($license) ) | |
{ | |
foreach( $license as $k => $v ) | |
{ | |
$globals[$k] = $v; | |
} | |
} | |
return true; | |
} | |
function soft_encode($txt) | |
{ | |
$from = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ); | |
$to = array( "!", "@", "#", "\$", "%", "^", "&", "*", "(", ")" ); | |
$txt = base64_encode($txt); | |
$txt = str_replace($from, $to, $txt); | |
$txt = gzcompress($txt); | |
$txt = base64_encode($txt); | |
return $txt; | |
} | |
function soft_decode($txt) | |
{ | |
$from = array( "!", "@", "#", "\$", "%", "^", "&", "*", "(", ")" ); | |
$to = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ); | |
$txt = base64_decode($txt); | |
$txt = @gzuncompress($txt); | |
$txt = str_replace($from, $to, $txt); | |
$txt = base64_decode($txt); | |
return $txt; | |
} | |
function sm_decode($txt) | |
{ | |
$from = array( "!", "@", "#", "\$", "%", "^", "&", "*", "(", ")" ); | |
$to = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ); | |
$txt = base64_decode($txt); | |
for( $i = 0; $i < strlen($txt); | |
$i++ ) | |
{ | |
$txt[$i] = sm_reverse_bits($txt[$i]); | |
} | |
$txt = gzuncompress($txt); | |
$txt = str_replace($from, $to, $txt); | |
$txt = base64_decode($txt); | |
return $txt; | |
} | |
function sm_reverse_bits($orig) | |
{ | |
$v = decbin(ord($orig)); | |
$pad = str_pad($v, 8, "0", STR_PAD_LEFT); | |
$rev = strrev($pad); | |
$bin = bindec($rev); | |
$chr = chr($bin); | |
return $chr; | |
} | |
function sqlsplit($data) | |
{ | |
$ret = array( ); | |
$buffer = ""; | |
$sql = ""; | |
$start_pos = 0; | |
$i = 0; | |
$len = 0; | |
$big_value = -2147483649; | |
$sql_delimiter = ";"; | |
$finished = false; | |
while( !($finished && $len <= $i) ) | |
{ | |
if( $data === false ) | |
{ | |
break; | |
} | |
if( $data === true ) | |
{ | |
} | |
else | |
{ | |
$buffer .= $data; | |
$data = false; | |
if( strpos($buffer, $sql_delimiter, $i) === false && !$finished ) | |
{ | |
continue; | |
} | |
} | |
$len = strlen($buffer); | |
while( $i < $len ) | |
{ | |
$found_delimiter = false; | |
$old_i = $i; | |
if( preg_match("/('|\"|#|-- |\\/\\*|`|(?i)DELIMITER)/", $buffer, $matches, PREG_OFFSET_CAPTURE, $i) ) | |
{ | |
$first_position = $matches[1][1]; | |
} | |
else | |
{ | |
$first_position = $big_value; | |
} | |
$first_sql_delimiter = strpos($buffer, $sql_delimiter, $i); | |
if( $first_sql_delimiter === false ) | |
{ | |
$first_sql_delimiter = $big_value; | |
} | |
else | |
{ | |
$found_delimiter = true; | |
} | |
$i = min($first_position, $first_sql_delimiter); | |
if( $i == $big_value ) | |
{ | |
$i = $old_i; | |
if( !$finished ) | |
{ | |
break; | |
} | |
if( trim($buffer) == "" ) | |
{ | |
$buffer = ""; | |
$len = 0; | |
break; | |
} | |
$i = strlen($buffer) - 1; | |
} | |
$ch = $buffer[$i]; | |
if( strpos("'\"`", $ch) !== false ) | |
{ | |
$quote = $ch; | |
$endq = false; | |
while( !$endq ) | |
{ | |
$pos = strpos($buffer, $quote, $i + 1); | |
if( $pos === false ) | |
{ | |
if( $finished ) | |
{ | |
$endq = true; | |
$i = $len - 1; | |
} | |
$found_delimiter = false; | |
break; | |
} | |
for( $j = $pos - 1; $buffer[$j] == "\\"; $j-- ) | |
{ | |
} | |
$endq = ($pos - 1 - $j) % 2 == 0; | |
$i = $pos; | |
if( $first_sql_delimiter < $pos ) | |
{ | |
$found_delimiter = false; | |
} | |
} | |
if( !$endq ) | |
{ | |
break; | |
} | |
$i++; | |
if( $finished && $i == $len ) | |
{ | |
$i--; | |
} | |
else | |
{ | |
continue; | |
} | |
} | |
if( ($i == $len - 1 && ($ch == "-" || $ch == "/") || $i == $len - 2 && ($ch == "-" && $buffer[$i + 1] == "-" || $ch == "/" && $buffer[$i + 1] == "*")) && !$finished ) | |
{ | |
break; | |
} | |
if( $ch == "#" || $i < $len - 1 && $ch == "-" && $buffer[$i + 1] == "-" && ($i < $len - 2 && $buffer[$i + 2] <= " " || $i == $len - 1 && $finished) || $i < $len - 1 && $ch == "/" && $buffer[$i + 1] == "*" ) | |
{ | |
if( $start_pos != $i ) | |
{ | |
$sql .= substr($buffer, $start_pos, $i - $start_pos); | |
} | |
$j = $i; | |
$i = strpos($buffer, ($ch == "/" ? "*/" : "\n"), $i); | |
if( $i === false ) | |
{ | |
if( $finished ) | |
{ | |
$i = $len - 1; | |
} | |
else | |
{ | |
break; | |
} | |
} | |
if( $ch == "/" ) | |
{ | |
if( $buffer[$j + 2] == "!" ) | |
{ | |
$comment = substr($buffer, $j + 3, $i - $j - 3); | |
if( preg_match("/^[0-9]{5}/", $comment, $version) ) | |
{ | |
if( $version[0] <= 50000000 ) | |
{ | |
$sql .= substr($comment, 5); | |
} | |
} | |
else | |
{ | |
$sql .= $comment; | |
} | |
} | |
$i++; | |
} | |
$i++; | |
$start_pos = $i; | |
if( $i == $len ) | |
{ | |
$i--; | |
} | |
else | |
{ | |
continue; | |
} | |
} | |
if( strtoupper(substr($buffer, $i, 9)) == "DELIMITER" && $buffer[$i + 9] <= " " && $i < $len - 11 && strpos($buffer, "\n", $i + 11) !== false ) | |
{ | |
$new_line_pos = strpos($buffer, "\n", $i + 10); | |
$sql_delimiter = substr($buffer, $i + 10, $new_line_pos - $i - 10); | |
$i = $new_line_pos + 1; | |
$start_pos = $i; | |
continue; | |
} | |
if( $found_delimiter || $finished && $i == $len - 1 ) | |
{ | |
$tmp_sql = $sql; | |
if( $start_pos < $len ) | |
{ | |
$length_to_grab = $i - $start_pos; | |
if( !$found_delimiter ) | |
{ | |
$length_to_grab++; | |
} | |
$tmp_sql .= substr($buffer, $start_pos, $length_to_grab); | |
unset($length_to_grab); | |
} | |
if( !preg_match("/^([\\s]*;)*\$/", trim($tmp_sql)) ) | |
{ | |
$sql = $tmp_sql; | |
$ret[] = $sql; | |
$buffer = substr($buffer, $i + strlen($sql_delimiter)); | |
$len = strlen($buffer); | |
$sql = ""; | |
$i = 0; | |
$start_pos = 0; | |
if( strpos($buffer, $sql_delimiter) === false && !$finished ) | |
{ | |
break; | |
} | |
} | |
else | |
{ | |
$i++; | |
$start_pos = $i; | |
} | |
} | |
} | |
} | |
return $ret; | |
} | |
function chowngrp($path, $own, $grp, $rec = 0) | |
{ | |
@chown($path, $own); | |
@chgrp($path, $grp); | |
if( empty($rec) ) | |
{ | |
return true; | |
} | |
if( empty($path) || $path == "/" ) | |
{ | |
return false; | |
} | |
resetfilelist(); | |
$path = (substr($path, -1) == "/" || substr($path, -1) == "\\" ? $path : $path . "/"); | |
$files = filelist($path, 1, 0, "all"); | |
$files = (!is_array($files) ? array( ) : $files); | |
foreach( $files as $k => $v ) | |
{ | |
@chown($k, $own); | |
@chgrp($k, $grp); | |
} | |
resetfilelist(); | |
@clearstatcache(); | |
return true; | |
} | |
function schmod($path, $oct, $rec = 0) | |
{ | |
@chmod($path, $oct); | |
if( empty($rec) ) | |
{ | |
return true; | |
} | |
if( empty($path) || $path == "/" ) | |
{ | |
return false; | |
} | |
resetfilelist(); | |
$path = (substr($path, -1) == "/" || substr($path, -1) == "\\" ? $path : $path . "/"); | |
$files = filelist($path, 1, 0, "all"); | |
$files = (!is_array($files) ? array( ) : $files); | |
foreach( $files as $k => $v ) | |
{ | |
@chmod($k, $oct); | |
} | |
resetfilelist(); | |
@clearstatcache(); | |
return true; | |
} | |
function saveuserprefs($data, $UID = 0) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $theme; | |
global $error; | |
$UID = (empty($UID) ? $user["uid"] : $UID); | |
if( empty($UID) || $UID < 1 ) | |
{ | |
return false; | |
} | |
$orig = _unserialize($user["preferences"]); | |
$orig = (is_array($orig) ? $orig : array( )); | |
foreach( $data as $k => $v ) | |
{ | |
$orig[$k] = $v; | |
} | |
$prefs = serialize($orig); | |
update_query("UPDATE `users`\n\t\t\t\tSET preferences = :preferences\n\t\t\t\tWHERE uid = :uid", array( ":preferences" => $prefs, ":uid" => $UID )); | |
return true; | |
} | |
function savevpsprefs($data) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $theme; | |
global $error; | |
$orig = _unserialize($user["vps"]["preferences"]); | |
$orig = (is_array($orig) ? $orig : array( )); | |
foreach( $data as $k => $v ) | |
{ | |
$orig[$k] = $v; | |
} | |
$prefs = serialize($orig); | |
update_query("UPDATE `vps`\n\t\t\t\tSET preferences = :preferences\n\t\t\t\tWHERE vpsid = :vpsid", array( ":preferences" => $prefs, ":vpsid" => $user["vps"]["vpsid"] )); | |
return true; | |
} | |
function soft_memory_limit($mb) | |
{ | |
$bytes = $mb * 1024 * 1024; | |
$mb_str = (string) $mb . "M"; | |
$memory_limit = @ini_get("memory_limit"); | |
if( empty($memory_limit) ) | |
{ | |
return NULL; | |
} | |
$memory_limit_bytes = (strpos($memory_limit, "M") ? intval($memory_limit) * 1024 * 1024 : intval($memory_limit)); | |
if( $memory_limit_bytes <= $bytes ) | |
{ | |
@ini_set("memory_limit", $mb_str); | |
} | |
} | |
function soft_premium() | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $theme; | |
global $softpanel; | |
global $iscripts; | |
global $catwise; | |
global $error; | |
if( empty($globals["lictype"]) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function getvps($vid, $use_cache = 1) | |
{ | |
global $globals; | |
global $oslist; | |
global $ostemplates; | |
global $distros; | |
global $vps_cache; | |
if( !empty($use_cache) && !empty($vps_cache[$vid]) ) | |
{ | |
return $vps_cache[$vid]; | |
} | |
$res = makequery("SELECT v.*, u.pid FROM `vps` v\n\t\t\t\t\tLEFT JOIN users u ON (u.uid = v.uid)\n\t\t\t\t\tWHERE v.vpsid = '" . $vid . "'"); | |
if( vsql_num_rows($res) < 1 ) | |
{ | |
return false; | |
} | |
$vps = vsql_fetch_assoc($res); | |
$res = makequery("SELECT * FROM `disks` \n\t\t\t\t\tWHERE vps_uuid = '" . $vps["uuid"] . "'\n\t\t\t\t\tORDER BY `num`"); | |
$vps["disks"] = array( ); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$row["vpsid"] = $vid; | |
if( !empty($row["extra"]) ) | |
{ | |
$row["extra"] = _unserialize($row["extra"]); | |
foreach( $row["extra"] as $kk => $vv ) | |
{ | |
if( !array_key_exists($kk, $row) ) | |
{ | |
$row[$kk] = $vv; | |
} | |
} | |
} | |
if( preg_match("/block/is", $row["type"]) && empty($row["format"]) ) | |
{ | |
$row["format"] = "raw"; | |
} | |
if( preg_match("/file/is", $row["type"]) && empty($row["format"]) ) | |
{ | |
$row["format"] = "qcow2"; | |
} | |
$vps["disks"][$row["num"]] = $row; | |
} | |
} | |
if( !empty($vps["ubc"]) ) | |
{ | |
$vps["ubc"] = _unserialize($vps["ubc"]); | |
} | |
if( !empty($vps["mg"]) ) | |
{ | |
$vps["mg"] = cexplode(",", $vps["mg"], 1); | |
} | |
if( !empty($vps["cached_disk"]) ) | |
{ | |
$vps["cached_disk"] = _unserialize($vps["cached_disk"]); | |
} | |
if( !empty($vps["openvz_features"]) ) | |
{ | |
$vps["openvz_features"] = _unserialize($vps["openvz_features"]); | |
} | |
if( !empty($vps["locked"]) ) | |
{ | |
$vps["locked"] = _unserialize($vps["locked"]); | |
} | |
if( !empty($vps["speed_cap"]) ) | |
{ | |
$vps["speed_cap"] = _unserialize($vps["speed_cap"]); | |
} | |
$vps_cache[$vid] = $vps; | |
return $vps; | |
} | |
function is_cloud_owner($vpsid, $uid) | |
{ | |
$vps = getvps($vpsid); | |
if( empty($vps) ) | |
{ | |
return false; | |
} | |
if( $vps["uid"] == $uid || $vps["pid"] == $uid ) | |
{ | |
return $vps; | |
} | |
return false; | |
} | |
function vps_virt($vid, $vz = 0, $xen = 0, $xenhvm = 0, $kvm = 0, $xcp = 0, $virtualbox = 0) | |
{ | |
global $globals; | |
global $users; | |
global $vps_cache; | |
if( !empty($users["vps"]["vpsid"]) && $users["vps"]["vpsid"] == $vid ) | |
{ | |
$vps = $users["vps"]; | |
} | |
else | |
{ | |
$vps = getvps($vid, 1); | |
} | |
$virt = $vps["virt"]; | |
if( $virt == "openvz" ) | |
{ | |
return $vz; | |
} | |
if( $virt == "xen" && !empty($vps["hvm"]) ) | |
{ | |
return $xenhvm; | |
} | |
if( $virt == "xen" ) | |
{ | |
return $xen; | |
} | |
if( $virt == "kvm" ) | |
{ | |
return $kvm; | |
} | |
if( $virt == "xcp" ) | |
{ | |
return $xcp; | |
} | |
if( $virt == "virtualbox" ) | |
{ | |
return $virtualbox; | |
} | |
} | |
function vps_virt_text($vid = 0) | |
{ | |
global $globals; | |
global $users; | |
$vid = (empty($vid) ? $globals["vpsid"] : $vid); | |
if( empty($vid) ) | |
{ | |
return ""; | |
} | |
$vps = getvps($vid, 1); | |
return $vps["virt"]; | |
} | |
function distro_find($osname) | |
{ | |
global $globals; | |
global $isos; | |
global $distros; | |
$distro = ""; | |
foreach( $distros as $k => $v ) | |
{ | |
if( preg_match("/" . preg_quote($k, "/") . "/is", $osname) ) | |
{ | |
$distro = $k; | |
break; | |
} | |
} | |
return $distro; | |
} | |
function distro_logo($distro, $size = 40) | |
{ | |
global $globals; | |
global $isos; | |
global $distros; | |
global $theme; | |
if( empty($distros[$distro]) ) | |
{ | |
return $theme["images"] . "others_" . $size . ".gif"; | |
} | |
if( !empty($size) ) | |
{ | |
$size = "_" . $size; | |
} | |
$v = $distros[$distro]; | |
return (!empty($v["logo"]) ? $v["logo"] : $theme["images"] . $v["distro"] . $size . ".gif"); | |
} | |
function distro_list() | |
{ | |
global $globals; | |
global $isos; | |
global $distros; | |
global $theme; | |
include($globals["path"] . "/distro_list.php"); | |
$res = makequery("SELECT * FROM `os_distros`\n\t\t\t\t\tORDER BY distro ASC"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$distros[$row["distro"]] = $row; | |
} | |
$stan = array( "centos", "fedora", "suse", "debian", "ubuntu", "windows", "scientific", "webuzo" ); | |
foreach( $stan as $k ) | |
{ | |
$distros[$k]["permanent"] = 1; | |
} | |
} | |
function isolist() | |
{ | |
global $globals; | |
global $isos; | |
global $distros; | |
global $A; | |
distro_list(); | |
$isos = array( ); | |
if( empty($distros) ) | |
{ | |
$stan = array( "centos", "webuzo", "fedora", "suse", "debian", "ubuntu" ); | |
} | |
else | |
{ | |
$stan = array_keys($distros); | |
} | |
$res = makequery("SELECT * FROM iso"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$uuid = $row["uuid"]; | |
if( empty($uuid) ) | |
{ | |
$uuid = generaterandstr(16); | |
$q = update_query("UPDATE `iso` \n\t\t\t\t\t\tSET uuid = :uuid \n\t\t\t\t\t\tWHERE iso = :isofile", array( ":isofile" => $row["iso"], ":uuid" => $uuid )); | |
} | |
$isos[$uuid] = $row; | |
if( !empty($row["mg"]) ) | |
{ | |
$isos[$uuid]["mg"] = cexplode(",", $row["mg"], 1); | |
} | |
$isos[$uuid]["name"] = $row["iso"]; | |
$isos[$uuid]["filename"] = $row["iso"]; | |
$isos[$uuid]["size"] = vfilesize($globals["isos"] . "/" . $row["iso"]); | |
$isos[$uuid]["isuseriso"] = 0; | |
$distro = ""; | |
preg_replace("/(" . implode("|", $stan) . ")/ies", "\$distro = strtolower('\$1');", $row["iso"]); | |
if( empty($distro) ) | |
{ | |
$isos[$uuid]["distro"] = "others"; | |
} | |
else | |
{ | |
$isos[$uuid]["distro"] = $distro; | |
} | |
} | |
if( !is_array($isos) ) | |
{ | |
return false; | |
} | |
} | |
function useriso($uid = 0) | |
{ | |
global $isos; | |
global $globals; | |
global $distros; | |
isolist(); | |
if( empty($uid) ) | |
{ | |
return false; | |
} | |
$res = makequery("SELECT * FROM `enduser_iso`\n\t\t\t\t\tWHERE uid = '" . $uid . "' \n\t\t\t\t\tAND size = downloaded\n\t\t\t\t\tAND deleted = 0"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$uuid = $row["uuid"]; | |
$isos[$uuid]["isuseriso"] = $row["uid"]; | |
$isos[$uuid]["filename"] = $row["iso"]; | |
$isos[$uuid]["name"] = $row["iso"]; | |
$isos[$uuid]["size"] = $row["downloaded"]; | |
} | |
if( !is_array($isos) ) | |
{ | |
return false; | |
} | |
} | |
function oslist($update = 0) | |
{ | |
global $globals; | |
global $oslist; | |
global $ostemplates; | |
global $oses; | |
global $distros; | |
global $A; | |
distro_list(); | |
if( !empty($update) || !file_exists($globals["path"] . "/ostemplates_list.json") ) | |
{ | |
$data = get_softaculous_file("http://api.virtualizor.com/ostemplates_list2.php"); | |
if( !empty($data) && @json_decode($data, true) ) | |
{ | |
writefile($globals["path"] . "/ostemplates_list.json", $data, 1); | |
} | |
} | |
$oslist = $ostemplates = $oses = array( ); | |
$json = file_get_contents($globals["path"] . "/ostemplates_list.json"); | |
$vars = json_decode($json, true); | |
if( !empty($json) && is_array($vars) ) | |
{ | |
foreach( $vars as $k => $v ) | |
{ | |
$GLOBALS[$k] = $v; | |
} | |
} | |
if( empty($distros) ) | |
{ | |
$stan = array( "centos", "webuzo", "fedora", "suse", "debian", "ubuntu", "scientific" ); | |
} | |
else | |
{ | |
$stan = array_keys($distros); | |
} | |
foreach( $oses as $k => $v ) | |
{ | |
$name = explode("-", $v["name"]); | |
if( !in_array($name[0], $stan) ) | |
{ | |
$name[0] = "others"; | |
} | |
$oses[$k]["distro"] = $name[0]; | |
if( empty($oses[$k]["Nvirt"]) ) | |
{ | |
$oses[$k]["Nvirt"] = $oses[$k]["type"] . ((empty($oses[$k]["hvm"]) ? "" : "hvm")); | |
} | |
} | |
$res = makequery("SELECT * FROM `os`\n\t\t\t\t\tORDER BY osid ASC"); | |
$installed = array( ); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( !empty($oses[$row["osid"]]) ) | |
{ | |
$row["osdata"] = $oses[$row["osid"]]; | |
} | |
else | |
{ | |
$row["osdata"] = _unserialize($row["osdata"]); | |
if( empty($row["osdata"]) ) | |
{ | |
continue; | |
} | |
} | |
$name = explode("-", $row["osdata"]["name"]); | |
if( !in_array($name[0], $stan) ) | |
{ | |
$name[0] = "others"; | |
} | |
$row["osdata"]["distro"] = $name[0]; | |
if( !empty($row["mg"]) ) | |
{ | |
$row["osdata"]["mg"] = cexplode(",", $row["mg"], 1); | |
} | |
if( empty($row["Nvirt"]) ) | |
{ | |
$row["osdata"]["Nvirt"] = $row["osdata"]["type"] . ((empty($row["osdata"]["hvm"]) ? "" : "hvm")); | |
} | |
$ostemplates[$row["osid"]] = $row["osdata"]; | |
$oslist[$row["osdata"]["type"]][$name[0]][$row["osid"]] = $row["osdata"]; | |
} | |
} | |
function valid_ip($ip) | |
{ | |
if( !preg_match("/^(\\d){1,3}\\.(\\d){1,3}\\.(\\d){1,3}\\.(\\d){1,3}\$/is", $ip) || substr_count($ip, ".") != 3 ) | |
{ | |
return false; | |
} | |
$r = explode(".", $ip); | |
foreach( $r as $v ) | |
{ | |
if( 255 < $v ) | |
{ | |
return false; | |
} | |
} | |
return true; | |
} | |
function cpuused($cmd, $speed = 100000, $times = 2) | |
{ | |
$PREV_TOTAL = 0; | |
$PREV_IDLE = 0; | |
for( $i = 1; $i <= $times; $i++ ) | |
{ | |
$stats = array( ); | |
$ret = vexec($cmd, $stats); | |
if( empty($stats[0]) ) | |
{ | |
return false; | |
} | |
$tmp = preg_grep("/^cpu /is", $stats); | |
$tmp = preg_split("/[\\s]+/is", $tmp[0]); | |
unset($tmp[0]); | |
$idle = $tmp[4]; | |
$total = array_sum($tmp); | |
$diff_total = $total - $PREV_TOTAL; | |
$diff_idle = $idle - $PREV_IDLE; | |
$usage = ((1000 * ($diff_total - $diff_idle)) / $diff_total + 1) / 10; | |
$PREV_TOTAL = $total; | |
$PREV_IDLE = $idle; | |
usleep($speed); | |
clearstatcache(); | |
} | |
return $usage; | |
} | |
function iprange($start, $end) | |
{ | |
$range = array( ); | |
if( empty($start) || empty($end) ) | |
{ | |
return false; | |
} | |
if( ip2long($end) < ip2long($start) ) | |
{ | |
return false; | |
} | |
for( $s = ip2long($start); | |
$s <= ip2long($end); | |
$s++ ) | |
{ | |
$tmp = long2ip($s); | |
if( empty($tmp) ) | |
{ | |
continue; | |
} | |
$range[] = $tmp; | |
} | |
return $range; | |
} | |
function parseshadow($data, $type = 1) | |
{ | |
if( $type == 1 ) | |
{ | |
$shadow = @file($data); | |
} | |
else | |
{ | |
if( is_array($data) ) | |
{ | |
$shadow = $data; | |
} | |
else | |
{ | |
$shadow = explode("\n", $data); | |
} | |
} | |
if( empty($shadow) ) | |
{ | |
return false; | |
} | |
$passwd = array( ); | |
foreach( $shadow as $uk => $uv ) | |
{ | |
$uv = explode(":", trim($uv)); | |
$passwd[$uv[0]] = $uv; | |
} | |
return $passwd; | |
} | |
function allow_slave_action() | |
{ | |
global $globals; | |
if( !empty($globals["slave"]) && empty($globals["apicall"]) ) | |
{ | |
return true; | |
} | |
return false; | |
} | |
function is_slave() | |
{ | |
global $globals; | |
if( !empty($globals["slave"]) ) | |
{ | |
return true; | |
} | |
return false; | |
} | |
function is_master() | |
{ | |
return !is_slave(); | |
} | |
function make_api_call($ip, $pass, $path, $data = array( ), $post = array( )) | |
{ | |
$key = generaterandstr(8); | |
$apikey = make_apikey($key, $pass); | |
$url = "https://" . $ip . ":4085/" . $path; | |
$url .= (strstr($url, "?") ? "" : "?"); | |
$url .= "&mver=" . $GLOBALS["globals"]["version"] . "&api=serialize&apikey=" . rawurlencode($apikey); | |
if( !empty($data) ) | |
{ | |
$url .= "&apidata=" . rawurlencode(base64_encode(serialize($data))); | |
} | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL, $url); | |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (!empty($GLOBALS["globals"]["curl_timeout"]) ? $GLOBALS["globals"]["curl_timeout"] : 3)); | |
curl_setopt($ch, CURLOPT_TIMEOUT, 3600); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | |
curl_setopt($ch, CURLOPT_USERAGENT, "Softaculous"); | |
if( !empty($post) ) | |
{ | |
curl_setopt($ch, CURLOPT_POST, 1); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); | |
} | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | |
$resp = curl_exec($ch); | |
$curl_err = curl_error($ch); | |
curl_close($ch); | |
if( empty($resp) ) | |
{ | |
return false; | |
} | |
$r = _unserialize($resp); | |
if( empty($r) ) | |
{ | |
return false; | |
} | |
return $r; | |
} | |
function e_make_api_call($ip, $pass, $vid, $path, $post = array( )) | |
{ | |
$key = generaterandstr(8); | |
$apikey = make_apikey($key, $pass); | |
$url = "https://" . $ip . ":4083/" . $path; | |
$url .= (strstr($url, "?") ? "" : "?"); | |
$url .= "&mver=" . $GLOBALS["globals"]["version"] . "&svs=" . $vid . "&api=serialize&apikey=" . rawurlencode($apikey); | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL, $url); | |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (!empty($GLOBALS["globals"]["curl_timeout"]) ? $GLOBALS["globals"]["curl_timeout"] : 3)); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | |
curl_setopt($ch, CURLOPT_USERAGENT, "Softaculous"); | |
if( !empty($post) ) | |
{ | |
curl_setopt($ch, CURLOPT_POST, 1); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); | |
} | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | |
$resp = curl_exec($ch); | |
curl_close($ch); | |
if( empty($resp) ) | |
{ | |
return false; | |
} | |
$r = _unserialize($resp); | |
if( empty($r) ) | |
{ | |
return false; | |
} | |
return $r; | |
} | |
function E_api_call($ip, $pass, $vid, $path, $post = array( )) | |
{ | |
$key = generaterandstr(8); | |
$apikey = make_apikey($key, $pass); | |
$url = "https://" . $ip . ":4085/" . $path; | |
$url .= (strstr($url, "?") ? "" : "?"); | |
$url .= "&mver=" . $GLOBALS["globals"]["version"] . "&svs=" . $vid . "&api=serialize&apikey=" . rawurlencode($apikey); | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL, $url); | |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (!empty($GLOBALS["globals"]["curl_timeout"]) ? $GLOBALS["globals"]["curl_timeout"] : 3)); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | |
curl_setopt($ch, CURLOPT_USERAGENT, "Softaculous"); | |
if( !empty($post) ) | |
{ | |
curl_setopt($ch, CURLOPT_POST, 1); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); | |
} | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | |
$resp = curl_exec($ch); | |
curl_close($ch); | |
if( empty($resp) ) | |
{ | |
return false; | |
} | |
$r = _unserialize($resp); | |
if( empty($r) ) | |
{ | |
return false; | |
} | |
return $r; | |
} | |
function return_apidata($data = array( )) | |
{ | |
global $globals; | |
if( empty($globals["apicall"]) ) | |
{ | |
return false; | |
} | |
if( empty($data) ) | |
{ | |
foreach( $GLOBALS as $k => $v ) | |
{ | |
if( $k == "GLOBALS" ) | |
{ | |
continue; | |
} | |
$data[$k] = $v; | |
} | |
} | |
echo "<" . $globals["apicall"] . ">" . serialize($data) . "</" . $globals["apicall"] . ">"; | |
return true; | |
} | |
function apicall_validate() | |
{ | |
global $globals; | |
$apikey = optget("apikey"); | |
$key = substr($apikey, 0, 8); | |
if( $apikey != make_apikey($key, $globals["pass"]) && $apikey != make_apikey($key, $globals["pass"], 1) ) | |
{ | |
return false; | |
} | |
if( isset($_GET["mver"]) ) | |
{ | |
$difference = abs(numeric_version($_GET["mver"]) - numeric_version($globals["version"])); | |
if( 5 < $difference ) | |
{ | |
return false; | |
} | |
} | |
$r["key"] = $key; | |
$r["data"] = array( ); | |
if( isset($_GET["apidata"]) ) | |
{ | |
$tmp = @soft_decode(@optget("apidata")); | |
if( empty($tmp) ) | |
{ | |
$tmp = base64_decode(optget("apidata")); | |
} | |
if( empty($tmp) ) | |
{ | |
return false; | |
} | |
$data = _unserialize($tmp); | |
if( empty($data) ) | |
{ | |
return false; | |
} | |
$r["data"] = $data; | |
} | |
return $r; | |
} | |
function api_success() | |
{ | |
global $globals; | |
$globals["apisuccess"] = 1; | |
} | |
function apidata($k) | |
{ | |
global $globals; | |
return $globals["apidata"][$k]; | |
} | |
function is_api_call($from_master = false) | |
{ | |
global $globals; | |
if( empty($globals["apicall"]) ) | |
{ | |
return false; | |
} | |
if( !empty($from_master) && $_SERVER["REMOTE_ADDR"] != $globals["masterip"] ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function make_apikey($key, $pass, $softencode = 0) | |
{ | |
if( empty($softencode) ) | |
{ | |
return $key . md5($pass . $key); | |
} | |
return $key . soft_encode(md5($pass . $key)); | |
} | |
function numeric_version($ver) | |
{ | |
return (int) str_replace(".", "", $ver); | |
} | |
function wildsearch($txt) | |
{ | |
return str_replace("*", "%", $txt); | |
} | |
function logdir($dir = "") | |
{ | |
$path = V_LOG_DIR . ((empty($dir) ? "" : "/" . $dir)); | |
if( !is_dir($path) ) | |
{ | |
mkdir_recursive($path, 493); | |
} | |
return $path . "/"; | |
} | |
function logs_vps($action, $data, $status = 1, $vpsid = 0, $uid = 0) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $error; | |
$uid = (empty($uid) ? 0 : $uid); | |
$data = (is_array($data) ? implode("", $data) : $data); | |
return insert_and_id("INSERT INTO logs_vps\n\t\t\t\t\t\tSET uid = :uid,\n\t\t\t\t\t\tvpsid = :vpsid,\n\t\t\t\t\t\taction = :action,\n\t\t\t\t\t\t`data` = :data,\n\t\t\t\t\t\t`time` = :time,\n\t\t\t\t\t\t`status` = :status,\n\t\t\t\t\t\tip = :ip", array( ":uid" => $uid, ":vpsid" => $vpsid, ":action" => $action, ":data" => $data, ":time" => time(), ":status" => $status, ":ip" => $_SERVER["REMOTE_ADDR"] )); | |
} | |
function get_task_progress($actid) | |
{ | |
$res = makequery("SELECT * FROM `tasks`\n\t\t\t\t\t WHERE actid = " . $actid); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$tasks[$row["actid"]] = $row; | |
} | |
} | |
if( !empty($tasks) ) | |
{ | |
foreach( $tasks as $k => $v ) | |
{ | |
$progress[] = $v["status"]; | |
$data = unserialize($v["data"]); | |
$progress[] = $data[0]; | |
$progress[] = $v["vpsid"]; | |
} | |
} | |
return $progress; | |
} | |
function migration_task_status($actid) | |
{ | |
$res = makequery("SELECT * FROM `tasks`\n\t\t\t\t\t WHERE actid = '" . $actid . "'"); | |
if( vsql_num_rows($res) < 1 ) | |
{ | |
return false; | |
} | |
$task = vsql_fetch_assoc($res); | |
$data = _unserialize($task["data"]); | |
$progress["status"] = $task["status"]; | |
$progress["status_txt"] = $task["status_txt"]; | |
$progress["vpsid"] = $task["vpsid"]; | |
$progress["completed"] = 0; | |
$progress["updated"] = $task["updated"]; | |
$progress["percent"] = $data["percent"]; | |
$progress["speed"] = $data["speed"]; | |
if( $task["status"] == -1 || $task["progress"] == 100 ) | |
{ | |
$progress["completed"] = 1; | |
} | |
return $progress; | |
} | |
function task_start($actid) | |
{ | |
$GLOBALS["current_taskid"] = $actid; | |
$res = update_query("UPDATE tasks \n\t\t\t\t\tSET started = '" . time() . "'\n\t\t\t\t\tWHERE actid = " . $actid); | |
if( is_slave() ) | |
{ | |
to_master("tasks", "started", $actid, "actid", time()); | |
if( defined("INITIATE_REVERSE_SYNC") ) | |
{ | |
initiate_reverse_sync(); | |
} | |
} | |
} | |
function task_update($actid, $status_txt = "", $status = 0, $data = "") | |
{ | |
$actid = (int) $actid; | |
$vpsid = $GLOBALS["cache_actid_vpsid"][$actid]["vpsid"]; | |
$action = $GLOBALS["cache_actid_vpsid"][$actid]["action"]; | |
if( empty($vpsid) || empty($action) ) | |
{ | |
$res = makequery("SELECT * FROM tasks WHERE actid = '" . $actid . "'"); | |
$row = vsql_fetch_assoc($res); | |
$vpsid = $row["vpsid"]; | |
$action = $row["action"]; | |
$GLOBALS["cache_actid_vpsid"][$actid]["vpsid"] = $row["vpsid"]; | |
$GLOBALS["cache_actid_vpsid"][$actid]["action"] = $row["action"]; | |
} | |
$token_vals = array( ":updated" => time(), ":status" => ($status == -1 ? -1 : 1), ":actid" => $actid ); | |
if( $status == 100 || $status == -1 ) | |
{ | |
$token_vals[":ended"] = time(); | |
unset($GLOBALS["current_taskid"]); | |
} | |
if( !empty($status_txt) ) | |
{ | |
$token_vals[":status_txt"] = $status_txt; | |
} | |
if( !empty($data) ) | |
{ | |
$data = (is_array($data) ? serialize($data) : $data); | |
$token_vals[":data"] = $data; | |
} | |
if( 0 <= $status ) | |
{ | |
$token_vals[":progress"] = $status; | |
} | |
$res = update_query("UPDATE tasks\n\t\t\t\t\tSET updated = :updated,\n\t\t\t\t\t" . (($status == 100 || $status == -1 ? "ended = :ended," : "")) . "\n\t\t\t\t\t" . ((!empty($status_txt) ? "status_txt = :status_txt," : "")) . "\n\t\t\t\t\tstatus = :status\n\t\t\t\t\t" . ((!empty($data) ? ",data = :data" : "")) . "\n\t\t\t\t\t" . ((0 <= $status ? ",progress = :progress" : "")) . "\n\t\t\t\t\tWHERE actid = :actid", $token_vals); | |
if( is_slave() ) | |
{ | |
$value["updated"] = time(); | |
$value["status"] = ($status == -1 ? -1 : 1); | |
if( !empty($status_txt) ) | |
{ | |
$value["status_txt"] = $status_txt; | |
} | |
if( 0 <= $status ) | |
{ | |
$value["progress"] = $status; | |
} | |
if( $status == 100 || $status == -1 ) | |
{ | |
$value["ended"] = time(); | |
} | |
if( !empty($data) ) | |
{ | |
$value["data"] = $data; | |
} | |
if( !empty($vpsid) ) | |
{ | |
$value["vpsid"] = $vpsid; | |
} | |
if( !empty($action) ) | |
{ | |
$value["action"] = $action; | |
} | |
$res = makequery("SELECT value FROM to_master \n\t\t\t\t\t\t\tWHERE tables = 'tasks'\n\t\t\t\t\t\t\tAND columns = 'array'\n\t\t\t\t\t\t\tAND id = :actid", array( ":actid" => $actid )); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$prev_value = $row["value"]; | |
$prev_value = unserialize($prev_value); | |
$value = array_replace($prev_value, $value); | |
} | |
to_master("tasks", "array", $actid, "actid", $value); | |
if( defined("INITIATE_REVERSE_SYNC") ) | |
{ | |
initiate_reverse_sync(); | |
} | |
} | |
} | |
function task_update_echo($actid, $status_txt = "", $status = 0, $data = "") | |
{ | |
echo "Progress: " . $status . ": " . $status_txt . "\n"; | |
return task_update($actid, $status_txt, $status, $data); | |
} | |
function tasks_admin_process($action, $data, $status = 1, $vpsid = 0, $uid = 0, $replace = 0, $actid = 0) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $error; | |
$uid = (empty($uid) ? 0 : $uid); | |
$data = (is_array($data) ? serialize($data) : $data); | |
if( !empty($replace) ) | |
{ | |
$token_vals = array( ":data" => $data, ":status" => ($status == -1 ? -1 : 1), ":vpsid" => $vpsid, ":updated" => time(), ":actid" => $actid ); | |
if( $status == 100 || $status == -1 ) | |
{ | |
$token_vals["ended"] = time(); | |
} | |
if( 0 <= $status ) | |
{ | |
$token_vals[":progress"] = $status; | |
} | |
$res = update_query("UPDATE tasks \n\t\t\t\t\t\tSET data = :data,\n\t\t\t\t\t\tstatus = :status,\n\t\t\t\t\t\t" . ((0 <= $status ? "progress = :progress," : "")) . "\n\t\t\t\t\t\tvpsid = :vpsid,\n\t\t\t\t\t\t" . (($status == 100 || $status == -1 ? "ended = :ended," : "")) . "\n\t\t\t\t\t\tupdated = :updated\n\t\t\t\t\t\tWHERE actid = :actid", $token_vals); | |
} | |
else | |
{ | |
$token_vals = array( ":uid" => $uid, ":vpsid" => $vpsid, ":action" => $action, ":data" => $data, ":time" => time(), ":status" => ($status == -1 ? -1 : 1), ":ip" => $_SERVER["REMOTE_ADDR"] ); | |
if( 0 <= $status ) | |
{ | |
$token_vals[":progress"] = $status; | |
} | |
$actid = insert_and_id("INSERT INTO tasks\n\t\t\t\t\t\t\tSET `uid` = :uid,\n\t\t\t\t\t\t\t`vpsid` = :vpsid,\n\t\t\t\t\t\t\t`action` = :action,\n\t\t\t\t\t\t\t`data` = :data,\n\t\t\t\t\t\t\t`time` = :time,\n\t\t\t\t\t\t\t`status` = :status,\n\t\t\t\t\t\t\t" . ((0 <= $status ? "progress = :progress," : "")) . "\n\t\t\t\t\t\t\t`ip` = :ip", $token_vals); | |
} | |
if( is_slave() ) | |
{ | |
if( !empty($replace) ) | |
{ | |
$value["updated"] = time(); | |
} | |
else | |
{ | |
$value["uid"] = $uid; | |
$value["action"] = $action; | |
} | |
$value["actid"] = $actid; | |
$value["vpsid"] = $vpsid; | |
$value["data"] = $data; | |
$value["status"] = ($status == -1 ? -1 : 1); | |
$value["status_txt"] = $status_txt; | |
if( 0 <= $status ) | |
{ | |
$value["progress"] = $status; | |
} | |
if( $status == 100 || $status == -1 ) | |
{ | |
$value["ended"] = time(); | |
} | |
to_master("tasks", "array", $actid, "actid", $value); | |
if( defined("INITIATE_REVERSE_SYNC") ) | |
{ | |
initiate_reverse_sync(); | |
} | |
} | |
$GLOBALS["cache_actid_vpsid"][$actid]["vpsid"] = $vpsid; | |
$GLOBALS["cache_actid_vpsid"][$actid]["action"] = $action; | |
return $actid; | |
} | |
function tasks_running($action, $vpsid = 0, $uid = 0) | |
{ | |
$where = array( ); | |
$where["action"] = "action = '" . $action . "'"; | |
$where["started"] = "started > '0'"; | |
$where["ended"] = "ended = '0'"; | |
if( !empty($vpsid) ) | |
{ | |
$where["vpsid"] = "vpsid = '" . $vpsid . "'"; | |
} | |
if( !empty($uid) ) | |
{ | |
$where["uid"] = "uid = '" . $uid . "'"; | |
} | |
$res = makequery("SELECT * FROM `tasks` WHERE " . implode(" AND ", $where)); | |
$tasks = array( ); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$data = unserialize($row["data"]); | |
if( !empty($data["pid"]) ) | |
{ | |
vexec("/bin/ps " . $data["pid"], $output); | |
if( 1 < count($output) ) | |
{ | |
$tasks[] = $row; | |
} | |
} | |
} | |
return $tasks; | |
} | |
function logs_admin($action, $data, $status = 1, $id = 0, $uid = 0) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $error; | |
$uid = (empty($uid) ? 0 : $uid); | |
return insert_and_id("INSERT INTO logs_admin\n\t\t\t\t\t\tSET uid = :uid,\n\t\t\t\t\t\tid = :id,\n\t\t\t\t\t\taction = :action,\n\t\t\t\t\t\t`data` = :data,\n\t\t\t\t\t\t`time` = :time,\n\t\t\t\t\t\t`status` = :status,\n\t\t\t\t\t\tip = :ip", array( ":uid" => $uid, ":id" => $id, ":action" => $action, ":data" => $data, ":time" => time(), ":status" => $status, ":ip" => $_SERVER["REMOTE_ADDR"] )); | |
} | |
function ip_logs($vpsid) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $error; | |
$ipes = array( ); | |
$res = makequery("SELECT * from `ips`\n\t\t\tWHERE vpsid = '" . $vpsid . "'"); | |
while( $row = vsql_fetch_assoc($res) ) | |
{ | |
$ipes[$row["ipid"]] = $row["ip"]; | |
} | |
$res = makequery("SELECT * from `vps`\n\t\t\tWHERE vpsid= '" . $vpsid . "'"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$userid = $row["uid"]; | |
$res = makequery("SELECT * from `users`\n\t\t\t\tWHERE uid= '" . $userid . "'"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$useremail = $row["email"]; | |
} | |
if( !empty($row["pid"]) ) | |
{ | |
$res = makequery("SELECT * from `users`\n\t\t\t\t\tWHERE uid= '" . $row["pid"] . "'"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$cid = $row["uid"]; | |
$cemail = $row["email"]; | |
} | |
} | |
} | |
foreach( $ipes as $k => $v ) | |
{ | |
insert_and_id("INSERT INTO ip_logs\n\t\t\t\tSET ipid = :ipid,\n\t\t\t\tip = :ip,\n\t\t\t\tvpsid = :vpsid,\n\t\t\t\tuid = :uid,\n\t\t\t\t`email` = :email,\n\t\t\t\tcloud_uid = :cloud_uid,\n\t\t\t\t`cloud_email` = :cloud_email,\n\t\t\t\t`time` = :time,\n\t\t\t\t`date` = :date", array( ":ipid" => $k, ":ip" => $v, ":vpsid" => $vpsid, ":uid" => $userid, ":email" => $useremail, ":cloud_uid" => (empty($cid) ? 0 : $cid), ":cloud_email" => (empty($cemail) ? 0 : $cemail), ":time" => time(), ":date" => time() )); | |
} | |
} | |
function logs_login($username, $vpsid = 0, $status = 1) | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $error; | |
return insert_and_id("INSERT INTO logs_login\n\t\t\t\t\t\tSET username = :username,\n\t\t\t\t\t\tvpsid = :vpsid,\n\t\t\t\t\t\t`time` = :time,\n\t\t\t\t\t\t`status` = :status,\n\t\t\t\t\t\tip = :ip", array( ":username" => $username, ":vpsid" => $vpsid, ":time" => time(), ":status" => $status, ":ip" => $_SERVER["REMOTE_ADDR"] )); | |
} | |
function vps_task($action, $data, $status = 1, $vpsid = 0, $uid = 0, $replace = 0, $status_txt = "") | |
{ | |
global $user; | |
global $globals; | |
global $l; | |
global $error; | |
$uid = (empty($uid) ? 0 : $uid); | |
if( !empty($replace) ) | |
{ | |
$replace_actid = 0; | |
$res = makequery("SELECT * FROM `tasks`\n\t\t\t\t\t\tWHERE vpsid = '" . $vpsid . "'\n\t\t\t\t\t\tAND `action` = '" . $action . "'\n\t\t\t\t\t\tAND started = 0 \n\t\t\t\t\t\tAND updated = 0 \n\t\t\t\t\t\tAND ended = 0\n\t\t\t\t\t\tORDER BY actid ASC"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$tasks[$row["actid"]] = $row; | |
$replace_actid = $row["actid"]; | |
} | |
} | |
$keys = @implode(", ", @array_keys($tasks)); | |
$keys = (empty($keys) ? 0 : $keys); | |
$res = makequery("DELETE FROM `tasks`\n\t\t\t\t\tWHERE vpsid = '" . $vpsid . "'\n\t\t\t\t\tAND actid IN (" . $keys . ")"); | |
} | |
$token_vals = array( ":uid" => $uid, ":vpsid" => $vpsid, ":action" => $action, ":data" => $data, ":time" => time(), ":status_txt" => $status_txt, ":status" => ($status == -1 ? -1 : 1), ":ip" => $_SERVER["REMOTE_ADDR"] ); | |
if( 0 <= $status ) | |
{ | |
$token_vals[":progress"] = $status; | |
} | |
if( !empty($replace_actid) ) | |
{ | |
$token_vals[":actid"] = $replace_actid; | |
} | |
$actid = insert_and_id("INSERT INTO tasks\n\t\t\t\t\t\tSET uid = :uid,\n\t\t\t\t\t\t" . ((!empty($replace_actid) ? "actid = :actid," : "")) . "\n\t\t\t\t\t\tvpsid = :vpsid,\n\t\t\t\t\t\taction = :action,\n\t\t\t\t\t\t`data` = :data,\n\t\t\t\t\t\t`time` = :time,\n\t\t\t\t\t\t`status` = :status,\n\t\t\t\t\t\t" . ((0 <= $status ? "progress = :progress," : "")) . "\n\t\t\t\t\t\t`status_txt` = :status_txt,\n\t\t\t\t\t\tip = :ip", $token_vals); | |
if( is_slave() ) | |
{ | |
$value["actid"] = $actid; | |
$value["uid"] = $uid; | |
$value["vpsid"] = $vpsid; | |
$value["action"] = $action; | |
$value["data"] = $data; | |
$value["time"] = time(); | |
$value["status"] = ($status == -1 ? -1 : 1); | |
$value["status_txt"] = $status_txt; | |
$value["ip"] = $_SERVER["REMOTE_ADDR"]; | |
if( 0 <= $status ) | |
{ | |
$value["progress"] = $status; | |
} | |
to_master("tasks", "array", $actid, "actid", $value); | |
} | |
return $actid; | |
} | |
function action_text($action, $data, $admin = 1) | |
{ | |
global $l; | |
load_lang("log_action"); | |
$a = (!empty($admin) ? "a" : ""); | |
$txt = (empty($l[$a . "log_act_" . $action]) ? ucfirst($action) : $l[$a . "log_act_" . $action]); | |
if( !empty($data) ) | |
{ | |
$txt .= " - " . $data; | |
} | |
return $txt; | |
} | |
function new_mac() | |
{ | |
$c = "abcdef0123456789"; | |
$r = array( ); | |
for( $i = 1; $i <= 6; $i++ ) | |
{ | |
$r[] = $c[rand(0, 15)] . $c[rand(0, 15)]; | |
} | |
return implode(":", $r); | |
} | |
function valid_mac($mac_addr) | |
{ | |
$validval = (preg_match("/^[a-f0-9]{2}:[a-f0-9]{2}:[a-f0-9]{2}:[a-f0-9]{2}:[a-f0-9]{2}:[a-f0-9]{2}\$/i", $mac_addr) ? 1 : 0); | |
if( !empty($validval) ) | |
{ | |
return true; | |
} | |
return false; | |
} | |
function fstypes() | |
{ | |
$fstypes["0"] = "Empty"; | |
$fstypes["1"] = "FAT12"; | |
$fstypes["2"] = "XENIX root"; | |
$fstypes["3"] = "XENIX usr"; | |
$fstypes["4"] = "FAT16 <32M"; | |
$fstypes["5"] = "Extended"; | |
$fstypes["6"] = "FAT16"; | |
$fstypes["7"] = "HPFS/NTFS"; | |
$fstypes["8"] = "AIX"; | |
$fstypes["9"] = "AIX bootable"; | |
$fstypes["a"] = "OS/2 Boot Manag"; | |
$fstypes["b"] = "W95 FAT32"; | |
$fstypes["c"] = "W95 FAT32 (LBA)"; | |
$fstypes["e"] = "W95 FAT16 (LBA)"; | |
$fstypes["f"] = "W95 Ext'd (LBA)"; | |
$fstypes["10"] = "OPUS"; | |
$fstypes["11"] = "Hidden FAT12"; | |
$fstypes["12"] = "Compaq diagnost"; | |
$fstypes["14"] = "Hidden FAT16 <3"; | |
$fstypes["16"] = "Hidden FAT16"; | |
$fstypes["17"] = "Hidden HPFS/NTF"; | |
$fstypes["18"] = "AST SmartSleep"; | |
$fstypes["1b"] = "Hidden W95 FAT3"; | |
$fstypes["1c"] = "Hidden W95 FAT3"; | |
$fstypes["1e"] = "Hidden W95 FAT1"; | |
$fstypes["24"] = "NEC DOS"; | |
$fstypes["39"] = "Plan 9"; | |
$fstypes["3c"] = "PartitionMagic"; | |
$fstypes["40"] = "Venix 80286"; | |
$fstypes["41"] = "PPC PReP Boot"; | |
$fstypes["42"] = "SFS"; | |
$fstypes["4d"] = "QNX4.x"; | |
$fstypes["4e"] = "QNX4.x 2nd part"; | |
$fstypes["4f"] = "QNX4.x 3rd part"; | |
$fstypes["50"] = "OnTrack DM"; | |
$fstypes["51"] = "OnTrack DM6 Aux"; | |
$fstypes["52"] = "CP/M"; | |
$fstypes["53"] = "OnTrack DM6 Aux"; | |
$fstypes["54"] = "OnTrackDM6"; | |
$fstypes["55"] = "EZ-Drive"; | |
$fstypes["56"] = "Golden Bow"; | |
$fstypes["5c"] = "Priam Edisk"; | |
$fstypes["61"] = "SpeedStor"; | |
$fstypes["63"] = "GNU HURD or Sys"; | |
$fstypes["64"] = "Novell Netware"; | |
$fstypes["65"] = "Novell Netware"; | |
$fstypes["70"] = "DiskSecure Mult"; | |
$fstypes["75"] = "PC/IX"; | |
$fstypes["80"] = "Old Minix"; | |
$fstypes["81"] = "Minix / old Lin"; | |
$fstypes["82"] = "Linux swap"; | |
$fstypes["83"] = "Linux"; | |
$fstypes["84"] = "OS/2 hidden C:"; | |
$fstypes["85"] = "Linux extended"; | |
$fstypes["86"] = "NTFS volume set"; | |
$fstypes["87"] = "NTFS volume set"; | |
$fstypes["88"] = "Linux plaintext"; | |
$fstypes["8e"] = "Linux LVM"; | |
$fstypes["93"] = "Amoeba"; | |
$fstypes["94"] = "Amoeba BBT"; | |
$fstypes["9f"] = "BSD/OS"; | |
$fstypes["a0"] = "IBM Thinkpad hi"; | |
$fstypes["a5"] = "FreeBSD"; | |
$fstypes["a6"] = "OpenBSD"; | |
$fstypes["a7"] = "NeXTSTEP"; | |
$fstypes["a8"] = "Darwin UFS"; | |
$fstypes["a9"] = "NetBSD"; | |
$fstypes["ab"] = "Darwin boot"; | |
$fstypes["af"] = "HFS / HFS+"; | |
$fstypes["b7"] = "BSDI fs"; | |
$fstypes["b8"] = "BSDI swap"; | |
$fstypes["bb"] = "Boot Wizard hid"; | |
$fstypes["be"] = "Solaris boot"; | |
$fstypes["c1"] = "DRDOS/sec (FAT-"; | |
$fstypes["bf"] = "Solaris"; | |
$fstypes["c4"] = "DRDOS/sec (FAT-"; | |
$fstypes["c6"] = "DRDOS/sec (FAT-"; | |
$fstypes["c7"] = "Syrinx"; | |
$fstypes["da"] = "Non-FS data"; | |
$fstypes["db"] = "CP/M / CTOS / ."; | |
$fstypes["de"] = "Dell Utility"; | |
$fstypes["df"] = "BootIt"; | |
$fstypes["e1"] = "DOS access"; | |
$fstypes["e3"] = "DOS R/O"; | |
$fstypes["e4"] = "SpeedStor"; | |
$fstypes["eb"] = "BeOS fs"; | |
$fstypes["ee"] = "GPT"; | |
$fstypes["ef"] = "EFI (FAT-12/16/"; | |
$fstypes["f0"] = "Linux/PA-RISC b"; | |
$fstypes["f1"] = "SpeedStor"; | |
$fstypes["f4"] = "SpeedStor"; | |
$fstypes["f2"] = "DOS secondary"; | |
$fstypes["fb"] = "VMware VMFS"; | |
$fstypes["fc"] = "VMware VMKCORE"; | |
$fstypes["fd"] = "Linux raid auto"; | |
$fstypes["fe"] = "LANstep"; | |
$fstypes["ff"] = "BBT"; | |
return $fstypes; | |
} | |
function diskinfo($dev) | |
{ | |
$ret = array( ); | |
$ret["num"]["linux"] = 0; | |
$ret["num"]["windows"] = 0; | |
$ret["parts"] = array( ); | |
$ret["rawparts"] = array( ); | |
$ret["numparts"] = 0; | |
vexec("/sbin/kpartx " . $dev, $parts); | |
$ret["numparts"] = count($parts); | |
if( $ret["numparts"] < 1 ) | |
{ | |
return $ret; | |
} | |
unset($parts); | |
vexec("/sbin/sfdisk -luS -q " . $dev, $ret["rawparts"]); | |
$ret["rawparts"] = array_slice($ret["rawparts"], 0 - max($ret["numparts"], 4)); | |
foreach( $ret["rawparts"] as $k => $v ) | |
{ | |
$tmp = preg_split("/[\\s]+/is", trim($ret["rawparts"][$k])); | |
$part_type = strtolower($tmp[count($tmp) - 1]); | |
$ret["parts"][$k]["start"] = trim($tmp[count($tmp) - 5]); | |
$ret["parts"][$k]["hextype"] = trim($tmp[count($tmp) - 2]); | |
$ret["parts"][$k]["boot"] = ($tmp[1] == "*" ? "*" : "-"); | |
if( $part_type == "linux" ) | |
{ | |
$ret["parts"][$k]["islinux"] = 1; | |
$ret["num"]["linux"]++; | |
} | |
else | |
{ | |
if( preg_match("/linux swap/is", $ret["rawparts"][$k]) ) | |
{ | |
$ret["parts"][$k]["isswap"] = 1; | |
$ret["num"]["linux"]++; | |
} | |
else | |
{ | |
if( preg_match("/ntfs/is", $part_type) ) | |
{ | |
$ret["parts"][$k]["iswindows"] = 1; | |
$ret["num"]["windows"]++; | |
} | |
} | |
} | |
} | |
return $ret; | |
} | |
function file_diskinfo($dev) | |
{ | |
global $globals; | |
$ret = array( ); | |
$ret["num"]["linux"] = 0; | |
$ret["num"]["windows"] = 0; | |
$ret["parts"] = array( ); | |
$ret["rawparts"] = array( ); | |
$ret["numparts"] = 0; | |
vexec("guestfish -a " . $dev . " 2>/dev/null << EOF \nrun\n-list-devices\necho \"VIRTUALIZOR\"\n-blockdev-getsz /dev/sda\necho \"VIRTUALIZOR\"\n-part-list /dev/sda\necho \"VIRTUALIZOR\"\n-part-get-mbr-id /dev/sda 1\n-part-get-mbr-id /dev/sda 2\n-part-get-mbr-id /dev/sda 3\n-part-get-mbr-id /dev/sda 4\necho \"VIRTUALIZOR\"\n-part-get-bootable /dev/sda 1\n-part-get-bootable /dev/sda 2\n-part-get-bootable /dev/sda 3\n-part-get-bootable /dev/sda 4\nEOF", $parts); | |
$details = implode("\n", $parts); | |
$details = explode("VIRTUALIZOR", $details); | |
foreach( $details as $k => $v ) | |
{ | |
$details[$k] = trim($v); | |
} | |
$details[3] = explode("\n", $details[3]); | |
$details[4] = explode("\n", $details[4]); | |
$partitions = array( ); | |
if( preg_match("/\\}/", $details[2]) ) | |
{ | |
$tmp = preg_replace("/\\[.\\](\\s*)\\=(\\s*)/is", "", $details[2]); | |
$tmp = preg_split("/\\}(\\s*)\\{/is", $tmp); | |
foreach( $tmp as $tk => $tv ) | |
{ | |
$tmp[$tk] = $tv = trim(str_replace(array( "{", "}" ), array( "", "" ), $tv)); | |
$tv = explode("\n", $tv); | |
foreach( $tv as $k => $v ) | |
{ | |
$v = explode(":", $v); | |
$partitions[$tk][trim($v[0])] = trim($v[1]); | |
} | |
} | |
preg_match("/(\\s*?)part_start:(\\s*?)(\\d+)/", $details[2], $matches); | |
$ret["start_offset"] = (int) $matches[3]; | |
} | |
$ret["numparts"] = count($partitions); | |
$ret["disk_max_sectors"] = $details[1]; | |
if( $ret["numparts"] < 1 ) | |
{ | |
return $ret; | |
} | |
$fstypes = fstypes(); | |
foreach( $partitions as $k => $v ) | |
{ | |
$ret["parts"][$k]["start"] = $v["part_start"] / 512; | |
$ret["parts"][$k]["hextype"] = str_replace("0x", "", $details[3][$k]); | |
$ret["parts"][$k]["boot"] = (!empty($details[4][$k]) && $details[4][$k] == "true" ? true : false); | |
$part_type = strtolower($fstypes[$ret["parts"][$k]["hextype"]]); | |
$partitions[$k]["part_type"] = $part_type; | |
if( $part_type == "linux" ) | |
{ | |
$ret["parts"][$k]["islinux"] = 1; | |
$ret["num"]["linux"]++; | |
} | |
else | |
{ | |
if( preg_match("/linux swap/is", $part_type) ) | |
{ | |
$ret["parts"][$k]["isswap"] = 1; | |
$ret["num"]["linux"]++; | |
} | |
else | |
{ | |
if( preg_match("/ntfs/is", $part_type) ) | |
{ | |
$ret["parts"][$k]["iswindows"] = 1; | |
$ret["num"]["windows"]++; | |
} | |
} | |
} | |
} | |
$ret["rawparts"] = $partitions; | |
return $ret; | |
} | |
function is_safe_file($path) | |
{ | |
if( file_exists($path) && realpath($path) != $path ) | |
{ | |
return false; | |
} | |
if( is_link($path) ) | |
{ | |
return false; | |
} | |
$stat = @stat($path); | |
if( !is_dir($path) && 1 < $stat["nlink"] ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function sshkey_clean($path) | |
{ | |
if( empty($path) || realpath($path . "/etc") == "/etc" || realpath($path) != $path ) | |
{ | |
return false; | |
} | |
if( !is_safe_file($path . "/etc/ssh/ssh_host_rsa_key") || !is_safe_file($path . "/etc/ssh/ssh_host_dsa_key") ) | |
{ | |
return false; | |
} | |
vexec("/bin/rm -rf " . $path . "/etc/ssh/ssh_host*"); | |
if( is_file($path . "/etc/network/interfaces") ) | |
{ | |
vexec("/usr/bin/ssh-keygen -t rsa -N \"\" -f " . $path . "/etc/ssh/ssh_host_rsa_key"); | |
vexec("/usr/bin/ssh-keygen -t dsa -N \"\" -f " . $path . "/etc/ssh/ssh_host_dsa_key"); | |
} | |
} | |
function dns_configure($path, $vps) | |
{ | |
global $globals; | |
if( empty($path) || realpath($path . "/etc") == "/etc" || realpath($path) != $path ) | |
{ | |
return false; | |
} | |
if( !is_safe_file($path . "/etc/resolv.conf.org") || !is_safe_file($path . "/etc/resolv.conf") ) | |
{ | |
return false; | |
} | |
if( is_dir($path . "/etc") ) | |
{ | |
$dns = unserialize($vps["dns_nameserver"]); | |
if( !empty($dns) ) | |
{ | |
$ret1 = vexec("/bin/mv " . $path . "/etc/resolv.conf " . $path . "/etc/resolv.conf.org", $o1); | |
$returnval = 0; | |
foreach( $dns as $f => $d ) | |
{ | |
$ret = vexec("/bin/echo \"nameserver " . $d . "\" >> " . $path . "/etc/resolv.conf", $o); | |
$returnval += $ret; | |
} | |
if( empty($returnval) ) | |
{ | |
vexec("rm -f" . $path . "/etc/resolv.conf.org"); | |
return NULL; | |
} | |
vexec("mv " . $path . "/etc/resolv.conf.org " . $path . "/etc/resolv.conf"); | |
} | |
} | |
} | |
function network_configure($path, $ips, $dns, $add_route) | |
{ | |
global $globals; | |
if( empty($path) || realpath($path . "/etc") == "/etc" || realpath($path) != $path ) | |
{ | |
return false; | |
} | |
$_ips = $ips; | |
$ips = array( ); | |
$ips6 = array( ); | |
$ips_int = array( ); | |
$add_ipv6_route = 0; | |
$has_v6 = false; | |
$has_v6s = false; | |
foreach( $_ips as $k => $v ) | |
{ | |
if( !empty($v["internal"]) ) | |
{ | |
$ips_int[] = $v; | |
} | |
else | |
{ | |
if( !empty($v["ipv6"]) ) | |
{ | |
if( !empty($v["ipr_netmask"]) && !empty($v["ipr_ips"]) ) | |
{ | |
$ipr_ips = _unserialize($v["ipr_ips"]); | |
if( !empty($ipr_ips) && is_array($ipr_ips) ) | |
{ | |
$v["ipr_ips"] = $ipr_ips; | |
} | |
$has_v6s = true; | |
} | |
if( !$has_v6s ) | |
{ | |
$has_v6 = true; | |
} | |
$ips6[$v["ipid"]] = $v; | |
if( !empty($v["routing"]) ) | |
{ | |
$add_ipv6_route = 1; | |
} | |
} | |
else | |
{ | |
$ips[] = $v; | |
} | |
} | |
} | |
if( is_dir($path . "/etc/sysconfig/network-scripts") ) | |
{ | |
foreach( glob($path . "/etc/sysconfig/network-scripts/ifcfg-eth0*") as $filename ) | |
{ | |
if( !is_safe_file($filename) ) | |
{ | |
return false; | |
} | |
} | |
foreach( glob($path . "/etc/sysconfig/network-scripts/route-eth0*") as $filename ) | |
{ | |
if( !is_safe_file($filename) ) | |
{ | |
return false; | |
} | |
} | |
if( !is_safe_file($path . "/etc/sysconfig/network") ) | |
{ | |
return false; | |
} | |
vexec("rm -rf " . $path . "/etc/sysconfig/network-scripts/ifcfg-eth0:*"); | |
if( $add_route ) | |
{ | |
vexec("rm -rf " . $path . "/etc/sysconfig/network-scripts/route-eth0:*"); | |
} | |
foreach( $ips as $k => $v ) | |
{ | |
$v["dev"] = "eth0" . (($k == 0 ? "" : ":" . ($k - 1))); | |
$v["netmask"] = (empty($v["netmask"]) ? (empty($ips[0]["netmask"]) ? "255.255.255.0" : $ips[0]["netmask"]) : $v["netmask"]); | |
$v["gateway"] = (empty($v["gateway"]) ? (empty($ips[0]["gateway"]) ? "" : $ips[0]["gateway"]) : $v["gateway"]); | |
$eth = "DEVICE=" . $v["dev"] . "\nBOOTPROTO=static\nONBOOT=yes\nIPADDR=" . $v["ip"] . "\nNETMASK=" . $v["netmask"] . "\n" . ((empty($v["gateway"]) || $k != 0 ? "" : "GATEWAY=" . $v["gateway"])) . "\n" . ((empty($v["mtu"]) ? "" : "\n" . "MTU=" . $v["mtu"])) . "\n"; | |
writefile($path . "/etc/sysconfig/network-scripts/ifcfg-" . $v["dev"], $eth, 1); | |
if( $add_route ) | |
{ | |
$route = ((empty($v["gateway"]) ? "" : $v["gateway"])) . " dev " . $v["dev"] . "\ndefault via " . ((empty($v["gateway"]) ? "" : $v["gateway"])) . " dev " . $v["dev"] . "\n"; | |
writefile($path . "/etc/sysconfig/network-scripts/route-" . $v["dev"], $route, 1); | |
} | |
} | |
if( 0 < count($ips6) ) | |
{ | |
$network = file($path . "/etc/sysconfig/network"); | |
foreach( $network as $nk => $nv ) | |
{ | |
if( preg_match("/NETWORKING_IPV6/is", $nv) ) | |
{ | |
$network[$nk] = "NETWORKING_IPV6=yes\n"; | |
} | |
} | |
writefile($path . "/etc/sysconfig/network", implode("", $network), 1); | |
$eth0 = implode("", file($path . "/etc/sysconfig/network-scripts/ifcfg-eth0")); | |
if( empty($ips) ) | |
{ | |
$eth0 = "DEVICE=eth0\nBOOTPROTO=static\nONBOOT=yes"; | |
} | |
$current = current($ips6); | |
unset($ips6[$current["ipid"]]); | |
$eth0 .= "\nIPV6INIT=yes\nIPV6ADDR=" . $current["ip"] . ((empty($current["ipr_netmask"]) ? (empty($current["netmask"]) ? "" : "/" . $current["netmask"]) : "/" . $current["ipr_netmask"])) . "\n" . ((empty($current["mtu"]) ? "" : "IPV6_MTU=" . $current["mtu"])) . "\nIPV6_DEFAULTGW=" . $current["gateway"]; | |
if( !empty($current["ipr_ips"]) && is_array($current["ipr_ips"]) ) | |
{ | |
foreach( $current["ipr_ips"] as $ipr_ip ) | |
{ | |
$_ips6[] = $ipr_ip . ((empty($current["ipr_netmask"]) ? (empty($current["netmask"]) ? "" : "/" . $current["netmask"]) : "/" . $current["ipr_netmask"])); | |
} | |
} | |
foreach( $ips6 as $k => $v ) | |
{ | |
$_ips6[] = $v["ip"] . ((empty($v["ipr_netmask"]) ? (empty($v["netmask"]) ? "" : "/" . $v["netmask"]) : "/" . $v["ipr_netmask"])); | |
if( !empty($v["ipr_ips"]) && is_array($v["ipr_ips"]) ) | |
{ | |
foreach( $v["ipr_ips"] as $ipr_ip ) | |
{ | |
$_ips6[] = $ipr_ip . ((empty($v["ipr_netmask"]) ? (empty($v["netmask"]) ? "" : "/" . $v["netmask"]) : "/" . $v["ipr_netmask"])); | |
} | |
} | |
} | |
if( 0 < count($_ips6) ) | |
{ | |
$eth0 .= "\n" . "IPV6ADDR_SECONDARIES=\"" . implode(" \\ \n", $_ips6) . "\""; | |
} | |
$eth0 .= "\n"; | |
writefile($path . "/etc/sysconfig/network-scripts/ifcfg-eth0", $eth0, 1); | |
if( $has_v6 && $add_ipv6_route || !$has_v6 && $has_v6s ) | |
{ | |
vexec("rm -rf " . $path . "/etc/sysconfig/network-scripts/route6-eth0"); | |
$route6 = ((empty($current["gateway"]) ? "" : $current["gateway"])) . " dev eth0\ndefault via " . ((empty($current["gateway"]) ? "" : $current["gateway"])) . " dev eth0\n"; | |
writefile($path . "/etc/sysconfig/network-scripts/route6-eth0", $route6, 1, 420); | |
} | |
} | |
if( !empty($ips_int) ) | |
{ | |
foreach( glob($path . "/etc/sysconfig/network-scripts/ifcfg-eth1*") as $filename ) | |
{ | |
if( !is_safe_file($filename) ) | |
{ | |
return false; | |
} | |
} | |
vexec("rm -rf " . $path . "/etc/sysconfig/network-scripts/ifcfg-eth1:*"); | |
foreach( $ips_int as $k => $v ) | |
{ | |
$v["dev"] = "eth1" . (($k == 0 ? "" : ":" . ($k - 1))); | |
$v["netmask"] = (empty($v["netmask"]) ? (empty($ips_int[0]["netmask"]) ? "255.255.255.0" : $ips_int[0]["netmask"]) : $v["netmask"]); | |
$v["gateway"] = (empty($v["gateway"]) ? (empty($ips_int[0]["gateway"]) ? "" : $ips_int[0]["gateway"]) : $v["gateway"]); | |
$eth = "DEVICE=" . $v["dev"] . "\nBOOTPROTO=static\nONBOOT=yes\nIPADDR=" . $v["ip"] . "\nNETMASK=" . $v["netmask"] . "\n" . ((empty($v["mtu"]) ? "" : "MTU=" . $v["mtu"])) . "\n"; | |
writefile($path . "/etc/sysconfig/network-scripts/ifcfg-" . $v["dev"], $eth, 1); | |
} | |
} | |
} | |
if( is_file($path . "/etc/network/interfaces") ) | |
{ | |
if( !is_safe_file($path . "/etc/network/interfaces") ) | |
{ | |
return false; | |
} | |
$eth = "# The loopback network interface\nauto lo\niface lo inet loopback\n\n# The primary network interface\n"; | |
foreach( $ips as $k => $v ) | |
{ | |
$v["dev"] = "eth0" . (($k == 0 ? "" : ":" . ($k - 1))); | |
$v["netmask"] = (empty($v["netmask"]) ? (empty($ips[0]["netmask"]) ? "255.255.255.0" : $ips[0]["netmask"]) : $v["netmask"]); | |
$v["gateway"] = (empty($v["gateway"]) ? (empty($ips[0]["gateway"]) ? "" : $ips[0]["gateway"]) : $v["gateway"]); | |
$eth .= "auto " . $v["dev"] . "\niface " . $v["dev"] . " inet static\naddress " . $v["ip"] . "\nnetmask " . $v["netmask"] . "\n" . ((empty($v["mtu"]) ? "" : "mtu " . $v["mtu"])); | |
if( empty($add_route) ) | |
{ | |
$eth .= (empty($v["gateway"]) ? "" : " \ngateway " . $v["gateway"] . "\n"); | |
} | |
else | |
{ | |
$eth .= " \nbroadcast " . $v["ip"] . "\n" . ((empty($v["gateway"]) ? "" : "post-up route add " . $v["gateway"] . " dev " . $v["dev"])) . "\n" . ((empty($v["gateway"]) ? "" : "post-up route add default gw " . $v["gateway"] . " dev " . $v["dev"])) . "\n"; | |
} | |
} | |
if( 0 < count($ips6) ) | |
{ | |
$current = current($ips6); | |
unset($ips6[$current["ipid"]]); | |
$current["dev"] = "eth0"; | |
if( empty($ips) ) | |
{ | |
$eth .= "auto " . $current["dev"] . "\n"; | |
} | |
$eth .= "iface " . $current["dev"] . " inet6 static\n\taddress " . $current["ip"] . "\n\tnetmask " . ((empty($current["ipr_netmask"]) ? (empty($current["netmask"]) ? "" : $current["netmask"]) : $current["ipr_netmask"])) . "\n" . ((empty($current["mtu"]) ? "" : "\tmtu " . $current["mtu"])) . "\n" . ((empty($current["gateway"]) || !empty($add_ipv6_route) ? "" : "\tgateway " . $current["gateway"])); | |
if( !empty($current["ipr_ips"]) && is_array($current["ipr_ips"]) ) | |
{ | |
foreach( $current["ipr_ips"] as $ipr_ip ) | |
{ | |
$eth .= "\n" . "\tup /sbin/ifconfig " . $current["dev"] . " inet6 add " . $ipr_ip . ((empty($current["ipr_netmask"]) ? (empty($current["netmask"]) ? "" : "/" . $current["netmask"]) : "/" . $current["ipr_netmask"])); | |
} | |
} | |
foreach( $ips6 as $k => $v ) | |
{ | |
$eth .= "\n" . "\tup /sbin/ifconfig " . $current["dev"] . " inet6 add " . $v["ip"] . ((empty($v["ipr_netmask"]) ? (empty($v["netmask"]) ? "" : "/" . $v["netmask"]) : "/" . $v["ipr_netmask"])); | |
if( !empty($v["ipr_ips"]) && is_array($v["ipr_ips"]) ) | |
{ | |
foreach( $v["ipr_ips"] as $ipr_ip ) | |
{ | |
$eth .= "\n" . "\tup /sbin/ifconfig " . $current["dev"] . " inet6 add " . $ipr_ip . ((empty($v["ipr_netmask"]) ? (empty($v["netmask"]) ? "" : "/" . $v["netmask"]) : "/" . $v["ipr_netmask"])); | |
} | |
} | |
} | |
if( ($has_v6 && $add_ipv6_route || !$has_v6 && $has_v6s) && !empty($current["gateway"]) ) | |
{ | |
$eth .= "\n" . "post-up /sbin/ip -r route add " . $current["gateway"] . " dev eth0\npost-up /sbin/ip -r route add default via " . $current["gateway"] . "\n"; | |
} | |
$eth .= "\n\n"; | |
} | |
if( !empty($ips_int) ) | |
{ | |
foreach( $ips_int as $k => $v ) | |
{ | |
$v["dev"] = "eth1" . (($k == 0 ? "" : ":" . ($k - 1))); | |
$v["netmask"] = (empty($v["netmask"]) ? (empty($ips_int[0]["netmask"]) ? "255.255.255.0" : $ips_int[0]["netmask"]) : $v["netmask"]); | |
$v["gateway"] = (empty($v["gateway"]) ? (empty($ips_int[0]["gateway"]) ? "" : $ips_int[0]["gateway"]) : $v["gateway"]); | |
$eth .= "\nauto " . $v["dev"] . "\niface " . $v["dev"] . " inet static\naddress " . $v["ip"] . "\n" . ((empty($v["mtu"]) ? "" : "mtu " . $v["mtu"])) . "\nnetmask " . $v["netmask"]; | |
} | |
} | |
writefile($path . "/etc/network/interfaces", $eth, 1); | |
} | |
if( is_dir($path . "/etc/sysconfig/network") ) | |
{ | |
if( !is_safe_file($path . "/etc/sysconfig/network") || !is_safe_file($path . "/etc/sysconfig/network/ifcfg-eth0") || !is_safe_file($path . "/etc/init.d/after.local") || !is_safe_file($path . "/etc/sysconfig/network/routes") ) | |
{ | |
return false; | |
} | |
$eth = "DEVICE='eth0'\nBOOTPROTO='static'\nSTARTMODE='auto'\n"; | |
foreach( $ips as $k => $v ) | |
{ | |
$v["netmask"] = (empty($v["netmask"]) ? (empty($ips[0]["netmask"]) ? "255.255.255.0" : $ips[0]["netmask"]) : $v["netmask"]); | |
if( $k == 0 ) | |
{ | |
$eth .= "IPADDR='" . $v["ip"] . "'\nNETMASK='" . $v["netmask"] . "'\n"; | |
$eth .= (empty($v["mtu"]) ? "" : "MTU='" . $v["mtu"] . "'\n"); | |
} | |
else | |
{ | |
$eth .= "IPADDR_" . ($k - 1) . "='" . $v["ip"] . "'\nNETMASK_" . ($k - 1) . "='" . $v["netmask"] . "'\nLABEL_" . ($k - 1) . "='" . ($k - 1) . "'\n"; | |
$eth .= (empty($v["mtu"]) ? "" : "MTU_" . ($k - 1) . "='" . $v["mtu"] . "'\n"); | |
} | |
} | |
if( 0 < count($ips6) ) | |
{ | |
$i = $k; | |
foreach( $ips6 as $ik => $iv ) | |
{ | |
if( empty($current) ) | |
{ | |
$current = $iv; | |
} | |
$eth .= "IPADDR_" . $i . "='" . $iv["ip"] . "'\nPREFIXLEN_" . $i . "='" . ((empty($iv["ipr_netmask"]) ? (empty($iv["netmask"]) ? "" : $iv["netmask"]) : $iv["ipr_netmask"])) . "'\nLABEL_" . $i . "='" . $i . "'\n"; | |
$eth .= (empty($iv["mtu"]) ? "" : "MTU_" . $i . "='" . $iv["mtu"] . "'\n"); | |
$i++; | |
if( !empty($iv["ipr_ips"]) && is_array($iv["ipr_ips"]) ) | |
{ | |
foreach( $iv["ipr_ips"] as $ipr_ip ) | |
{ | |
$eth .= "IPADDR_" . $i . "='" . $ipr_ip . "'\nPREFIXLEN_" . $i . "='" . ((empty($iv["ipr_netmask"]) ? (empty($iv["netmask"]) ? "" : $iv["netmask"]) : $iv["ipr_netmask"])) . "'\nLABEL_" . $i . "='" . $i . "'\n"; | |
$eth .= (empty($iv["mtu"]) ? "" : "MTU_" . $i . "='" . $iv["mtu"] . "'\n"); | |
$i++; | |
} | |
} | |
} | |
} | |
writefile($path . "/etc/sysconfig/network/ifcfg-eth0", $eth, 1); | |
$gw = ""; | |
if( !empty($ips[0]["gateway"]) ) | |
{ | |
$gw .= "default " . $ips[0]["gateway"] . " - -" . "\n"; | |
} | |
if( !empty($current["gateway"]) ) | |
{ | |
$gw .= "default " . $current["gateway"] . " - -" . "\n"; | |
} | |
writefile($path . "/etc/sysconfig/network/routes", $gw, 1); | |
if( !empty($add_route) || $has_v6 && $add_ipv6_route || !$has_v6 && $has_v6s ) | |
{ | |
$route_gw = "#!/bin/sh" . "\n"; | |
if( !empty($add_route) && !empty($ips[0]["gateway"]) ) | |
{ | |
$route_gw .= "ip route add " . $ips[0]["gateway"] . " dev eth0" . "\n"; | |
$route_gw .= "route add -net default gw " . $ips[0]["gateway"] . "\n"; | |
$suse_route_write = 1; | |
} | |
if( ($has_v6 && $add_ipv6_route || !$has_v6 && $has_v6s) && !empty($current["gateway"]) ) | |
{ | |
$route_gw .= "ip -r route add " . $current["gateway"] . " dev eth0" . "\n"; | |
$route_gw .= "ip -r route add default via " . $current["gateway"] . "\n"; | |
$suse_route_write = 1; | |
} | |
if( !empty($suse_route_write) ) | |
{ | |
writefile($path . "/etc/init.d/after.local", $route_gw, 1); | |
@chmod($path . "/etc/init.d/after.local", 493); | |
} | |
} | |
if( !empty($ips_int) && is_safe_file($path . "/etc/sysconfig/network/ifcfg-eth1") ) | |
{ | |
$eth = "DEVICE='eth1'\nBOOTPROTO='static'\nSTARTMODE='auto'\n"; | |
foreach( $ips_int as $k => $v ) | |
{ | |
$v["netmask"] = (empty($v["netmask"]) ? (empty($ips_int[0]["netmask"]) ? "255.255.255.0" : $ips_int[0]["netmask"]) : $v["netmask"]); | |
if( $k == 0 ) | |
{ | |
$eth .= "IPADDR='" . $v["ip"] . "'\nNETMASK='" . $v["netmask"] . "'\n"; | |
$eth .= (empty($v["mtu"]) ? "" : "MTU='" . $v["mtu"] . "'\n"); | |
} | |
else | |
{ | |
$eth .= "IPADDR_" . ($k - 1) . "='" . $v["ip"] . "'\nNETMASK_" . ($k - 1) . "='" . $v["netmask"] . "'\nLABEL_" . ($k - 1) . "='" . ($k - 1) . "'\n"; | |
$eth .= (empty($v["mtu"]) ? "" : "MTU_" . ($k - 1) . "='" . $v["mtu"] . "'"); | |
} | |
} | |
writefile($path . "/etc/sysconfig/network/ifcfg-eth1", $eth, 1); | |
} | |
} | |
if( is_dir($path . "/etc") ) | |
{ | |
if( !is_safe_file($path . "/etc/resolv.conf") ) | |
{ | |
return false; | |
} | |
if( !empty($dns["dns"]) ) | |
{ | |
$ns = ""; | |
foreach( $dns["dns"] as $key => $value ) | |
{ | |
$ns .= "nameserver " . $value . "\n"; | |
} | |
} | |
else | |
{ | |
$ips[0]["ns1"] = (empty($ips[0]["ns1"]) ? "4.2.2.1" : $ips[0]["ns1"]); | |
$ips[0]["ns2"] = (empty($ips[0]["ns2"]) ? "4.2.2.2" : $ips[0]["ns2"]); | |
$ns = "nameserver " . $ips[0]["ns1"] . "\nnameserver " . $ips[0]["ns2"] . "\n"; | |
if( 0 < count($ips6) || !empty($current) ) | |
{ | |
$ns .= "nameserver " . $current["ns1"] . "\nnameserver " . $current["ns2"] . "\n"; | |
} | |
} | |
writefile($path . "/etc/resolv.conf", $ns, 1); | |
} | |
if( !is_safe_file($path . "/etc/udev/rules.d/70-persistent-net.rules") ) | |
{ | |
return false; | |
} | |
if( file_exists($path . "/etc/udev/rules.d/70-persistent-net.rules") ) | |
{ | |
unlink($path . "/etc/udev/rules.d/70-persistent-net.rules"); | |
} | |
} | |
function hostname_configure($path, $host) | |
{ | |
global $globals; | |
if( empty($path) || realpath($path . "/etc") == "/etc" || realpath($path) != $path ) | |
{ | |
return false; | |
} | |
if( is_file($path . "/etc/hostname") ) | |
{ | |
if( !is_safe_file($path . "/etc/hostname") ) | |
{ | |
return false; | |
} | |
writefile($path . "/etc/hostname", $host . "\n", 1); | |
return true; | |
} | |
if( is_file($path . "/etc/sysconfig/network") ) | |
{ | |
if( !is_safe_file($path . "/etc/sysconfig/network") ) | |
{ | |
return false; | |
} | |
$file = file($path . "/etc/sysconfig/network"); | |
foreach( $file as $k => $v ) | |
{ | |
if( preg_match("/hostname(\\s*?)=(\\s*?)(.*?)/is", $v) ) | |
{ | |
$found = 1; | |
$file[$k] = "HOSTNAME=\"" . $host . "\"" . "\n"; | |
} | |
} | |
if( empty($found) ) | |
{ | |
$file[] = "HOSTNAME=\"" . $host . "\"" . "\n"; | |
} | |
writefile($path . "/etc/sysconfig/network", implode("", $file), 1); | |
return true; | |
} | |
else | |
{ | |
if( is_file($path . "/etc/HOSTNAME") ) | |
{ | |
if( !is_safe_file($path . "/etc/HOSTNAME") ) | |
{ | |
return false; | |
} | |
writefile($path . "/etc/HOSTNAME", $host . "\n", 1); | |
return true; | |
} | |
return false; | |
} | |
} | |
function valid_ipv6($ip) | |
{ | |
$pattern = "/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))\$/"; | |
if( !preg_match($pattern, $ip) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function ip6range($start, $num = 1, $till = 7, $input_mask = 0) | |
{ | |
$range = array( ); | |
$chars = "abcdef0123456789"; | |
$there = explode(":", $start); | |
for( $i = 1; $i <= $num; $i++ ) | |
{ | |
$tmp = $there; | |
if( !empty($input_mask) ) | |
{ | |
$last_key = count($tmp) - 1; | |
$rem = $input_mask % 16; | |
if( $rem != 0 ) | |
{ | |
$rem = $rem / 4; | |
for( $j = 4; $rem < $j; $j-- ) | |
{ | |
$tmp[$last_key] .= $chars[rand(0, 15)]; | |
} | |
} | |
} | |
for( $t = count($tmp); | |
$t <= $till; | |
$t++ ) | |
{ | |
$tmp[] = $chars[rand(0, 15)] . $chars[rand(0, 15)] . $chars[rand(0, 15)] . $chars[rand(0, 15)]; | |
} | |
$range[] = implode(":", $tmp); | |
} | |
if( $num == 1 ) | |
{ | |
return current($range); | |
} | |
return $range; | |
} | |
function ipv6_expand($addr) | |
{ | |
if( strpos($addr, "::") !== false ) | |
{ | |
$part = explode("::", $addr); | |
$part[0] = explode(":", $part[0]); | |
$part[1] = explode(":", $part[1]); | |
$missing = array( ); | |
for( $i = 0; $i < 8 - (count($part[0]) + count($part[1])); | |
$i++ ) | |
{ | |
array_push($missing, "0000"); | |
} | |
$missing = array_merge($part[0], $missing); | |
$part = array_merge($missing, $part[1]); | |
} | |
else | |
{ | |
$part = explode(":", $addr); | |
} | |
foreach( $part as &$p ) | |
{ | |
while( strlen($p) < 4 ) | |
{ | |
$p = "0" . $p; | |
} | |
} | |
unset($p); | |
$result = implode(":", $part); | |
if( strlen($result) == 39 ) | |
{ | |
return $result; | |
} | |
return false; | |
} | |
function sync($serid, $tables = array( )) | |
{ | |
global $globals; | |
global $servers; | |
global $servergroups; | |
global $SETTINGS; | |
$data = array( ); | |
$allowed = array( "vps" => array( ), "ips" => array( ), "ippool" => array( ), "users" => array( ), "os" => array( ), "iso" => array( ), "enduser_iso" => array( ), "console_sessions" => array( ), "ippool_servers" => array( ), "backup_servers" => array( ), "os_distros" => array( ), "haproxy" => array( ), "backup_plans" => array( ), "plans" => array( ) ); | |
$info = $allowed; | |
$info["vps"]["id"] = "vpsid"; | |
$info["ips"]["id"] = "ipid"; | |
$info["ippool"]["id"] = "ippid"; | |
$info["os"]["id"] = "osid"; | |
$info["iso"]["id"] = "uuid"; | |
$info["console_sessions"]["id"] = "vpsid"; | |
$info["os_distros"]["id"] = "distro"; | |
$info["haproxy"]["id"] = "id"; | |
$info["enduser_iso"]["id"] = "isoid"; | |
$info["backup_plans"]["id"] = "bpid"; | |
$info["backup_servers"]["id"] = "bid"; | |
$info["plans"]["id"] = "plid"; | |
$info["vps"]["serid"] = "serid"; | |
$info["ips"]["serid"] = "ip_serid"; | |
$info["ippool"]["serid"] = "ipp_serid"; | |
$info["console_sessions"]["serid"] = "serid"; | |
$info["haproxy"]["serid"] = "serid"; | |
$info["ips"]["ippid"] = "ippid"; | |
$info["ippool"]["ippid"] = "ippid"; | |
$resid = makequery("SELECT * FROM ippool_servers\n\t\t\t\t\t\tWHERE sgid = '" . $servers[$serid]["sgid"] . "'\n\t\t\t\t\t\tOR serid IN ('-1', '" . $serid . "')"); | |
$ipsid = array( ); | |
if( 1 <= vsql_num_rows($resid) ) | |
{ | |
for( $i = 0; $i < vsql_num_rows($resid); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($resid); | |
$ipsid[] = $row["ippid"]; | |
$row["sgid"] = -2; | |
$row["serid"] = 0; | |
$data["ippool_servers"][] = $row; | |
} | |
} | |
$depends["vps"][] = array( "id" => "uuid", "did" => "vps_uuid", "key" => "did", "table" => "disks" ); | |
$depends["vps"][] = array( "id" => "uid", "did" => "uid", "key" => "uid", "table" => "users" ); | |
$tables = (empty($tables) ? $allowed : $tables); | |
foreach( $tables as $k => $v ) | |
{ | |
if( $k == "ippool_servers" ) | |
{ | |
continue; | |
} | |
$where = array( ); | |
if( !empty($v) ) | |
{ | |
$where[] = "`" . $info[$k]["id"] . "` IN (" . implode(", ", $v) . ")"; | |
} | |
if( !empty($info[$k]["serid"]) ) | |
{ | |
if( $k == "ippool" || $k == "ips" ) | |
{ | |
if( !empty($ipsid) ) | |
{ | |
$where[] = "(`" . $info[$k]["ippid"] . "` IN (" . implode(",", $ipsid) . ") " . (($k == "ips" ? " OR `" . $info[$k]["serid"] . "` = '" . $serid . "'" : "")) . ")"; | |
} | |
} | |
else | |
{ | |
$where[] = "(`" . $info[$k]["serid"] . "` = '" . $serid . "' " . ((empty($info[$k]["serid_additional"]) ? "" : " OR `" . $info[$k]["serid"] . "` = '" . $info[$k]["serid_additional"] . "'")) . ")"; | |
} | |
} | |
$res = makequery("SELECT * FROM `" . $k . "`\n\t\t\t\t\t\t" . ((!empty($where) ? "WHERE " . implode(" AND ", $where) : ""))); | |
$data[$k] = array( ); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( !empty($info[$k]["serid"]) ) | |
{ | |
$row[$info[$k]["serid"]] = 0; | |
} | |
$data[$k][$row[$info[$k]["id"]]] = $row; | |
} | |
} | |
foreach( $depends as $dk => $dtables ) | |
{ | |
foreach( $dtables as $k => $v ) | |
{ | |
$where = array( ); | |
if( !empty($v["id"]) ) | |
{ | |
foreach( $data[$dk] as $x => $y ) | |
{ | |
$dids[] = $y[$v["id"]]; | |
} | |
if( !empty($dids) ) | |
{ | |
$where[] = "`" . $v["did"] . "` IN ('" . implode("', '", $dids) . "')"; | |
} | |
} | |
$res = makequery("SELECT * FROM `" . $v["table"] . "`\n\t\t\t\t\t\t\t" . ((!empty($where) ? "WHERE " . implode(" AND ", $where) : ""))); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( !empty($v["did"]) ) | |
{ | |
$data[$v["table"]][$row[$v["key"]]] = $row; | |
} | |
else | |
{ | |
$data[$v["table"]][$row[$v["did"]]] = $row; | |
} | |
} | |
} | |
} | |
if( $serid != 0 ) | |
{ | |
$master_settings = load_master_settings(); | |
$slave_data = array( ); | |
foreach( $SETTINGS as $sk => $sv ) | |
{ | |
if( preg_match("/m/", $sv) && array_key_exists($sk, $master_settings) ) | |
{ | |
$slave_data[$sk] = $master_settings[$sk]; | |
} | |
} | |
$res = makequery("SELECT vnc_ip, internal_ip, settings FROM `servers` WHERE serid = '" . $serid . "'"); | |
$tmp_data = vsql_fetch_assoc($res); | |
$data["servers"][0]["serid"] = 0; | |
$data["servers"][0]["vnc_ip"] = $tmp_data["vnc_ip"]; | |
$data["servers"][0]["internal_ip"] = $tmp_data["internal_ip"]; | |
$tmp_data = unserialize($tmp_data["settings"]); | |
if( !empty($tmp_data) ) | |
{ | |
foreach( $SETTINGS as $sk => $sv ) | |
{ | |
if( preg_match("/s/", $sv) && array_key_exists($sk, $tmp_data) ) | |
{ | |
$slave_data[$sk] = $tmp_data[$sk]; | |
} | |
} | |
} | |
$data["servers"][0]["settings"] = serialize($slave_data); | |
$resid = makequery("SELECT * FROM storage_servers\n\t\t\t\t\t\t\tWHERE sgid = '" . $servers[$serid]["sgid"] . "'\n\t\t\t\t\t\t\tOR serid IN ('-1', '" . $serid . "')"); | |
$stids = array( ); | |
$data["storage"] = array( ); | |
$data["storage_servers"] = array( ); | |
if( 1 <= vsql_num_rows($resid) ) | |
{ | |
for( $i = 0; $i < vsql_num_rows($resid); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($resid); | |
$stids[$row["stid"]] = $row["stid"]; | |
$row["sgid"] = -2; | |
$row["serid"] = 0; | |
$data["storage_servers"][] = $row; | |
} | |
$res = makequery("SELECT * FROM storage\n\t\t\t\t\t\t\t\tWHERE stid IN (" . implode(",", $stids) . ")"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$data["storage"][$row["stid"]] = $row; | |
} | |
} | |
} | |
$ret = base64_encode(gzcompress(serialize($data))); | |
return $ret; | |
} | |
function storedata($data) | |
{ | |
$r = _unserialize(gzuncompress(base64_decode($data))); | |
if( !is_array($r) || empty($r) ) | |
{ | |
return false; | |
} | |
foreach( $r as $table => $values ) | |
{ | |
if( $table == "ippool_servers" ) | |
{ | |
$res = makequery("TRUNCATE TABLE `" . $table . "`"); | |
foreach( $values as $k => $v ) | |
{ | |
$res = makequery("INSERT INTO `" . $table . "`\n\t\t\t\t\t\t\t\t\tSET `ippid` = :ippid,\n\t\t\t\t\t\t\t\t\t`serid` = :serid,\n\t\t\t\t\t\t\t\t\t`sgid` = :sgid", array( ":ippid" => $v["ippid"], ":serid" => $v["serid"], ":sgid" => $v["sgid"] )); | |
} | |
continue; | |
} | |
else | |
{ | |
if( $table == "storage" ) | |
{ | |
$res = makequery("TRUNCATE TABLE `" . $table . "`"); | |
} | |
if( $table == "iso" || $table == "enduser_iso" ) | |
{ | |
$res = makequery("TRUNCATE TABLE `" . $table . "`"); | |
} | |
if( $table == "storage_servers" ) | |
{ | |
$res = makequery("TRUNCATE TABLE `" . $table . "`"); | |
foreach( $values as $k => $v ) | |
{ | |
$res = makequery("INSERT INTO `" . $table . "`\n\t\t\t\t\t\t\t\t\tSET `stid` = " . $v["stid"] . ",\n\t\t\t\t\t\t\t\t\t`serid` = " . $v["serid"] . ",\n\t\t\t\t\t\t\t\t\t`sgid` = " . $v["sgid"] . ""); | |
} | |
continue; | |
} | |
else | |
{ | |
$res = makequery("SHOW COLUMNS FROM `" . $table . "`", array( ), true); | |
$temp = vsql_fetch_assoc($res); | |
$key = $temp["Field"]; | |
if( empty($key) ) | |
{ | |
continue; | |
} | |
foreach( $values as $k => $v ) | |
{ | |
$str = array( ); | |
foreach( $v as $col => $val ) | |
{ | |
$str[] = "`" . $col . "` = '" . addslashes($val) . "'"; | |
} | |
if( $table == "servers" ) | |
{ | |
$res = makequery("SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\""); | |
} | |
$res = makequery("INSERT INTO `" . $table . "`\n\t\t\t\t\t\t\t\tSET " . implode(", ", $str) . "\n\t\t\t\t\t\t\t\tON DUPLICATE KEY UPDATE " . implode(", ", $str), array( ), true); | |
} | |
$keys = (empty($values) ? 0 : implode("', '", array_keys($values))); | |
$res = makequery("DELETE FROM `" . $table . "`\n\t\t\t\t\t\tWHERE `" . $key . "` NOT IN ('" . $keys . "')", array( ), true); | |
} | |
} | |
} | |
return true; | |
} | |
function getos($name, $virt, $ip = "", $key = "") | |
{ | |
global $globals; | |
$ip = (empty($ip) ? $globals["masterip"] : $ip); | |
$key = (empty($key) ? $globals["key"] : $key); | |
if( empty($ip) ) | |
{ | |
return true; | |
} | |
if( 0 < @vfilesize($globals[$virt] . "/" . $name) ) | |
{ | |
return true; | |
} | |
$url = "https://" . $ip . ":4085/index.php?giveos=1&slavekey=" . rawurlencode($key) . "&os=" . rawurlencode($name) . "&osvirt=" . rawurlencode($virt); | |
mkosdir(); | |
if( file_exists("/usr/bin/wget") ) | |
{ | |
$ret = vexec("/usr/bin/wget -O \"" . $globals[$virt] . "/" . $name . "\" \"" . $url . "\" --no-check-certificate", $o); | |
$ret = (int) $ret; | |
return empty($ret); | |
} | |
return save_web_file($url, $globals[$virt] . "/" . $name); | |
} | |
function vps_status($array, $live = 1) | |
{ | |
global $user; | |
global $servers; | |
global $globals; | |
global $kernel; | |
if( empty($servers) ) | |
{ | |
if( !class_exists("cluster") ) | |
{ | |
include_once($globals["adminfiles"] . "/cluster.php"); | |
} | |
$cluster = new cluster(); | |
list_servers(); | |
} | |
else | |
{ | |
global $cluster; | |
} | |
return $cluster->vps_status($array, $live); | |
} | |
function sysctl_configure($property, $value) | |
{ | |
$sysctl = file("/etc/sysctl.conf"); | |
foreach( $sysctl as $k => $v ) | |
{ | |
$v = trim($v); | |
if( empty($v[0]) || $v[0] == "#" ) | |
{ | |
continue; | |
} | |
if( preg_match("/^" . preg_quote($property, "/") . "/is", $v) ) | |
{ | |
$sysctlline = $k; | |
} | |
} | |
if( empty($sysctlline) ) | |
{ | |
$sysctl[] = (string) $property . " = " . $value . " \n"; | |
} | |
else | |
{ | |
$sysctl[$sysctlline] = (string) $property . " = " . $value . " \n"; | |
} | |
writefile("/etc/sysctl.conf", implode("", $sysctl), 1); | |
return true; | |
} | |
function mkosdir() | |
{ | |
global $globals; | |
include_once($globals["mainfiles"] . "/functions/file_functions.php"); | |
if( !is_dir($globals["isos"]) ) | |
{ | |
@mkdir_recursive($globals["isos"], 493); | |
} | |
if( !is_dir($globals["euisos"]) ) | |
{ | |
@mkdir_recursive($globals["euisos"], 493); | |
} | |
if( !is_dir($globals["openvzos"]) ) | |
{ | |
@mkdir_recursive($globals["openvzos"], 493); | |
} | |
if( !is_dir($globals["xenos"]) ) | |
{ | |
@mkdir_recursive($globals["xenos"], 493); | |
} | |
if( !is_dir($globals["kvmos"]) ) | |
{ | |
@mkdir_recursive($globals["kvmos"], 493); | |
} | |
if( !is_dir($globals["xcpos"]) ) | |
{ | |
@mkdir_recursive($globals["xcpos"], 493); | |
} | |
if( !is_dir($globals["lxcos"]) ) | |
{ | |
@mkdir_recursive($globals["lxcos"], 493); | |
} | |
if( !is_dir($globals["proxkos"]) ) | |
{ | |
@mkdir_recursive($globals["proxkos"], 493); | |
} | |
if( !is_dir($globals["proxoos"]) ) | |
{ | |
@mkdir_recursive($globals["proxoos"], 493); | |
} | |
if( !is_dir($globals["proxlos"]) ) | |
{ | |
@mkdir_recursive($globals["proxlos"], 493); | |
} | |
if( !is_dir($globals["vzoos"]) ) | |
{ | |
@mkdir_recursive($globals["vzoos"], 493); | |
} | |
if( !is_dir($globals["vzkos"]) ) | |
{ | |
@mkdir_recursive($globals["vzkos"], 493); | |
} | |
if( !is_dir($globals["webuzo_scripts"]) ) | |
{ | |
@mkdir_recursive($globals["webuzo_scripts"], 493); | |
} | |
} | |
function random_unqnum($start, $end, $col_name, $table_name) | |
{ | |
$r = rand($start, $end); | |
$res = makequery("SELECT COUNT(" . $col_name . ") AS count FROM " . $table_name . " where " . $col_name . "='" . $r . "'"); | |
$row = vsql_fetch_assoc($res); | |
if( !empty($row["count"]) ) | |
{ | |
random_unqnum($start, $end, $col_name, $table_name); | |
} | |
return $r; | |
} | |
function ftp_upload($backup) | |
{ | |
$connection = ftp_connect($backup["ftp_backupserver"]); | |
$login = ftp_login($connection, $backup["ftp_username"], $backup["ftp_passwd"]); | |
if( !$connection || !$login ) | |
{ | |
return false; | |
} | |
$upload = ftp_put($connection, $backup["remote_filename"], $backup["filename"], FTP_BINARY); | |
if( !$upload ) | |
{ | |
return false; | |
} | |
ftp_close($connection); | |
} | |
function check_disk_space($vpsid, $space) | |
{ | |
global $globals; | |
if( !empty($vpsid) && !empty($space) ) | |
{ | |
$server_free_space = ""; | |
$req_space = (int) $space * 2; | |
$spaceret = vexec($globals["com"]["vgdisplay"] . " vg", $spaceout); | |
if( !empty($spaceout) && empty($spaceret) ) | |
{ | |
foreach( $spaceout as $s => $p ) | |
{ | |
if( preg_match("/Free PE/i", $p) ) | |
{ | |
$sp = explode("/", $p); | |
$server_free_space = (int) $sp[2]; | |
} | |
} | |
} | |
if( $req_space < $server_free_space ) | |
{ | |
return true; | |
} | |
return false; | |
} | |
} | |
function vexec($command, &$o = "", &$r = NULL) | |
{ | |
exec($command, $output, $retval); | |
if( defined("DEBUG") ) | |
{ | |
$log = "[COMMAND]: " . $command . " , [OUTPUT]: " . print_r($output, true) . ", [RETVAL]: " . $retval . "\n"; | |
$handle = fopen(logdir() . "virtualizor.log", "a"); | |
fwrite($handle, $log); | |
fclose($handle); | |
} | |
$GLOBALS["logr"][] = array( "command" => $command, "output" => $output, "return" => $retval ); | |
if( 2 <= func_num_args() ) | |
{ | |
$o = $output; | |
} | |
$r = $retval; | |
return $retval; | |
} | |
function oexec($command, &$o = "", &$r = NULL) | |
{ | |
$ret = vexec($command, $o, $r); | |
$o = implode("\n", $o); | |
return $ret; | |
} | |
function array_end(&$array) | |
{ | |
return end($array); | |
} | |
function server_load() | |
{ | |
oexec("uptime", $uptime); | |
$tmp = explode("average:", $uptime); | |
$load = explode(",", $tmp[1]); | |
foreach( $load as $k => $v ) | |
{ | |
$load[$k] = (double) trim($v); | |
} | |
return $load; | |
} | |
function calc_load($uptime) | |
{ | |
if( !preg_match("/average/is", $uptime) ) | |
{ | |
return array( ); | |
} | |
$tmp = explode("average:", $uptime); | |
$load = explode(",", $tmp[1]); | |
foreach( $load as $k => $v ) | |
{ | |
$load[$k] = (double) trim($v); | |
} | |
return $load; | |
} | |
function lvsize($lv, $units = "G") | |
{ | |
$lvsize = 0; | |
$units = (empty($units) ? "G" : $units); | |
vexec("lvdisplay -C --nosuffix --units " . strtolower($units) . " " . $lv, $o, $ret); | |
if( $ret != 0 ) | |
{ | |
return 0; | |
} | |
if( !empty($o) ) | |
{ | |
$lvtmp = preg_split("/[\\s]+/is", trim($o[1])); | |
$lvsize = (int) trim($lvtmp[3]); | |
} | |
return $lvsize; | |
} | |
function qemu_size($lv, $units = "G") | |
{ | |
$lvsize = 0; | |
$units = (empty($units) ? "G" : $units); | |
vexec("qemu-img info " . $lv, $o, $ret); | |
if( $ret != 0 ) | |
{ | |
return 0; | |
} | |
if( !empty($o) ) | |
{ | |
foreach( $o as $k => $v ) | |
{ | |
$matches = array( ); | |
if( preg_match("/virtual(\\s*)size(\\s*)\\:(\\s*)(\\d{1,5})G(\\s*)/is", $v, $matches) ) | |
{ | |
$lvsize = (int) $matches[4]; | |
} | |
if( preg_match("/virtual(\\s*)size(\\s*)\\:(\\s*)(\\d{1,5}\\.\\d{1,5})G(\\s*)/is", $v, $matches) ) | |
{ | |
$lvsize = (int) $matches[4]; | |
} | |
if( preg_match("/virtual(\\s*)size(\\s*)\\:(\\s*)(\\d{1,5})T(\\s*)/is", $v, $matches) ) | |
{ | |
$lvsize = (int) $matches[4]; | |
if( $units == "G" ) | |
{ | |
$lvsize = $lvsize * 1024; | |
} | |
} | |
if( preg_match("/virtual(\\s*)size(\\s*)\\:(\\s*)(\\d{1,5}\\.\\d{1,5})T(\\s*)/is", $v, $matches) ) | |
{ | |
$lvsize = (int) $matches[4]; | |
if( $units == "G" ) | |
{ | |
$lvsize = $lvsize * 1024; | |
} | |
} | |
} | |
} | |
return $lvsize; | |
} | |
function qemu_size_real($lv, $units = "B") | |
{ | |
$disk_size = 0; | |
$disk_size = (int) @vfilesize($lv); | |
if( $units == "K" ) | |
{ | |
$disk_size = $disk_size / 1024; | |
} | |
if( $units == "M" ) | |
{ | |
$disk_size = $disk_size / 1024 / 1024; | |
} | |
if( $units == "G" ) | |
{ | |
$disk_size = $disk_size / 1024 / 1024 / 1024; | |
} | |
return $disk_size; | |
} | |
function listmgs() | |
{ | |
$res = makequery("SELECT * FROM media_groups\n\t\t\t\t\tORDER BY `mgid` ASC"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$mgs[$row["mgid"]] = $row; | |
} | |
return $mgs; | |
} | |
function server_groups() | |
{ | |
global $globals; | |
$servergroups[0]["sgid"] = 0; | |
$servergroups[0]["sg_name"] = (!empty($globals["default_sg_name"]) ? $globals["default_sg_name"] : "Default"); | |
$servergroups[0]["sg_reseller_name"] = (!empty($globals["default_sg_reseller_name"]) ? $globals["default_sg_reseller_name"] : "Default"); | |
$servergroups[0]["sg_desc"] = (!empty($globals["default_sg_desc"]) ? $globals["default_sg_desc"] : "Default Group"); | |
$servergroups[0]["sg_select"] = 0; | |
$res = makequery("SELECT * FROM server_groups"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$row["sg_reseller_name"] = (empty($row["sg_reseller_name"]) ? $row["sg_name"] : $row["sg_reseller_name"]); | |
$servergroups[$row["sgid"]] = $row; | |
} | |
} | |
return $servergroups; | |
} | |
function updatescripts($force = 0) | |
{ | |
global $globals; | |
global $scripts; | |
$modified = @filemtime($globals["path"] . "/scripts.json"); | |
if( !empty($force) || 86400 < time() - $modified ) | |
{ | |
save_web_file("http://api.softaculous.com/_scripts.php?in=json", $globals["path"] . "/scripts.json"); | |
} | |
return true; | |
} | |
function load_scripts() | |
{ | |
global $globals; | |
global $scripts; | |
global $iscripts; | |
if( $globals["disable_webuzo"] ) | |
{ | |
return false; | |
} | |
$scripts = json_decode(file_get_contents($globals["path"] . "/scripts.json"), 1); | |
$iscripts = array( ); | |
$_scripts = $scripts; | |
$scripts = array( ); | |
foreach( $_scripts as $k => $v ) | |
{ | |
$scripts[$k]["sid"] = $k; | |
$scripts[$k]["parent"] = $v["parent"]; | |
$scripts[$k]["name"] = $v["name"]; | |
$scripts[$k]["softname"] = $v["softname"]; | |
$scripts[$k]["type"] = $v["type"]; | |
$scripts[$k]["category"] = $v["category"]; | |
if( $v["type"] != "php" || (empty($globals["noc_apikey"]) || empty($globals["noc_apipass"])) && empty($v["ins"]) ) | |
{ | |
continue; | |
} | |
$iscripts[$k] = $k; | |
} | |
} | |
function update_webuzoapps($force = 0) | |
{ | |
global $globals; | |
$modified = @filemtime($globals["path"] . "/apps.json"); | |
if( !empty($force) || 86400 < time() - $modified ) | |
{ | |
save_web_file("http://api.webuzo.com/apps.php?in=json", $globals["path"] . "/apps.json"); | |
} | |
$modified = @filemtime($globals["path"] . "/conf/default_web_apps.json"); | |
if( !empty($force) || 86400 < time() - $modified ) | |
{ | |
save_web_file("http://api.webuzo.com/apps.php?in=json&default=1", $globals["path"] . "/conf/default_web_apps.json"); | |
} | |
return true; | |
} | |
function load_webuzoapps() | |
{ | |
global $globals; | |
global $apps; | |
if( !empty($globals["disable_webuzo"]) ) | |
{ | |
return false; | |
} | |
if( !file_exists($globals["path"] . "/apps.json") ) | |
{ | |
update_webuzoapps(); | |
} | |
$apps = json_decode(file_get_contents($globals["path"] . "/apps.json"), 1); | |
$webuzo_apps = array( ); | |
$restricted_apps = array( 1, 2 ); | |
foreach( $apps as $k => $v ) | |
{ | |
if( !preg_match("/apache|php|mysql/is", $v["softname"]) ) | |
{ | |
continue; | |
} | |
if( empty($globals["noc_apikey"]) && empty($globals["noc_apipass"]) ) | |
{ | |
continue; | |
} | |
if( !empty($v["deprecated"]) ) | |
{ | |
continue; | |
} | |
if( in_array($k, $restricted_apps) ) | |
{ | |
continue; | |
} | |
$webuzo_apps[$v["group_type"]][$k]["fullname"] = $apps[$k]["fullname"]; | |
$webuzo_apps[$v["group_type"]][$k]["softname"] = $apps[$k]["softname"]; | |
$webuzo_apps[$v["group_type"]][$k]["version"] = $apps[$k]["version"]; | |
} | |
return $webuzo_apps; | |
} | |
function load_free_webapps() | |
{ | |
global $globals; | |
$webuzo_apps = load_webuzoapps(); | |
$stack = json_decode(read_file($globals["path"] . "/conf/default_web_apps.json"), 1); | |
foreach( $stack as $sk => $sv ) | |
{ | |
$free_apps[$sv][$sk] = $webuzo_apps[$sv][$sk]; | |
} | |
return $free_apps; | |
} | |
function prepare_webuzo($options) | |
{ | |
global $globals; | |
global $scripts; | |
global $iscripts; | |
if( empty($options["webuzo"]) || empty($options["license"]) || empty($options["ip"]) ) | |
{ | |
return false; | |
} | |
return get_web_file("http://" . $options["ip"] . ":2004/install.php?prepareinstall=" . $options["webuzo"] . "&license=" . $options["license"]); | |
} | |
function prepare_webuzoapps($options) | |
{ | |
global $globals; | |
global $error; | |
$apps = array( ); | |
if( empty($options) || empty($options["primary_ip"]) || empty($options["data"]) ) | |
{ | |
return false; | |
} | |
if( !empty($options["isfree"]) ) | |
{ | |
$stack = load_free_webapps(); | |
foreach( $stack as $sk => $sv ) | |
{ | |
$apps[] = $stack[$sk][$sv]["softname"]; | |
} | |
} | |
else | |
{ | |
if( empty($options["applist"]["webserver"]) || empty($options["applist"]["mysql"]) || empty($options["applist"]["php"]) ) | |
{ | |
$error[] = "No Application List found"; | |
return false; | |
} | |
$apps[] = implode(",", $options["applist"]); | |
$apps[] = implode(",", array( "exim", "bind" )); | |
} | |
$params = implode(",", $apps); | |
$ret = get_web_file("http://" . $options["primary_ip"] . ":2004/install.php?prepareapps=" . $params . "&license=" . $options["lic"]); | |
if( !$ret ) | |
{ | |
return false; | |
} | |
if( !empty($options["script"]) ) | |
{ | |
$url = "http://" . $options["primary_ip"] . ":2004/install.php?prepareinstall=" . $options["script"]; | |
$ret = get_web_file($url . "&license=" . $options["lic"]); | |
if( !$ret ) | |
{ | |
return false; | |
} | |
} | |
$params = ""; | |
foreach( $options["data"] as $k => $v ) | |
{ | |
if( !empty($v) ) | |
{ | |
$params[] = $k . "=" . $v; | |
} | |
} | |
$params = implode("&", $params); | |
$ret = vexec("curl --data \"" . $params . "&submit=1&api=serialize\" http://" . $options["primary_ip"] . ":2004/install.php", $output, $ret); | |
$output = unserialize($output[0]); | |
if( $ret != 0 ) | |
{ | |
return false; | |
} | |
if( !empty($output["error"]) ) | |
{ | |
$error[] = $output["error"][0]; | |
return false; | |
} | |
return true; | |
} | |
function is_internalip($ip) | |
{ | |
return (preg_match("/^10\\.(.*?)|^192\\.168\\.(.*?)/s", $ip) ? true : false); | |
} | |
function save_web_scripts($data) | |
{ | |
global $globals; | |
if( !writefile($globals["path"] . "/conf/web_scripts.json", json_encode($data), 1) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function get_web_scripts() | |
{ | |
global $globals; | |
return (array) json_decode(read_file($globals["path"] . "/conf/web_scripts.json")); | |
} | |
function is_validNOC($noc_apikey, $noc_apipass) | |
{ | |
global $globals; | |
if( empty($noc_apikey) || empty($noc_apipass) ) | |
{ | |
return false; | |
} | |
if( !class_exists("SOFT_NOC") ) | |
{ | |
include_once($globals["path"] . "/sdk/" . "noc_api.inc"); | |
} | |
$obj = new SOFT_NOC($noc_apikey, $noc_apipass, "", 1); | |
$response = $obj->licenses("", "", "", 0, 1, ""); | |
if( empty($response) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function get_webuzo_license($ip = 0, $email = 0, &$isfree, $buy = 0) | |
{ | |
global $globals; | |
global $error; | |
$lic = "WEBUZO-42117-76793-20955-49158"; | |
if( empty($ip) || empty($email) ) | |
{ | |
return false; | |
} | |
$isvalid = is_validnoc($globals["noc_apikey"], $globals["noc_apipass"]); | |
if( empty($isvalid) ) | |
{ | |
$isfree = 1; | |
return $lic; | |
} | |
$isinternal = is_internalip($ip); | |
if( !empty($isinternal) ) | |
{ | |
return $lic; | |
} | |
if( empty($buy) ) | |
{ | |
return NULL; | |
} | |
if( !class_exists("SOFT_NOC") ) | |
{ | |
include_once($globals["path"] . "/sdk/noc_api.inc"); | |
} | |
$noc = new SOFT_NOC($globals["noc_apikey"], $globals["noc_apipass"], "", 1); | |
$licenses = (array) $noc->webuzo_licenses("", $ip); | |
$ret = current($licenses["licenses"]); | |
$lic = $ret["license"]; | |
if( empty($lic) ) | |
{ | |
$ret = $noc->webuzo_buy($ip, "1M", 2, $email, 1); | |
if( empty($ret) || !empty($noc->error) ) | |
{ | |
$error[] = $noc->error; | |
return NULL; | |
} | |
$lic = $ret["license"]; | |
} | |
return $lic; | |
} | |
function webuzo_os($virt, $hvm = "") | |
{ | |
global $globals; | |
global $ostemplates; | |
if( empty($virt) ) | |
{ | |
return false; | |
} | |
if( empty($ostemplates) ) | |
{ | |
oslist(); | |
} | |
$webuzo_os = array( ); | |
foreach( $ostemplates as $k => $v ) | |
{ | |
if( $v["distro"] != "webuzo" ) | |
{ | |
continue; | |
} | |
if( !preg_match("/" . $virt . "/is", $v["Nvirt"]) ) | |
{ | |
continue; | |
} | |
$webuzo_os[$k] = $v; | |
} | |
return $webuzo_os; | |
} | |
function ping_webuzo_vps($ip) | |
{ | |
$active = false; | |
oexec("curl \"http://" . $ip . ":2004/install.php\"", $output, $ret); | |
if( $ret != 0 ) | |
{ | |
return $active; | |
} | |
if( preg_match("/\\<\\!DOCTYPE/", $output) ) | |
{ | |
$active = true; | |
} | |
return $active; | |
} | |
function get_script_req($sid) | |
{ | |
global $globals; | |
global $tmp_req; | |
if( empty($sid) ) | |
{ | |
return false; | |
} | |
if( !is_dir($globals["webuzo_scripts"]) ) | |
{ | |
mkdir_recursive($globals["webuzo_scripts"], 493); | |
} | |
if( !is_dir($globals["webuzo_scripts"] . "/" . $sid) ) | |
{ | |
mkdir_recursive($globals["webuzo_scripts"] . "/" . $sid, 493); | |
} | |
if( !file_exists($globals["webuzo_scripts"] . "/" . $sid . "/info.xml") ) | |
{ | |
$zip_path = $globals["webuzo_scripts"] . "/" . $sid . "/" . $sid . ".zip"; | |
$res = save_web_file("http://api.softaculous.com/givesoft.php?softid=" . $sid . "&sp=1&license=WEBUZO-42067-82998-91612-49497&panel=webuzo", $zip_path); | |
if( !$res ) | |
{ | |
return false; | |
} | |
rmdir_recursive($globals["webuzo_scripts"] . "/" . $sid . "/tmp/"); | |
if( !unzip($zip_path, $globals["webuzo_scripts"] . "/" . $sid . "/tmp/", 1, array( ), array( ), 1) ) | |
{ | |
return false; | |
} | |
if( !copy($globals["webuzo_scripts"] . "/" . $sid . "/tmp/info.xml", $globals["webuzo_scripts"] . "/" . $sid . "/info.xml") ) | |
{ | |
return false; | |
} | |
if( is_safe_file($zip_path) ) | |
{ | |
@unlink($zip_path); | |
} | |
rmdir_recursive($globals["webuzo_scripts"] . "/" . $sid . "/tmp/"); | |
} | |
$tmp_req = array( ); | |
$tmp_info = @implode("", @file($globals["webuzo_scripts"] . "/" . $sid . "/info.xml")); | |
$tmp_info = preg_replace_callback("/<requirement(.*?)>(.*?)<\\/requirement>/is", "replace_callback", $tmp_info); | |
$tmp_info = preg_replace_callback("/<requirement(.*?)\\/>/is", "replace_callback", $tmp_info); | |
$requirements = $tmp_req; | |
$req = array( ); | |
foreach( $requirements as $k => $v ) | |
{ | |
soft_preg_replace("/check=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["check"], 2); | |
soft_preg_replace("/type=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["type"], 2); | |
soft_preg_replace("/operator=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["operator"], 2); | |
soft_preg_replace("/<\\!\\[CDATA\\[(\\s*?)(.*?)(\\s*?)\\]\\]>/is", $v, $req[$k]["grep"], 2); | |
soft_preg_replace("/name=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["name"], 2); | |
soft_preg_replace("/value=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["value"], 2); | |
soft_preg_replace("/version=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["version"], 2); | |
soft_preg_replace("/err=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["err"], 2); | |
soft_preg_replace("/function=(\"|')(.*?)(\"|')(\\s*?)/is", $v, $req[$k]["function"], 2); | |
if( !empty($req[$k]["value"]) && empty($req[$k]["version"]) ) | |
{ | |
$req[$k]["version"] = $req[$k]["value"]; | |
} | |
} | |
return $req; | |
} | |
function soft_preg_replace($pattern, $file, &$var, $valuenum, $stripslashes = "") | |
{ | |
preg_match($pattern, $file, $matches); | |
if( empty($stripslashes) ) | |
{ | |
$var = @trim($matches[$valuenum]); | |
} | |
else | |
{ | |
$var = @stripslashes(@trim($matches[$valuenum])); | |
} | |
} | |
function replace_callback($matches) | |
{ | |
global $tmp_req; | |
$tmp_req[] = $matches[0]; | |
return true; | |
} | |
function list_all_storages() | |
{ | |
global $globals; | |
global $servers; | |
global $storages; | |
$res = makequery("SELECT * FROM `storage`"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$storages[$row["stid"]] = $row; | |
} | |
if( count($storages) < 1 ) | |
{ | |
return false; | |
} | |
$res = makequery("SELECT * FROM `storage_servers`"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( -1 < $row["sgid"] ) | |
{ | |
$storages[$row["stid"]]["server_groups"][$row["sgid"]] = $row["sgid"]; | |
} | |
if( -2 < $row["serid"] ) | |
{ | |
$storages[$row["stid"]]["servers"][$row["serid"]] = $row["serid"]; | |
} | |
} | |
} | |
function list_storages() | |
{ | |
global $globals; | |
global $servers; | |
global $storages; | |
global $cluster; | |
$storages = array( ); | |
$res = makequery("SELECT * FROM `storage_servers`\n\t\t\t\t\tWHERE sgid = '" . $servers[$globals["server"]]["sgid"] . "'\n\t\t\t\t\tOR serid IN ('-1', '" . $globals["server"] . "')"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$storages[$row["stid"]] = $row; | |
} | |
if( count($storages) < 1 ) | |
{ | |
$storages[0]["stid"] = 0; | |
$storages[0]["name"] = "Default Storage" . ((!empty($globals["slave"]) ? " " . $globals["slave"] : "")); | |
$storages[0]["path"] = (!empty($globals["disk_path"]) ? $globals["disk_path"] : (!empty($globals["thin_lv"]) ? "/dev/" . $globals["lv"] . "/" . $globals["thin_lv"] : "/dev/" . $globals["lv"])); | |
$storages[0]["type"] = (!empty($globals["disk_path"]) ? "file" : (!empty($globals["thin_lv"]) ? "thin block" : "block")); | |
$storages[0]["format"] = ""; | |
$storages[0]["primary_storage"] = 1; | |
if( $cluster->virt(0, 0, 0, 0, 0, 0, 0, 1) ) | |
{ | |
$storages[0]["name"] = "local"; | |
$storages[0]["path"] = "/var/lib/vz"; | |
$storages[0]["type"] = "file"; | |
$storages[0]["format"] = "raw"; | |
} | |
else | |
{ | |
if( $cluster->virt(1) ) | |
{ | |
$storages[0]["path"] = "/vz"; | |
$storages[0]["type"] = "openvz"; | |
} | |
else | |
{ | |
if( empty($globals["disk_path"]) && empty($globals["lv"]) && empty($globals["thin_lv"]) ) | |
{ | |
unset($storages[0]); | |
} | |
} | |
} | |
return true; | |
} | |
$res = makequery("SELECT * FROM `storage`\n\t\t\t\t\tWHERE stid IN (" . implode(", ", array_keys($storages)) . ")\n\t\t\t\t\tORDER BY primary_storage DESC"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$storages[$row["stid"]] = $row; | |
} | |
foreach( $storages as $k => $v ) | |
{ | |
if( preg_match("/block/is", $v["type"]) && empty($v["format"]) ) | |
{ | |
$storages[$k]["format"] = "raw"; | |
} | |
if( preg_match("/file/is", $v["type"]) && empty($v["format"]) ) | |
{ | |
$storages[$k]["format"] = "qcow2"; | |
} | |
} | |
} | |
function list_servers() | |
{ | |
global $globals; | |
global $servers; | |
global $servers_keypass; | |
global $A; | |
global $storages; | |
$serids = array( ); | |
$serids[0] = array( ); | |
$res = makequery("SELECT * FROM `servers` \n\t\t\t\t\t" . ((empty($globals["slave"]) ? "" : "WHERE serid = 0")) . "\n\t\t\t\t\tORDER BY serid ASC"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$serids[$row["serid"]] = $row; | |
if( empty($row["serid"]) ) | |
{ | |
$localhost = 1; | |
} | |
} | |
$serids[0]["serid"] = 0; | |
$serids[0]["server_name"] = (empty($globals["master_name"]) ? "localhost" : $globals["master_name"]); | |
$serids[0]["virt"] = $globals["kernel"]; | |
$serids[0]["ip"] = "127.0.0.1"; | |
$serids[0]["key"] = $globals["key"]; | |
$serids[0]["pass"] = $globals["pass"]; | |
$serids[0]["lv"] = $globals["lv"]; | |
$serids[0]["overcommit"] = $globals["overcommit"]; | |
if( empty($localhost) ) | |
{ | |
if( preg_match("/xen/is", $globals["kernel"]) ) | |
{ | |
vexec("/usr/sbin/xm info | grep hvm", $ishvm); | |
} | |
else | |
{ | |
if( preg_match("/xcp/is", $globals["kernel"]) ) | |
{ | |
vexec("/usr/sbin/xl info | grep hvm", $ishvm); | |
} | |
} | |
if( !empty($ishvm) && 0 < count($ishvm) ) | |
{ | |
$serids[0]["hvm"] = 1; | |
} | |
$res = makequery("SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\""); | |
$res = makequery("INSERT INTO servers\n\t\t\t\t\tSET serid = 0,\n\t\t\t\t\tserver_name = :server_name,\n\t\t\t\t\tvirt = :virt,\n\t\t\t\t\tip = :ip,\n\t\t\t\t\tlv = :lv,\n\t\t\t\t\thvm = :hvm\n\t\t\t\t\tON DUPLICATE KEY UPDATE\n\t\t\t\t\t\tserid = 0,\n\t\t\t\t\t\tserver_name = :server_name,\n\t\t\t\t\t\tvirt = :virt,\n\t\t\t\t\t\tip = :ip,\n\t\t\t\t\t\tlv = :lv,\n\t\t\t\t\t\thvm = :hvm", array( ":server_name" => $serids[0]["server_name"], ":virt" => $serids[0]["virt"], ":ip" => $serids[0]["ip"], ":lv" => $serids[0]["lv"], ":hvm" => (empty($serids[0]["hvm"]) ? 0 : 1) )); | |
} | |
$res = makequery("SELECT serid, COUNT(vpsid) AS numvps, SUM(ram) AS alloc_ram, SUM(space) AS alloc_space, \n\t\t\t\t\tSUM(cpu) AS alloc_cpu, SUM(cpu_percent) AS alloc_cpu_percent, SUM(bandwidth) AS alloc_bandwidth\n\t\t\t\t\tFROM `vps`\n\t\t\t\t\tGROUP BY serid"); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$serids[$row["serid"]]["numvps"] = $row["numvps"]; | |
$serids[$row["serid"]]["alloc_ram"] = $row["alloc_ram"]; | |
$serids[$row["serid"]]["alloc_space"] = $row["alloc_space"]; | |
$serids[$row["serid"]]["alloc_cpu"] = $row["alloc_cpu"]; | |
$serids[$row["serid"]]["alloc_cpu_percent"] = $row["alloc_cpu_percent"]; | |
$serids[$row["serid"]]["alloc_bandwidth"] = $row["alloc_bandwidth"]; | |
} | |
foreach( $serids as $k => $v ) | |
{ | |
$servers_keypass[$k]["key"] = $v["key"]; | |
$servers_keypass[$k]["pass"] = $v["pass"]; | |
$serids[$k]["virts"] = explode(" ", $v["virt"]); | |
unset($serids[$k]["key"]); | |
unset($serids[$k]["pass"]); | |
} | |
$servers = $serids; | |
if( empty($storages) ) | |
{ | |
list_storages(); | |
} | |
} | |
function set_active_server($serid) | |
{ | |
global $globals; | |
global $servers; | |
global $servers_keypass; | |
global $A; | |
global $storages; | |
$globals["server"] = $serid; | |
list_storages(); | |
} | |
function server_virt($serid, $virt) | |
{ | |
global $globals; | |
global $servers; | |
$server_virt = $globals["kernel"]; | |
if( 0 < $serid ) | |
{ | |
$server_virt = $servers[$serid]["virt"]; | |
} | |
if( preg_match("/" . $virt . "/is", $server_virt) ) | |
{ | |
return $virt; | |
} | |
return false; | |
} | |
function server_os_arch($serid) | |
{ | |
global $globals; | |
global $servers; | |
$server_arch = $servers[$serid]["os_arch"]; | |
return (preg_match("/amd64|x86\\_64/is", $server_arch) ? 64 : 32); | |
} | |
function server_hostname($serid) | |
{ | |
global $globals; | |
global $servers; | |
$hostname = $servers[$serid]["server_name"]; | |
if( $serid == 0 ) | |
{ | |
$tmp = $_SERVER["HTTP_HOST"]; | |
if( 0 < substr_count($tmp, ":") ) | |
{ | |
$tmp = explode(":", $tmp); | |
$hostname = $tmp[0]; | |
} | |
else | |
{ | |
$hostname = $tmp; | |
} | |
} | |
return $hostname; | |
} | |
function server_publicip($serid) | |
{ | |
global $globals; | |
global $servers; | |
$ip = $servers[$serid]["ip"]; | |
if( $serid == 0 ) | |
{ | |
$ip = $globals["primary_ip"]; | |
} | |
return $ip; | |
} | |
function server_vncip($serid) | |
{ | |
global $globals; | |
global $servers; | |
$ip = $servers[$serid]["vnc_ip"]; | |
if( empty($ip) ) | |
{ | |
$ip = server_publicip($serid); | |
} | |
return $ip; | |
} | |
function server_primary_virt($serid) | |
{ | |
global $globals; | |
global $servers; | |
$server_virt = $globals["kernel"]; | |
if( 0 < $serid ) | |
{ | |
$server_virt = $servers[$serid]["virt"]; | |
} | |
$virts = explode(" ", $server_virt); | |
if( preg_match("/proxk/is", $server_virt) ) | |
{ | |
return "proxk"; | |
} | |
if( preg_match("/vzk/is", $server_virt) ) | |
{ | |
return "vzk"; | |
} | |
if( preg_match("/kvm/is", $server_virt) ) | |
{ | |
return "kvm"; | |
} | |
return $virts[0]; | |
} | |
function server_update_location($serid) | |
{ | |
global $globals; | |
global $servers; | |
$server = $servers[$serid]; | |
$ser_addr = $server["ip"]; | |
if( empty($server["serid"]) ) | |
{ | |
$ser_addr = $globals["primary_ip"]; | |
} | |
$location_data = get_map_data($ser_addr); | |
if( !json_decode($location_data) ) | |
{ | |
return false; | |
} | |
if( !empty($location_data) ) | |
{ | |
$res = makequery("UPDATE servers \n\t\t\t\t\t\tSET location = '" . $location_data . "'\n\t\t\t\t\t\tWHERE serid = '" . $serid . "'"); | |
} | |
return $location_data; | |
} | |
function numvs($serid) | |
{ | |
global $servers; | |
if( empty($servers[$serid]["licnumvs"]) ) | |
{ | |
return true; | |
} | |
$qres = makequery("SELECT *\tFROM `vps`\n\t\t\t\t\t\tWHERE serid = " . $serid); | |
if( $servers[$serid]["licnumvs"] <= vsql_num_rows($qres) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function load_cluster() | |
{ | |
global $globals; | |
global $servers; | |
global $cluster; | |
if( !class_exists("cluster") ) | |
{ | |
include_once($globals["adminfiles"] . "/cluster.php"); | |
} | |
$cluster = new cluster(); | |
} | |
function get_next_serial($curr_serial, $today = "") | |
{ | |
if( $today == "" ) | |
{ | |
$today = date("Ymd"); | |
} | |
$revision = (int) substr($curr_serial, -2); | |
$ser_date = substr($curr_serial, 0, 8); | |
if( $curr_serial == "0" ) | |
{ | |
$serial = $curr_serial; | |
} | |
else | |
{ | |
if( $curr_serial == $today . "99" ) | |
{ | |
$serial = get_next_date($today) . "00"; | |
} | |
else | |
{ | |
if( strcmp($today, $ser_date) === 0 ) | |
{ | |
$revision = $revision + 1; | |
} | |
else | |
{ | |
if( strncmp($today, $curr_serial, 8) === -1 ) | |
{ | |
$today = substr($curr_serial, 0, 8); | |
if( $revision == 99 ) | |
{ | |
$today = get_next_date($today); | |
$revision = "00"; | |
} | |
else | |
{ | |
$revision = $revision + 1; | |
} | |
} | |
else | |
{ | |
$revision = "00"; | |
} | |
} | |
$serial = $today . str_pad($revision, 2, "0", STR_PAD_LEFT); | |
} | |
} | |
return $serial; | |
} | |
function set_soa_serial($soa_rec, $serial) | |
{ | |
$soa = explode(" ", $soa_rec); | |
if( 5 < count($soa) ) | |
{ | |
$soa[2] = $serial; | |
} | |
else | |
{ | |
$soa[0] = $serial; | |
} | |
$soa_rec = join(" ", $soa); | |
chop($soa_rec); | |
return $soa_rec; | |
} | |
function update_soa_serial($domain_id, $con) | |
{ | |
$res = mysql_query("SELECT content FROM records WHERE type = 'SOA' AND domain_id = " . $domain_id, $con); | |
if( mysql_num_rows($res) < 1 ) | |
{ | |
return false; | |
} | |
$soa_rec = mysql_fetch_assoc($res); | |
$temp_curr_serial = explode(" ", $soa_rec["content"]); | |
if( 5 < count($temp_curr_serial) ) | |
{ | |
$curr_serial = $temp_curr_serial[2]; | |
} | |
else | |
{ | |
$curr_serial = $temp_curr_serial[0]; | |
} | |
$new_serial = get_next_serial($curr_serial); | |
if( $curr_serial != $new_serial ) | |
{ | |
$soa_record = set_soa_serial($soa_rec["content"], $new_serial); | |
return mysql_query("UPDATE records SET content='" . $soa_record . "' WHERE domain_id = " . $domain_id . " AND type = 'SOA'", $con); | |
} | |
return true; | |
} | |
function get_next_date($curr_date) | |
{ | |
$next_date = date("Ymd", strtotime("+1 day", strtotime($curr_date))); | |
return $next_date; | |
} | |
function is_valid_domain_name($domain_name) | |
{ | |
$pieces = explode(".", $domain_name); | |
foreach( $pieces as $piece ) | |
{ | |
if( !preg_match("/^[a-z\\d-_][a-z\\d-_]{0,62}\$/i", $piece) || preg_match("/-\$/", $piece) ) | |
{ | |
return false; | |
} | |
} | |
return true; | |
} | |
function connect_to_remote_mysql($hostname, $username, $password, $dbname, $ssl = 0) | |
{ | |
if( !empty($ssl) ) | |
{ | |
$con = mysql_connect($hostname, $username, $password, MYSQL_CLIENT_SSL); | |
} | |
else | |
{ | |
$con = mysql_connect($hostname, $username, $password); | |
} | |
if( !mysql_select_db($dbname, $con) ) | |
{ | |
return false; | |
} | |
return $con; | |
} | |
function get_dns_server($pdnsid) | |
{ | |
if( empty($pdnsid) ) | |
{ | |
return false; | |
} | |
$res = makequery("SELECT * FROM pdns WHERE id = " . $pdnsid); | |
$pdns = vsql_fetch_assoc($res); | |
if( !empty($pdns["encrypt_sql_pass"]) ) | |
{ | |
$pdns["sql_password"] = pass_decrypt($pdns["sql_password"], $pdns["salt"]); | |
} | |
return $pdns; | |
} | |
function rdns_ip($ip, &$zone) | |
{ | |
if( !valid_ip($ip) && !valid_ipv6($ip) ) | |
{ | |
return false; | |
} | |
if( valid_ipv6($ip) ) | |
{ | |
$ip = ipv6_expand($ip); | |
$rzone = $r_zone = explode(":", $ip); | |
$r_zone = implode("", $r_zone); | |
$r_zone = strrev($r_zone); | |
$r_zone = str_split($r_zone); | |
$domainIP = implode(".", $r_zone); | |
unset($rzone[6]); | |
unset($rzone[7]); | |
$rzone = implode("", $rzone); | |
$rzone = strrev($rzone); | |
$rzone = str_split($rzone); | |
$rzone_ip = implode(".", $rzone); | |
$zone_extension = ".ip6.arpa"; | |
$rnds_entry = $domainIP . $zone_extension; | |
} | |
if( valid_ip($ip) ) | |
{ | |
$rzone = explode(".", $ip); | |
$rdomain = $rzone = array_reverse($rzone); | |
$popped = array_shift($rzone); | |
$rzone_ip = implode(".", $rzone); | |
$zone_extension = ".in-addr.arpa"; | |
$rnds_entry = implode(".", $rdomain) . $zone_extension; | |
} | |
$zone = $rzone_ip . $zone_extension; | |
return $rnds_entry; | |
} | |
function rdns_name($name) | |
{ | |
$name = explode(".", $name); | |
$len = count($name); | |
if( $name[$len - 2] == "in-addr" ) | |
{ | |
unset($name[$len - 2]); | |
unset($name[$len - 1]); | |
$rnds_ip = implode(".", array_reverse($name)); | |
} | |
else | |
{ | |
if( $name[$len - 2] == "ip6" ) | |
{ | |
unset($name[$len - 2]); | |
unset($name[$len - 1]); | |
$name = implode("", $name); | |
$name = strrev($name); | |
$ipes = str_split($name, 4); | |
$rnds_ip = implode(":", $ipes); | |
if( strlen($rnds_ip) != 39 ) | |
{ | |
return false; | |
} | |
} | |
} | |
return $rnds_ip; | |
} | |
function connect_ftp($hostname, $username, $password, $port) | |
{ | |
$ftp_con = ftp_connect($hostname, $port, 24 * 60 * 60); | |
$login_res = ftp_login($ftp_con, $username, $password); | |
if( !$ftp_con || !$login_res ) | |
{ | |
return false; | |
} | |
ftp_pasv($ftp_con, true); | |
return $ftp_con; | |
} | |
function get_ssh_backup_list($connection, $dir, $selected_date = 0) | |
{ | |
$sftp = ssh2_sftp($connection); | |
$directory = scandir("ssh2.sftp://" . intval($sftp) . $dir . "/", 1); | |
foreach( $directory as $k => $folder ) | |
{ | |
if( $folder != ".." && $folder != "." && strlen($folder) == 8 && strtotime($folder) <= time() && 0 < strtotime($folder) ) | |
{ | |
$temp_date = (int) substr($folder, 6, 2); | |
$temp_mon = (int) substr($folder, 4, 2); | |
$temp_yr = (int) substr($folder, 0, 4); | |
if( 0 < $temp_date && $temp_date < 32 && 0 < $temp_mon && $temp_mon < 13 && 2010 <= $temp_yr ) | |
{ | |
$back_folder_list[$folder] = array( ); | |
} | |
} | |
} | |
if( empty($selected_date) || !isset($back_folder_list[$selected_date]) ) | |
{ | |
$dates = array_keys($back_folder_list); | |
$selected_date = max($dates); | |
if( empty($selected_date) ) | |
{ | |
return array( ); | |
} | |
} | |
$folder_to_fetch = $dir . "/" . $selected_date; | |
$temp_backups = scandir("ssh2.sftp://" . intval($sftp) . $folder_to_fetch . "", 1); | |
$backups = array( ); | |
foreach( $temp_backups as $k => $file ) | |
{ | |
$back_file_list[$file] = array( ); | |
$temp_file = explode("/", $file); | |
$name = $temp_file[count($temp_file) - 1]; | |
if( preg_match("/(.*?)\\.((img\\.gz)|(tar\\.gz)|(vma\\.gz)|(img)|(vma)|(tar))\$/is", $name) ) | |
{ | |
$statinfo = ssh2_sftp_stat($sftp, $folder_to_fetch . "/" . $name); | |
$size = $statinfo["size"]; | |
$backups[] = array( "abs_path" => $folder_to_fetch . "/" . $file, "size" => $size ); | |
} | |
} | |
$back_folder_list[$selected_date] = $backups; | |
return $back_folder_list; | |
} | |
function get_backups_list($ftp_con, $dir, $selected_date = 0) | |
{ | |
if( !empty($ftp_con) ) | |
{ | |
$folderlist = _ftp_nlist($ftp_con, $dir); | |
$folder_to_fetch = ""; | |
foreach( $folderlist as $k => $folder ) | |
{ | |
$temp = explode("/", $folder); | |
$folder_name = $temp[count($temp) - 1]; | |
if( strlen($folder_name) == 8 && strtotime($folder_name) <= time() && 0 < strtotime($folder_name) ) | |
{ | |
$temp_date = (int) substr($folder_name, 6, 2); | |
$temp_mon = (int) substr($folder_name, 4, 2); | |
$temp_yr = (int) substr($folder_name, 0, 4); | |
if( 0 < $temp_date && $temp_date < 32 && 0 < $temp_mon && $temp_mon < 13 && 2010 <= $temp_yr ) | |
{ | |
$backup_folders_list[$folder_name] = array( ); | |
} | |
} | |
} | |
if( empty($selected_date) || !isset($backup_folders_list[$selected_date]) ) | |
{ | |
$dates = array_keys($backup_folders_list); | |
$selected_date = max($dates); | |
if( empty($selected_date) ) | |
{ | |
return array( ); | |
} | |
} | |
$folder_to_fetch = $dir . "/" . $selected_date; | |
$backups = array( ); | |
$temp_backups = _ftp_nlist($ftp_con, $folder_to_fetch); | |
foreach( $temp_backups as $k => $file ) | |
{ | |
$temp_file = explode("/", $file); | |
$name = $temp_file[count($temp_file) - 1]; | |
if( !preg_match("/(\\w+.inf)/", $name, $matches) ) | |
{ | |
ftp_size($ftp_con, $file); | |
$resp = ftp_raw($ftp_con, "size " . $file); | |
$size = implode("", $resp); | |
$size = explode(" ", $size); | |
$size = $size[count($size) - 1]; | |
$backups[] = array( "abs_path" => $file, "size" => $size ); | |
} | |
} | |
$backup_folders_list[$selected_date] = $backups; | |
} | |
else | |
{ | |
$folderlist = filelist($dir, 0); | |
$folder_to_fetch = ""; | |
foreach( $folderlist as $folder => $folderinfo ) | |
{ | |
if( strlen($folderinfo["name"]) == 8 && strtotime($folderinfo["name"]) <= time() && 0 < strtotime($folderinfo["name"]) ) | |
{ | |
$temp_date = (int) substr($folderinfo["name"], 6, 2); | |
$temp_mon = (int) substr($folderinfo["name"], 4, 2); | |
$temp_yr = (int) substr($folderinfo["name"], 0, 4); | |
if( 0 < $temp_date && $temp_date < 32 && 0 < $temp_mon && $temp_mon < 13 && 2010 <= $temp_yr ) | |
{ | |
$backup_folders_list[$folderinfo["name"]] = array( ); | |
} | |
} | |
} | |
if( empty($selected_date) || !isset($backup_folders_list[$selected_date]) ) | |
{ | |
$dates = array_keys($backup_folders_list); | |
$selected_date = max($dates); | |
if( empty($selected_date) ) | |
{ | |
return array( ); | |
} | |
} | |
$folder_to_fetch = $dir . "/" . $selected_date; | |
$backups = array( ); | |
$t_backups = filelist($folder_to_fetch, 0); | |
foreach( $t_backups as $backup => $backupinfo ) | |
{ | |
$file_parts = pathinfo($backup); | |
if( $file_parts["extension"] != "inf" && $file_parts["extension"] != "log" ) | |
{ | |
$size = vfilesize($backup); | |
$backups[] = array( "abs_path" => $backup, "size" => $size ); | |
} | |
} | |
$backup_folders_list[$selected_date] = $backups; | |
} | |
return $backup_folders_list; | |
} | |
function create_backup_folders($ftp_con, $start_dir, $rotation) | |
{ | |
global $error; | |
global $l; | |
$date = @datify(@time(), 0, 1, "Ymd"); | |
$result = @ftp_chdir($ftp_con, $start_dir); | |
if( !$result && !ftp_mkdir($ftp_con, $start_dir) ) | |
{ | |
$error[] = $l["err_create_backup_folder"]; | |
return false; | |
} | |
$folderlist = _ftp_nlist($ftp_con, $start_dir); | |
$folders = array( ); | |
foreach( $folderlist as $k => $folderinfo ) | |
{ | |
if( $folderinfo == $start_dir . "/" . $date ) | |
{ | |
continue; | |
} | |
$bfolder = substr($folderinfo, -8, 8); | |
if( strtotime($bfolder) <= time() && 0 < strtotime($bfolder) ) | |
{ | |
$temp_date = (int) substr($bfolder, 6, 2); | |
$temp_mon = (int) substr($bfolder, 4, 2); | |
$temp_yr = (int) substr($bfolder, 0, 4); | |
if( 0 < $temp_date && $temp_date < 32 && 0 < $temp_mon && $temp_mon < 13 && 2010 <= $temp_yr ) | |
{ | |
$folders[] = $bfolder; | |
} | |
} | |
} | |
log_output("FTP Folders : "); | |
log_output($folders); | |
$num_backups = count($folders); | |
$folders_to_delete = array( ); | |
if( $num_backups == $rotation ) | |
{ | |
$folders_to_delete = array( min($folders) ); | |
} | |
else | |
{ | |
if( $rotation < $num_backups ) | |
{ | |
$folder_delete_count = $num_backups - $rotation; | |
$folder_delete_count++; | |
$folders_to_delete = array( ); | |
for( $i = 0; $i < $folder_delete_count; $i++ ) | |
{ | |
$folders_to_delete[] = min($folders); | |
$folders = array_diff($folders, $folders_to_delete); | |
} | |
} | |
} | |
log_output("Folders to Delete : "); | |
log_output($folders_to_delete); | |
if( !empty($folders_to_delete) ) | |
{ | |
foreach( $folders_to_delete as $k => $v ) | |
{ | |
$files = _ftp_nlist($ftp_con, $v); | |
foreach( $files as $file ) | |
{ | |
ftp_delete($ftp_con, $file); | |
} | |
if( !ftp_rmdir($ftp_con, $v) ) | |
{ | |
return false; | |
} | |
} | |
} | |
$result = @ftp_chdir($ftp_con, $start_dir . "/" . $date); | |
if( !$result && !ftp_mkdir($ftp_con, $start_dir . "/" . $date) ) | |
{ | |
$error[] = $l["err_create_backup_date_folder_folder"]; | |
return false; | |
} | |
return $start_dir . "/" . $date; | |
} | |
function create_backup_folders2($ftp_con, $start_dir, $vpsid, $rotation = 0, $date = "") | |
{ | |
global $error; | |
global $l; | |
if( empty($date) ) | |
{ | |
$date = @datify(@time(), 0, 1, "Ymd"); | |
} | |
$result = _ftp_nlist($ftp_con, $start_dir); | |
if( $result === false && !ftp_mkdir($ftp_con, $start_dir) ) | |
{ | |
$error[] = $l["err_create_backup_folder"]; | |
return false; | |
} | |
if( $rotation != 0 ) | |
{ | |
echo lang_vars_name($l["log_deleting_backups"], array( "rotation" => $rotation )) . "\n"; | |
$folders = _ftp_nlist($ftp_con, $start_dir); | |
rsort($folders); | |
$vps = getvps($vpsid); | |
$extensions = get_backup_extensions($vps["virt"]); | |
foreach( $folders as $folder ) | |
{ | |
$folder = basename($folder); | |
if( $folder == $date ) | |
{ | |
continue; | |
} | |
if( !is_valid_backup_folder($folder) ) | |
{ | |
continue; | |
} | |
$files = _ftp_nlist($ftp_con, $start_dir . "/" . $folder); | |
if( empty($files) ) | |
{ | |
if( ftp_rmdir($ftp_con, $start_dir . "/" . $folder) ) | |
{ | |
echo lang_vars_name($l["log_deleted_folder"], array( "folder" => $start_dir . "/" . $folder )) . "\n"; | |
} | |
continue; | |
} | |
foreach( $files as $file ) | |
{ | |
$filename = basename($file); | |
$parts = explode(".", $filename, 2); | |
if( preg_match("/^" . $vpsid . "(_\\d+)?\$/is", $parts[0]) && in_array($parts[1], $extensions) ) | |
{ | |
if( 1 < $rotation ) | |
{ | |
$rotation--; | |
continue 2; | |
} | |
if( ftp_delete($ftp_con, $file) ) | |
{ | |
echo lang_vars_name($l["log_deleted_file"], array( "file" => $file )) . "\n"; | |
} | |
} | |
} | |
if( ftp_delete($ftp_con, $start_dir . "/" . $folder . "/" . $vpsid . ".inf") ) | |
{ | |
echo lang_vars_name($l["log_deleted_file"], array( "file" => $start_dir . "/" . $folder . "/" . $vpsid . ".inf" )) . "\n"; | |
} | |
$files = _ftp_nlist($ftp_con, $start_dir . "/" . $folder); | |
if( empty($files) && ftp_rmdir($ftp_con, $start_dir . "/" . $folder) ) | |
{ | |
echo lang_vars_name($l["log_deleted_folder"], array( "folder" => $start_dir . "/" . $folder )) . "\n"; | |
} | |
} | |
echo $l["log_finished_deleting_backups"] . "\n"; | |
} | |
$result = _ftp_nlist($ftp_con, $start_dir . "/" . $date); | |
if( $result === false && !ftp_mkdir($ftp_con, $start_dir . "/" . $date) ) | |
{ | |
$error[] = $l["err_create_backup_date_folder"]; | |
return false; | |
} | |
return $start_dir . "/" . $date; | |
} | |
function create_ssh_backup_folders2($connection, $start_dir, $vpsid, $rotation = 0, $date = "") | |
{ | |
global $error; | |
global $l; | |
if( substr($start_dir, 0, 1) != "/" ) | |
{ | |
$error[] = $l["err_backup_dir_not_absolute"]; | |
return false; | |
} | |
$sftp = ssh2_sftp($connection); | |
if( empty($date) ) | |
{ | |
$date = @datify(@time(), 0, 1, "Ymd"); | |
} | |
$result = file_exists("ssh2.sftp://" . intval($sftp) . "/" . $start_dir); | |
if( !$result && !ssh2_sftp_mkdir($sftp, $start_dir) ) | |
{ | |
$error[] = $l["err_create_backup_folder"]; | |
return false; | |
} | |
if( $rotation != 0 ) | |
{ | |
echo lang_vars_name($l["log_deleting_backups"], array( "rotation" => $rotation )) . "\n"; | |
$folders = scandir("ssh2.sftp://" . intval($sftp) . $start_dir); | |
rsort($folders); | |
$vps = getvps($vpsid); | |
$extensions = get_backup_extensions($vps["virt"]); | |
foreach( $folders as $folder ) | |
{ | |
if( $folder == $date ) | |
{ | |
continue; | |
} | |
if( !is_valid_backup_folder($folder) ) | |
{ | |
continue; | |
} | |
$files = scandir("ssh2.sftp://" . intval($sftp) . $start_dir . "/" . $folder); | |
if( count($files) <= 2 ) | |
{ | |
if( ssh2_sftp_rmdir($sftp, $start_dir . "/" . $folder) ) | |
{ | |
echo lang_vars_name($l["log_deleted_folder"], array( "folder" => $start_dir . "/" . $folder )) . "\n"; | |
} | |
continue; | |
} | |
foreach( $files as $file ) | |
{ | |
$parts = explode(".", $file, 2); | |
if( preg_match("/^" . $vpsid . "(_\\d+)?\$/is", $parts[0]) && in_array($parts[1], $extensions) ) | |
{ | |
if( 1 < $rotation ) | |
{ | |
$rotation--; | |
continue 2; | |
} | |
if( ssh2_sftp_unlink($sftp, $start_dir . "/" . $folder . "/" . $file) ) | |
{ | |
echo lang_vars_name($l["log_deleted_file"], array( "file" => $file )) . "\n"; | |
} | |
} | |
} | |
if( ssh2_sftp_unlink($sftp, $start_dir . "/" . $folder . "/" . $vpsid . ".inf") ) | |
{ | |
echo lang_vars_name($l["log_deleted_file"], array( "file" => $file . ".inf" )) . "\n"; | |
} | |
$files = scandir("ssh2.sftp://" . intval($sftp) . $start_dir . "/" . $folder); | |
if( count($files) <= 2 && ssh2_sftp_rmdir($sftp, $start_dir . "/" . $folder) ) | |
{ | |
echo lang_vars_name($l["log_deleted_folder"], array( "folder" => $start_dir . "/" . $folder )) . "\n"; | |
} | |
} | |
echo $l["log_finished_deleting_backups"] . "\n"; | |
} | |
$result = file_exists("ssh2.sftp://" . intval($sftp) . (string) $start_dir . "/" . $date); | |
if( !$result && !ssh2_sftp_mkdir($sftp, $start_dir . "/" . $date) ) | |
{ | |
$error[] = $l["err_create_backup_date_folder"]; | |
return false; | |
} | |
return $start_dir . "/" . $date; | |
} | |
function create_local_backup_folders($start_dir, $rotation = 0) | |
{ | |
global $error; | |
global $l; | |
$date = @datify(@time(), 0, 1, "Ymd"); | |
$result = @chdir($start_dir); | |
if( !$result && !mkdir($start_dir) ) | |
{ | |
$error[] = $l["err_create_backup_folder"]; | |
return false; | |
} | |
$folderlist = scandir($start_dir); | |
$folderlist = array_diff($folderlist, array( ".", ".." )); | |
$folders = array( ); | |
foreach( $folderlist as $k => $folderinfo ) | |
{ | |
if( $folderinfo == $date ) | |
{ | |
continue; | |
} | |
if( strlen($folderinfo) == 8 && strtotime($folderinfo) <= time() && 0 < strtotime($folderinfo) ) | |
{ | |
$temp_date = (int) substr($folderinfo, 6, 2); | |
$temp_mon = (int) substr($folderinfo, 4, 2); | |
$temp_yr = (int) substr($folderinfo, 0, 4); | |
if( 0 < $temp_date && $temp_date < 32 && 0 < $temp_mon && $temp_mon < 13 && 2010 <= $temp_yr ) | |
{ | |
$folders[] = $folderinfo; | |
} | |
} | |
} | |
log_output("Local Backup Folders : "); | |
log_output($folders); | |
$num_backups = count($folders); | |
$folders_to_delete = array( ); | |
if( $num_backups == $rotation ) | |
{ | |
$folders_to_delete = array( min($folders) ); | |
} | |
else | |
{ | |
if( $rotation < $num_backups ) | |
{ | |
$folder_delete_count = $num_backups - $rotation; | |
$folder_delete_count++; | |
$folders_to_delete = array( ); | |
for( $i = 0; $i < $folder_delete_count; $i++ ) | |
{ | |
$folders_to_delete[] = min($folders); | |
$folders = array_diff($folders, $folders_to_delete); | |
} | |
} | |
} | |
log_output("Folders to Delete : "); | |
log_output($folders_to_delete); | |
if( !empty($folders_to_delete) ) | |
{ | |
foreach( $folders_to_delete as $k => $v ) | |
{ | |
$files = scandir($start_dir . "/" . $v); | |
$files = array_diff($files, array( ".", ".." )); | |
foreach( $files as $file ) | |
{ | |
@unlink($start_dir . "/" . $v . "/" . $file); | |
} | |
if( !rmdir($start_dir . "/" . $v) ) | |
{ | |
return false; | |
} | |
} | |
} | |
$result = @chdir($start_dir . "/" . $date); | |
if( !$result && !mkdir($start_dir . "/" . $date) ) | |
{ | |
$error[] = $l["err_create_backup_date_folder_folder"]; | |
return false; | |
} | |
return $start_dir . "/" . $date; | |
} | |
function create_local_backup_folders2($start_dir, $vpsid, $rotation = 0, $date = "") | |
{ | |
global $error; | |
global $l; | |
if( substr($start_dir, 0, 1) != "/" ) | |
{ | |
$error[] = $l["err_backup_dir_not_absolute"]; | |
return false; | |
} | |
if( empty($date) ) | |
{ | |
$date = @datify(@time(), 0, 1, "Ymd"); | |
} | |
$result = is_dir($start_dir); | |
if( !$result && !mkdir($start_dir) ) | |
{ | |
$error[] = $l["err_create_backup_folder"]; | |
return false; | |
} | |
if( $rotation != 0 ) | |
{ | |
echo lang_vars_name($l["log_deleting_backups"], array( "rotation" => $rotation )) . "\n"; | |
$folders = scandir($start_dir); | |
rsort($folders); | |
$vps = getvps($vpsid); | |
$extensions = get_backup_extensions($vps["virt"]); | |
foreach( $folders as $folder ) | |
{ | |
if( $folder == $date ) | |
{ | |
continue; | |
} | |
if( !is_valid_backup_folder($folder) ) | |
{ | |
continue; | |
} | |
$files = scandir($start_dir . "/" . $folder); | |
if( count($files) <= 2 ) | |
{ | |
if( @rmdir($start_dir . "/" . $folder) ) | |
{ | |
echo lang_vars_name($l["log_deleted_folder"], array( "folder" => $start_dir . "/" . $folder )) . "\n"; | |
} | |
continue; | |
} | |
foreach( $files as $file ) | |
{ | |
$parts = explode(".", $file, 2); | |
if( preg_match("/^" . $vpsid . "(_\\d+)?\$/is", $parts[0]) && in_array($parts[1], $extensions) ) | |
{ | |
if( 1 < $rotation ) | |
{ | |
$rotation--; | |
continue 2; | |
} | |
if( @unlink($start_dir . "/" . $folder . "/" . $file) ) | |
{ | |
echo lang_vars_name($l["log_deleted_file"], array( "file" => $file )) . "\n"; | |
} | |
} | |
} | |
if( @unlink($start_dir . "/" . $folder . "/" . $vpsid . ".inf") ) | |
{ | |
echo lang_vars_name($l["log_deleted_file"], array( "file" => $start_dir . "/" . $folder . "/" . $vpsid . ".inf" )) . "\n"; | |
} | |
$files = scandir($start_dir . "/" . $folder); | |
if( count($files) <= 2 && rmdir($start_dir . "/" . $folder) ) | |
{ | |
echo lang_vars_name($l["log_deleted_folder"], array( "folder" => $start_dir . "/" . $folder )) . "\n"; | |
} | |
} | |
echo $l["log_finished_deleting_backups"] . "\n"; | |
} | |
$result = is_dir($start_dir . "/" . $date); | |
if( !$result && !mkdir($start_dir . "/" . $date) ) | |
{ | |
$error[] = $l["err_create_backup_date_folder"]; | |
return false; | |
} | |
return $start_dir . "/" . $date; | |
} | |
function _ftp_nlist($ftp_con, $dir) | |
{ | |
$pwd = ftp_pwd($ftp_con); | |
if( !@ftp_chdir($ftp_con, $dir) ) | |
{ | |
return false; | |
} | |
$_list = ftp_nlist($ftp_con, "."); | |
if( empty($_list) ) | |
{ | |
$_list = ftp_nlist($ftp_con, ""); | |
} | |
if( !@ftp_chdir($ftp_con, $pwd) ) | |
{ | |
return false; | |
} | |
$list = array( ); | |
foreach( $_list as $k => $v ) | |
{ | |
if( $v == "." || $v == ".." ) | |
{ | |
continue; | |
} | |
$v = ltrim($v, "./"); | |
$list[] = $dir . "/" . $v; | |
} | |
return $list; | |
} | |
function snapsize($size) | |
{ | |
return (25 < $size ? 25 : $size); | |
} | |
function log_output($msg) | |
{ | |
$handle = fopen(logdir() . "virtualizor-backups.log", "a"); | |
if( is_array($msg) ) | |
{ | |
foreach( $msg as $k => $m ) | |
{ | |
$log = "[" . datify(time(), 0, 1, "D M d H:i:s Y") . "] " . $m . "\n"; | |
fwrite($handle, $log); | |
} | |
} | |
else | |
{ | |
$log = "[" . datify(time(), 0, 1, "D M d H:i:s Y") . "] " . $msg . "\n"; | |
fwrite($handle, $log); | |
} | |
fclose($handle); | |
} | |
function xmlstring2array($string) | |
{ | |
$xml = simplexml_load_string($string, "SimpleXMLElement", LIBXML_NOCDATA); | |
$array = json_decode(json_encode($xml), true); | |
return $array; | |
} | |
function array2json($arr) | |
{ | |
if( function_exists("json_encode") ) | |
{ | |
return json_encode($arr); | |
} | |
$parts = array( ); | |
$is_list = false; | |
$keys = array_keys($arr); | |
$max_length = count($arr) - 1; | |
if( $keys[0] == 0 && $keys[$max_length] == $max_length ) | |
{ | |
$is_list = true; | |
for( $i = 0; $i < count($keys); | |
$i++ ) | |
{ | |
if( $i != $keys[$i] ) | |
{ | |
$is_list = false; | |
break; | |
} | |
} | |
} | |
foreach( $arr as $key => $value ) | |
{ | |
if( is_array($value) ) | |
{ | |
if( $is_list ) | |
{ | |
$parts[] = array2json($value); | |
} | |
else | |
{ | |
$parts[] = "\"" . $key . "\":" . array2json($value); | |
} | |
} | |
else | |
{ | |
$str = ""; | |
if( !$is_list ) | |
{ | |
$str = "\"" . $key . "\":"; | |
} | |
if( is_numeric($value) ) | |
{ | |
$str .= $value; | |
} | |
else | |
{ | |
if( $value === false ) | |
{ | |
$str .= "false"; | |
} | |
else | |
{ | |
if( $value === true ) | |
{ | |
$str .= "true"; | |
} | |
else | |
{ | |
$str .= "\"" . addslashes($value) . "\""; | |
} | |
} | |
} | |
$parts[] = $str; | |
} | |
} | |
$json = implode(",", $parts); | |
if( $is_list ) | |
{ | |
return "[" . $json . "]"; | |
} | |
return "{" . $json . "}"; | |
} | |
function vlog() | |
{ | |
if( empty($GLOBALS["vlogfile"]) ) | |
{ | |
return false; | |
} | |
$handle = fopen($GLOBALS["vlogfile"], "a"); | |
$args = func_get_args(); | |
foreach( $args as $k => $v ) | |
{ | |
$log = ""; | |
if( is_array($v) ) | |
{ | |
$log = "[" . strftime("%a %b %e %H:%M:%S %Y") . "] Array : \n"; | |
$log .= var_export($v, 1); | |
$log .= "\n"; | |
fwrite($handle, $log); | |
} | |
else | |
{ | |
$log = "[" . strftime("%a %b %e %H:%M:%S %Y") . "] " . $v . " \n"; | |
fwrite($handle, $log); | |
} | |
echo $log; | |
} | |
fclose($handle); | |
} | |
function create_temp_storage($stid, $lv, $type, $vpsid, $disable_compression) | |
{ | |
global $globals; | |
global $error; | |
global $l; | |
global $storages; | |
$storage = $storages[$stid]; | |
if( empty($storage) ) | |
{ | |
$error[] = "create_temp_storage() : Storage not found"; | |
return false; | |
} | |
if( empty($vpsid) ) | |
{ | |
$error[] = "create_temp_storage() : No VPS IDs"; | |
return false; | |
} | |
$tmp_lv = trim(cleanpath($lv)); | |
if( empty($lv) || $tmp_lv == "/" || empty($tmp_lv) ) | |
{ | |
$error[] = "create_temp_storage() : LV empty"; | |
return false; | |
} | |
$disks = get_vps_DISKS($vpsid); | |
$max_space = 0; | |
$vps = getvps($vpsid); | |
foreach( $disks as $disk ) | |
{ | |
if( preg_match("/" . $vps["vps_name"] . "swap/is", $disk["path"]) || !empty($disk["size_unit"]) && $disk["size_unit"] != "G" ) | |
{ | |
continue; | |
} | |
$size = $disk["size"]; | |
if( $max_space < $size ) | |
{ | |
$max_space = $size; | |
} | |
} | |
$temp_storage_dir = ""; | |
$lv_size = (empty($disable_compression) ? $max_space * 1024 + 512 : ceil($max_space * 1024 * 1.1)); | |
if( preg_match("/block/is", $storage["type"]) ) | |
{ | |
if( preg_match("/zfs/is", $storage["type"]) ) | |
{ | |
$lvm_path = $storage["path"]; | |
$ret_lv = vexec("zfs create -V " . $lv_size . "M " . basename($lvm_path) . "/" . $lv); | |
sleep(3); | |
} | |
else | |
{ | |
if( preg_match("/thin/is", $storage["type"]) ) | |
{ | |
$lvm_path = $storage["path"]; | |
$ret_lv = vexec($globals["com"]["lvcreate"] . " -V" . $lv_size . "M -n " . $lv . " -T " . $lvm_path); | |
$lvm_path = dirname($lvm_path); | |
} | |
else | |
{ | |
$lvm_path = $storage["path"]; | |
$ret_lv = vexec($globals["com"]["lvcreate"] . " -L " . $lv_size . "M -n " . $lv . " " . $lvm_path); | |
} | |
} | |
if( $ret_lv != 0 ) | |
{ | |
$error[] = $l["backups_err_lvm"]; | |
return false; | |
} | |
$ret_mkfs = vexec("/sbin/mkfs -t ext3 " . $lvm_path . "/" . $lv); | |
if( $ret_mkfs != 0 ) | |
{ | |
$error[] = $l["backup_err_mkfs"]; | |
return false; | |
} | |
$ret_fsck = vexec("/sbin/e2fsck -f -y " . $lvm_path . "/" . $lv); | |
$temp_storage_dir = "/var/virtualizor/" . $lv; | |
if( !file_exists($temp_storage_dir) ) | |
{ | |
$ret_mkdir = vexec("/bin/mkdir " . $temp_storage_dir); | |
} | |
$ret_mount = vexec("/bin/mount " . $lvm_path . "/" . $lv . " " . $temp_storage_dir); | |
if( $ret_mount != 0 ) | |
{ | |
$error[] = $l["backup_err_mount"]; | |
return false; | |
} | |
} | |
if( preg_match("/file/is", $storage["type"]) ) | |
{ | |
$temp_storage_dir = $storage["path"] . "/" . $lv; | |
@mkdir($temp_storage_dir, 493); | |
} | |
return $temp_storage_dir; | |
} | |
function cleanup_temp_storage($stid, $lv, $type, $virt, $vpsid) | |
{ | |
global $globals; | |
global $error; | |
global $storages; | |
if( in_array($virt, array( "openvz", "vzo", "vzk" )) ) | |
{ | |
vexec("/bin/rm -rf /vz/dump/" . $vpsid . ".*"); | |
return true; | |
} | |
$storage = $storages[$stid]; | |
if( empty($storage) ) | |
{ | |
$error[] = "cleanup_temp_storage() : Storage not found"; | |
return false; | |
} | |
$tmp_lv = trim(cleanpath($lv)); | |
if( empty($lv) || $tmp_lv == "/" || empty($tmp_lv) ) | |
{ | |
$error[] = "cleanup_temp_storage() : LV empty"; | |
return false; | |
} | |
if( preg_match("/block/is", $storage["type"]) ) | |
{ | |
$temp_dir = "/var/virtualizor/" . $lv; | |
vexec("/bin/umount " . $temp_dir); | |
if( preg_match("/zfs/is", $storage["type"]) ) | |
{ | |
vexec("zfs destroy -R " . basename($storage["path"]) . "/" . $lv); | |
sleep(3); | |
} | |
else | |
{ | |
if( preg_match("/thin/is", $storage["type"]) ) | |
{ | |
vexec($globals["com"]["lvremove"] . " -f " . dirname($storage["path"]) . "/" . $lv); | |
} | |
else | |
{ | |
vexec($globals["com"]["lvremove"] . " -f " . $storage["path"] . "/" . $lv); | |
} | |
} | |
} | |
if( preg_match("/file/is", $storage["type"]) ) | |
{ | |
$temp_dir = $storage["path"] . "/" . $lv; | |
if( cleanpath($storage["path"]) == cleanpath($temp_dir) ) | |
{ | |
$error[] = "cleanup_temp_storage() : Storage Path equal to TEMPORARY PATH to delete !"; | |
return false; | |
} | |
} | |
vexec("/bin/rm -rf " . $temp_dir); | |
return true; | |
} | |
function is_allowed($act) | |
{ | |
global $user; | |
$action = "act_" . $act; | |
if( $user["uid"] == 0 ) | |
{ | |
return true; | |
} | |
if( empty($user[$action]) && !empty($user["aclid"]) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function hooks($hook) | |
{ | |
global $globals; | |
$hookpath = $globals["path"] . "/hooks/" . $hook . ".php"; | |
if( file_exists($hookpath) ) | |
{ | |
include_once($hookpath); | |
$args = func_get_args(); | |
unset($args[0]); | |
$final_args = array( ); | |
foreach( $args as $k => $v ) | |
{ | |
$final_args[] = $v; | |
} | |
return call_user_func_array("__" . $hook, $final_args); | |
} | |
else | |
{ | |
return false; | |
} | |
} | |
function distro_check($centos5 = 0, $centos6 = 0, $ubuntu = 0, $xcp = 0, $centos7 = 0) | |
{ | |
if( file_exists("/etc/redhat-release") ) | |
{ | |
$release = file_get_contents("/etc/redhat-release"); | |
if( preg_match("/xenserver/is", $release) ) | |
{ | |
if( !empty($centos5) && preg_match("/release 5/is", $release) ) | |
{ | |
return $centos5; | |
} | |
if( !empty($centos6) && preg_match("/release 6/is", $release) ) | |
{ | |
return $centos6; | |
} | |
if( !empty($centos7) && preg_match("/release 7/is", $release) ) | |
{ | |
return $centos7; | |
} | |
return $xcp; | |
} | |
if( preg_match("/release 5/is", $release) ) | |
{ | |
return $centos5; | |
} | |
if( preg_match("/release 6/is", $release) ) | |
{ | |
return $centos6; | |
} | |
if( preg_match("/release 7/is", $release) ) | |
{ | |
return $centos7; | |
} | |
} | |
else | |
{ | |
if( file_exists("/etc/debian_version") ) | |
{ | |
return $ubuntu; | |
} | |
} | |
} | |
function distro_name() | |
{ | |
if( file_exists("/etc/redhat-release") ) | |
{ | |
return trim(file_get_contents("/etc/redhat-release")); | |
} | |
if( file_exists("/etc/debian_version") ) | |
{ | |
oexec("lsb_release -d | cut -f2", $o, $ret); | |
if( $ret == 0 ) | |
{ | |
return trim($o); | |
} | |
return "Ubuntu"; | |
} | |
return "otheros"; | |
} | |
function vfilesize($file) | |
{ | |
if( empty($file) ) | |
{ | |
return false; | |
} | |
if( PHP_INT_SIZE >= 8 ) | |
{ | |
return filesize($file); | |
} | |
vexec("stat -c%s \"" . $file . "\"", $output); | |
return trim($output[0]); | |
} | |
function vm_disk_path($vps) | |
{ | |
global $globals; | |
if( !empty($vps["disks"][0]) ) | |
{ | |
return $vps["disks"][0]["path"]; | |
} | |
return "/dev/" . $globals["lv"] . "/vs" . $vps["vps_name"]; | |
} | |
function vps_disk_struct() | |
{ | |
$ret["primary"] = 0; | |
$ret["path"] = ""; | |
$ret["st_uuid"] = ""; | |
$ret["type"] = "block"; | |
$ret["size"] = 0; | |
$ret["size_unit"] = ""; | |
$ret["vpsid"] = 0; | |
$ret["rescue"] = 0; | |
$ret["target_name"] = ""; | |
$ret["format"] = ""; | |
$ret["disk_uuid"] = ""; | |
return $ret; | |
} | |
function vpsdisk_db_struct() | |
{ | |
$r["did"] = ""; | |
$r["disk_uuid"] = ""; | |
$r["st_uuid"] = ""; | |
$r["vps_uuid"] = ""; | |
$r["path"] = ""; | |
$r["primary"] = ""; | |
$r["size"] = ""; | |
$r["size_unit"] = ""; | |
$r["type"] = ""; | |
$r["format"] = ""; | |
$r["num"] = ""; | |
$r["rescue"] = ""; | |
$r["extra"] = ""; | |
return $r; | |
} | |
function get_vps_DISKS($vpsid) | |
{ | |
global $globals; | |
global $servers; | |
global $kernel; | |
$vps = getvps($vpsid); | |
if( empty($vps) ) | |
{ | |
return ""; | |
} | |
if( empty($servers) ) | |
{ | |
list_servers(); | |
} | |
$vps["virt"] = (empty($vps["virt"]) ? $servers[$vps["serid"]]["virt"] : $vps["virt"]); | |
$disks = $vps["disks"]; | |
if( empty($vps["disks"]) ) | |
{ | |
$disks[0]["primary"] = 1; | |
$disks[0]["path"] = "/dev/" . $globals["lv"] . "/vs" . $vps["vps_name"]; | |
$disks[0]["st_uuid"] = ""; | |
$disks[0]["type"] = ((!empty($globals["thin_lv"]) ? "thin " : "")) . "block"; | |
$disks[0]["size"] = $vps["space"]; | |
$disks[0]["vpsid"] = $vpsid; | |
if( $vps["virt"] == "xen" && empty($vps["hvm"]) && 0 < $vps["swap"] ) | |
{ | |
$disks[1]["primary"] = 0; | |
$disks[1]["path"] = "/dev/" . $globals["lv"] . "/vs" . $vps["vps_name"] . "swap"; | |
$disks[1]["st_uuid"] = ""; | |
$disks[1]["type"] = ((!empty($globals["thin_lv"]) ? "thin " : "")) . "block"; | |
$disks[1]["size"] = $vps["swap"]; | |
$disks[1]["size_unit"] = "M"; | |
$disks[1]["vpsid"] = $vpsid; | |
} | |
} | |
if( !empty($vps["rescue"]) ) | |
{ | |
$disks[-1]["primary"] = 1; | |
$disks[-1]["rescue"] = 1; | |
$disks[-1]["path"] = $disks[0]["path"] . "-rescue"; | |
$disks[-1]["st_uuid"] = $disks[0]["st_uuid"]; | |
$disks[-1]["type"] = $disks[0]["type"]; | |
$disks[-1]["format"] = $disks[0]["format"]; | |
$disks[-1]["size"] = 1; | |
$disks[-1]["vpsid"] = $vpsid; | |
$disks[0]["primary"] = 0; | |
if( $kernel->conf($vpsid, "get_vps_rescue_DISKS") ) | |
{ | |
$disks = $kernel->get_vps_rescue_DISKS($vpsid, $disks); | |
} | |
} | |
foreach( $disks as $k => $v ) | |
{ | |
$disks[$k]["vpsid"] = $vpsid; | |
if( preg_match("/file/is", $v["type"]) ) | |
{ | |
$disks[$k]["format"] = (empty($v["format"]) ? "qcow2" : $v["format"]); | |
} | |
$disks[$k]["key"] = $k; | |
} | |
if( $kernel->conf($vpsid, "get_vps_DISKS") ) | |
{ | |
$disks = $kernel->get_vps_DISKS($vpsid, $disks); | |
} | |
return $disks; | |
} | |
function get_vps_disk($vpsid, $storage = "", $disk_num = 0) | |
{ | |
$vps = getvps($vpsid); | |
if( empty($vps) ) | |
{ | |
return ""; | |
} | |
$disks = get_vps_disks($vpsid); | |
if( empty($storage) ) | |
{ | |
if( !empty($disk_num) ) | |
{ | |
$DISK = $disks[$disk_num]; | |
$KEY = $disk_num; | |
} | |
else | |
{ | |
foreach( $disks as $k => $v ) | |
{ | |
if( !empty($v["primary"]) ) | |
{ | |
$DISK = $v; | |
$KEY = $k; | |
} | |
} | |
} | |
} | |
else | |
{ | |
foreach( $disks as $k => $v ) | |
{ | |
if( !empty($v["path"]) && $v["path"] == $storage ) | |
{ | |
$DISK = $v; | |
$KEY = $k; | |
} | |
} | |
} | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
$DISK["mount_point"] = "/home/" . $vps["vps_name"] . "/" . $KEY; | |
$DISK["key"] = $KEY; | |
return $DISK; | |
} | |
function update_vps_disks($serid, $stid, $resources, $vpsIDs = array( )) | |
{ | |
return false; | |
} | |
function vpsdisk_info($vpsid, $storage = "") | |
{ | |
$DISK = get_vps_disk($vpsid, $storage); | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
return diskinfo($DISK["path"]); | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
return file_diskinfo($DISK["path"]); | |
} | |
} | |
function get_diskinfo($DISK) | |
{ | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
return diskinfo($DISK["path"]); | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
return file_diskinfo($DISK["path"]); | |
} | |
} | |
function vpsdisk_size($DISK) | |
{ | |
if( empty($DISK) ) | |
{ | |
return -1; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = basename(dirname($DISK["path"])) . "/" . basename($DISK["path"]); | |
vexec("zfs get -p referenced " . $disk_path . " -o value", $o, $ret); | |
$disk_size = (int) $o[1]; | |
if( empty($DISK["size_unit"]) || $DISK["size_unit"] == "G" ) | |
{ | |
$init = $disk_size / 1024 / 1024 / 1024; | |
} | |
else | |
{ | |
if( $DISK["size_unit"] == "M" ) | |
{ | |
$init = $disk_size / 1024 / 1024; | |
} | |
else | |
{ | |
if( $DISK["size_unit"] == "K" ) | |
{ | |
$init = $disk_size / 1024; | |
} | |
else | |
{ | |
$init = $disk_size; | |
} | |
} | |
} | |
return $init; | |
} | |
if( preg_match("/ceph/is", $DISK["type"]) ) | |
{ | |
$disk_path = basename(dirname($DISK["path"])) . "/" . basename($DISK["path"]); | |
vexec("/usr/bin/rbd info " . $disk_path, $o, $ret); | |
$disk_size_temp = explode(" ", $o[1]); | |
$disk_size = (int) trim($disk_size_temp[1]); | |
if( empty($DISK["size_unit"]) || $DISK["size_unit"] == "G" ) | |
{ | |
$init = $disk_size / 1024; | |
} | |
else | |
{ | |
if( $DISK["size_unit"] == "M" ) | |
{ | |
$init = $disk_size; | |
} | |
else | |
{ | |
if( $DISK["size_unit"] == "K" ) | |
{ | |
$init = $disk_size * 1024; | |
} | |
else | |
{ | |
$init = $disk_size; | |
} | |
} | |
} | |
return $init; | |
} | |
return lvsize($DISK["path"], $DISK["size_unit"]); | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
return qemu_size($DISK["path"], $DISK["size_unit"]); | |
} | |
return 0; | |
} | |
function vpsdisk_real_size($DISK) | |
{ | |
if( empty($DISK) ) | |
{ | |
return -1; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = basename(dirname($DISK["path"])) . "/" . basename($DISK["path"]); | |
vexec("zfs get -p volsize " . $disk_path . " -o value", $o, $ret); | |
$disk_size = (int) $o[1]; | |
if( $DISK["size_unit"] == "G" ) | |
{ | |
$init = $disk_size / 1024 / 1024 / 1024; | |
} | |
else | |
{ | |
if( $DISK["size_unit"] == "M" ) | |
{ | |
$init = $disk_size / 1024 / 1024; | |
} | |
else | |
{ | |
if( $DISK["size_unit"] == "K" ) | |
{ | |
$init = $disk_size / 1024; | |
} | |
else | |
{ | |
$init = $disk_size; | |
} | |
} | |
} | |
return $init; | |
} | |
return lvsize($DISK["path"], "B"); | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
return qemu_size_real($DISK["path"]); | |
} | |
return 0; | |
} | |
function vpsdisk_path_build($suffix = "", $storage, $vps) | |
{ | |
global $globals; | |
global $kernel; | |
if( $kernel->conf($vps["vpsid"], "vpsdisk_path_build") ) | |
{ | |
return $kernel->vpsdisk_path_build($vps["vpsid"], $suffix, $storage, $vps); | |
} | |
if( preg_match("/ceph/is", $storage["type"]) ) | |
{ | |
$disk_name = "vs" . $vps["vps_name"] . $suffix . "-" . $vps["uuid"]; | |
return $storage["path"] . "/" . $disk_name; | |
} | |
if( preg_match("/block/is", $storage["type"]) ) | |
{ | |
$disk_name = "vs" . $vps["vps_name"] . $suffix . "-" . $vps["uuid"]; | |
} | |
else | |
{ | |
$disk_name = $vps["vps_name"] . $suffix . "-" . $vps["uuid"] . "." . ((empty($storage["format"]) ? "qcow2" : $storage["format"])); | |
} | |
$storage_path = (preg_match("/thin/is", $storage["type"]) && !preg_match("/zfs/is", $storage["type"]) ? dirname($storage["path"]) : $storage["path"]); | |
return $storage_path . "/" . $disk_name; | |
} | |
function vpsdisk_add($vps_uuid, $DISK) | |
{ | |
global $globals; | |
global $kernel; | |
$return = array( ); | |
$struct = vpsdisk_db_struct(); | |
$vals["vps_uuid"] = $vps_uuid; | |
$vals["disk_uuid"] = (preg_match("/^d(\\w{15})/is", $DISK["disk_uuid"]) ? $DISK["disk_uuid"] : "d" . generaterandstr(15)); | |
foreach( $DISK as $k => $v ) | |
{ | |
if( !array_key_exists($k, $vals) && array_key_exists($k, $struct) ) | |
{ | |
$vals[$k] = $DISK[$k]; | |
} | |
} | |
if( !empty($vals["extra"]) && is_array($vals["extra"]) ) | |
{ | |
$vals["extra"] = serialize($vals["extra"]); | |
} | |
foreach( $vals as $k => $v ) | |
{ | |
$tokens[$k] = "`" . $k . "` = :" . $k; | |
} | |
$did = insert_and_id("INSERT INTO disks\n\t\t\t\t\t\tSET " . implode(", ", $tokens), $vals); | |
if( empty($did) ) | |
{ | |
return false; | |
} | |
return $vals["disk_uuid"]; | |
} | |
function vpsdisk_update($vps_uuid, $DISK) | |
{ | |
global $globals; | |
global $kernel; | |
$return = array( ); | |
if( empty($DISK["disk_uuid"]) ) | |
{ | |
$return["no_disk_uuid"] = "There is no Disk UUID given !"; | |
return $return; | |
} | |
$struct = vpsdisk_db_struct(); | |
$vals["vps_uuid"] = $vps_uuid; | |
$vals["disk_uuid"] = $DISK["disk_uuid"]; | |
foreach( $DISK as $k => $v ) | |
{ | |
if( !array_key_exists($k, $vals) && array_key_exists($k, $struct) ) | |
{ | |
$vals[$k] = $DISK[$k]; | |
} | |
} | |
if( !empty($vals["extra"]) && is_array($vals["extra"]) ) | |
{ | |
$vals["extra"] = serialize($vals["extra"]); | |
} | |
foreach( $vals as $k => $v ) | |
{ | |
$tokens[$k] = "`" . $k . "` = :" . $k; | |
} | |
makequery("UPDATE disks\n\t\t\t\t\t\tSET " . implode(", ", $tokens) . "\n\t\t\t\t\t\tWHERE disk_uuid = '" . $DISK["disk_uuid"] . "'", $vals); | |
return $return; | |
} | |
function vpsdisk_create($DISK, $os_template = "") | |
{ | |
global $globals; | |
global $kernel; | |
$return = array( ); | |
if( empty($DISK) ) | |
{ | |
$return[] = "No disk info"; | |
return $return; | |
} | |
if( $kernel->conf($DISK["vpsid"], "vpsdisk_create") ) | |
{ | |
return $kernel->vpsdisk_create($DISK["vpsid"], $DISK, $os_template); | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = str_replace("/dev/zvol/", "", $DISK["path"]); | |
if( preg_match("/thin/is", $DISK["type"]) ) | |
{ | |
vexec("zfs create -s -V " . $DISK["size"] . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " " . $disk_path, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_lvm"] . " " . $disk_path; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
if( preg_match("/compressed/is", $DISK["type"]) ) | |
{ | |
vexec("zfs set compression=on " . $disk_path, $o, $ret); | |
} | |
} | |
else | |
{ | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
vexec("zfs create -V " . $DISK["size"] . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " " . $disk_path, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_lvm"] . " " . $disk_path; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
if( preg_match("/compressed/is", $DISK["type"]) ) | |
{ | |
vexec("zfs set compression=on " . $disk_path, $o, $ret); | |
} | |
} | |
} | |
sleep(3); | |
if( $ret != "0" ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_lvm"] . " " . $disk_path; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
else | |
{ | |
if( preg_match("/ceph/is", $DISK["type"]) ) | |
{ | |
$disk_name = explode("/", $DISK["path"]); | |
$pool_disk = $disk_name[3] . "/" . $disk_name[4]; | |
vexec("/usr/bin/rbd create --size " . round($DISK["size"]) . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " " . $pool_disk . " --image-feature layering", $o, $ret); | |
sleep(1); | |
if( $ret != 0 ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_ceph_block"] . " " . $pool_disk; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
vexec("/usr/bin/rbd map " . $pool_disk, $o, $ret); | |
if( $ret != 0 ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_ceph_block_map"] . " " . $pool_disk; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
else | |
{ | |
if( preg_match("/thin/is", $DISK["type"]) ) | |
{ | |
vexec($globals["com"]["lvcreate"] . " -V" . $DISK["size"] . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " -n " . basename($DISK["path"]) . " -T " . storage_thin_path($DISK)); | |
} | |
else | |
{ | |
vexec($globals["com"]["lvcreate"] . " -L " . $DISK["size"] . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " -n " . basename($DISK["path"]) . " " . storage_path($DISK)); | |
} | |
vexec($globals["com"]["lvdisplay"] . " \"" . $DISK["path"] . "\"", $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_lvm"]; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
if( !empty($os_template) ) | |
{ | |
vexec("/bin/dd if=\"" . $os_template . "\" of=" . $DISK["path"] . " bs=24M 2>&1", $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_dd"]; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
$format = $DISK["format"]; | |
$size = $DISK["size"] . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")); | |
if( !empty($os_template) ) | |
{ | |
vexec("qemu-img convert -f raw -O " . $format . " " . $os_template . " " . $DISK["path"], $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = "QEMU : File Convert Error"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
vexec("qemu-img resize " . $DISK["path"] . " " . $size, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = "QEMU : Resize Error"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
else | |
{ | |
vexec("qemu-img create -f " . $format . " " . $DISK["path"] . " " . $size, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = "QEMU : Create Error"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
return $return; | |
} | |
function vpsdisk_destroy($vid, $storage = "") | |
{ | |
global $globals; | |
global $kernel; | |
if( is_array($vid) ) | |
{ | |
$DISK = $vid; | |
$vid = $DISK["vpsid"]; | |
} | |
else | |
{ | |
$DISK = get_vps_disk($vid, $storage); | |
if( empty($DISK) ) | |
{ | |
$return[] = "Disk not found"; | |
return $return; | |
} | |
} | |
$return = array( ); | |
if( $kernel->conf($vid, "vpsdisk_destroy") ) | |
{ | |
return $kernel->vpsdisk_destroy($vid, $DISK); | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = basename(dirname($DISK["path"])) . "/" . basename($DISK["path"]); | |
vexec("zfs destroy -R " . $disk_path); | |
} | |
else | |
{ | |
if( preg_match("/ceph/is", $DISK["type"]) ) | |
{ | |
$disk_path = basename(dirname($DISK["path"])) . "/" . basename($DISK["path"]); | |
vexec("/usr/bin/rbd unmap " . $disk_path, $o, $ret); | |
if( $ret != 0 ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_ceph_block_unmap"] . " " . $disk_path; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
vexec("/usr/bin/rbd rm " . $disk_path, $o, $ret); | |
if( $ret != 0 ) | |
{ | |
$return[] = $GLOBALS["l"]["kvm_err_ceph_block_rm"] . " " . $disk_path; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
else | |
{ | |
vexec($globals["com"]["lvremove"] . " -f " . $DISK["path"]); | |
} | |
} | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
vexec("rm -rf " . $DISK["path"]); | |
} | |
} | |
function vpsdisk_mkfs_direct($DISK, $fstype) | |
{ | |
global $globals; | |
global $l; | |
$return = array( ); | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( $fstype != "swap" ) | |
{ | |
$ret = vexec("/sbin/mkfs -t " . $fstype . " " . $DISK["path"]); | |
} | |
else | |
{ | |
$ret = vexec("/sbin/mkswap -f " . $DISK["path"]); | |
} | |
if( $ret != "0" ) | |
{ | |
$return[] = $l["xen_err_mkfs"] . " - " . $fstype; | |
$error["derr"] = array_end($GLOBALS["logr"]); | |
return false; | |
} | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
$com = "guestfish -a " . $DISK["path"] . " 2>/dev/null << EOF \nrun\n"; | |
if( $fstype != "swap" ) | |
{ | |
$com .= "mkfs " . $fstype . " /dev/sda\nEOF"; | |
} | |
else | |
{ | |
$com .= "mkswap /dev/sda\nEOF"; | |
} | |
$ret = vexec($com); | |
if( $ret != "0" ) | |
{ | |
$return[] = "File : " . $l["xen_err_mkfs"] . " - " . $fstype; | |
$error["derr"] = array_end($GLOBALS["logr"]); | |
return false; | |
} | |
} | |
} | |
function mount($vpsid, $storage = "", $win = 0) | |
{ | |
global $globals; | |
global $kernel; | |
$DISK = get_vps_disk($vpsid, $storage); | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
if( !is_dir($DISK["mount_point"]) ) | |
{ | |
mkdir_recursive($DISK["mount_point"], 493); | |
} | |
if( $kernel->conf($vpsid, "vbd_plug") && $DISK["format"] == "vhd" ) | |
{ | |
$orig_type = $DISK["type"]; | |
$DISK = $kernel->vbd_plug($vpsid, $DISK); | |
$DISK["type"] = "block"; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
$diskinfo = diskinfo($DISK["path"]); | |
if( empty($diskinfo["parts"][0]["islinux"]) && empty($win) ) | |
{ | |
return -1; | |
} | |
vexec("/sbin/kpartx -l " . $DISK["path"], $kpart, $kparted); | |
$is_centos5 = os_check("centos", "<", 6); | |
$kpartx_s = (!empty($is_centos5) ? "" : "s"); | |
vexec("/sbin/kpartx -av" . $kpartx_s . " " . $DISK["path"], $_kpart, $kparted); | |
if( $kparted != 0 ) | |
{ | |
vexec("/sbin/kpartx -d " . $DISK["path"]); | |
return ""; | |
} | |
$tmp = explode(" ", $kpart[0]); | |
$mapper = $tmp[0]; | |
vexec("/bin/mount /dev/mapper/" . $mapper . " " . $DISK["mount_point"], $mout, $mounted); | |
if( $mounted != 0 && $diskinfo["parts"][0]["iswindows"] == 1 ) | |
{ | |
vexec("/bin/ntfsfix /dev/mapper/" . $mapper); | |
vexec("/bin/mount /dev/mapper/" . $mapper . " " . $DISK["mount_point"], $mout, $mounted); | |
} | |
if( $mounted != "0" ) | |
{ | |
vexec("/bin/umount " . $DISK["mount_point"]); | |
vexec("/sbin/kpartx -d " . $DISK["path"]); | |
return ""; | |
} | |
$DISK["kpart"] = $kpart; | |
$DISK["diskinfo"] = $diskinfo; | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
$no_guestmount_support = os_check("centos", ">=", 7.3); | |
$dret = file_diskinfo($DISK["path"]); | |
if( $no_guestmount_support && $DISK["format"] == "raw" && !empty($dret["parts"][0]["iswindows"]) ) | |
{ | |
if( empty($dret["start_offset"]) ) | |
{ | |
return ""; | |
} | |
vexec("mount -o loop,rw,offset=" . xss($dret["start_offset"]) . " " . xss($DISK["path"]) . " " . xss($DISK["mount_point"]), $mout, $mounted); | |
} | |
else | |
{ | |
vexec("guestmount -a " . $DISK["path"] . " -i --rw " . $DISK["mount_point"], $mout, $mounted); | |
} | |
if( $mounted != 0 && $dret["parts"][0]["iswindows"] == 1 ) | |
{ | |
$cmd = "guestfish -a " . $DISK["path"] . " 2>/dev/null << EOF \nrun\nntfsfix /dev/sda1\nEOF"; | |
vexec($cmd); | |
vexec("guestmount -a " . $DISK["path"] . " -i --rw " . $DISK["mount_point"], $mout, $mounted); | |
} | |
if( $mounted != "0" ) | |
{ | |
vexec("/bin/umount " . $DISK["mount_point"]); | |
return ""; | |
} | |
} | |
if( !empty($orig_type) ) | |
{ | |
$DISK["type"] = $orig_type; | |
} | |
return $DISK; | |
} | |
function mount_direct($vpsid, $storage = "") | |
{ | |
global $globals; | |
$DISK = get_vps_disk($vpsid, $storage); | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
if( !is_dir($DISK["mount_point"]) ) | |
{ | |
mkdir_recursive($DISK["mount_point"], 493); | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
$diskinfo = diskinfo($DISK["path"]); | |
$DISK["diskinfo"] = $diskinfo; | |
vexec("/bin/mount " . $DISK["path"] . " " . $DISK["mount_point"], $mout, $mounted); | |
if( $mounted != "0" ) | |
{ | |
vexec("/bin/umount " . $DISK["mount_point"]); | |
return ""; | |
} | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
vexec("guestmount -a " . $DISK["path"] . " -m /dev/sda --rw " . $DISK["mount_point"], $mout, $mounted); | |
if( $mounted != "0" ) | |
{ | |
vexec("/bin/umount " . $DISK["mount_point"]); | |
return ""; | |
} | |
} | |
return $DISK; | |
} | |
function mount_snapshot($DISK) | |
{ | |
global $globals; | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
$DISK["mount_point"] = rtrim($DISK["mount_point"], "/") . "_snap"; | |
if( !is_dir($DISK["mount_point"]) ) | |
{ | |
mkdir_recursive($DISK["mount_point"], 493); | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
vexec("/bin/mount " . $DISK["snapshot_path"] . " " . $DISK["mount_point"], $mout, $mounted); | |
if( $mounted != "0" ) | |
{ | |
vexec("/bin/umount " . $DISK["mount_point"]); | |
return ""; | |
} | |
} | |
return $DISK; | |
} | |
function umount($DISK) | |
{ | |
global $kernel; | |
$return = array( ); | |
if( empty($DISK["mount_point"]) ) | |
{ | |
$return[] = "No mount point found"; | |
return $return; | |
} | |
vexec("/bin/umount " . $DISK["mount_point"], $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return[] = "Error unmounting"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
vexec("/sbin/kpartx -d " . $DISK["path"]); | |
} | |
if( $kernel->conf($DISK["vpsid"], "vbd_unplug") && $DISK["format"] == "vhd" ) | |
{ | |
$DISK = $kernel->vbd_unplug($DISK["vpsid"], $DISK); | |
} | |
return $return; | |
} | |
function vpsdisk_resize($vpsid, $storage = "") | |
{ | |
global $kernel; | |
$return = array( ); | |
$vps = getvps($vpsid); | |
if( empty($vps) ) | |
{ | |
$return["error"][] = "VPS not found"; | |
return $return; | |
} | |
$DISK = get_vps_disk($vpsid, $storage); | |
if( empty($DISK) ) | |
{ | |
$return["error"][] = "DISK not found"; | |
return $return; | |
} | |
if( $kernel->conf($vpsid, "vpsdisk_resize") ) | |
{ | |
$kernel_return = $kernel->vpsdisk_resize($vpsid, $DISK); | |
} | |
if( $kernel->conf($vpsid, "vbd_plug") && $DISK["format"] == "vhd" ) | |
{ | |
$DISK = $kernel->vbd_plug($vpsid, $DISK); | |
$DISK["type"] = "block"; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( $DISK["format"] != "vhd" ) | |
{ | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = str_replace("/dev/zvol/", "", $DISK["path"]); | |
vexec("zfs set volsize=" . $DISK["size"] . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " " . $disk_path, $o, $ret); | |
} | |
else | |
{ | |
if( preg_match("/ceph/is", $DISK["type"]) ) | |
{ | |
$disk_path = str_replace("/dev/rbd/", "", $DISK["path"]); | |
vexec("/usr/bin/rbd resize --size " . round($DISK["size"]) . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " " . $disk_path); | |
} | |
else | |
{ | |
vexec("lvresize -L " . $DISK["size"] . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")) . " " . $DISK["path"], $o, $ret); | |
} | |
} | |
} | |
$return["resized"] = true; | |
$diskinfo = diskinfo($DISK["path"]); | |
$DISK["diskinfo"] = $diskinfo; | |
$return["diskinfo"] = $diskinfo; | |
if( !empty($diskinfo["parts"][0]["islinux"]) && $diskinfo["numparts"] == 1 || !empty($diskinfo["parts"][0]["islinux"]) && !empty($diskinfo["parts"][1]["isswap"]) && $diskinfo["numparts"] == 2 ) | |
{ | |
$return["altered_partitions"] = true; | |
if( 0 < $vps["swap"] && !empty($DISK["primary"]) ) | |
{ | |
$space_less_swap = (1024 * $DISK["size"] - $vps["swap"]) * 1024 * 2; | |
$swap_start = $space_less_swap + $diskinfo["parts"][0]["start"]; | |
vexec("/sbin/sfdisk " . $DISK["path"] . " -uS --force << EOF\n" . $diskinfo["parts"][0]["start"] . "," . $space_less_swap . "," . $diskinfo["parts"][0]["hextype"] . "," . $diskinfo["parts"][0]["boot"] . "\n" . $swap_start . ",,82\n0,0\n0,0\nEOF", $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return["error"][] = "Error sfdisk"; | |
$return["error"]["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
vexec("/sbin/kpartx -l " . $DISK["path"], $kpart, $kparted); | |
$is_centos5 = os_check("centos", "<", 6); | |
$kpartx_s = (!empty($is_centos5) ? "" : "s"); | |
vexec("/sbin/kpartx -av" . $kpartx_s . " " . $DISK["path"], $_kpart, $kparted); | |
if( $kparted == 0 ) | |
{ | |
$stmp = explode(" ", $kpart[1]); | |
$smapper = $stmp[0]; | |
vexec("/sbin/mkswap /dev/mapper/" . $smapper, $swaping, $swapret); | |
} | |
vexec("/sbin/kpartx -d " . $DISK["path"]); | |
} | |
else | |
{ | |
vexec("/sbin/sfdisk " . $DISK["path"] . " -uS --force << EOF\n" . $diskinfo["parts"][0]["start"] . ",," . $diskinfo["parts"][0]["hextype"] . "," . $diskinfo["parts"][0]["boot"] . "\n0,0\n0,0\n0,0\nEOF", $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return["error"][] = "Error sfdisk without swap"; | |
$return["error"]["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
else | |
{ | |
if( !empty($diskinfo["parts"][0]["iswindows"]) && $diskinfo["numparts"] == 1 ) | |
{ | |
$return["altered_partitions"] = true; | |
vexec("/sbin/sfdisk " . $DISK["path"] . " -uS --force << EOF\n" . $diskinfo["parts"][0]["start"] . ",," . $diskinfo["parts"][0]["hextype"] . "," . $diskinfo["parts"][0]["boot"] . "\n0,0\n0,0\n0,0\nEOF", $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return["error"][] = "Windows : Error sfdisk"; | |
$return["error"]["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
$size = $DISK["size"] . "" . ((!empty($DISK["size_unit"]) ? $DISK["size_unit"] : "G")); | |
vexec("qemu-img resize " . $DISK["path"] . " " . $size, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return["error"][] = $GLOBALS["l"]["qemu_resize_err"]; | |
$return["error"]["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
$return["resized"] = true; | |
$diskinfo = file_diskinfo($DISK["path"]); | |
$DISK["diskinfo"] = $diskinfo; | |
$return["diskinfo"] = $diskinfo; | |
$com = ""; | |
if( !empty($diskinfo["parts"][0]["islinux"]) && $diskinfo["numparts"] == 1 || !empty($diskinfo["parts"][0]["islinux"]) && !empty($diskinfo["parts"][1]["isswap"]) && $diskinfo["numparts"] == 2 ) | |
{ | |
$return["altered_partitions"] = true; | |
if( 0 < $vps["swap"] ) | |
{ | |
$space_less_swap = (1024 * $DISK["size"] - $vps["swap"]) * 1024 * 2; | |
$com = "guestfish -a " . $DISK["path"] . " << EOF\nrun"; | |
foreach( $diskinfo["parts"] as $k => $v ) | |
{ | |
$com .= "\npart-del /dev/sda " . ($k + 1); | |
} | |
$v = $diskinfo["parts"][0]; | |
$k = 0; | |
$com .= "\npart-add /dev/sda p " . $v["start"] . " " . $space_less_swap . "\npart-set-mbr-id /dev/sda 1 0x" . $v["hextype"] . "\npart-set-bootable /dev/sda 1 " . (($v["boot"] ? "true" : "false")); | |
$swap_start = $space_less_swap + 1; | |
$com .= "\npart-add /dev/sda p " . $swap_start . " " . ($diskinfo["disk_max_sectors"] - 1) . "\npart-set-mbr-id /dev/sda 2 0x82\nmkswap /dev/sda2"; | |
$com .= "\nEOF"; | |
} | |
else | |
{ | |
$make_single = 1; | |
} | |
} | |
else | |
{ | |
if( !empty($diskinfo["parts"][0]["iswindows"]) && $diskinfo["numparts"] == 1 ) | |
{ | |
$return["altered_partitions"] = true; | |
$make_single = 1; | |
} | |
} | |
if( !empty($make_single) ) | |
{ | |
$com = "guestfish -a " . $DISK["path"] . " << EOF\nrun"; | |
foreach( $diskinfo["parts"] as $k => $v ) | |
{ | |
$com .= "\npart-del /dev/sda " . ($k + 1); | |
} | |
$v = $diskinfo["parts"][0]; | |
$com .= "\npart-add /dev/sda p " . $v["start"] . " " . ($diskinfo["disk_max_sectors"] - 1) . "\npart-set-mbr-id /dev/sda 1 0x" . $v["hextype"] . "\npart-set-bootable /dev/sda 1 " . (($v["boot"] ? "true" : "false")); | |
$com .= "\nEOF"; | |
} | |
if( !empty($com) ) | |
{ | |
vexec($com, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
$return["error"][] = "Qemu : Resize Partitions Error"; | |
$return["error"]["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
return $return; | |
} | |
function vpsdisk_resize_filesystem($DISK) | |
{ | |
global $globals; | |
global $l; | |
global $kernel; | |
$return = array( ); | |
$vps = getvps($DISK["vpsid"]); | |
if( empty($vps) ) | |
{ | |
$return["error"][] = "VPS not found"; | |
return $return; | |
} | |
if( $kernel->conf($vps["vpsid"], "vbd_plug") && $DISK["format"] == "vhd" ) | |
{ | |
$DISK = $kernel->vbd_plug($DISK["vpsid"], $DISK); | |
} | |
if( empty($DISK["diskinfo"]) ) | |
{ | |
$DISK["diskinfo"] = get_diskinfo($DISK); | |
} | |
if( $DISK["format"] == "vhd" ) | |
{ | |
$DISK["type"] = "block"; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
$kpartx = kpartx($DISK); | |
if( empty($kpartx) ) | |
{ | |
$return[] = $l["kvm_err_kpart"]; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
$disk = $DISK["diskinfo"]; | |
if( !empty($disk["parts"][0]["islinux"]) ) | |
{ | |
vexec("/sbin/fsck -f -y " . $kpartx["maps"][0], $e2fsck, $e2ret); | |
vexec($globals["com"]["resizefs"] . " " . $kpartx["maps"][0], $resize2fs, $reret); | |
if( $reret != "0" ) | |
{ | |
$return["error"] = $l["kvm_err_resizefs"]; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
else | |
{ | |
if( !empty($disk["parts"][0]["iswindows"]) ) | |
{ | |
vexec("ntfsresize -P --force " . $kpartx["maps"][0] . " 2>&1", $resize2fs, $reret); | |
if( $reret != "0" ) | |
{ | |
$return["error"] = $l["kvm_err_resizefs"]; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
vexec("ntfsfix -b " . $kpartx["maps"][0] . " 2>&1", $resize2fs, $reret); | |
if( $reret != "0" ) | |
{ | |
$return["error"] = $l["kvm_err_resizefs"]; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
kpartx_delete($DISK); | |
} | |
if( preg_match("/file/is", $DISK["type"]) ) | |
{ | |
$disk = $DISK["diskinfo"]; | |
if( !empty($disk["parts"][0]["islinux"]) ) | |
{ | |
$com = "guestfish -a " . $DISK["path"] . " 2>/dev/null << EOF \nrun\ne2fsck /dev/sda1 correct:true\nresize2fs /dev/sda1\nEOF"; | |
} | |
else | |
{ | |
if( !empty($disk["parts"][0]["iswindows"]) ) | |
{ | |
$com = "guestfish -a " . $DISK["path"] . " 2>/dev/null << EOF \nrun\nntfsfix /dev/sda1\nntfsresize-opts /dev/sda1 force:true\nEOF"; | |
} | |
} | |
if( !empty($com) ) | |
{ | |
vexec($com, $o, $ret); | |
if( $ret != "0" ) | |
{ | |
if( !empty($disk["parts"][0]["islinux"]) ) | |
{ | |
vexec($com, $o, $ret); | |
} | |
if( $ret != "0" ) | |
{ | |
$return["error"] = "QEMU : Resize FS error"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
} | |
} | |
return $return; | |
} | |
function vpsdisk_snapshot_create($vid, $prefix = "snapshot", $disk_num = 0) | |
{ | |
global $globals; | |
if( is_array($vid) ) | |
{ | |
$DISK = $vid; | |
$vid = $DISK["vpsid"]; | |
} | |
else | |
{ | |
$DISK = get_vps_disk($vid, $storage, $disk_num); | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
$tmp = $prefix . "-" . $disk_num . "-" . generaterandstr(5); | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = str_replace("/dev/zvol/", "", $DISK["path"]); | |
$ret = vexec("zfs snapshot " . $disk_path . "@" . $tmp . "-SNAP"); | |
if( $ret != "0" ) | |
{ | |
return ""; | |
} | |
$ret = vexec("zfs clone " . $disk_path . "@" . $tmp . "-SNAP " . basename(dirname($DISK["path"])) . "/" . $tmp); | |
sleep(1); | |
} | |
else | |
{ | |
if( preg_match("/thin/is", $DISK["type"]) ) | |
{ | |
$ret = vexec($globals["com"]["lvcreate"] . " -kn -s -n " . $tmp . " " . $DISK["path"]); | |
} | |
else | |
{ | |
$ret = vexec($globals["com"]["lvcreate"] . " -s -L " . snapsize($DISK["size"]) . "G -n " . $tmp . " " . $DISK["path"]); | |
} | |
} | |
if( $ret != "0" ) | |
{ | |
return ""; | |
} | |
$DISK["snapshot_path"] = storage_path($DISK) . "/" . $tmp; | |
} | |
return $DISK; | |
} | |
function vpsdisk_snapshot_delete($DISK) | |
{ | |
global $globals; | |
$return = array( ); | |
if( empty($DISK["snapshot_path"]) ) | |
{ | |
$return[] = "No snapshot found"; | |
return $return; | |
} | |
if( preg_match("/block/is", $DISK["type"]) ) | |
{ | |
if( preg_match("/zfs/is", $DISK["type"]) ) | |
{ | |
$disk_path = str_replace("/dev/zvol/", "", $DISK["path"]); | |
$tmp = basename($DISK["snapshot_path"]); | |
$ret = vexec("zfs destroy " . basename(dirname($DISK["path"])) . "/" . $tmp . " 2>&1"); | |
sleep(2); | |
if( $ret != "0" ) | |
{ | |
$return[] = "Error deleteing Clone"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
$ret = vexec("zfs destroy -R " . $disk_path . "@" . $tmp . "-SNAP", $o, $ret); | |
sleep(3); | |
if( $ret != "0" ) | |
{ | |
$return[] = "Error deleteing snapshot"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
else | |
{ | |
$ret = vexec($globals["com"]["lvremove"] . " -f " . $DISK["snapshot_path"], $o, $ret); | |
} | |
if( $ret != "0" ) | |
{ | |
$return[] = "Error deleteing snapshot"; | |
$return["derr"] = array_end($GLOBALS["logr"]); | |
return $return; | |
} | |
} | |
return $return; | |
} | |
function storage_type_text($type) | |
{ | |
$type_text = array( ); | |
$type_text["block"] = "LVM"; | |
$type_text["thin block"] = "Thin LVM"; | |
$type_text["openvz"] = "OpenVZ"; | |
$type_text["file"] = "File"; | |
$type_text["zfs block"] = "ZFS"; | |
$type_text["zfs thin block"] = "ZFS Thin"; | |
$type_text["zfs block compressed"] = "ZFS Compressed"; | |
$type_text["zfs thin block compressed"] = "ZFS Thin Compressed"; | |
$type_text["ceph block"] = "Ceph Block Device"; | |
if( array_key_exists($type, $type_text) ) | |
{ | |
return $type_text[$type]; | |
} | |
} | |
function storage_path($DISK) | |
{ | |
global $storages; | |
$type = $DISK["type"]; | |
$vpsdisk_path = $DISK["path"]; | |
if( preg_match("/block/is", $type) ) | |
{ | |
return dirname($vpsdisk_path); | |
} | |
return dirname($vpsdisk_path); | |
} | |
function storage_thin_path($DISK) | |
{ | |
global $storages; | |
$st_uuid = $DISK["st_uuid"]; | |
$type = $DISK["type"]; | |
if( preg_match("/block/is", $type) && preg_match("/thin/is", $type) ) | |
{ | |
foreach( $storages as $sk => $sv ) | |
{ | |
if( $sv["st_uuid"] == $st_uuid ) | |
{ | |
return $sv["path"]; | |
} | |
} | |
} | |
return ""; | |
} | |
function storage_get_primary($virt = "") | |
{ | |
global $storages; | |
if( $virt == "vzo" ) | |
{ | |
$virt = "openvz"; | |
} | |
foreach( $storages as $k => $v ) | |
{ | |
if( !empty($virt) && ($virt == "openvz" && $virt != $v["type"] || $virt != "openvz" && $v["type"] == "openvz") ) | |
{ | |
continue; | |
} | |
if( $virt == "proxo" && $v["type"] != "file" ) | |
{ | |
continue; | |
} | |
if( !empty($v["primary_storage"]) ) | |
{ | |
return $k; | |
} | |
} | |
foreach( $storages as $k => $v ) | |
{ | |
if( !empty($virt) && ($virt == "openvz" && $virt != $v["type"] || $virt != "openvz" && $v["type"] == "openvz") ) | |
{ | |
continue; | |
} | |
if( $virt == "proxo" && $v["type"] == "file" ) | |
{ | |
continue; | |
} | |
return $k; | |
} | |
} | |
function storage_size($path, $type) | |
{ | |
if( preg_match("/file|openvz/is", $type) ) | |
{ | |
vexec("df -P " . $path, $disk); | |
if( !empty($disk[1]) ) | |
{ | |
$tmp = preg_split("/[\\s]+/", trim($disk[1])); | |
$free_Kblocks = (double) trim($tmp[3]); | |
$one_Kblocks = (double) trim($tmp[1]); | |
$ret["size"] = @round($one_Kblocks / 1024 / 1024, 2); | |
$ret["free"] = @round($free_Kblocks / 1024 / 1024, 2); | |
} | |
} | |
else | |
{ | |
if( preg_match("/zfs/is", $type) ) | |
{ | |
$pool_name = basename($path); | |
vexec("zfs get -p available " . $pool_name . " -o value", $o); | |
$available = @round($o[1] / 1024 / 1024 / 1024, 2); | |
vexec("zpool list " . $pool_name . " -o size", $k); | |
if( strpos($k[1], "M") !== false ) | |
{ | |
$tmp = (double) str_replace("M", "", $k[1]); | |
$size = @round($tmp / 1024, 2); | |
} | |
else | |
{ | |
if( strpos($k[1], "T") !== false ) | |
{ | |
$tmp = (double) str_replace("T", "", $k[1]); | |
$size = round($tmp * 1024, 2); | |
} | |
else | |
{ | |
$tmp = (double) substr($k[1], 0, -1); | |
$size = round($tmp, 2); | |
} | |
} | |
$ret["size"] = $size; | |
$ret["free"] = $available; | |
} | |
else | |
{ | |
if( preg_match("/ceph/is", $type) ) | |
{ | |
$pool_name = basename($path); | |
vexec("rados df -p \"" . $pool_name . "\"", $disk); | |
if( !empty($disk[3]) ) | |
{ | |
$tmp = explode(" ", $disk[3]); | |
$ret["free"] = @round((double) @trim($tmp[@count($tmp) - 1]) / 1024 / 1024, 2); | |
} | |
if( !empty($disk[4]) ) | |
{ | |
$tmp = explode(" ", $disk[4]); | |
$ret["size"] = @round((double) @trim($tmp[@count($tmp) - 1]) / 1024 / 1024, 2); | |
} | |
} | |
else | |
{ | |
if( preg_match("/thin/is", $type) && preg_match("/block/is", $type) ) | |
{ | |
vexec("lvdisplay -C --nosuffix --units k \"" . $path . "\"", $disk); | |
if( !empty($disk[1]) ) | |
{ | |
$tmp = preg_split("/[\\s]+/", trim($disk[1])); | |
$used_percentage = (double) trim($tmp[4]); | |
$free_percentage = 100 - $used_percentage; | |
$total_space_kb = (double) trim($tmp[3]); | |
$ret["size"] = @round($total_space_kb / 1024 / 1024, 2); | |
$ret["free"] = @round(($total_space_kb * $free_percentage) / 100 / 1024 / 1024, 2); | |
} | |
} | |
else | |
{ | |
vexec("vgdisplay -C --nosuffix --units k \"" . $path . "\"", $disk); | |
if( !empty($disk[1]) ) | |
{ | |
$tmp = preg_split("/[\\s]+/", trim($disk[1])); | |
$ret["size"] = @round((double) @trim($tmp[@count($tmp) - 2]) / 1024 / 1024, 2); | |
$ret["free"] = @round((double) @trim($tmp[@count($tmp) - 1]) / 1024 / 1024, 2); | |
} | |
} | |
} | |
} | |
} | |
return $ret; | |
} | |
function storage_allocated_space($stid) | |
{ | |
global $globals; | |
global $servers; | |
$resid = makequery("SELECT * FROM storage\n\t\t\t\t\t\tWHERE stid = '" . $stid . "'"); | |
if( vsql_num_rows($resid) < 1 ) | |
{ | |
return 0; | |
} | |
$storage = vsql_fetch_assoc($resid); | |
$resid = makequery("SELECT * FROM storage_servers\n\t\t\t\t\t\tWHERE stid = '" . $stid . "'"); | |
if( 1 <= vsql_num_rows($resid) ) | |
{ | |
for( $i = 0; $i < vsql_num_rows($resid); | |
$i++ ) | |
{ | |
$prow = vsql_fetch_assoc($resid); | |
$storage_servers[$prow["stid"] . "|" . $prow["serid"] . "|" . $prow["sgid"]] = $prow; | |
$_servers[$prow["serid"]] = $prow["serid"]; | |
$_server_groups[$prow["sgid"]] = $prow["sgid"]; | |
} | |
} | |
$final_servers = array( ); | |
foreach( $servers as $k => $v ) | |
{ | |
if( isset($_servers[$k]) || !empty($_servers[-1]) || isset($_server_groups[$v["sgid"]]) ) | |
{ | |
$final_servers[$k] = $k; | |
} | |
} | |
if( empty($final_servers) ) | |
{ | |
return 0; | |
} | |
if( $storage["type"] == "openvz" ) | |
{ | |
$res = makequery("SELECT SUM(space) AS alloc_space FROM vps\n\t\t\t\t\t\t\tWHERE serid IN (" . implode(", ", $final_servers) . ")\n\t\t\t\t\t\t\tAND virt = 'openvz'"); | |
$row = vsql_fetch_assoc($res); | |
return (double) $row["alloc_space"]; | |
} | |
$res = makequery("SELECT SUM(size) AS total_size, size_unit FROM disks\n\t\t\tWHERE st_uuid = '" . $storage["st_uuid"] . "'"); | |
$space_alloc = 0; | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( $row["size_unit"] == "M" ) | |
{ | |
$row["total_size"] = (double) ($row["total_size"] / 1024); | |
} | |
$space_alloc += (double) $row["total_size"]; | |
} | |
return (double) $space_alloc; | |
} | |
function kpartx($vid, $storage = "") | |
{ | |
if( is_array($vid) ) | |
{ | |
$DISK = $vid; | |
$vid = $DISK["vpsid"]; | |
} | |
else | |
{ | |
$DISK = get_vps_disk($vid, $storage); | |
if( empty($DISK) ) | |
{ | |
return ""; | |
} | |
} | |
vexec("/sbin/kpartx -l " . $DISK["path"], $kpart, $kparted); | |
$is_centos5 = os_check("centos", "<", 6); | |
$kpartx_s = (!empty($is_centos5) ? "" : "s"); | |
vexec("/sbin/kpartx -av" . $kpartx_s . " " . $DISK["path"], $_kpart, $kparted); | |
if( $kparted != 0 ) | |
{ | |
return ""; | |
} | |
$maps = array( ); | |
foreach( $kpart as $k => $v ) | |
{ | |
$tmp = explode(" ", $kpart[$k]); | |
$maps[$k] = "/dev/mapper/" . $tmp[0]; | |
} | |
$KPARTX["maps"] = $maps; | |
$KPARTX["raw_list"] = $kpart; | |
return $KPARTX; | |
} | |
function kpartx_delete($vid, $storage = "") | |
{ | |
if( is_array($vid) ) | |
{ | |
$DISK = $vid; | |
$vid = $DISK["vpsid"]; | |
} | |
else | |
{ | |
$DISK = get_vps_disk($vid, $storage); | |
if( empty($DISK) ) | |
{ | |
$return[] = "Disk not found"; | |
return $return; | |
} | |
} | |
vexec("/sbin/kpartx -d " . $DISK["path"], $kpart, $kparted); | |
return ""; | |
} | |
function package_install($package, $log) | |
{ | |
global $globals; | |
$package = (is_array($package) ? $package : array( $package )); | |
$package_list = implode(" ", $package); | |
if( distro_check(0, 0, 1) ) | |
{ | |
foreach( $package as $k => $v ) | |
{ | |
shell_exec("apt-get -y install " . $v . " >> " . $log . " 2>&1"); | |
} | |
return NULL; | |
} | |
else | |
{ | |
shell_exec("yum -y install " . $package_list . " >> " . $log . " 2>&1"); | |
} | |
} | |
function chkconfig($service, $priority = "") | |
{ | |
global $globals; | |
if( distro_check(0, 0, 1) ) | |
{ | |
shell_exec("update-rc.d " . $service . " defaults " . $priority . ""); | |
} | |
else | |
{ | |
shell_exec("/sbin/chkconfig " . $service . " on"); | |
} | |
} | |
function get_cores() | |
{ | |
global $globals; | |
@exec("cat /proc/cpuinfo", $core_output, $ret); | |
$c_tmp = implode("\n", $core_output); | |
preg_replace("/(.*?)processor(\\s*?):(\\s*?)(.*?)\\n/ies", "\$cores[] = trim('\$4');", $c_tmp); | |
if( $ret != 0 || count($cores) < 1 ) | |
{ | |
return false; | |
} | |
return $no_of_cores = max(array_values($cores)) + 1; | |
} | |
function database_dump($dbuser, $dbpass, $db, $filename) | |
{ | |
vexec("/usr/local/emps/bin/mysqldump --user=" . $dbuser . " --password=" . $dbpass . " " . $db . " | gzip -9 > " . $filename, $out, $ret); | |
return $ret; | |
} | |
function pass_encrypt($txt, $salt) | |
{ | |
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($salt), $txt, MCRYPT_MODE_CBC, md5(md5($salt)))); | |
} | |
function pass_decrypt($crypttxt, $salt) | |
{ | |
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($salt), base64_decode($crypttxt), MCRYPT_MODE_CBC, md5(md5($salt))), ""); | |
} | |
function ebtables_save() | |
{ | |
if( distro_check(0, 0, 0, 0, 1) ) | |
{ | |
vexec("/usr/libexec/ebtables save"); | |
} | |
else | |
{ | |
vexec("service ebtables save"); | |
} | |
} | |
function vncPort($vps) | |
{ | |
$vncport = 0; | |
if( !empty($vps["vncport"]) ) | |
{ | |
$vncport = $vps["vncport"]; | |
} | |
if( empty($vncport) ) | |
{ | |
$vps_name = (int) str_replace("v", "", $vps["vps_name"]); | |
$vncport = 5900 - 1000 + $vps_name; | |
} | |
return $vncport; | |
} | |
function merge_error($error1, $error2) | |
{ | |
if( empty($error2) ) | |
{ | |
return $error1; | |
} | |
if( !is_array($error2) ) | |
{ | |
$error2 = array( $error2 ); | |
} | |
if( !is_array($error1) ) | |
{ | |
$error1 = (empty($error1) ? array( ) : array( $error1 )); | |
} | |
return array_merge($error1, $error2); | |
} | |
function yum_exclude($excludes = "") | |
{ | |
$conf = "/etc/yum.conf"; | |
if( !file_exists($conf) ) | |
{ | |
return true; | |
} | |
$excludes = (is_array($excludes) ? $excludes : array( $excludes )); | |
if( empty($excludes) ) | |
{ | |
$excludes = array( "kernel" ); | |
} | |
$excludes = array_unique($excludes); | |
$yum = file($conf); | |
$exclude_line = -1; | |
foreach( $yum as $k => $line ) | |
{ | |
if( preg_match("/^exclude/is", $line) ) | |
{ | |
$exclude_line = $k; | |
foreach( $excludes as $xk => $xv ) | |
{ | |
if( !is_string($xv) ) | |
{ | |
return false; | |
} | |
if( preg_match("/" . trim($xv) . "/is", $line) ) | |
{ | |
unset($excludes[$xk]); | |
} | |
} | |
} | |
} | |
if( count($excludes) == 0 ) | |
{ | |
return true; | |
} | |
$excludes = implode(" ", $excludes); | |
if( $exclude_line != -1 ) | |
{ | |
$yum[$exclude_line] = trim($yum[$exclude_line]) . " " . $excludes . "\n"; | |
writefile($conf, implode("", $yum), 1); | |
} | |
else | |
{ | |
exec("echo " . xss("exclude=" . $excludes) . " >> " . $conf); | |
} | |
return true; | |
} | |
function load_master_settings() | |
{ | |
include(dirname(dirname(__FILE__)) . "/universal.php"); | |
return $globals; | |
} | |
function get_slave_settings($serid = 0, $setting_name = "") | |
{ | |
global $globals; | |
global $servers; | |
global $servergroups; | |
global $SETTINGS; | |
$SLAVE_SETTINGS = @unserialize($servers[$serid]["settings"]) or $ret = array( ); | |
foreach( $SETTINGS as $sk => $sv ) | |
{ | |
if( preg_match("/m/", $SETTINGS[$sk]) && array_key_exists($sk, $globals) ) | |
{ | |
$ret[$sk] = $globals[$sk]; | |
} | |
if( preg_match("/s/", $SETTINGS[$sk]) && array_key_exists($sk, $SLAVE_SETTINGS) ) | |
{ | |
$ret[$sk] = $SLAVE_SETTINGS[$sk]; | |
} | |
} | |
if( !empty($setting_name) ) | |
{ | |
return $ret[$setting_name]; | |
} | |
return $ret; | |
} | |
function os_arch() | |
{ | |
oexec("uname -a", $o, $r); | |
return (preg_match("/amd64|x86\\_64/is", $o) ? 64 : 32); | |
} | |
function cleanpath($path) | |
{ | |
$path = str_replace("\\\\", "/", $path); | |
$path = str_replace("\\", "/", $path); | |
return rtrim($path, "/"); | |
} | |
function pass_strength($passowrd) | |
{ | |
global $globals; | |
global $error; | |
$score = 0; | |
if( strlen($passowrd) < 4 ) | |
{ | |
$pass_strength = (int) (1.5 / 5 * 100); | |
return $pass_strength; | |
} | |
if( 7 < strlen($passowrd) ) | |
{ | |
$score += 1.5; | |
} | |
if( preg_match("/([a-z].*[A-Z])|([A-Z].*[a-z])/", $passowrd) ) | |
{ | |
$score += 1.5; | |
} | |
if( preg_match("/([a-zA-Z])/", $passowrd) && preg_match("/([0-9])/", $passowrd) ) | |
{ | |
$score += 1.5; | |
} | |
if( preg_match("/([!%&@#\$^*?_])/", $passowrd) && preg_match("/([a-zA-Z])/", $passowrd) ) | |
{ | |
$score += 1.5; | |
} | |
if( preg_match("/(.*[!%&@#\$^*?_].*[!%&@#\$^*?_])/", $passowrd) && preg_match("/([a-zA-Z])/", $passowrd) ) | |
{ | |
$score += 1.5; | |
} | |
if( $score < 2 ) | |
{ | |
$pass_strength = (int) ($score / 5 * 100); | |
} | |
if( $score == 2 ) | |
{ | |
$pass_strength = (int) ($score / 5 * 100); | |
} | |
else | |
{ | |
$pass_strength = (int) ($score / 5 * 100); | |
} | |
if( 100 < $pass_strength ) | |
{ | |
return 100; | |
} | |
return $pass_strength; | |
} | |
function win_pass_score($passowrd) | |
{ | |
global $globals; | |
global $error; | |
$score = 0; | |
if( preg_match("/[0-9]/", $passowrd) ) | |
{ | |
$score += 1; | |
} | |
if( preg_match("/[a-z]/", $passowrd) ) | |
{ | |
$score += 1; | |
} | |
if( preg_match("/[A-Z]/", $passowrd) ) | |
{ | |
$score += 1; | |
} | |
if( preg_match("/[^a-zA-Z0-9]/", $passowrd) ) | |
{ | |
$score += 1; | |
} | |
return $score; | |
} | |
function generateRandPwd($length) | |
{ | |
$string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#\$%&*"; | |
return substr(str_shuffle($string), 0, $length); | |
} | |
function get_meminfo($path = "/proc/meminfo", $data = "") | |
{ | |
if( empty($data) ) | |
{ | |
$data = explode("\n", file_get_contents($path)); | |
} | |
$meminfo = array( ); | |
foreach( $data as $line ) | |
{ | |
list($key, $val) = explode(":", $line); | |
$tmp_val = explode(" ", trim($val)); | |
$meminfo[$key] = (int) ($tmp_val[0] / 1024); | |
} | |
return $meminfo; | |
} | |
function new_vps_name($virt) | |
{ | |
global $globals; | |
global $error; | |
if( !empty($globals["disable_master_vpsname"]) ) | |
{ | |
return ""; | |
} | |
$res = makequery("DELETE FROM `vps_name`\n\t\t\tWHERE time <= (" . (time() - 1800) . ")"); | |
if( $virt == "openvz" || $virt == "vzo" ) | |
{ | |
$ret = 101; | |
$q = "SELECT vps_name FROM `vps` \n\t\t\tWHERE (vps_name * 1) rlike '^[0-9]*\$'\n\t\t\tAND virt = 'openvz' OR virt = 'vzo'\n\t\t\tORDER BY (vps_name * 1) DESC\n\t\t\tLIMIT 0, 1"; | |
} | |
else | |
{ | |
$ret = 1001; | |
$q = "SELECT vps_name FROM `vps` \n\t\t\tWHERE vps_name rlike '^[0-9]*\$'\n\t\t\tAND virt != 'openvz'\n\t\t\tORDER BY vps_name DESC\n\t\t\tLIMIT 0, 1"; | |
$res = makequery($q); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$row["vps_name"] = (int) str_replace("v", "", $row["vps_name"]); | |
if( $ret <= $row["vps_name"] ) | |
{ | |
$ret = $row["vps_name"] + 1; | |
} | |
} | |
$q = "SELECT vps_name FROM `vps` \n\t\t\tWHERE vps_name rlike '^v[0-9]*\$'\n\t\t\tAND virt != 'openvz'\n\t\t\tORDER BY substring(vps_name, 2)*1 DESC\n\t\t\tLIMIT 0, 1"; | |
} | |
$res = makequery($q); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$row["vps_name"] = (int) str_replace("v", "", $row["vps_name"]); | |
if( $ret <= $row["vps_name"] ) | |
{ | |
$ret = $row["vps_name"] + 1; | |
} | |
} | |
if( $virt == "openvz" || $virt == "vzo" ) | |
{ | |
$res = makequery("SELECT vpsname FROM vps_name \n\t\t\t\tWHERE virt = 'openvz' OR virt = 'vzo'\n\t\t\t\tORDER BY (vpsname * 1) DESC\n\t\t\t\tLIMIT 0, 1"); | |
} | |
else | |
{ | |
$res = makequery("SELECT vpsname FROM vps_name \n\t\t\t\tWHERE virt != 'openvz' && virt != 'vzo'\n\t\t\t\tORDER BY (vpsname * 1) DESC\n\t\t\t\tLIMIT 0, 1"); | |
} | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( $ret <= $row["vpsname"] ) | |
{ | |
$ret = $row["vpsname"] + 1; | |
} | |
} | |
$res = makequery("INSERT INTO vps_name \n\t\t\t\tSET vpsname = '" . $ret . "',\n\t\t\t\tvirt = '" . $virt . "',\n\t\t\t\tserid='" . $globals["server"] . "',\n\t\t\t\ttime = '" . time() . "'"); | |
if( $virt == "openvz" || $virt == "proxo" || $virt == "proxl" || $virt == "proxk" || $virt == "vzo" ) | |
{ | |
return $ret; | |
} | |
return "v" . $ret; | |
} | |
function mask2cidr($mask) | |
{ | |
if( $mask == "0.0.0.0" ) | |
{ | |
return 0; | |
} | |
$long = ip2long($mask); | |
$base = ip2long("255.255.255.255"); | |
return 32 - log(($long ^ $base) + 1, 2); | |
} | |
function to_master($table, $column, $id, $unique_column, $value) | |
{ | |
if( $column == "array" && is_array($value) ) | |
{ | |
$value = serialize($value); | |
} | |
$res = makequery("INSERT INTO to_master SET\n\t\t\t\t\t`tables` = :tables,\n\t\t\t\t\t`columns` = :columns,\n\t\t\t\t\t`id` = :id,\n\t\t\t\t\t`unique_column` = :unique_column,\n\t\t\t\t\t`value` = :value\n\t\t\t\t\tON DUPLICATE KEY UPDATE \n\t\t\t\t\t\t`tables` = :tables,\n\t\t\t\t\t\t`columns` = :columns,\n\t\t\t\t\t\t`id` = :id,\n\t\t\t\t\t\t`unique_column` = :unique_column,\n\t\t\t\t\t\t`value` = :value", array( ":tables" => $table, ":columns" => $column, ":id" => $id, ":unique_column" => $unique_column, ":value" => $value )); | |
if( vsql_num_rows($res) < 1 ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function give_to_master_data() | |
{ | |
global $globals; | |
if( is_slave() && !is_api_call(1) ) | |
{ | |
return false; | |
} | |
$res = makequery("SELECT * FROM to_master"); | |
$to_master = array( ); | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$to_master[$row["tables"]][$row["id"]][$row["columns"]] = $row; | |
} | |
$res = makequery("TRUNCATE to_master"); | |
return $to_master; | |
} | |
function save_to_master_data($data, $serid) | |
{ | |
if( empty($data) ) | |
{ | |
return false; | |
} | |
foreach( $data as $tables => $tabledata ) | |
{ | |
if( $tables == "tasks" ) | |
{ | |
if( !is_master() ) | |
{ | |
continue; | |
} | |
$keys = implode(",", array_keys($tabledata)); | |
$res = makequery("SELECT actid, slaveactid FROM `tasks` \n\t\t\t\t\t\t\tWHERE slaveactid IN (" . ((empty($keys) ? "-1000" : $keys)) . ")\n\t\t\t\t\t\t\tAND serid = '" . $serid . "'"); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$found[$row["slaveactid"]] = $row["actid"]; | |
} | |
foreach( $tabledata as $id => $columndata ) | |
{ | |
$qval = array( ); | |
$token_vals = array( ); | |
foreach( $columndata as $cols => $values ) | |
{ | |
if( $cols == "array" ) | |
{ | |
$tmp = unserialize($values["value"]); | |
foreach( $tmp as $tk => $tv ) | |
{ | |
$token_vals[":" . $tk] = $tv; | |
} | |
continue; | |
} | |
else | |
{ | |
$token_vals[":" . $cols] = $values["value"]; | |
} | |
} | |
if( empty($found[$id]) ) | |
{ | |
$query_table = "INSERT INTO tasks SET "; | |
$token_vals[":slaveactid"] = $id; | |
$token_vals[":serid"] = $serid; | |
$where = ""; | |
} | |
else | |
{ | |
$query_table = "UPDATE tasks SET "; | |
$where = "`slaveactid` = '" . $id . "' AND serid = '" . $serid . "'"; | |
} | |
unset($token_vals[":actid"]); | |
foreach( $token_vals as $ck => $cv ) | |
{ | |
$qval[$ck] = "`" . substr($ck, 1) . "` = " . $ck; | |
} | |
$query = $query_table . implode(",", $qval) . ((empty($where) ? "" : " WHERE " . $where)); | |
$_res = makequery($query, $token_vals); | |
} | |
continue; | |
} | |
else | |
{ | |
$query_table = "UPDATE " . $tables . " SET "; | |
foreach( $tabledata as $id => $columndata ) | |
{ | |
$qval = array( ); | |
$token_vals = array( ); | |
foreach( $columndata as $cols => $values ) | |
{ | |
$qval[$cols] = "`" . $cols . "` = :" . $cols; | |
$token_vals[":" . $cols] = $values["value"]; | |
$token_vals[":where"] = $id; | |
$where = "`" . $values["unique_column"] . "` = :where"; | |
} | |
$query = $query_table . implode(",", $qval) . " WHERE " . $where; | |
$_res = makequery($query, $token_vals); | |
} | |
} | |
} | |
} | |
function get_recipe($rid = "") | |
{ | |
global $globals; | |
$recipes = array( ); | |
if( empty($rid) ) | |
{ | |
return false; | |
} | |
$where = " WHERE rid = '" . $rid . "'"; | |
$res = makequery("SELECT * FROM recipes " . $where); | |
if( vsql_num_rows($res) < 0 ) | |
{ | |
return $recipes; | |
} | |
return vsql_fetch_assoc($res); | |
} | |
function getall_bw_info($start, $end) | |
{ | |
$vpses = array( ); | |
$res = makequery("SELECT v.vpsid,v.time as creation_date,v.uid,b.*\n\t\t\t\t\tFROM vps v \n\t\t\t\t\tLEFT JOIN bandwidth b ON v.vpsid = b.vpsid\n\t\t\t\t\tWHERE b.date >= '" . $start . "' AND b.date <= '" . $end . "' AND b.time = 0 AND v.serid=0"); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$vpses[$row["vpsid"]]["bandwidth"][$row["date"]]["in"] = $row["in"]; | |
$vpses[$row["vpsid"]]["bandwidth"][$row["date"]]["out"] = $row["out"]; | |
$vpses[$row["vpsid"]]["user"] = $row["uid"]; | |
$vpses[$row["vpsid"]]["creation_date"] = $row["creation_date"]; | |
} | |
return $vpses; | |
} | |
function get_map_data($ip_address) | |
{ | |
$address = array( ); | |
if( empty($ip_address) ) | |
{ | |
return false; | |
} | |
$address = get_softaculous_file("http://s2.softaculous.com/a/virtualizor/ip_location.php?ip=" . $ip_address); | |
return $address; | |
} | |
function valid_date($date) | |
{ | |
if( strlen($date) != 10 ) | |
{ | |
return false; | |
} | |
$day = (int) substr($date, 0, 2); | |
$month = (int) substr($date, 3, 2); | |
$year = (int) substr($date, 6, 4); | |
if( $year < 0 ) | |
{ | |
return false; | |
} | |
if( $month < 0 || 12 < $month ) | |
{ | |
return false; | |
} | |
if( $day < 0 || 31 < $day ) | |
{ | |
return false; | |
} | |
if( mktime(0, 0, 0, $month, $day, $year) < 0 ) | |
{ | |
return false; | |
} | |
return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2); | |
} | |
function valid_time($time, $date = "") | |
{ | |
if( strlen($time) != 8 ) | |
{ | |
return false; | |
} | |
$hour = (int) substr($time, 0, 2); | |
$minute = (int) substr($time, 3, 2); | |
$second = (int) substr($time, 6, 2); | |
if( $hour < 0 || 23 < $hour ) | |
{ | |
return false; | |
} | |
if( $minute < 0 || 59 < $minute ) | |
{ | |
return false; | |
} | |
if( $second < 0 || 59 < $second ) | |
{ | |
return false; | |
} | |
if( !empty($date) ) | |
{ | |
if( !valid_date($date) ) | |
{ | |
return false; | |
} | |
$day = (int) substr($date, 0, 2); | |
$month = (int) substr($date, 3, 2); | |
$year = (int) substr($date, 6, 4); | |
$unixtime = mktime($hour, $minute, $second, $month, $day, $year); | |
if( $unixtime < 0 ) | |
{ | |
return false; | |
} | |
return $unixtime; | |
} | |
return true; | |
} | |
function valid_datetime($datetime) | |
{ | |
if( strlen($datetime) != 12 ) | |
{ | |
return false; | |
} | |
$year = (int) substr($datetime, 0, 4); | |
$month = (int) substr($datetime, 4, 2); | |
$day = (int) substr($datetime, 6, 2); | |
$hour = (int) substr($datetime, 8, 2); | |
$minute = (int) substr($datetime, 10, 2); | |
if( $year < 0 ) | |
{ | |
return false; | |
} | |
if( $month < 0 || 12 < $month ) | |
{ | |
return false; | |
} | |
if( $day < 0 || 31 < $day ) | |
{ | |
return false; | |
} | |
if( $hour < 0 || 23 < $hour ) | |
{ | |
return false; | |
} | |
if( $minute < 0 || 59 < $minute ) | |
{ | |
return false; | |
} | |
if( mktime($hour, $minute, 0, $month, $day, $year) < 0 ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function datetime_to_time($datetime) | |
{ | |
if( strlen($datetime) != 12 ) | |
{ | |
return false; | |
} | |
$year = (int) substr($datetime, 0, 4); | |
$month = (int) substr($datetime, 4, 2); | |
$day = (int) substr($datetime, 6, 2); | |
$hour = (int) substr($datetime, 8, 2); | |
$minute = (int) substr($datetime, 10, 2); | |
return mktime($hour, $minute, 0, $month, $day, $year); | |
} | |
function proxmox_api_call() | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
if( is_object($pve2) ) | |
{ | |
return $pve2; | |
} | |
require_once($globals["mainfiles"] . "/classes/pve2_api.class.php"); | |
if( !empty($globals["proxmox_server_pass"]) ) | |
{ | |
$proxmox_server_pass = (!empty($globals["proxmox_server_pass_salt"]) ? pass_decrypt($globals["proxmox_server_pass"], $globals["proxmox_server_pass_salt"]) : $globals["proxmox_server_pass"]); | |
$pve2 = new PVE2_API("127.0.0.1", "root", "pam", $proxmox_server_pass); | |
if( $pve2->login() ) | |
{ | |
return $pve2; | |
} | |
$error[] = "Api call failed"; | |
return false; | |
} | |
$error[] = "Server Password validation failed"; | |
return false; | |
} | |
function proxmox_post_call($action, $path, $post = array( )) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
proxmox_api_call(); | |
$first_node = get_proxmox_node($globals["proxmox_server_name"]); | |
return $pve2->post("/" . $action . "/" . $first_node . $path, $post); | |
} | |
function proxmox_put_call($action, $path, $put = array( )) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
proxmox_api_call(); | |
$first_node = get_proxmox_node($globals["proxmox_server_name"]); | |
return $pve2->put("/" . $action . "/" . $first_node . $path, $put); | |
} | |
function proxmox_del_call($action, $path, $post = array( )) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
proxmox_api_call(); | |
$first_node = get_proxmox_node($globals["proxmox_server_name"]); | |
return $pve2->delete("/" . $action . "/" . $first_node . $path); | |
} | |
function proxmox_get_call($action, $path) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
proxmox_api_call(); | |
$first_node = get_proxmox_node($globals["proxmox_server_name"]); | |
return $pve2->get("/" . $action . "/" . $first_node . $path); | |
} | |
function get_proxmox_node($proxserver_name) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
global $first_node; | |
if( !is_object($pve2) ) | |
{ | |
proxmox_api_call(); | |
} | |
if( !empty($first_node) ) | |
{ | |
return $first_node; | |
} | |
if( !empty($error) ) | |
{ | |
return false; | |
} | |
$node_info = $pve2->get("/nodes"); | |
if( is_array($node_info) ) | |
{ | |
foreach( $node_info as $k => $v ) | |
{ | |
$server_name = $node_info[$k]["node"]; | |
$server_info[$server_name] = $v; | |
$server_info_key[$server_name] = $v["node"]; | |
} | |
} | |
if( array_key_exists($proxserver_name, $server_info) ) | |
{ | |
$first_node = array_search($proxserver_name, $server_info_key); | |
return $first_node; | |
} | |
} | |
function get_proxmox_storage() | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
global $first_node; | |
if( !is_object($pve2) ) | |
{ | |
proxmox_api_call(); | |
} | |
if( !empty($error) ) | |
{ | |
return false; | |
} | |
$storage_info = $pve2->get("/storage"); | |
if( is_array($storage_info) ) | |
{ | |
foreach( $storage_info as $k => $v ) | |
{ | |
$storage_name = $storage_info[$k]["storage"]; | |
$storage_details[$storage_name] = $v; | |
} | |
} | |
return $storage_details; | |
} | |
function put_proxmox_storage($storage_data) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
global $first_node; | |
if( !is_object($pve2) ) | |
{ | |
proxmox_api_call(); | |
} | |
if( !empty($storage_data) ) | |
{ | |
if( $storage_data["type"] == "file" ) | |
{ | |
$pve2->post("/storage", array( "storage" => $storage_data["name"], "type" => "dir", "path" => $storage_data["path"], "content" => "images,rootdir" )); | |
sleep(2); | |
return NULL; | |
} | |
if( $storage_data["type"] == "block" ) | |
{ | |
$vg_name = explode("/", $storage_data["path"]); | |
$pve2->post("/storage", array( "storage" => $storage_data["name"], "type" => "lvm", "vgname" => $vg_name[2], "content" => "images,rootdir" )); | |
sleep(2); | |
return NULL; | |
} | |
if( preg_match("/zfs/is", $storage_data["type"]) ) | |
{ | |
$zfspool = $disk_path = str_replace("/dev/zvol/", "", $storage_data["path"]); | |
$pve2->post("/storage", array( "storage" => $storage_data["name"], "type" => "zfspool", "pool" => $zfspool, "content" => "images,rootdir" )); | |
sleep(2); | |
return NULL; | |
} | |
if( preg_match("/thin/is", $storage_data["type"]) ) | |
{ | |
$thin_pool = explode("/", $storage_data["path"]); | |
$pve2->post("/storage", array( "storage" => $storage_data["name"], "type" => "lvmthin", "thinpool" => $thin_pool[3], "vgname" => $thin_pool[2], "content" => "images,rootdir" )); | |
sleep(2); | |
} | |
} | |
} | |
function del_proxmox_storage($storage_name) | |
{ | |
global $globals; | |
global $error; | |
global $pve2; | |
global $first_node; | |
if( !is_object($pve2) ) | |
{ | |
proxmox_api_call(); | |
} | |
if( !empty($storage_name) ) | |
{ | |
$pve2->delete("/storage/" . $storage_name); | |
sleep(2); | |
} | |
} | |
function callback_api_call($vpsid, $act, $data = array( )) | |
{ | |
global $globals; | |
if( empty($act) || empty($globals["cb_hash"]) || empty($globals["cb_url"]) ) | |
{ | |
return false; | |
} | |
$post["hash"] = $globals["cb_hash"]; | |
$post["act"] = $act; | |
$post["vpsid"] = (int) $vpsid; | |
$url = ((empty($globals["cb_use_https"]) ? "http://" : "https://")) . $globals["cb_url"]; | |
if( !empty($data) ) | |
{ | |
$post["data"] = base64_encode(serialize($data)); | |
} | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL, $url); | |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (!empty($GLOBALS["globals"]["curl_timeout"]) ? $GLOBALS["globals"]["curl_timeout"] : 3)); | |
curl_setopt($ch, CURLOPT_TIMEOUT, 3600); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | |
curl_setopt($ch, CURLOPT_USERAGENT, "Softaculous"); | |
if( !empty($post) ) | |
{ | |
curl_setopt($ch, CURLOPT_POST, 1); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); | |
} | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | |
$resp = curl_exec($ch); | |
$curl_err = curl_error($ch); | |
curl_close($ch); | |
if( empty($resp) ) | |
{ | |
return false; | |
} | |
return trim($resp); | |
} | |
function emaillog($msg, $debug_level) | |
{ | |
global $globals; | |
if( !empty($globals["mail_debug"]) ) | |
{ | |
file_put_contents(logdir("email") . "email.log", "[" . datify(time(), 0, 1, "Y-m-d H:i:s") . "] " . $msg . "\n"); | |
} | |
} | |
function generate_email_otp($user) | |
{ | |
global $globals; | |
global $l; | |
global $error; | |
$otp = rand(100000, 999999); | |
$user["uid"] = (empty($user["uid"]) ? "0" : $user["uid"]); | |
$res = makequery("INSERT INTO user_meta\tSET \n\t\t\t\t\tuid = :uid,\n\t\t\t\t\tmeta_value = :meta_value,\n\t\t\t\t\tmeta_key = :meta_key\n\t\t\t\t\tON DUPLICATE KEY UPDATE\n\t\t\t\t\t\tuid = :uid,\n\t\t\t\t\t\tmeta_value = :meta_value,\n\t\t\t\t\t\tmeta_key = :meta_key", array( ":uid" => $user["uid"], ":meta_value" => $otp, ":meta_key" => "valid_otp" )); | |
$res = makequery("INSERT INTO user_meta\tSET \n\t\t\t\t\tuid = :uid,\n\t\t\t\t\tmeta_value = :meta_value,\n\t\t\t\t\tmeta_key = :meta_key\n\t\t\t\t\tON DUPLICATE KEY UPDATE\n\t\t\t\t\t\tuid = :uid,\n\t\t\t\t\t\tmeta_value = :meta_value,\n\t\t\t\t\t\tmeta_key = :meta_key", array( ":uid" => $user["uid"], ":meta_value" => time() + 900, ":meta_key" => "email_otp_expiry" )); | |
if( empty($error) ) | |
{ | |
return $otp; | |
} | |
return false; | |
} | |
function os_check($distro = "", $operator = "", $version = "", $value = true) | |
{ | |
global $error; | |
global $globals; | |
global $kernel; | |
global $servers; | |
global $cluster; | |
$os_name = $servers[0]["os"]; | |
$distro = strtolower($distro); | |
if( $distro == "centos" || $distro == "sl" ) | |
{ | |
$distro = "rhel"; | |
} | |
if( $distro == "debian" ) | |
{ | |
$distro = "ubuntu"; | |
} | |
$matched = os_distro_check($distro); | |
if( !$matched ) | |
{ | |
return false; | |
} | |
if( empty($operator) ) | |
{ | |
return $value; | |
} | |
if( $distro == "rhel" || $distro == "xcp" ) | |
{ | |
$tmp = preg_split("/release/is", $os_name); | |
$os_version = trim(substr(trim($tmp[1]), 0, 5)); | |
if( version_compare($os_version, $version, $operator) ) | |
{ | |
return $value; | |
} | |
return false; | |
} | |
if( $distro == "ubuntu" ) | |
{ | |
$tmp = explode(" ", $os_name); | |
$os_version = trim($tmp[1]); | |
if( version_compare($os_version, $version, $operator) ) | |
{ | |
return $value; | |
} | |
return false; | |
} | |
return false; | |
} | |
function os_distro_check($distro = "", $value = true) | |
{ | |
global $error; | |
global $globals; | |
global $kernel; | |
global $servers; | |
$os_name = $servers[0]["os"]; | |
$distro = strtolower($distro); | |
if( $distro == "centos" || $distro == "sl" ) | |
{ | |
$distro = "rhel"; | |
} | |
if( $distro == "debian" ) | |
{ | |
$distro = "ubuntu"; | |
} | |
if( $distro == "rhel" ) | |
{ | |
if( preg_match("/centos|Red Hat|Scientific/is", $os_name) ) | |
{ | |
return $value; | |
} | |
return false; | |
} | |
if( $distro == "xcp" ) | |
{ | |
if( preg_match("/xenserver/is", $os_name) ) | |
{ | |
return $value; | |
} | |
return false; | |
} | |
if( $distro == "ubuntu" ) | |
{ | |
if( preg_match("/ubuntu|debian/is", $os_name) ) | |
{ | |
return $value; | |
} | |
return false; | |
} | |
return false; | |
} | |
function lockvps($vpsid, $reason = "") | |
{ | |
$res = makequery("UPDATE `vps`\n\t\t\t\t\tSET locked = :locked\n\t\t\t\t\tWHERE vpsid = :vpsid", array( ":locked" => serialize(array( "time" => time(), "reason" => $reason )), ":vpsid" => $vpsid )); | |
if( !$res ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function unlockvps($vpsid) | |
{ | |
$res = makequery("UPDATE `vps`\n\t\t\t\t\tSET locked = ''\n\t\t\t\t\tWHERE vpsid = :vpsid", array( ":vpsid" => $vpsid )); | |
if( !$res ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function validate_speed_cap($speed_cap_down, $speed_cap_up, $network_speed, $upload_speed) | |
{ | |
global $l; | |
global $error; | |
if( $speed_cap_down < 0 || !empty($network_speed) && $network_speed < $speed_cap_down ) | |
{ | |
$error["speed_cap_down"] = $l["speed_cap_down_inv"] . ": " . $speed_cap_down; | |
} | |
if( $speed_cap_up < 0 || $upload_speed < 0 && 0 < $network_speed && $network_speed < $speed_cap_up || 0 < $upload_speed && $upload_speed < $speed_cap_up ) | |
{ | |
$error["speed_cap_up"] = $l["speed_cap_up_inv"] . ": " . $speed_cap_up; | |
} | |
return $error; | |
} | |
function validate_ports_list($ports_list, $all_ports = "", $not_in = 0) | |
{ | |
global $error; | |
unset($error["validate_ports_list"]); | |
if( empty($ports_list) ) | |
{ | |
return $ports_list; | |
} | |
$err_ports = array( ); | |
$in_all_ports = array( ); | |
$not_in_all_ports = array( ); | |
$tmp = preg_split("/\\s*\\,\\s*/", trim($ports_list)); | |
$found = false; | |
if( !empty($all_ports) ) | |
{ | |
$all_ports = preg_split("/\\s*\\,\\s*/", trim($all_ports)); | |
} | |
$returnportlist = ""; | |
foreach( $tmp as $k => $v ) | |
{ | |
$tmp_v = array( ); | |
if( preg_match("/\\s*\\-\\s*/", $v) ) | |
{ | |
$vtmp = preg_split("/\\s*\\-\\s*/", $v); | |
if( $vtmp[1] < $vtmp[0] ) | |
{ | |
$err_ports[] = $vtmp[0] . "-" . $vtmp[1]; | |
continue; | |
} | |
$tmp_v[] = trim($vtmp[0]); | |
$tmp_v[] = trim($vtmp[1]); | |
} | |
else | |
{ | |
$tmp_v[] = $v; | |
} | |
$returnportlist .= $v . ","; | |
foreach( $tmp_v as $m => $n ) | |
{ | |
if( !preg_match("/^\\d{1,5}\$/", $n) || $n <= 0 || pow(2, 16) <= $n ) | |
{ | |
$err_ports[] = $n; | |
} | |
if( is_array($all_ports) ) | |
{ | |
foreach( $all_ports as $x => $y ) | |
{ | |
$found = false; | |
if( preg_match("/\\s*\\-\\s*/", $y) ) | |
{ | |
$ytmp = preg_split("/\\s*\\-\\s*/", $y); | |
if( $ytmp[1] < $ytmp[0] ) | |
{ | |
$err_ports[] = $ytmp[0] . "-" . $ytmp[1]; | |
continue; | |
} | |
if( $ytmp[0] <= $n && $n <= $ytmp[1] ) | |
{ | |
$found = true; | |
} | |
} | |
else | |
{ | |
if( $n == $y ) | |
{ | |
$found = true; | |
} | |
} | |
if( $found ) | |
{ | |
break; | |
} | |
} | |
} | |
if( $found == true ) | |
{ | |
$in_all_ports[] = $n; | |
} | |
else | |
{ | |
$not_in_all_ports[] = $n; | |
} | |
} | |
} | |
if( !empty($all_ports) ) | |
{ | |
if( !empty($in_all_ports) && empty($not_in) ) | |
{ | |
$error["validate_ports_list"] = $in_all_ports; | |
return false; | |
} | |
if( !empty($not_in_all_ports) && !empty($not_in) ) | |
{ | |
$error["validate_ports_list"] = $not_in_all_ports; | |
return false; | |
} | |
} | |
else | |
{ | |
if( !empty($err_ports) ) | |
{ | |
$error["validate_ports_list"] = $err_ports; | |
return false; | |
} | |
} | |
return trim($returnportlist, ","); | |
} | |
function vdf_no_duplicates($new, $serid) | |
{ | |
$res = makequery("SELECT *\n\t\t\t\t\tFROM haproxy\n\t\t\t\t\tWHERE serid=:serid AND src_hostname=:src_hostname AND src_port=:src_port", array( ":serid" => $serid, ":src_hostname" => $new["src_hostname"], "src_port" => $new["src_port"] )); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
return false; | |
} | |
return true; | |
} | |
function log_message($path, $msg, $echo = 0) | |
{ | |
global $globals; | |
$msg = "[" . gmdate("D M d, Y H:i:s T", time()) . "] " . $msg . "\n"; | |
if( $echo == 1 ) | |
{ | |
echo $msg; | |
} | |
file_put_contents($path, $msg, FILE_APPEND); | |
} | |
function save_haproxy() | |
{ | |
global $globals; | |
$empty_config = 0; | |
$haconftemplate = "/usr/local/virtualizor/conf/haproxy_template.dat"; | |
$haproxybin = "/usr/sbin/haproxy"; | |
$haproxycfg = "/etc/haproxy/haproxy.cfg"; | |
$iptablescfg = (os_distro_check("debian", 1) ? "/etc/iptables/rules.v4" : "/etc/sysconfig/iptables"); | |
$virt_halog_path = logdir("haproxy") . "/haproxy.log"; | |
if( !empty($globals["haproxy_enable"]) ) | |
{ | |
$actid = tasks_admin_process("haproxy_cron", array( )); | |
task_start($actid); | |
task_update($actid, "Checking if HAProxy binary installed or not", 5); | |
if( !file_exists($haproxybin) ) | |
{ | |
$msg = "Installing HAProxy, as HAProxy binary not found"; | |
task_update($actid, $msg, 10); | |
log_message($virt_halog_path, $msg); | |
log_message(logdir("haproxy") . "haproxyinstall.log", $msg); | |
$install_bin = (distro_check(0, 0, 1) ? "apt-get" : "yum"); | |
vexec($install_bin . " -y install haproxy 2>&1 >> " . logdir("haproxy") . "haproxyinstall.log", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to install haproxy\nError: " . print_r($o, 1); | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg); | |
log_message(logdir("haproxy") . "haproxyinstall.log", $msg); | |
return false; | |
} | |
$msg = "HAProxy binary installed"; | |
log_message($virt_halog_path, $msg); | |
log_message(logdir("haproxy") . "haproxyinstall.log", $msg); | |
task_update($actid, $msg, 45); | |
$msg = "Enabling TPROXY kernel module"; | |
log_message($virt_halog_path, $msg); | |
vexec("modprobe xt_TPROXY 2>&1 >> " . logdir("haproxy") . "haproxyinstall.log", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to enable TPROXY kernel module\nError: " . print_r($o, 1); | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg); | |
return false; | |
} | |
$msg = "TPROXY kernel module enabled"; | |
log_message($virt_halog_path, $msg); | |
$msg = "Adding IPtables Mangle Rules"; | |
log_message($virt_halog_path, $msg); | |
$mangle_rules_reload = "ip route del local 0.0.0.0/0 dev lo table 100;\nip rule del fwmark 111 lookup 100;\niptables -t mangle -D DIVERT -j ACCEPT;\niptables -t mangle -D DIVERT -j MARK --set-mark 111;\niptables -t mangle -D PREROUTING -p tcp -m socket -j DIVERT;\niptables -t mangle -X DIVERT;\n\niptables -t mangle -N DIVERT;\niptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT;\niptables -t mangle -A DIVERT -j MARK --set-mark 111;\niptables -t mangle -A DIVERT -j ACCEPT;\nip rule add fwmark 111 lookup 100;\nip route add local 0.0.0.0/0 dev lo table 100;"; | |
vexec($mangle_rules_reload, $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to add mangle rules for transparent proxy\nError:\n" . print_r($o, 1); | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg); | |
return false; | |
} | |
$msg = "Added mangle rules and route entry"; | |
log_message($virt_halog_path, $msg); | |
$msg = "Adding MASQUERADE rules for transparent proxy"; | |
log_message($virt_halog_path, $msg); | |
$interface = (!empty($globals["interface"]) ? $globals["interface"] : "eth0"); | |
if( server_virt(0, "xen") == "xen" || server_virt(0, "kvm") == "kvm" ) | |
{ | |
$interface = "viifbr0"; | |
} | |
if( server_virt(0, "xcp") == "xcp" ) | |
{ | |
$interface = "xenbr0"; | |
} | |
$masquerade_reload = "iptables -t nat -D POSTROUTING -o " . $interface . " -j MASQUERADE; iptables -t nat -A POSTROUTING -o " . $interface . " -j MASQUERADE"; | |
vexec($masquerade_reload, $o, $r); | |
if( $r ) | |
{ | |
$msg = "Failed to add MASQUERADE rules for transparent proxy\nError:\n" . print_r($o, 1); | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg); | |
return false; | |
} | |
vexec("iptables-save > " . $iptablescfg, $o, $r); | |
if( $r ) | |
{ | |
$msg = "Failed to save iptables rules\nErrors:\n" . print_r($o, 1); | |
log_message($virt_halog_path, $msg); | |
} | |
else | |
{ | |
$msg = "Saved iptables rules"; | |
log_message($virt_halog_path, $msg); | |
} | |
$msg = "Added MASQUERADE rules"; | |
log_message($virt_halog_path, $msg); | |
chkconfig("haproxy", 99); | |
$msg = "Enabling HAProxy logging in rsyslod"; | |
log_message($virt_halog_path, $msg); | |
$logconf = "/etc/rsyslog.d/haproxylogs.conf"; | |
$content = "\$ModLoad imudp\n\$UDPServerRun 514\nlocal2.*" . "\t" . "/var/log/haproxy.log"; | |
if( !file_put_contents($logconf, $content) ) | |
{ | |
$msg = "Failed to write log configuration to file " . $logconf . "\n"; | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg); | |
return false; | |
} | |
$msg = "Wrote the log configuration, restarting rsyslog service" . $logconf; | |
log_message($virt_halog_path, $msg); | |
vexec("service rsyslog restart", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to restart rsyslog service\nErrors:\n" . print_r($o, 1); | |
task_update($actid, $msg, 46); | |
log_message($virt_halog_path, $msg); | |
} | |
$msg = "Restarted rsyslog service"; | |
log_message($virt_halog_path, $msg); | |
$msg = "HAProxy installation completed"; | |
log_message($virt_halog_path, $msg); | |
} | |
else | |
{ | |
$msg = "HAProxy already installed"; | |
task_update($actid, $msg, 46); | |
log_message($virt_halog_path, $msg); | |
} | |
$msg = "Rebuilding HAProxy configuration"; | |
task_update($actid, $msg, 50); | |
log_message($virt_halog_path, $msg); | |
$res = makequery("select * from haproxy where serid = 0"); | |
$vdfdata = array( ); | |
$srcports = array( ); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
for( $i = 1; $i <= vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$distinct_src_ports[$row["src_port"]] = $row["src_port"]; | |
$vdfdata[$row["id"]] = $row; | |
} | |
$frontend_str = "frontend mainfrontend\nmode tcp\noption tcplog" . "\n"; | |
$backend_common_str = "mode tcp\noption tcplog\nsource 0.0.0.0 usesrc clientip\nserver server_"; | |
$backends_str = ""; | |
$bind_ports = array( ); | |
$front_use_backendlist = array( ); | |
$backends = array( ); | |
$tc_req_acpt = array( ); | |
$acl_host = array( ); | |
$acl_port = array( ); | |
$skipped_rec = array( ); | |
$remove_skipped_rec_entry = array( ); | |
$server_config = get_slave_settings(0); | |
$server_public_ip = server_publicip(0); | |
$server_src_ips = (empty($globals["haproxy_src_ips"]) ? array( $server_public_ip ) : preg_split("/\\s*\\,\\s*/", trim($globals["haproxy_src_ips"]))); | |
if( !empty($globals["le_primary_domain"]) && !empty($globals["le_verify"]) ) | |
{ | |
$vdfdata["local80"] = array( "id" => "local80", "vpsuuid" => -1, "serid" => 0, "protocol" => "HTTP", "src_hostname" => $globals["le_primary_domain"], "src_port" => 80, "dest_ip" => "127.0.0.1", "dest_port" => 4082 ); | |
} | |
foreach( $vdfdata as $k => $v ) | |
{ | |
$skipped_rec[$k] = array( ); | |
if( $v["protocol"] == "TCP" ) | |
{ | |
if( !in_array($v["src_hostname"], $server_src_ips) ) | |
{ | |
$skipped_rec[$k]["haproxy_src_ips"] = 1; | |
} | |
if( !validate_ports_list($v["src_port"], $server_config["haproxy_reservedports_http"]) ) | |
{ | |
$skipped_rec[$k]["haproxy_reservedports_http"] = 1; | |
} | |
} | |
if( !validate_ports_list($v["src_port"], $server_config["haproxy_allowedports"], 1) ) | |
{ | |
$skipped_rec[$k]["haproxy_allowedports"] = 1; | |
} | |
if( !validate_ports_list($v["src_port"], $server_config["haproxy_reservedports"]) ) | |
{ | |
$skipped_rec[$k]["haproxy_reservedports"] = 1; | |
} | |
if( !empty($skipped_rec[$k]) ) | |
{ | |
continue; | |
} | |
$name = $v["dest_ip"] . "_" . $v["dest_port"]; | |
$backend_server = $v["dest_ip"] . ":" . $v["dest_port"]; | |
$acl_port["acl_p_" . $v["src_port"]] = "dst_port " . $v["src_port"]; | |
$use_backend_priority = ($v["src_port"] != $v["dest_port"] ? ($v["protocol"] != "TCP" ? 0 : 1) : ($v["protocol"] != "TCP" ? 2 : 3)); | |
$backend_name = "backend_" . $name; | |
if( $v["protocol"] == "HTTP" || $v["protocol"] == "HTTPS" ) | |
{ | |
foreach( $server_src_ips as $kk => $vv ) | |
{ | |
$bind_ports[$vv][$v["src_port"]] = "bind " . $vv . ":" . $v["src_port"]; | |
} | |
$act_http_check = "hdr(Host)"; | |
$acl_host["acl_h_" . $v["src_hostname"]] = $act_http_check . " -i -m reg ^" . $v["src_hostname"]; | |
$tc_req_acpt["acl_h_" . $v["src_hostname"]] = "tcp-request content accept if acl_h_" . $v["src_hostname"]; | |
$front_use_backendlist[$use_backend_priority][$v["src_hostname"] . "_" . $v["src_port"]] = "use_backend " . $backend_name . " if acl_h_" . $v["src_hostname"] . " acl_p_" . $v["src_port"]; | |
if( $v["protocol"] == "HTTPS" ) | |
{ | |
$act_http_check = "req_ssl_sni"; | |
$acl_host["acl_hs_" . $v["src_hostname"]] = $act_http_check . " -i -m reg ^" . $v["src_hostname"] . "(:\\d+)*"; | |
$tc_req_acpt["acl_hs_" . $v["src_hostname"]] = "tcp-request content accept if { req_ssl_hello_type 1 } acl_hs_" . $v["src_hostname"]; | |
$front_use_backendlist[$use_backend_priority][$v["src_hostname"] . "_" . $v["src_port"]] .= "\n\t" . "use_backend " . $backend_name . " if acl_hs_" . $v["src_hostname"] . " acl_p_" . $v["src_port"]; | |
} | |
} | |
else | |
{ | |
if( $v["protocol"] == "TCP" ) | |
{ | |
$bind_ports[$v["src_hostname"]][$v["src_port"]] = "bind " . $v["src_hostname"] . ":" . $v["src_port"]; | |
$front_use_backendlist[$use_backend_priority][$v["src_hostname"] . "_" . $v["src_port"]] = "use_backend " . $backend_name . " if { dst " . $v["src_hostname"] . " } acl_p_" . $v["src_port"]; | |
} | |
} | |
$backends[$backend_name] = "backend " . $backend_name . "\n" . $backend_common_str . $name . " " . $backend_server . "\n"; | |
if( $v["vpsuuid"] == -1 ) | |
{ | |
$backends[$backend_name] = preg_replace("/(\\nsource.+clientip)/", "", $backends[$backend_name]); | |
} | |
} | |
if( !empty($skipped_rec) ) | |
{ | |
$query = ""; | |
foreach( $skipped_rec as $k => $v ) | |
{ | |
$query .= "UPDATE haproxy SET skipped='" . ((!empty($v) ? serialize($v) : "")) . "' WHERE id='" . $k . "';"; | |
} | |
makequery($query); | |
} | |
foreach( $bind_ports as $k => $v ) | |
{ | |
foreach( $v as $kk => $vv ) | |
{ | |
$frontend_str .= "\t" . $vv . "\n"; | |
} | |
} | |
$frontend_str .= "\n"; | |
foreach( $acl_host as $k => $v ) | |
{ | |
$frontend_str .= "\t" . "acl " . $k . " " . $v . "\n"; | |
} | |
$frontend_str .= "\n"; | |
foreach( $acl_port as $k => $v ) | |
{ | |
$frontend_str .= "\t" . "acl " . $k . " " . $v . "\n"; | |
} | |
$frontend_str .= "\n\ttcp-request inspect-delay\t100ms" . "\n"; | |
foreach( $tc_req_acpt as $k => $v ) | |
{ | |
$frontend_str .= "\t" . $v . "\n"; | |
} | |
$frontend_str .= "\n"; | |
for( $i = 0; $i < 4; $i++ ) | |
{ | |
if( !empty($front_use_backendlist[$i]) ) | |
{ | |
foreach( $front_use_backendlist[$i] as $k => $v ) | |
{ | |
$frontend_str .= "\t" . $v . "\n"; | |
} | |
} | |
} | |
$frontend_str .= "\n"; | |
foreach( $backends as $k => $v ) | |
{ | |
$backends_str .= $v . "\n"; | |
} | |
$maincfg = file_get_contents($haconftemplate); | |
if( empty($maincfg) ) | |
{ | |
$msg = "Initial HAProxy configuration template empty, exiting"; | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg); | |
return false; | |
} | |
$maincfg .= "\n" . $frontend_str . $backends_str; | |
writefile($haproxycfg, $maincfg, 1, 384); | |
$msg = "Configuration saved"; | |
log_message($virt_halog_path, $msg); | |
vexec("service haproxy status 2>&1", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "HAProxy service not running, starting HAProxy service"; | |
log_message($virt_halog_path, $msg); | |
vexec("service haproxy start 2>&1 && service haproxy status", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to start HAProxy service"; | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg . "\n" . print_r($o, 1)); | |
return false; | |
} | |
$msg = "Started HAProxy service successfuly"; | |
log_message($virt_halog_path, $msg); | |
} | |
else | |
{ | |
$msg = "Reloading HAProxy service"; | |
log_message($virt_halog_path, $msg); | |
vexec("service haproxy reload 2>&1 && service haproxy status", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to reload HAProxy service"; | |
task_update($actid, $msg, -1); | |
log_message($virt_halog_path, $msg . "\n" . print_r($o, 1)); | |
return false; | |
} | |
$msg = "Reloaded HAProxy service successfuly"; | |
log_message($virt_halog_path, $msg); | |
} | |
if( !empty($globals["le_primary_domain"]) ) | |
{ | |
$globals["le_haproxy"] = 1; | |
} | |
} | |
else | |
{ | |
$empty_config = 1; | |
$msg = "No HAProxy rules found to build"; | |
task_update($actid, $msg, 80); | |
log_message($virt_halog_path, $msg); | |
} | |
} | |
else | |
{ | |
$msg = "HAProxy not enabled"; | |
log_message($virt_halog_path, $msg); | |
$globals["le_haproxy"] = 0; | |
} | |
if( empty($globals["haproxy_enable"]) || $empty_config == 1 ) | |
{ | |
if( file_exists($haproxybin) ) | |
{ | |
log_message($virt_halog_path, "Stopping"); | |
vexec("service haproxy status", $o, $r); | |
if( $r == 0 ) | |
{ | |
$msg = "Stopping HAProxy service"; | |
log_message($virt_halog_path, $msg); | |
vexec("service haproxy stop", $o, $r); | |
if( $r != 0 ) | |
{ | |
$msg = "Failed to stop HAProxy service"; | |
log_message($virt_halog_path, $msg); | |
return false; | |
} | |
$msg = "Stopped HAProxy service successfuly"; | |
log_message($virt_halog_path, $msg); | |
task_update($actid, $msg, 90); | |
} | |
else | |
{ | |
$msg = "HAProxy service already stopped"; | |
log_message($virt_halog_path, $msg); | |
} | |
} | |
$globals["le_haproxy"] = 0; | |
} | |
if( !empty($actid) ) | |
{ | |
task_update($actid, $msg, 100); | |
} | |
return true; | |
} | |
function reinit_haproxy() | |
{ | |
global $globals; | |
$mangle_rules_reload = "ip route del local 0.0.0.0/0 dev lo table 100;\nip rule del fwmark 111 lookup 100;"; | |
if( !empty($globals["haproxy_enable"]) ) | |
{ | |
$mangle_rules_reload .= "\nip rule add fwmark 111 lookup 100;\nip route add local 0.0.0.0/0 dev lo table 100"; | |
} | |
vexec($mangle_rules_reload, $o, $r); | |
} | |
function is_valid_backup_folder($folder) | |
{ | |
if( strlen($folder) == 8 && strtotime($folder) <= time() && 0 < strtotime($folder) ) | |
{ | |
$temp_date = (int) substr($folder, 6, 2); | |
$temp_mon = (int) substr($folder, 4, 2); | |
$temp_yr = (int) substr($folder, 0, 4); | |
if( 0 < $temp_date && $temp_date < 32 && 0 < $temp_mon && $temp_mon < 13 && 2010 <= $temp_yr ) | |
{ | |
return true; | |
} | |
} | |
return false; | |
} | |
function get_backup_plan($vpsid) | |
{ | |
$res = makequery("SELECT bp.* FROM vps v\n\t\t\t\t\t\tLEFT JOIN plans p ON p.plid = v.plid\n\t\t\t\t\t\tINNER JOIN backup_plans bp ON (bp.bpid = v.bpid OR (v.bpid = -1 AND bp.bpid = p.bpid))\n\t\t\t\t\t\tWHERE v.vpsid = :vpsid", array( ":vpsid" => $vpsid )); | |
if( vsql_num_rows($res) == 0 ) | |
{ | |
return false; | |
} | |
$row = vsql_fetch_assoc($res); | |
return $row; | |
} | |
function get_backup_extensions($virt = "") | |
{ | |
$extensions = array( "kvm" => array( "img", "img.gz" ), "xen" => array( "img", "img.gz", "tar.gz" ), "xcp" => array( "img", "img.gz" ), "openvz" => array( "tar.gz", "tar" ), "lxc" => array( "tar.gz" ), "proxk" => array( "vma.gz", "vma.lzo", "vma" ), "proxl" => array( "tar.gz", "tar.lzo", "tar" ), "proxo" => array( "tar.gz", "tar.lzo", "tar" ), "vzk" => array( "tar.gz", "tar" ), "vzo" => array( "tar.gz", "tar" ) ); | |
if( !empty($virt) ) | |
{ | |
return $extensions[$virt]; | |
} | |
return $extensions; | |
} | |
function iso_path($uid, $uuid, &$type = "isos") | |
{ | |
global $globals; | |
global $isos; | |
$isopath = ""; | |
if( empty($isos) ) | |
{ | |
useriso($uid); | |
} | |
foreach( $isos as $isok => $iso ) | |
{ | |
if( $isok == $uuid ) | |
{ | |
$filename = $isos[$isok]["filename"]; | |
if( $isos[$isok]["isuseriso"] ) | |
{ | |
$isopath = $uid . "/" . $uuid . ".iso"; | |
$type = "euisos"; | |
$path_info = pathinfo($isopath); | |
if( !is_dir($globals[$type] . "/" . $path_info["dirname"]) ) | |
{ | |
@mkdir($globals[$type] . "/" . $path_info["dirname"]); | |
} | |
} | |
else | |
{ | |
$isopath = $filename; | |
$type = "isos"; | |
} | |
break; | |
} | |
} | |
return $isopath; | |
} | |
function addsshkeys($mount_point, $ssh_keys) | |
{ | |
$auth_file = $mount_point . "/root/.ssh/authorized_keys"; | |
if( !is_safe_file($auth_file) ) | |
{ | |
return false; | |
} | |
if( empty($ssh_keys) || !is_array($ssh_keys) ) | |
{ | |
return false; | |
} | |
$keys_to_add = "\n" . implode("\n", $ssh_keys); | |
if( !is_dir(dirname($auth_file)) && !mkdir(dirname($auth_file)) ) | |
{ | |
return false; | |
} | |
$result = file_put_contents($auth_file, $keys_to_add, FILE_APPEND); | |
return $result !== false; | |
} | |
function get_vps_disk_usage($virt) | |
{ | |
$disk_usage = array( ); | |
if( !file_exists("/var/virtualizor/dumpe2fs") ) | |
{ | |
mkdir("/var/virtualizor/dumpe2fs"); | |
} | |
$res = makequery("SELECT vpsid FROM vps\n\t\t\t\t\t\tWHERE serid = :serid\n\t\t\t\t\t\tAND virt = :virt", array( ":serid" => 0, ":virt" => $virt )); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$vpsid = $row["vpsid"]; | |
$disks = get_vps_disks($vpsid); | |
$disk_used = 0; | |
$disk_free = 0; | |
$inode_count = 0; | |
$inode_used = 0; | |
$inode_free = 0; | |
$num_linux_parts = 0; | |
foreach( $disks as $disk ) | |
{ | |
if( preg_match("/block/is", $disk["type"]) ) | |
{ | |
$diskinfo = diskinfo($disk["path"]); | |
} | |
if( preg_match("/file/is", $disk["type"]) ) | |
{ | |
$diskinfo = file_diskinfo($disk["path"]); | |
} | |
if( empty($diskinfo) || empty($diskinfo["num"]["linux"]) ) | |
{ | |
continue; | |
} | |
$num_linux_parts = $diskinfo["num"]["linux"]; | |
$sector_size = 512; | |
foreach( $diskinfo["parts"] as $part ) | |
{ | |
vexec("dd if=" . xss($disk["path"]) . " of=/var/virtualizor/dumpe2fs/superblock ibs=" . $sector_size . " obs=" . $sector_size . " bs=" . $sector_size . " skip=" . $part["start"] . " count=24 status=none", $out, $ret); | |
if( $ret != 0 ) | |
{ | |
continue; | |
} | |
vexec("dumpe2fs -h /var/virtualizor/dumpe2fs/superblock 2> /dev/null", $out, $ret); | |
unlink("/var/virtualizor/dumpe2fs/superblock"); | |
$part_block_size = 0; | |
$part_block_count = 0; | |
$part_block_free = 0; | |
$part_inode_count = 0; | |
$part_inode_free = 0; | |
foreach( $out as $line ) | |
{ | |
$parts = explode(":", $line); | |
$key = trim($parts[0]); | |
$value = trim($parts[1]); | |
if( preg_match("/^Block\\s+size/is", $key) ) | |
{ | |
$part_block_size = (int) $value; | |
} | |
else | |
{ | |
if( preg_match("/^Block\\s+count/is", $key) ) | |
{ | |
$part_block_count = (int) $value; | |
} | |
else | |
{ | |
if( preg_match("/^Free\\s+blocks/is", $key) ) | |
{ | |
$part_block_free = (int) $value; | |
} | |
else | |
{ | |
if( preg_match("/^Inode\\s+count/is", $key) ) | |
{ | |
$part_inode_count = (int) $value; | |
} | |
else | |
{ | |
if( preg_match("/^Free\\s+inodes/is", $key) ) | |
{ | |
$part_inode_free = (int) $value; | |
} | |
} | |
} | |
} | |
} | |
} | |
if( !empty($part_block_size) && !empty($part_block_count) ) | |
{ | |
$part_size = $part_block_count * $part_block_size; | |
$part_free = $part_block_free * $part_block_size; | |
$disk_used += $part_size - $part_free; | |
$disk_free += $part_free; | |
} | |
if( !empty($part_inode_count) ) | |
{ | |
$inode_count += $part_inode_count; | |
$inode_free += $part_inode_free; | |
$inode_used += $part_inode_count - $part_inode_free; | |
} | |
} | |
} | |
if( empty($num_linux_parts) ) | |
{ | |
continue; | |
} | |
$disk_size = $disk_used + $disk_free; | |
$disk_usage[$vpsid] = array( "disk" => array( "Used" => $disk_used / 1024, "Available" => $disk_free / 1024, "Use%" => (empty($disk_size) ? 0 : round($disk_used / $disk_size * 100, 2)) ), "inode" => array( "Inodes" => $inode_count, "IUsed" => $inode_used, "IFree" => $inode_free, "Use%" => (empty($inode_count) ? 0 : round($inode_used / $inode_count * 100, 2)) ) ); | |
} | |
return $disk_usage; | |
} | |
function vs_ebtables_remove($vps_name, $vif_name) | |
{ | |
vexec("ebtables -L --Lx | grep " . xss($vps_name), $o, $r); | |
$regexp1 = "/\\s-A\\s/"; | |
foreach( $o as $k => $v ) | |
{ | |
if( preg_match($regexp1, $v) ) | |
{ | |
$v = preg_replace($regexp1, " -D ", $v); | |
vexec($v); | |
} | |
} | |
$regexp1 = "/\\s-N\\s/"; | |
foreach( $o as $k => $v ) | |
{ | |
if( preg_match($regexp1, $v) ) | |
{ | |
$v = preg_replace($regexp1, " -X ", $v); | |
vexec($v); | |
} | |
} | |
return true; | |
} | |
function vs_ebtables_add($vid, $vif_name, $mac_addr) | |
{ | |
global $globals; | |
global $error; | |
$vps = getvps($vid); | |
$vps_name = $vps["vps_name"]; | |
$res = makequery("SELECT i.*, ip.* FROM `ips` i\n\t\t\t\tLEFT JOIN ippool ip ON (ip.ippid = i.ippid) \n\t\t\t\tWHERE i.vpsid = '" . $vps["vpsid"] . "'\n\t\t\t\tORDER BY `primary` DESC"); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$ips[$i] = vsql_fetch_assoc($res); | |
} | |
vs_ebtables_remove($vps_name, $vif_name); | |
$no_ebtables_on_plans_arr = array( ); | |
if( !empty($globals["no_ebtables_on_plans"]) ) | |
{ | |
$no_ebtables_on_plans_arr = cexplode(",", $globals["no_ebtables_on_plans"]); | |
} | |
if( !in_array($vps["plid"], $no_ebtables_on_plans_arr) && empty($vps["disable_ebtables"]) ) | |
{ | |
if( !empty($ips[0]) ) | |
{ | |
vexec("ebtables -N " . xss("vm" . $vps_name), $output, $return); | |
vexec("ebtables -P " . xss("vm" . $vps_name) . " DROP", $output, $return); | |
vexec("ebtables -N " . xss("vm" . $vps_name) . "ARPIN", $output, $return); | |
vexec("ebtables -A FORWARD -p IPv4 -i " . xss($vif_name) . " -j " . xss("vm" . $vps_name), $output, $return); | |
vexec("ebtables -A INPUT -p ARP -i " . xss($vif_name) . " -j " . xss("vm" . $vps_name) . "ARPIN", $output, $return); | |
vexec("ebtables -A FORWARD -p ARP -i " . xss($vif_name) . " -j " . xss("vm" . $vps_name) . "ARPIN", $output, $return); | |
foreach( $ips as $k => $v ) | |
{ | |
if( !empty($v["ipv6"]) ) | |
{ | |
continue; | |
} | |
vexec("ebtables -A " . xss("vm" . $vps_name) . " -p " . ((empty($v["ipv6"]) ? "IPv4" : "IPv6")) . " --ip" . ((empty($v["ipv6"]) ? "" : "6")) . "-src " . xss($v["ip"] . ((empty($v["ipr_netmask"]) ? "" : "/" . $v["ipr_netmask"]))) . " -s " . xss($mac_addr) . " -j ACCEPT", $output, $return); | |
vexec("ebtables -A " . xss("vm" . $vps_name) . "ARPIN -p ARP --arp-ip-src " . xss($v["ip"] . ((empty($v["ipr_netmask"]) ? "" : "/" . $v["ipr_netmask"]))) . " --arp-mac-src " . xss($mac_addr) . " -j ACCEPT", $output, $return); | |
} | |
vexec("ebtables -A " . xss("vm" . $vps_name) . "ARPIN -p ARP -j DROP", $output, $return); | |
} | |
ebtables_save(); | |
} | |
} | |
function vs_get_net_speed($vid, $force_limit = 0) | |
{ | |
global $globals; | |
global $error; | |
$vps = getvps($vid, 0); | |
if( !is_array($vps) ) | |
{ | |
$error = "empty_vid"; | |
return false; | |
} | |
$download_limit = (int) (($vps["network_speed"] * 8) / 1024); | |
$upload_limit = (int) (((($vps["upload_speed"] == -1 ? $vps["network_speed"] : $vps["upload_speed"])) * 8) / 1024); | |
if( !empty($vps["speed_cap"]) && $vps["bandwidth"] < $vps["speed_cap"]["bw"] && (0 < $vps["speed_cap"]["down"] || 0 < $vps["speed_cap"]["up"]) && empty($globals["speed_cap_disable"]) ) | |
{ | |
$download_limit = (int) (($vps["speed_cap"]["down"] * 8) / 1024); | |
$upload_limit = (int) (((($vps["upload_speed"] == -1 ? $vps["speed_cap"]["down"] : $vps["speed_cap"]["up"])) * 8) / 1024); | |
} | |
if( !empty($force_limit) && empty($download_limit) ) | |
{ | |
$download_limit = 10000; | |
} | |
if( !empty($force_limit) && empty($upload_limit) ) | |
{ | |
$upload_limit = 10000; | |
} | |
return array( "down" => $download_limit, "up" => $upload_limit ); | |
} | |
function vs_tc_create($vid, $interface, $force_limit = 0) | |
{ | |
global $globals; | |
global $error; | |
vexec("ip a | grep " . xss(": " . $interface), $o, $r); | |
if( empty($interface) || !empty($r) ) | |
{ | |
return false; | |
} | |
unset($o); | |
unset($r); | |
$ret = vs_get_net_speed($vid, $force_limit); | |
$download_limit = $ret["down"]; | |
$upload_limit = $ret["up"]; | |
$interface_speed = "100mbit"; | |
if( 1000 < $download_limit || 1000 < $upload_limit ) | |
{ | |
$interface_speed = "10000mbit"; | |
} | |
else | |
{ | |
if( 100 < $download_limit || 100 < $upload_limit ) | |
{ | |
$interface_speed = "1000mbit"; | |
} | |
} | |
vs_tc_destroy($interface); | |
usleep(500000); | |
if( !empty($download_limit) ) | |
{ | |
vexec("tc qdisc add dev " . xss($interface) . " root handle 1: htb default 10 2>&1"); | |
vexec("tc class add dev " . xss($interface) . " parent 1: classid 1:1 htb rate " . xss($interface_speed) . " burst 15k 2>&1"); | |
vexec("tc class add dev " . xss($interface) . " parent 1:1 classid 1:10 htb rate " . xss($download_limit) . "mbit burst 15k 2>&1"); | |
vexec("tc qdisc add dev " . xss($interface) . " parent 1:10 handle 2: sfq perturb 10 2>&1"); | |
} | |
if( !empty($upload_limit) ) | |
{ | |
vexec("tc qdisc add dev " . xss($interface) . " ingress 2>&1"); | |
vexec("tc filter add dev " . xss($interface) . " parent ffff: protocol ip u32 match ip src 0.0.0.0/0 police rate " . xss($upload_limit) . "mbit burst 1000k mtu 64kb drop 2>&1"); | |
vexec("tc filter add dev " . xss($interface) . " parent ffff: protocol ipv6 u32 match ip6 src 0:0:0:0:0:0:0:0/0 police rate " . xss($upload_limit) . "mbit burst 1000k mtu 64kb drop 2>&1"); | |
} | |
return true; | |
} | |
function vs_tc_create_vz($vid, $force_limit = 0) | |
{ | |
global $globals; | |
global $error; | |
if( file_exists($globals["var"] . "/tc_ovz_old") ) | |
{ | |
$ret = vs_get_net_speed($vid, $force_limit); | |
$download_limit = $ret["down"]; | |
$upload_limit = $ret["up"]; | |
if( empty($download_limit) && empty($upload_limit) ) | |
{ | |
vs_tc_destroy_vz($vid); | |
return true; | |
} | |
$interface = (empty($GLOBALS["globals"]["interface"]) ? "eth0" : $GLOBALS["globals"]["interface"]); | |
$ips = array( ); | |
$classids = array( ); | |
$res = makequery("SELECT * FROM `ips`\n\t\t\t\t\t\tWHERE vpsid = '" . $vid . "'\t\t\t\t\t\n\t\t\t\t\t\tORDER BY `primary` DESC"); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$ips[$row["ipid"]] = $row["ip"]; | |
} | |
vexec("tc qdisc add dev venet0 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit"); | |
vexec("tc qdisc add dev " . xss($interface) . " root handle 1: cbq avpkt 1000 bandwidth 1000Mbit"); | |
$classids = get_all_classids(); | |
$vps_class_ids = array( ); | |
foreach( $ips as $k => $v ) | |
{ | |
for( $i = 1; $i < 10000; $i++ ) | |
{ | |
if( !in_array($i, $classids) ) | |
{ | |
$classids[$i] = $i; | |
$classid = $classids[$i]; | |
break; | |
} | |
} | |
$vps_class_ids[$v] = $classid; | |
if( !empty($download_limit) ) | |
{ | |
vexec("tc class add dev venet0 parent 1: classid 1:" . xss($classid) . " cbq rate " . xss($download_limit) . "mbit allot 1500 prio 5 bounded isolated"); | |
vexec("tc filter add dev venet0 parent 1: protocol ip prio 16 u32 match ip dst " . xss($v) . " flowid 1:" . xss($classid)); | |
vexec("tc qdisc add dev venet0 parent 1:" . xss($classid) . " sfq perturb 10"); | |
} | |
if( !empty($upload_limit) ) | |
{ | |
vexec("tc class add dev " . xss($interface) . " parent 1: classid 1:" . xss($classid) . " cbq rate " . xss($upload_limit) . "mbit allot 1500 prio 5 bounded isolated"); | |
vexec("tc filter add dev " . xss($interface) . " parent 1: protocol ip prio 16 u32 match ip src " . xss($v) . " flowid 1:" . xss($classid)); | |
vexec("tc qdisc add dev " . xss($interface) . " parent 1:" . xss($classid) . " sfq perturb 10"); | |
} | |
} | |
writefile($GLOBALS["globals"]["var"] . "/classids/" . $vid . ".cid", serialize($vps_class_ids), 1); | |
} | |
else | |
{ | |
$ret = vs_get_net_speed($vid, $force_limit); | |
$download_limit = $ret["down"]; | |
$upload_limit = $ret["up"]; | |
if( empty($download_limit) && empty($upload_limit) ) | |
{ | |
vs_tc_destroy_vz($vid); | |
return true; | |
} | |
$interface = (empty($GLOBALS["globals"]["interface"]) ? "eth0" : $GLOBALS["globals"]["interface"]); | |
$ips = array( ); | |
$classids = array( ); | |
$ipv6prefixes = array( ); | |
$res = makequery("SELECT * FROM `ips`\n\t\t\t\t\t\tWHERE vpsid = '" . $vid . "'\n\t\t\t\t\t\tORDER BY `primary` DESC"); | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
if( !empty($row["ipv6"]) ) | |
{ | |
$row["ip"] = ipv6_expand($row["ip"]); | |
$ipv6prefixes[$row["ip"]] = (!empty($row["ipr_netmask"]) ? $row["ipr_netmask"] : 128); | |
} | |
$ips[$row["ipid"]] = $row["ip"]; | |
} | |
$if_speed["venet0"] = $download_limit; | |
$if_speed[$interface] = $upload_limit; | |
$classids = get_all_classids(); | |
$vps_class_id = array( ); | |
for( $i = 1; $i < 65535; $i++ ) | |
{ | |
$tmp_i = dechex($i); | |
if( !in_array($tmp_i, $classids) ) | |
{ | |
$classids[$i] = $tmp_i; | |
$classid = $classids[$i]; | |
break; | |
} | |
} | |
$vps_class_id[$vid] = $classid; | |
foreach( $if_speed as $k => $v ) | |
{ | |
$k = xss($k); | |
vexec("tc qdisc show dev " . $k . " | grep \"qdisc htb 1: root \"", $o, $r); | |
if( $r ) | |
{ | |
vexec("tc qdisc add dev " . $k . " root handle 1: htb default ffff 2>&1"); | |
} | |
unset($r); | |
vexec("tc class show dev " . $k . " | grep \"class htb 1:ffff root \"", $o, $r); | |
if( $r ) | |
{ | |
vexec("tc class add dev " . $k . " parent 1: classid 1:ffff htb rate 10000mbit burst 24k 2>&1"); | |
} | |
unset($r); | |
vexec("tc qdisc show dev " . $k . " | grep \"qdisc sfq 2: parent 1:ffff \"", $o, $r); | |
if( $r ) | |
{ | |
vexec("tc qdisc add dev " . $k . " parent 1:ffff handle 2: sfq perturb 10 2>&1"); | |
} | |
unset($r); | |
vexec("tc class add dev " . $k . " parent 1: classid 1:" . xss($classid) . " htb rate " . xss($v) . "mbit burst 15k 2>&1"); | |
vexec("tc qdisc add dev " . $k . " parent 1:" . $classid . " handle " . xss(dechex(hexdec($classid) + 2)) . ": sfq perturb 10 2>&1"); | |
} | |
foreach( $ips as $k => $v ) | |
{ | |
foreach( $if_speed as $if => $sp ) | |
{ | |
if( !empty($sp) ) | |
{ | |
vexec("tc filter add dev " . xss($if) . " parent 1: protocol ip" . ((!empty($ipv6prefixes[$v]) ? "v6 prio 17" : " prio 16")) . " u32 match ip" . ((!empty($ipv6prefixes[$v]) ? "6" : "")) . " " . (($if == "venet0" ? "dst" : "src")) . " " . xss($v . ((!empty($ipv6prefixes[$v]) ? "/" . $ipv6prefixes[$v] : ""))) . " flowid 1:" . xss($classid) . " 2>&1"); | |
} | |
} | |
} | |
writefile($GLOBALS["globals"]["var"] . "/classids/" . $vid . ".cid", serialize($vps_class_id), 1); | |
} | |
return true; | |
} | |
function vs_tc_destroy($interface) | |
{ | |
if( empty($interface) ) | |
{ | |
return false; | |
} | |
vexec("tc qdisc del dev " . $interface . " root"); | |
vexec("tc qdisc del dev " . $interface . " ingress"); | |
return true; | |
} | |
function vs_tc_destroy_vz($vid) | |
{ | |
global $globals; | |
global $error; | |
$interface = (empty($GLOBALS["globals"]["interface"]) ? "eth0" : $GLOBALS["globals"]["interface"]); | |
$vps_classid = ""; | |
if( file_exists($GLOBALS["globals"]["var"] . "/classids/" . $vid . ".cid") && is_safe_file($GLOBALS["globals"]["var"] . "/classids/" . $vid . ".cid") ) | |
{ | |
$classids = file_get_contents($GLOBALS["globals"]["var"] . "/classids/" . $vid . ".cid"); | |
$tmp_vps_classid = _unserialize($classids); | |
$vps_classids = $tmp_vps_classid; | |
} | |
$fhs = array( ); | |
$fhs["up"] = $interface; | |
$fhs["down"] = "venet0"; | |
foreach( $fhs as $k => $v ) | |
{ | |
vexec("tc filter show dev " . xss($v), $o, $ret); | |
if( !empty($o) ) | |
{ | |
foreach( $o as $j => $m ) | |
{ | |
if( preg_match("/pref (\\w+).+\\s(\\w+::\\w+)\\s.+1:(" . implode("|", $vps_classids) . ")/", $m, $matches) ) | |
{ | |
vexec("tc filter del dev " . xss($v) . " prio " . trim($matches[1]) . " handle " . xss(trim($matches[2])) . " u32"); | |
unset($matches); | |
} | |
} | |
} | |
unset($o); | |
unset($ret); | |
} | |
foreach( $vps_classids as $vk => $vv ) | |
{ | |
vexec("tc class del dev venet0 parent 1: classid 1:" . xss($vv)); | |
vexec("tc class del dev " . xss($interface) . " parent 1: classid 1:" . xss($vv)); | |
} | |
return true; | |
} | |
function get_all_classids() | |
{ | |
$classids = array( ); | |
oexec("tc qdisc show", $out, $ret); | |
$out = explode("\n", $out); | |
foreach( $out as $k => $v ) | |
{ | |
preg_match("/(.*?)parent(\\s*?)1:(\\w+)(.*?)/is", $v, $classid); | |
if( empty($classid[3]) ) | |
{ | |
continue; | |
} | |
$classids[$classid[3]] = $classid[3]; | |
} | |
return $classids; | |
} | |
function get_running_tasks($actid = 0, $actions = array( ), $vpsid = 0, $failed_func = "") | |
{ | |
$query = "SELECT * FROM `tasks`"; | |
$where = array( "ended" => "ended = 0", "serid" => "serid = 0" ); | |
$tokenvals = array( ); | |
if( !empty($actid) ) | |
{ | |
$where["actid"] = "actid < :actid"; | |
$tokenvals[":actid"] = $actid; | |
} | |
if( !empty($actions) ) | |
{ | |
$where["action"] = "action IN ('-1', '" . implode("', '", $actions) . "')"; | |
} | |
if( !empty($vpsid) ) | |
{ | |
$where["vpsid"] = "vpsid = :vpsid"; | |
$tokenvals[":vpsid"] = $vpsid; | |
} | |
$query .= " WHERE " . implode(" AND ", $where); | |
$res = makequery($query, $tokenvals); | |
$running = 0; | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$data = unserialize($row["data"]); | |
if( !empty($data["pid"]) ) | |
{ | |
vexec("/bin/ps " . $data["pid"], $output); | |
$virt = $data["virt"]; | |
if( 1 < count($output) ) | |
{ | |
$running++; | |
} | |
else | |
{ | |
task_update($row["actid"], "", -1); | |
if( !empty($failed_func) && function_exists($failed_func) ) | |
{ | |
call_user_func($failed_func, $row); | |
} | |
} | |
} | |
} | |
return $running; | |
} | |
function initiate_reverse_sync() | |
{ | |
global $globals; | |
if( !is_slave() ) | |
{ | |
return false; | |
} | |
$timestamp = time(); | |
$res = makequery("UPDATE servers\n\t\t\t\t\t\tSET last_reverse_sync = :timestamp\n\t\t\t\t\t\tWHERE serid = 0", array( ":timestamp" => $timestamp )); | |
if( 0 < vsql_affected_rows($res) ) | |
{ | |
vexec("/bin/ps aux | grep " . xss($globals["path"] . "/scripts/reverse_sync.ph[p]"), $out); | |
if( 0 < count($out) ) | |
{ | |
return NULL; | |
} | |
vexec($globals["com"]["php"] . " " . $globals["path"] . "/scripts/reverse_sync.php > " . logdir() . "reverse_sync.log 2>&1 &"); | |
} | |
} | |
function billing_symbol() | |
{ | |
global $globals; | |
$GLOBALS["_api"]["billing_symbol"] = $globals["billing_symbol"]; | |
} | |
function bill_status($invoice) | |
{ | |
return (!empty($invoice["cancelled"]) ? "cancelled" : (empty($invoice["paydate"]) ? "unpaid" : "paid")); | |
} | |
function full_cp_url() | |
{ | |
global $globals; | |
global $SESS; | |
return $globals["cp_url"] . ((empty($SESS["token_key"]) ? "" : "/" . $SESS["token_key"])) . "/index.php?"; | |
} | |
function billing_balance($uid) | |
{ | |
global $globals; | |
global $user; | |
if( $uid <= 0 ) | |
{ | |
return 0; | |
} | |
$res = makequery("SELECT SUM(amt) AS bal FROM transactions\n\t\t\t\t\tWHERE uid = '" . $uid . "'\n\t\t\t\t\tAND used = 0"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$tmp = vsql_fetch_assoc($res); | |
return (double) $tmp["bal"]; | |
} | |
return 0; | |
} | |
function billing_charges_month($uid) | |
{ | |
global $globals; | |
global $user; | |
if( $uid <= 0 ) | |
{ | |
return 0; | |
} | |
$res = makequery("SELECT SUM(net) AS charges FROM invoices\n\t\t\t\t\tWHERE uid = '" . $uid . "'\n\t\t\t\t\tAND invodate >= '" . datify(time(), 0, 1, "Ym") . "01'\n\t\t\t\t\tAND invodate <= '" . datify(time(), 0, 1, "Ymt") . "'"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
$tmp = vsql_fetch_assoc($res); | |
return (double) $tmp["charges"]; | |
} | |
return 0; | |
} | |
function billing_unpaid($uid, &$value = 0) | |
{ | |
global $globals; | |
global $user; | |
$ret = array( ); | |
if( $uid <= 0 ) | |
{ | |
return $ret; | |
} | |
$res = makequery("SELECT * FROM invoices\n\t\t\t\t\tWHERE uid = '" . $uid . "'\n\t\t\t\t\tAND cancelled = 0\n\t\t\t\t\tAND paydate = 0\n\t\t\t\t\tORDER BY `net` ASC"); | |
if( 0 < vsql_num_rows($res) ) | |
{ | |
for( $i = 0; $i < vsql_num_rows($res); | |
$i++ ) | |
{ | |
$row = vsql_fetch_assoc($res); | |
$ret[$row["invoid"]] = $row; | |
$value += $row["net"]; | |
} | |
} | |
return $ret; | |
} | |
function billing_funds_added($uid) | |
{ | |
$balance = billing_balance($uid); | |
if( 0 < $balance ) | |
{ | |
$unpaid = billing_unpaid($uid); | |
if( 0 < count($unpaid) ) | |
{ | |
foreach( $unpaid as $uk => $uv ) | |
{ | |
$balance = billing_balance($uid); | |
if( $balance < $uv["net"] ) | |
{ | |
break; | |
} | |
$invoice_trid = insert_and_id("INSERT INTO transactions\n\t\t\t\t\t\tSET uid = :uid,\n\t\t\t\t\t\tdate = '" . datify(time(), 0, 1, "Ymd") . "',\n\t\t\t\t\t\tunixtime = '" . time() . "',\n\t\t\t\t\t\tinvoid = :invoid,\n\t\t\t\t\t\tamt = :amt,\n\t\t\t\t\t\tfees = :fees,\n\t\t\t\t\t\tnet = amt - fees,\n\t\t\t\t\t\tbal = :bal", array( "uid" => $uid, "invoid" => $uk, "amt" => 0 - $uv["net"], "fees" => 0, "bal" => $balance - $uv["net"] )); | |
$res = makequery("UPDATE invoices\n\t\t\t\t\tSET paydate = '" . datify(time(), 0, 1, "Ymd") . "',\n\t\t\t\t\tpaytime = '" . time() . "',\n\t\t\t\t\ttoken = '" . $invoice_trid . "'\n\t\t\t\t\tWHERE invoid = :invoid\n\t\t\t\t\tAND uid = :uid", array( ":invoid" => $uk, ":uid" => $uid )); | |
} | |
} | |
} | |
billing_try_unsuspend($uid); | |
} | |
function billing_try_unsuspend($uid) | |
{ | |
global $globals; | |
global $ckernel; | |
$res = makequery("UPDATE users u\n\t\t\t\t\tSET u.cur_bal = (SELECT SUM(amt)\n\t\t\t\t\t\t\t\tFROM transactions t\n\t\t\t\t\t\t\t\tWHERE t.`used` = 0\n\t\t\t\t\t\t\t\tAND t.uid = '" . $uid . "'),\n\t\t\t\t\tu.cur_invoices = (SELECT SUM(net)\n\t\t\t\t\t\t\t\tFROM invoices i\n\t\t\t\t\t\t\t\tWHERE i.paydate = 0\n\t\t\t\t\t\t\t\tAND i.cancelled = 0\n\t\t\t\t\t\t\t\tAND i.uid = '" . $uid . "'),\n\t\t\t\t\tu.cur_usage = (SELECT SUM(h_used)\n\t\t\t\t\t\t\t\tFROM `usage` us\n\t\t\t\t\t\t\t\tWHERE us.invoid = 0\n\t\t\t\t\t\t\t\tAND us.uid = '" . $uid . "')\n\t\t\t\t\tWHERE u.uid = '" . $uid . "'"); | |
$res = makequery("SELECT uid, email, cur_bal, cur_usage, cur_invoices, (cur_usage + cur_invoices) AS total_usage,\n\t\t\t\t\t((cur_usage + cur_invoices) / cur_bal * 100) AS used_percent, billing_warn, suspended\n\t\t\t\t\tFROM `users`\n\t\t\t\t\tWHERE uid = '" . $uid . "'"); | |
$row = vsql_fetch_assoc($res); | |
if( $row["cur_bal"] < $row["total_usage"] ) | |
{ | |
return false; | |
} | |
if( defined("VIRTUALIZOR_ENDUSER") ) | |
{ | |
return $ckernel->billing_unsuspend($uid); | |
} | |
return billing_unsuspend($uid); | |
} | |
function billing_unsuspend($uid) | |
{ | |
global $globals; | |
global $ckernel; | |
vexec($globals["com"]["php"] . " " . $globals["path"] . "/scripts/billing_unsuspend.php " . $uid . " > " . logdir("billing_unsuspend") . $uid . ".log 2>&1 &"); | |
return true; | |
} | |
function billing_update_all() | |
{ | |
$res = makequery("UPDATE users u\n\t\t\t\t\tINNER JOIN (\n\t\t\t\t\t\tSELECT uid, SUM(amt) 'cur_bal'\n\t\t\t\t\t\tFROM transactions\n\t\t\t\t\t\tWHERE `used` = 0\n\t\t\t\t\t\tGROUP BY uid\n\t\t\t\t\t) t\n\t\t\t\t\tSET u.cur_bal = t.cur_bal\n\t\t\t\t\tWHERE u.inhouse_billing > 0\n\t\t\t\t\tAND u.uid = t.uid"); | |
$res = makequery("UPDATE users u\n\t\t\t\t\tINNER JOIN (\n\t\t\t\t\t\tSELECT uid, SUM(net) 'cur_invoices'\n\t\t\t\t\t\tFROM invoices\n\t\t\t\t\t\tWHERE `paydate` = 0\n\t\t\t\t\t\tAND cancelled = 0\n\t\t\t\t\t\tGROUP BY uid\n\t\t\t\t\t) t\n\t\t\t\t\tSET u.cur_invoices = t.cur_invoices\n\t\t\t\t\tWHERE u.inhouse_billing > 0\n\t\t\t\t\tAND u.uid = t.uid"); | |
$res = makequery("UPDATE users u\n\t\t\t\t\tINNER JOIN (\n\t\t\t\t\t\tSELECT uid, SUM(h_used) 'cur_usage'\n\t\t\t\t\t\tFROM `usage`\n\t\t\t\t\t\tWHERE invoid = 0\n\t\t\t\t\t\tGROUP BY uid\n\t\t\t\t\t) t\n\t\t\t\t\tSET u.cur_usage = t.cur_usage\n\t\t\t\t\tWHERE u.inhouse_billing > 0\n\t\t\t\t\tAND u.uid = t.uid"); | |
} | |
function get_vps_service_period($vpsid) | |
{ | |
global $globals; | |
$vps = getvps($vpsid); | |
$start = array( "day" => 1, "month" => (int) datify(time(), 0, 0, "n"), "year" => (int) datify(time(), 0, 0, "Y") ); | |
if( !empty($globals["band_calc_creation"]) ) | |
{ | |
$curr_day = datify(time(), 0, 1, "j"); | |
$start["day"] = datify($vps["time"], 0, 1, "j"); | |
if( $curr_day < $start["day"] ) | |
{ | |
$start["month"]--; | |
} | |
} | |
$timestamps = array( ); | |
$timestamps["start"] = mktime(0, 0, 0, $start["month"], $start["day"], $start["year"]); | |
$timestamps["end"] = strtotime("+1 month", $timestamps["start"]); | |
return $timestamps; | |
} | |
function is_billing_api() | |
{ | |
$is_billing = optreq("billing_panel"); | |
if( !empty($is_billing) ) | |
{ | |
return $is_billing; | |
} | |
return false; | |
} | |
function resource_rates() | |
{ | |
global $globals; | |
$json = @file_get_contents($globals["path"] . "/resource_pricing.json"); | |
return @json_decode($json, 1); | |
} | |
function timezones() | |
{ | |
$regions = array( "Africa" => DateTimeZone::AFRICA, "America" => DateTimeZone::AMERICA, "Antarctica" => DateTimeZone::ANTARCTICA, "Asia" => DateTimeZone::ASIA, "Atlantic" => DateTimeZone::ATLANTIC, "Europe" => DateTimeZone::EUROPE, "Indian" => DateTimeZone::INDIAN, "Pacific" => DateTimeZone::PACIFIC ); | |
$timezones = array( ); | |
foreach( $regions as $name => $mask ) | |
{ | |
$zones = DateTimeZone::listIdentifiers($mask); | |
foreach( $zones as $timezone ) | |
{ | |
$time = new DateTime(NULL, new DateTimeZone($timezone)); | |
$ampm = $time->format("g:i A"); | |
$timezones[$name][$timezone] = substr($timezone, strlen($name) + 1) . " - " . $ampm; | |
} | |
} | |
return $timezones; | |
} | |
function perform_vps_operation($vid, $actid = 0, $action, $data = array( )) | |
{ | |
global $globals; | |
global $user; | |
global $ostemplates; | |
global $l; | |
global $oslist; | |
global $kernel; | |
if( is_array($actid) ) | |
{ | |
$actid = $GLOBALS["current_taskid"]; | |
} | |
$vps = getvps($vid); | |
if( empty($oslist) ) | |
{ | |
oslist(); | |
} | |
task_start($actid); | |
task_update($actid, $l["started"], 10, "XXXXXXXX"); | |
if( $vps["virt"] == "lxc" || $vps["virt"] == "xen" && empty($vps["hvm"]) ) | |
{ | |
$mount = mount_direct($vid); | |
} | |
else | |
{ | |
$mount = mount($vid, "", 1); | |
} | |
if( !is_array($mount) ) | |
{ | |
if( $mount == -1 ) | |
{ | |
task_update($actid, $l["mount_undetermined"], -1); | |
return true; | |
} | |
task_update($actid, $l["err_mount"], -1); | |
return false; | |
} | |
if( $action == "change_password" && is_safe_file($mount["mount_point"] . "/etc/shadow") && file_exists($mount["mount_point"] . "/etc/shadow") ) | |
{ | |
$shadow = file($mount["mount_point"] . "/etc/shadow"); | |
$tmp = explode(":", $shadow[0]); | |
$tmp[1] = crypt($data[0]); | |
$shadow[0] = implode(":", $tmp); | |
writefile($mount["mount_point"] . "/etc/shadow", implode("", $shadow), 1); | |
} | |
if( file_exists($mount["mount_point"] . "/Windows/System32/config/SAM") || file_exists($mount["mount_point"] . "/WINDOWS/system32/config/SAM") ) | |
{ | |
$sam_location = $mount["mount_point"] . "/Windows/System32/config/SAM"; | |
if( !file_exists($sam_location) ) | |
{ | |
$sam_location = $mount["mount_point"] . "/WINDOWS/system32/config/SAM"; | |
} | |
if( !empty($ostemplates[$vps["osid"]]["template_admin_name"]) ) | |
{ | |
$windows_admin_name = $ostemplates[$vps["osid"]]["template_admin_name"]; | |
} | |
$location = $mount["mount_point"] . "/Users/" . ((empty($windows_admin_name) ? "Administrator" : $windows_admin_name)) . "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup"; | |
if( !file_exists($location) ) | |
{ | |
$location = $mount["mount_point"] . "/Documents and Settings/All Users/Start Menu/Programs/Startup"; | |
} | |
if( is_safe_file($sam_location) && is_safe_file($location) && is_safe_file($location . "/virtualizor.bat") ) | |
{ | |
$contents = file_get_contents($location . "/virtualizor.bat"); | |
if( !preg_match("/REM @remote_desktop_start.*REM @remote_desktop_end/is", $contents) || !preg_match("/REM @password_start.*REM @password_end/is", $contents) ) | |
{ | |
$contents = "@echo off\n\nREM @remote_desktop_start\nREM @remote_desktop_end\n\nREM @password_start\nREM @password_end\n\ntimeout /t 5 /nobreak >nul 2>nul\nREM @shutdown\nDEL \"%~f0\""; | |
} | |
if( $action == "change_password" ) | |
{ | |
vexec("chntpw ", $o, $r); | |
$v1 = explode(" ", $o[0]); | |
$v1 = explode(".", $v1[2]); | |
$v1 = (0 < $v1[0] ? "q" : ""); | |
@exec("chntpw -u " . ((empty($windows_admin_name) ? "Administrator" : $windows_admin_name)) . " \"" . $sam_location . "\" << EOF\n1" . ((empty($v1) ? "" : "\nq")) . "\ny\nEOF", $output, $ret); | |
$contents = preg_replace("/REM @password_start.*REM @password_end/is", "REM @password_start\nnet user " . ((empty($windows_admin_name) ? "Administrator" : $windows_admin_name)) . " \"" . str_replace("\"", "\\\"", $data[0]) . "\" >nul 2>nul\nREM @password_end", $contents); | |
$contents = preg_replace("/REM @shutdown/is", "Shutdown -l", $contents); | |
} | |
if( $action == "remote_desktop" ) | |
{ | |
if( !empty($data[0]) ) | |
{ | |
$contents = preg_replace("/REM @remote_desktop_start.*REM @remote_desktop_end/is", "REM @remote_desktop_start\nreg add \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 0 /f >nul 2>nul\nnetsh firewall set service type = remotedesktop mode = enable >nul 2>nul\nREM @remote_desktop_end", $contents); | |
} | |
else | |
{ | |
$contents = preg_replace("/REM @remote_desktop_start.*REM @remote_desktop_end/is", "REM @remote_desktop_start\nreg add \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 1 /f >nul 2>nul\nnetsh firewall set service type = remotedesktop mode = disable >nul 2>nul\nREM @remote_desktop_end", $contents); | |
} | |
} | |
writefile($location . "/virtualizor.bat", $contents, 1); | |
} | |
} | |
$umount = umount($mount); | |
if( !empty($umount) ) | |
{ | |
$error[] = $l["err_unmount"]; | |
task_update($actid, $l["err_unmount"], -1); | |
return false; | |
} | |
task_update($actid, $l["completed"], 100); | |
return true; | |
} | |
Script to generate license | |
function sm_reverse_bits($orig) | |
{ | |
$v = decbin(ord($orig)); | |
$pad = str_pad($v, 8, "0", STR_PAD_LEFT); | |
$rev = strrev($pad); | |
$bin = bindec($rev); | |
$chr = chr($bin); | |
return $chr; | |
} | |
function sm_encode($txt) | |
{ | |
$from = array( "!", "@", "#", "\$", "%", "^", "&", "*", "(", ")" ); | |
$to = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ); | |
$txt = base64_encode($txt); | |
$txt = str_replace($to, $from, $txt); | |
$txt = gzcompress($txt); | |
for( $i = 0; $i < strlen($txt);$i++ ) | |
{ | |
$txt[$i] = sm_reverse_bits($txt[$i]); | |
} | |
$txt = base64_encode($txt); | |
return $txt; | |
} | |
$ip=str_replace(PHP_EOL, '',file_get_contents("http://www.cpanel.net/showip.cgi")); | |
$ipx=str_replace(".","",$ip); | |
echo sm_encode('{ | |
"license": "VRTDVLPL-FULLANDFULL-TUHANTS75-INEEDMONEY-FORANEWSERVER-'.$ipx.'END", | |
"lictype": "1", | |
"lictype_txt": "Unlimited", | |
"active": 1, | |
"active_txt": "<font color=\"green\">Active<\/font>", | |
"licnumvs": "0", | |
"primary_ip": "'.$ip.'", | |
"licexpires": "29991231", | |
"licexpires_txt": "31\/12\/2999 GMT", | |
"last_edit": "0", | |
"fast_mirrors": ["https:\/\/s1.softaculous.com\/a\/virtualizor", "https:\/\/s2.softaculous.com\/a\/virtualizor", "https:\/\/s3.softaculous.com\/a\/virtualizor", "https:\/\/s4.softaculous.com\/a\/virtualizor", "https:\/\/s7.softaculous.com\/a\/virtualizor"] | |
}'); | |
?> | |
Script to decrypt license | |
<?php | |
function sm_decode($txt) | |
{ | |
$from = array( "!", "@", "#", "\$", "%", "^", "&", "*", "(", ")" ); | |
$to = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ); | |
$txt = base64_decode($txt); | |
for( $i = 0; $i < strlen($txt);$i++ ) | |
{ | |
$txt[$i] = sm_reverse_bits($txt[$i]); | |
} | |
$txt = gzuncompress($txt); | |
$txt = str_replace($from, $to, $txt); | |
$txt = base64_decode($txt); | |
return $txt; | |
} | |
function sm_reverse_bits($orig) | |
{ | |
$v = decbin(ord($orig)); | |
$pad = str_pad($v, 8, "0", STR_PAD_LEFT); | |
$rev = strrev($pad); | |
$bin = bindec($rev); | |
$chr = chr($bin); | |
return $chr; | |
} | |
echo sm_decode("license2.php 里面的字符串"); | |
?> | |
One-click automatic script cracking | |
First create the script | |
vi /opt/license.sh | |
Then write the following | |
#/bin/bash | |
# | |
# 设置license | |
# | |
chattr -i /usr/local/virtualizor/license2.php | |
rm -rf /usr/local/virtualizor/license2.php | |
IP=`curl http://members.3322.org/dyndns/getip` | |
LIC_URL='http://www.03sec.com/make_license.php?str='$IP | |
license_text=`curl $LIC_URL` | |
echo $license_text >> /usr/local/virtualizor/license2.php | |
chattr +i /usr/local/virtualizor/license2.php | |
Finally, add execution permissions and run scripts | |
chmod +x /opt/license.sh && /opt/license.sh | |
In the test, it was found that virtualizor will change license2.php by itself, even if chattr is used, it is useless. It is recommended to set the above script as a scheduled task and run it every hour | |
0 * * * * /opt/license.sh | |
make_license.php | |
function sm_reverse_bits($orig) | |
{ | |
$v = decbin(ord($orig)); | |
$pad = str_pad($v, 8, "0", STR_PAD_LEFT); | |
$rev = strrev($pad); | |
$bin = bindec($rev); | |
$chr = chr($bin); | |
return $chr; | |
} | |
function sm_encode($txt) | |
{ | |
$from = array( "!", "@", "#", "\$", "%", "^", "&", "*", "(", ")" ); | |
$to = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ); | |
$txt = base64_encode($txt); | |
$txt = str_replace($to, $from, $txt); | |
$txt = gzcompress($txt); | |
for( $i = 0; $i < strlen($txt);$i++ ) | |
{ | |
$txt[$i] = sm_reverse_bits($txt[$i]); | |
} | |
$txt = base64_encode($txt); | |
return $txt; | |
} | |
$str=$_REQUEST['str']; | |
if(filter_var($str, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { | |
$ipx=str_replace(".","",$str); | |
echo sm_encode('{ | |
"license": "VRTDVLPL-03SEC-CRACK-FORANEWSERVER-'.$ipx.'END", | |
"lictype": "1", | |
"lictype_txt": "Unlimited", | |
"active": 1, | |
"active_txt": "<font color=\"green\">Active<\/font>", | |
"licnumvs": "0", | |
"primary_ip": "'.$str.'", | |
"licexpires": "29991231", | |
"licexpires_txt": "31\/12\/2999 GMT", | |
"last_edit": "0", | |
"fast_mirrors": ["https:\/\/s1.softaculous.com\/a\/virtualizor", "https:\/\/s2.softaculous.com\/a\/virtualizor", "https:\/\/s3.softaculous.com\/a\/virtualizor", "https:\/\/s4.softaculous.com\/a\/virtualizor", "https:\/\/s7.softaculous.com\/a\/virtualizor"] | |
}'); | |
}else{ | |
echo "sb....."; | |
exit(); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment