413 lines
15 KiB
PHP
413 lines
15 KiB
PHP
<?php
|
|
//判断是否 WHMCS 访问
|
|
if(!defined("WHMCS")){
|
|
die("This file cannot be accessed directly");
|
|
}
|
|
|
|
function shadowsocks_ConfigOptions(){
|
|
return array(
|
|
'连接端口' => array(
|
|
'Type' => 'text',
|
|
'Description' => 'API 通讯端口'
|
|
),
|
|
'流量限制' => array(
|
|
'Type' => 'text',
|
|
'Description' => '在 Configoptions 中 traffic 为空时则会启用此处设定'
|
|
),
|
|
'计费单位' => array(
|
|
'Type' => 'dropdown',
|
|
'Options' => 'MB,GB',
|
|
'Description' => '可选按照 MB 或 GB 作为流量计费单位'
|
|
),
|
|
'节点列表' => array(
|
|
'Type' => 'textarea',
|
|
'Description' => '格式为:物理地域 | 网协地址 | 别名地址 | 加密方式'
|
|
)
|
|
);
|
|
}
|
|
|
|
function shadowsocks_CreateAccount($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
if(!empty($params['customfields']['password'])){
|
|
$adminuser = mysql_fetch_array(mysql_query("SELECT username FROM `tbladmins`"));
|
|
$adminuser = $adminuser['username'];
|
|
$values["password2"] = $params["customfields"]['password'];
|
|
$results = localAPI("encryptpassword",$values,$adminuser);
|
|
$table = "tblhosting";
|
|
$update = array("password"=>$results['password']);
|
|
$where = array("id"=>$params["serviceid"]);
|
|
update_query($table,$update,$where);
|
|
$password = $params["customfields"]['password'];
|
|
}else{
|
|
$password = $params['password'];
|
|
}
|
|
if(!empty($params['configoptions']['traffic'])){
|
|
$traffic = $params['configoptions']['traffic'];
|
|
}else{
|
|
$traffic = $params['configoption2'];
|
|
}
|
|
if($params['configoption3'] == "GB"){
|
|
$traffic = $traffic * 1024;
|
|
}
|
|
$command = array(
|
|
'action' => 'create',
|
|
'pid' => $pid,
|
|
'password' => $password,
|
|
'traffic' => $traffic
|
|
);
|
|
$curl_create = curl_init();
|
|
curl_setopt($curl_create, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_create, CURLOPT_POST, 1);
|
|
curl_setopt($curl_create, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_create, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_create, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_create, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_create, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_create, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_create, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_create, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$create_data = curl_exec($curl_create);
|
|
curl_close($curl_create);
|
|
$create_data = json_decode($create_data, true);
|
|
if($create_data['status'] != "Error"){
|
|
insert_query("mod_weektraffic",array(
|
|
'id' => $pid,
|
|
'port' => $create_data['result'],
|
|
'last_time' => time()
|
|
));
|
|
$result = 'success';
|
|
}else{
|
|
$result = $create_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_SuspendAccount($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
$command = array(
|
|
'action' => 'suspend',
|
|
'pid' => $pid
|
|
);
|
|
$curl_suspend = curl_init();
|
|
curl_setopt($curl_suspend, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_suspend, CURLOPT_POST, 1);
|
|
curl_setopt($curl_suspend, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_suspend, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_suspend, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_suspend, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_suspend, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_suspend, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_suspend, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_suspend, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$suspend_data = curl_exec($curl_suspend);
|
|
curl_close($curl_suspend);
|
|
$suspend_data = json_decode($suspend_data, true);
|
|
if($suspend_data['status'] == "Success"){
|
|
$result = 'success';
|
|
}else{
|
|
$result = $suspend_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_UnsuspendAccount($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
if(!empty($params['customfields']['password'])){
|
|
$adminuser = mysql_fetch_array(mysql_query("SELECT username FROM `tbladmins`"));
|
|
$adminuser = $adminuser['username'];
|
|
$values["password2"] = $params["customfields"]['password'];
|
|
$results = localAPI("encryptpassword",$values,$adminuser);
|
|
$table = "tblhosting";
|
|
$update = array("password"=>$results['password']);
|
|
$where = array("id"=>$params["serviceid"]);
|
|
update_query($table,$update,$where);
|
|
$password = $params["customfields"]['password'];
|
|
}else{
|
|
$password = $params['password'];
|
|
}
|
|
$command = array(
|
|
'action' => 'unsuspend',
|
|
'pid' => $pid,
|
|
'password' => $password,
|
|
);
|
|
$curl_unspend = curl_init();
|
|
curl_setopt($curl_unspend, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_unspend, CURLOPT_POST, 1);
|
|
curl_setopt($curl_unspend, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_unspend, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_unspend, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_unspend, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_unspend, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_unspend, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_unspend, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_unspend, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$unspend_data = curl_exec($curl_unspend);
|
|
curl_close($curl_unspend);
|
|
$unspend_data = json_decode($unspend_data, true);
|
|
if($unspend_data['status'] == "Success"){
|
|
$result = 'success';
|
|
}else{
|
|
$result = $unspend_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_TerminateAccount($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
$command = array(
|
|
'action' => 'terminate',
|
|
'pid' => $pid
|
|
);
|
|
$curl_terminate = curl_init();
|
|
curl_setopt($curl_terminate, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_terminate, CURLOPT_POST, 1);
|
|
curl_setopt($curl_terminate, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_terminate, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_terminate, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_terminate, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_terminate, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_terminate, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_terminate, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_terminate, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$terminate_data = curl_exec($curl_terminate);
|
|
curl_close($curl_terminate);
|
|
$terminate_data = json_decode($terminate_data, true);
|
|
if($terminate_data['status'] == "Success"){
|
|
$result = 'success';
|
|
}else{
|
|
$result = $terminate_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_ChangePackage($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
if(!empty($params['configoptions']['traffic'])){
|
|
$traffic = $params['configoptions']['traffic'];
|
|
}else{
|
|
$traffic = $params['configoption2'];
|
|
}
|
|
if($params['configoption3'] == "GB"){
|
|
$traffic = $traffic * 1024;
|
|
}
|
|
$command = array(
|
|
'action' => 'changepackage',
|
|
'pid' => $pid,
|
|
'traffic' => $traffic
|
|
);
|
|
$curl_changepackage = curl_init();
|
|
curl_setopt($curl_changepackage, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_changepackage, CURLOPT_POST, 1);
|
|
curl_setopt($curl_changepackage, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_changepackage, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_changepackage, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_changepackage, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_changepackage, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_changepackage, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_changepackage, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_changepackage, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$changepackage_data = curl_exec($curl_changepackage);
|
|
curl_close($curl_changepackage);
|
|
$changepackage_data = json_decode($changepackage_data, true);
|
|
if($changepackage_data['status'] == "Success"){
|
|
$result = 'success';
|
|
}else{
|
|
$result = $changepackage_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_ChangePassword($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
$password = $params['password'];
|
|
$command = array(
|
|
'action' => 'changepassword',
|
|
'pid' => $pid,
|
|
'password' => $password,
|
|
);
|
|
$curl_changepassword = curl_init();
|
|
curl_setopt($curl_changepassword, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_changepassword, CURLOPT_POST, 1);
|
|
curl_setopt($curl_changepassword, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_changepassword, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_changepassword, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_changepassword, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_changepassword, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_changepassword, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_changepassword, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_changepassword, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$changepassword_data = curl_exec($curl_changepassword);
|
|
curl_close($curl_changepassword);
|
|
$changepassword_data = json_decode($changepassword_data, true);
|
|
if($changepassword_data['status'] == "Success"){
|
|
$result = 'success';
|
|
}else{
|
|
$result = $changepassword_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_reset($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$serverip = $params['serverip'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
$command = array(
|
|
'action' => 'reset',
|
|
'pid' => $pid
|
|
);
|
|
$curl_reset = curl_init();
|
|
curl_setopt($curl_reset, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_reset, CURLOPT_POST, 1);
|
|
curl_setopt($curl_reset, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_reset, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_reset, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_reset, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_reset, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_reset, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_reset, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_reset, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$reset_data = curl_exec($curl_reset);
|
|
curl_close($curl_reset);
|
|
$reset_data = json_decode($reset_data, true);
|
|
if($reset_data['status'] == "Success"){
|
|
$result = 'success';
|
|
}else{
|
|
$result = $reset_data['result'];
|
|
}
|
|
return $result;
|
|
// print_r($data);die();
|
|
}
|
|
|
|
function shadowsocks_ClientArea($params){
|
|
$pid = $params['serviceid'];
|
|
$port = $params['configoption1'];
|
|
$node = explode("|",$params['configoption4']);
|
|
$serverip = $params['serverip'];
|
|
$password = $params['password'];
|
|
$serveraccesshash = $params['serveraccesshash'];
|
|
$command = array(
|
|
'action' => 'query',
|
|
'pid' => $pid
|
|
);
|
|
$curl_query = curl_init();
|
|
curl_setopt($curl_query, CURLOPT_URL, "http://".$serverip.':'.$port.'/shadowsocksapi.php');
|
|
curl_setopt($curl_query, CURLOPT_POST, 1);
|
|
curl_setopt($curl_query, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($curl_query, CURLOPT_FRESH_CONNECT, 1);
|
|
curl_setopt($curl_query, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($curl_query, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($curl_query, CURLOPT_HEADER, 0);
|
|
curl_setopt($curl_query, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl_query, CURLOPT_POSTFIELDS, $command);
|
|
curl_setopt($curl_query, CURLOPT_USERAGENT, $serveraccesshash);
|
|
$query_data = curl_exec($curl_query);
|
|
curl_close($query_data);
|
|
$query_data = json_decode($query_data, true);
|
|
if(!empty($params['configoptions']['traffic'])){
|
|
$traffic = $params['configoptions']['traffic'];
|
|
}else{
|
|
$traffic = $params['configoption2'];
|
|
}
|
|
$traffic_upload = $query_data['upload'] / 1024;
|
|
$traffic_upload = round($traffic_upload, 2);
|
|
$traffic_download = $query_data['download'] / 1024;
|
|
$traffic_download = round($traffic_download, 2);
|
|
$traffic_free = ($traffic * 1048576 - ($traffic_upload + $traffic_download)) / 1024;
|
|
$traffic_free = round($traffic_free, 2);
|
|
$traffic = $traffic * 1024;
|
|
$last_time = date('H', $query_data['last_time']);
|
|
if($last_time <= "5"){
|
|
$times = "凌晨";
|
|
}elseif($last_time <= "9"){
|
|
$times = "早上";
|
|
}elseif($last_time <= "14"){
|
|
$times = "中午";
|
|
}elseif($last_time <= "18"){
|
|
$times = "下午";
|
|
}elseif($last_time <= "22"){
|
|
$times = "晚上";
|
|
}else{
|
|
$times = "深夜";
|
|
}
|
|
$last_year = date('Y', $query_data['last_time']);
|
|
$last_month = date('m', $query_data['last_time']);
|
|
$last_day = date('d', $query_data['last_time']);
|
|
$last_time = date('H:i', $query_data['last_time']);
|
|
|
|
$node_list = '';
|
|
$x=0;$count=count($node)-1;
|
|
while($x <= $count){
|
|
$name = $node[$x];$x++;
|
|
$ipaddr = $node[$x];$x++;
|
|
$cname = $node[$x];$x++;
|
|
$method = $node[$x];$x++;
|
|
$ssqrcode = base64_encode($method.':'.$password.':'.$ipaddr.':'.$query_data['port']);
|
|
$node_list .= "<tr>
|
|
<td style=\"padding:10px 15px;border-right:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9\">
|
|
{$name}
|
|
</td>
|
|
<td style=\"padding:10px 15px;border-right:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9\">
|
|
{$ipaddr}
|
|
</td>
|
|
<td style=\"padding:10px 15px;border-right:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9\">
|
|
{$cname}
|
|
</td>
|
|
<td style=\"padding:10px 15px;border-right:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;text-transform:uppercase\">
|
|
{$method}
|
|
</td>
|
|
<td style=\"padding:10px 15px;border-bottom:1px solid #e9e9e9\">
|
|
<a name=\"qrcode\" data-title=\"{$name}\" data-qrcode=\"{$ssqrcode}\" href=\"javascript:;\" style=\"color:#00afd1;text-decoration:none\">查看二维码图片</a>
|
|
</td>
|
|
</tr>";
|
|
}
|
|
|
|
$result = array(
|
|
'tabOverviewReplacementTemplate' => 'clientarea',
|
|
'templateVariables' => array(
|
|
'traffic' => $traffic,
|
|
'traffic_upload' => $traffic_upload,
|
|
'traffic_download' => $traffic_download,
|
|
'traffic_free' => $traffic_free,
|
|
'last_year' => $last_year,
|
|
'last_month' => $last_month,
|
|
'last_day' => $last_day,
|
|
'last_time' => $last_time,
|
|
'times' => $times,
|
|
'port' => $query_data['port'],
|
|
'node_list' => $node_list,
|
|
),
|
|
);
|
|
return $result;
|
|
}
|
|
|
|
function shadowsocks_AdminCustomButtonArray(){
|
|
return array(
|
|
'重置' => 'reset'
|
|
);
|
|
}
|