添加对阿里云的支持(ecs未测试)
This commit is contained in:
parent
cbd886bd0a
commit
8cb285866f
933
aliyun.php
Normal file
933
aliyun.php
Normal file
@ -0,0 +1,933 @@
|
|||||||
|
<?php
|
||||||
|
require_once __DIR__ . '/app/db_helper.php';
|
||||||
|
require_once __DIR__ . '/app/logger.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阿里云ECS和轻量应用服务器API适配器
|
||||||
|
* 支持ECS云服务器和轻量应用服务器(SWAS)的查询和管理
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL编码函数(RFC3986规范)
|
||||||
|
*/
|
||||||
|
function aliyunEncode($str) {
|
||||||
|
$res = urlencode($str);
|
||||||
|
$res = preg_replace('/\+/', '%20', $res);
|
||||||
|
$res = preg_replace('/\*/', '%2A', $res);
|
||||||
|
$res = preg_replace('/%7E/', '~', $res);
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成阿里云API签名 (HMAC-SHA1)
|
||||||
|
*/
|
||||||
|
function generateAliyunSignature($method, $params, $secretKey) {
|
||||||
|
// 按参数名排序
|
||||||
|
ksort($params);
|
||||||
|
|
||||||
|
// 构建规范化请求字符串
|
||||||
|
$canonicalizedQueryString = '';
|
||||||
|
foreach ($params as $key => $value) {
|
||||||
|
if ($canonicalizedQueryString !== '') {
|
||||||
|
$canonicalizedQueryString .= '&';
|
||||||
|
}
|
||||||
|
$canonicalizedQueryString .= aliyunEncode($key) . '=' . aliyunEncode($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构造待签名字符串
|
||||||
|
$stringToSign = $method . '&%2F&' . aliyunEncode($canonicalizedQueryString);
|
||||||
|
|
||||||
|
// 计算HMAC-SHA1签名
|
||||||
|
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $secretKey . '&', true));
|
||||||
|
|
||||||
|
return $signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送阿里云API请求
|
||||||
|
* @param string $configId 配置ID
|
||||||
|
* @param string $action API动作
|
||||||
|
* @param array $params 请求参数
|
||||||
|
* @param string $region 区域
|
||||||
|
* @param string $serviceType 服务类型: ecs 或 swas
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
function aliyunApiRequest($configId, $action, $params = [], $region = 'cn-hangzhou', $serviceType = 'ecs') {
|
||||||
|
$db = getVpsDB();
|
||||||
|
$config = $db->queryOne('SELECT * FROM configs WHERE id = ?', [$configId]);
|
||||||
|
|
||||||
|
if (!$config) {
|
||||||
|
Logger::error("配置ID {$configId} 不存在", 'aliyunApiRequest');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$accessKeyId = $config['account'];
|
||||||
|
$accessKeySecret = $config['api_key'];
|
||||||
|
|
||||||
|
Logger::debug("[aliyunApiRequest] Config ID: {$configId}, AccessKeyId: " . substr($accessKeyId, 0, 8) . "***", 'aliyunApiRequest');
|
||||||
|
|
||||||
|
// 确定API域名
|
||||||
|
if (!$region || empty($region)) {
|
||||||
|
Logger::error("Region参数为空,无法构建API域名", 'aliyunApiRequest');
|
||||||
|
return ['status' => 400, 'error' => 'Region参数为空'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($serviceType === 'swas') {
|
||||||
|
$host = 'swas.' . $region . '.aliyuncs.com';
|
||||||
|
} else {
|
||||||
|
$host = 'ecs.' . $region . '.aliyuncs.com';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公共参数
|
||||||
|
$commonParams = [
|
||||||
|
'Action' => $action,
|
||||||
|
'Version' => ($serviceType === 'swas') ? '2020-06-01' : '2014-05-26',
|
||||||
|
'Format' => 'JSON',
|
||||||
|
'AccessKeyId' => $accessKeyId,
|
||||||
|
'SignatureMethod' => 'HMAC-SHA1',
|
||||||
|
'SignatureVersion' => '1.0',
|
||||||
|
'SignatureNonce' => uniqid(),
|
||||||
|
'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
|
||||||
|
'RegionId' => $region,
|
||||||
|
];
|
||||||
|
|
||||||
|
// 合并参数
|
||||||
|
$allParams = array_merge($commonParams, $params);
|
||||||
|
|
||||||
|
// 生成签名
|
||||||
|
$signature = generateAliyunSignature(
|
||||||
|
'GET',
|
||||||
|
$allParams,
|
||||||
|
$accessKeySecret
|
||||||
|
);
|
||||||
|
|
||||||
|
$allParams['Signature'] = $signature;
|
||||||
|
|
||||||
|
// 构建URL
|
||||||
|
$url = 'https://' . $host . '/?' . http_build_query($allParams);
|
||||||
|
|
||||||
|
Logger::debug("[aliyunApiRequest] URL: {$url}", 'aliyunApiRequest');
|
||||||
|
Logger::debug("[aliyunApiRequest] Action: {$action}, Region: {$region}, ServiceType: {$serviceType}", 'aliyunApiRequest');
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
$ch = curl_init();
|
||||||
|
curl_setopt($ch, CURLOPT_URL, $url);
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||||
|
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
|
||||||
|
|
||||||
|
$response = curl_exec($ch);
|
||||||
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
|
$curlError = curl_error($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
if ($curlError) {
|
||||||
|
Logger::error("cURL错误: {$curlError}", 'aliyunApiRequest');
|
||||||
|
return ['status' => 0, 'error' => $curlError];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($httpCode !== 200) {
|
||||||
|
Logger::error("HTTP请求失败: {$httpCode}, 响应: {$response}", 'aliyunApiRequest');
|
||||||
|
|
||||||
|
// 尝试解析错误响应
|
||||||
|
$errorResult = json_decode($response, true);
|
||||||
|
if ($errorResult && isset($errorResult['Message'])) {
|
||||||
|
return ['status' => $httpCode, 'error' => $errorResult['Message'], 'code' => $errorResult['Code'] ?? 'Unknown'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['status' => $httpCode, 'error' => 'HTTP请求失败 (' . $httpCode . ')'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = json_decode($response, true);
|
||||||
|
|
||||||
|
if (!$result) {
|
||||||
|
Logger::error("JSON解析失败", 'aliyunApiRequest');
|
||||||
|
return ['status' => 500, 'error' => '响应解析失败'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查响应
|
||||||
|
if (isset($result['Code'])) {
|
||||||
|
Logger::error("API错误: {$result['Code']} - {$result['Message']}", 'aliyunApiRequest');
|
||||||
|
return ['status' => 400, 'error' => $result['Message'], 'code' => $result['Code']];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['status' => 200, 'data' => $result, 'region' => $region, 'service_type' => $serviceType];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有可用区域列表(ECS)
|
||||||
|
*/
|
||||||
|
function getAliyunRegions($configId) {
|
||||||
|
return [
|
||||||
|
'cn-qingdao', // 华北1(青岛)
|
||||||
|
'cn-beijing', // 华北2(北京)
|
||||||
|
'cn-zhangjiakou', // 华北3(张家口)
|
||||||
|
'cn-huhehaote', // 华北5(呼和浩特)
|
||||||
|
'cn-wulanchabu', // 华北6(乌兰察布)
|
||||||
|
'cn-hangzhou', // 华东1(杭州)
|
||||||
|
'cn-shanghai', // 华东2(上海)
|
||||||
|
'cn-nanjing', // 华东5(南京)
|
||||||
|
'cn-fuzhou', // 华东6(福州)
|
||||||
|
'cn-shenzhen', // 华南1(深圳)
|
||||||
|
'cn-heyuan', // 华南2(河源)
|
||||||
|
'cn-guangzhou', // 华南3(广州)
|
||||||
|
'cn-chengdu', // 西南1(成都)
|
||||||
|
'cn-hongkong', // 中国香港
|
||||||
|
'ap-southeast-1', // 新加坡
|
||||||
|
'ap-southeast-5', // 印度尼西亚(雅加达)
|
||||||
|
'ap-northeast-1', // 日本(东京)
|
||||||
|
'ap-northeast-2', // 韩国(首尔)
|
||||||
|
'ap-southeast-3', // 马来西亚(吉隆坡)
|
||||||
|
'ap-southeast-6', // 菲律宾(马尼拉)
|
||||||
|
'ap-southeast-7', // 泰国(曼谷)
|
||||||
|
'us-west-1', // 美国(硅谷)
|
||||||
|
'us-east-1', // 美国(弗吉尼亚)
|
||||||
|
'eu-central-1', // 德国(法兰克福)
|
||||||
|
'eu-west-1', // 英国(伦敦)
|
||||||
|
'me-east-1', // 阿联酋(迪拜)
|
||||||
|
'me-central-1', // 沙特(利雅得)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取轻量应用服务器可用区域列表
|
||||||
|
*/
|
||||||
|
function getAliyunSwasRegions($configId) {
|
||||||
|
return [
|
||||||
|
'cn-hangzhou', // 华东1(杭州)
|
||||||
|
'cn-shanghai', // 华东2(上海)
|
||||||
|
'cn-qingdao', // 华北1(青岛)
|
||||||
|
'cn-beijing', // 华北2(北京)
|
||||||
|
'cn-zhangjiakou', // 华北3(张家口)
|
||||||
|
'cn-shenzhen', // 华南1(深圳)
|
||||||
|
'cn-heyuan', // 华南2(河源)
|
||||||
|
'cn-chengdu', // 西南1(成都)
|
||||||
|
'cn-hongkong', // 中国香港
|
||||||
|
'ap-southeast-1', // 新加坡
|
||||||
|
'ap-northeast-1', // 日本(东京)
|
||||||
|
'us-west-1', // 美国(硅谷)
|
||||||
|
'eu-central-1', // 德国(法兰克福)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取ECS实例列表(单个区域)
|
||||||
|
*/
|
||||||
|
function aliyunGetEcsList($configId, $region, $maxResults = 100, $nextToken = null) {
|
||||||
|
$params = [
|
||||||
|
'MaxResults' => $maxResults,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($nextToken) {
|
||||||
|
$params['NextToken'] = $nextToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
return aliyunApiRequest($configId, 'DescribeInstances', $params, $region, 'ecs');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取轻量应用服务器实例列表(单个区域)
|
||||||
|
*/
|
||||||
|
function aliyunGetSwasList($configId, $region, $pageNumber = 1, $pageSize = 100) {
|
||||||
|
$params = [
|
||||||
|
'PageNumber' => $pageNumber,
|
||||||
|
'PageSize' => $pageSize,
|
||||||
|
];
|
||||||
|
|
||||||
|
return aliyunApiRequest($configId, 'ListInstances', $params, $region, 'swas');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取ECS实例详细信息
|
||||||
|
*/
|
||||||
|
function aliyunGetEcsDetails($configId, $instanceId, $region = null, $updateDb = true) {
|
||||||
|
$params = [
|
||||||
|
'InstanceIds' => json_encode([$instanceId]),
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'DescribeInstances', $params, $region, 'ecs');
|
||||||
|
|
||||||
|
// 如果获取成功且需要更新数据库
|
||||||
|
if ($updateDb && $result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
$instances = $result['data']['Instances']['Instance'] ?? [];
|
||||||
|
|
||||||
|
if (!empty($instances)) {
|
||||||
|
updateAliyunEcsToDatabase($configId, $instances[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取轻量应用服务器实例详细信息
|
||||||
|
*/
|
||||||
|
function aliyunGetSwasDetails($configId, $instanceId, $region = null, $updateDb = true) {
|
||||||
|
$params = [
|
||||||
|
'InstanceIds' => json_encode([$instanceId]),
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'ListInstances', $params, $region, 'swas');
|
||||||
|
|
||||||
|
// 如果获取成功且需要更新数据库
|
||||||
|
if ($updateDb && $result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
$instances = $result['data']['Instances'] ?? [];
|
||||||
|
|
||||||
|
if (!empty($instances)) {
|
||||||
|
updateAliyunSwasToDatabase($configId, $instances[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取ECS实例状态
|
||||||
|
*/
|
||||||
|
function aliyunGetEcsStatus($configId, $instanceId, $region = null, $updateDb = true) {
|
||||||
|
$params = [
|
||||||
|
'InstanceId.1' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'DescribeInstanceStatus', $params, $region, 'ecs');
|
||||||
|
|
||||||
|
// 如果获取成功且需要更新数据库
|
||||||
|
if ($updateDb && $result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
$instanceStatusSet = $result['data']['InstanceStatuses']['InstanceStatus'] ?? [];
|
||||||
|
|
||||||
|
if (!empty($instanceStatusSet)) {
|
||||||
|
$statusInfo = $instanceStatusSet[0];
|
||||||
|
$rawStatus = $statusInfo['Status'] ?? 'UNKNOWN';
|
||||||
|
|
||||||
|
// 状态映射
|
||||||
|
$statusMap = [
|
||||||
|
'Pending' => 'process',
|
||||||
|
'Running' => 'on',
|
||||||
|
'Starting' => 'process',
|
||||||
|
'Stopping' => 'process',
|
||||||
|
'Stopped' => 'off',
|
||||||
|
'Rebooting' => 'process',
|
||||||
|
'Unknown' => 'unknown'
|
||||||
|
];
|
||||||
|
|
||||||
|
$status = $statusMap[$rawStatus] ?? 'unknown';
|
||||||
|
|
||||||
|
updateVpsStatusInDatabaseAliyun($configId, $instanceId, $status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取轻量应用服务器实例状态
|
||||||
|
*/
|
||||||
|
function aliyunGetSwasStatus($configId, $instanceId, $region = null, $updateDb = true) {
|
||||||
|
$params = [
|
||||||
|
'InstanceIds' => json_encode([$instanceId]),
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'ListInstanceStatus', $params, $region, 'swas');
|
||||||
|
|
||||||
|
// 如果获取成功且需要更新数据库
|
||||||
|
if ($updateDb && $result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
$instanceStatusSet = $result['data']['InstanceStatuses'] ?? [];
|
||||||
|
|
||||||
|
if (!empty($instanceStatusSet)) {
|
||||||
|
$statusInfo = $instanceStatusSet[0];
|
||||||
|
$rawStatus = $statusInfo['Status'] ?? 'UNKNOWN';
|
||||||
|
|
||||||
|
// 状态映射
|
||||||
|
$statusMap = [
|
||||||
|
'Pending' => 'process',
|
||||||
|
'Starting' => 'process',
|
||||||
|
'Running' => 'on',
|
||||||
|
'Stopping' => 'process',
|
||||||
|
'Stopped' => 'off',
|
||||||
|
'Resetting' => 'process',
|
||||||
|
'Upgrading' => 'process',
|
||||||
|
'Disabled' => 'off',
|
||||||
|
'Unknown' => 'unknown'
|
||||||
|
];
|
||||||
|
|
||||||
|
$status = $statusMap[$rawStatus] ?? 'unknown';
|
||||||
|
|
||||||
|
updateVpsStatusInDatabaseAliyun($configId, $instanceId, $status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动ECS实例
|
||||||
|
*/
|
||||||
|
function aliyunPowerOn($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
Logger::info("[aliyunPowerOn] 从数据库获取到 region: {$region}", 'aliyunPowerOn');
|
||||||
|
} else {
|
||||||
|
Logger::error("[aliyunPowerOn] 无法从数据库获取 region,config_id: {$configId}, instance_id: {$instanceId}", 'aliyunPowerOn');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'InstanceId' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'StartInstance', $params, $region, 'ecs');
|
||||||
|
|
||||||
|
// 开机操作后立即获取状态并更新数据库
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
sleep(2);
|
||||||
|
aliyunGetEcsStatus($configId, $instanceId, $region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动轻量应用服务器
|
||||||
|
*/
|
||||||
|
function aliyunSwasPowerOn($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
Logger::info("[aliyunSwasPowerOn] 从数据库获取到 region: {$region}", 'aliyunSwasPowerOn');
|
||||||
|
} else {
|
||||||
|
Logger::error("[aliyunSwasPowerOn] 无法从数据库获取 region,config_id: {$configId}, instance_id: {$instanceId}", 'aliyunSwasPowerOn');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'InstanceId' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'StartInstance', $params, $region, 'swas');
|
||||||
|
|
||||||
|
// 开机操作后立即获取状态并更新数据库
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
sleep(2);
|
||||||
|
aliyunGetSwasStatus($configId, $instanceId, $region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止ECS实例
|
||||||
|
*/
|
||||||
|
function aliyunPowerOff($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[aliyunPowerOff] 无法从数据库获取 region", 'aliyunPowerOff');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'InstanceId' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'StopInstance', $params, $region, 'ecs');
|
||||||
|
|
||||||
|
// 关机操作后立即获取状态并更新数据库
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
sleep(2);
|
||||||
|
aliyunGetEcsStatus($configId, $instanceId, $region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止轻量应用服务器
|
||||||
|
*/
|
||||||
|
function aliyunSwasPowerOff($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[aliyunSwasPowerOff] 无法从数据库获取 region", 'aliyunSwasPowerOff');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'InstanceId' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'StopInstance', $params, $region, 'swas');
|
||||||
|
|
||||||
|
// 关机操作后立即获取状态并更新数据库
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
sleep(2);
|
||||||
|
aliyunGetSwasStatus($configId, $instanceId, $region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重启ECS实例
|
||||||
|
*/
|
||||||
|
function aliyunReboot($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[aliyunReboot] 无法从数据库获取 region", 'aliyunReboot');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'InstanceId' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'RebootInstance', $params, $region, 'ecs');
|
||||||
|
|
||||||
|
// 重启操作后立即获取状态并更新数据库
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
sleep(3);
|
||||||
|
aliyunGetEcsStatus($configId, $instanceId, $region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重启轻量应用服务器
|
||||||
|
*/
|
||||||
|
function aliyunSwasReboot($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[aliyunSwasReboot] 无法从数据库获取 region", 'aliyunSwasReboot');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'InstanceId' => $instanceId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = aliyunApiRequest($configId, 'RebootInstance', $params, $region, 'swas');
|
||||||
|
|
||||||
|
// 重启操作后立即获取状态并更新数据库
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
sleep(3);
|
||||||
|
aliyunGetSwasStatus($configId, $instanceId, $region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将ECS信息更新到数据库
|
||||||
|
*/
|
||||||
|
function updateAliyunEcsToDatabase($configId, $instance) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
|
||||||
|
$vpsId = $instance['InstanceId'];
|
||||||
|
$region = $instance['RegionId'] ?? '';
|
||||||
|
$zoneId = $instance['ZoneId'] ?? '';
|
||||||
|
|
||||||
|
// 提取CPU和内存信息
|
||||||
|
$cpuCores = $instance['Cpu'] ?? null;
|
||||||
|
// 注意:阿里云API返回的Memory单位是MB,需要转换为GB
|
||||||
|
$memorySize = isset($instance['Memory']) ? round($instance['Memory'] / 1024, 2) . 'G' : null;
|
||||||
|
|
||||||
|
// 提取系统盘信息
|
||||||
|
$diskSize = null;
|
||||||
|
if (isset($instance['SystemDisk']) && isset($instance['SystemDisk']['Size'])) {
|
||||||
|
$diskSize = $instance['SystemDisk']['Size'] . 'G';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取带宽信息
|
||||||
|
$bandwidth = null;
|
||||||
|
if (isset($instance['InternetMaxBandwidthOut'])) {
|
||||||
|
$bandwidth = $instance['InternetMaxBandwidthOut'] . 'Mbps';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取操作系统信息
|
||||||
|
$osType = $instance['OSName'] ?? ($instance['ImageId'] ?? null);
|
||||||
|
|
||||||
|
// 提取IP地址
|
||||||
|
$ipAddress = null;
|
||||||
|
if (isset($instance['PublicIpAddress']) && !empty($instance['PublicIpAddress']['IpAddress'])) {
|
||||||
|
$ipAddress = $instance['PublicIpAddress']['IpAddress'][0];
|
||||||
|
} elseif (isset($instance['EipAddress']) && isset($instance['EipAddress']['IpAddress'])) {
|
||||||
|
$ipAddress = $instance['EipAddress']['IpAddress'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取实例名称
|
||||||
|
$productName = $instance['InstanceName'] ?? null;
|
||||||
|
|
||||||
|
// 提取到期时间
|
||||||
|
$nextduedate = null;
|
||||||
|
if (isset($instance['ExpiredTime'])) {
|
||||||
|
$expiredTime = $instance['ExpiredTime'];
|
||||||
|
if ($expiredTime !== '' && $expiredTime !== null) {
|
||||||
|
$nextduedate = strtotime($expiredTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查记录是否存在
|
||||||
|
$existing = $listDb->queryOne(
|
||||||
|
'SELECT id FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $vpsId]
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($existing) {
|
||||||
|
// 更新现有记录
|
||||||
|
$listDb->execute(
|
||||||
|
'UPDATE vps_list SET domain = ?, ip_address = ?, product_name = ?, cpu_cores = ?, memory_size = ?, disk_size = ?, bandwidth = ?, os_type = ?, nextduedate = ?, last_check = CURRENT_TIMESTAMP WHERE id = ?',
|
||||||
|
[
|
||||||
|
$zoneId,
|
||||||
|
$ipAddress,
|
||||||
|
$productName,
|
||||||
|
$cpuCores,
|
||||||
|
$memorySize,
|
||||||
|
$diskSize,
|
||||||
|
$bandwidth,
|
||||||
|
$osType,
|
||||||
|
$nextduedate,
|
||||||
|
$existing['id']
|
||||||
|
]
|
||||||
|
);
|
||||||
|
Logger::info("[updateAliyunEcsToDatabase] ECS {$vpsId} 详细信息已更新", 'updateAliyunEcsToDatabase');
|
||||||
|
} else {
|
||||||
|
// 插入新记录
|
||||||
|
$listDb->execute(
|
||||||
|
'INSERT INTO vps_list (config_id, vps_id, domain, ip_address, product_name, cpu_cores, memory_size, disk_size, bandwidth, os_type, status, nextduedate, last_check) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, CURRENT_TIMESTAMP)',
|
||||||
|
[
|
||||||
|
$configId,
|
||||||
|
$vpsId,
|
||||||
|
$zoneId,
|
||||||
|
$ipAddress,
|
||||||
|
$productName,
|
||||||
|
$cpuCores,
|
||||||
|
$memorySize,
|
||||||
|
$diskSize,
|
||||||
|
$bandwidth,
|
||||||
|
$osType,
|
||||||
|
$nextduedate
|
||||||
|
]
|
||||||
|
);
|
||||||
|
Logger::info("[updateAliyunEcsToDatabase] ECS {$vpsId} 新记录已插入", 'updateAliyunEcsToDatabase');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将轻量应用服务器信息更新到数据库
|
||||||
|
*/
|
||||||
|
function updateAliyunSwasToDatabase($configId, $instance) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
|
||||||
|
$vpsId = $instance['InstanceId'];
|
||||||
|
$region = $instance['RegionId'] ?? '';
|
||||||
|
|
||||||
|
// 提取CPU和内存信息(从ResourceSpec中获取)
|
||||||
|
$cpuCores = isset($instance['ResourceSpec']) ? $instance['ResourceSpec']['Cpu'] : null;
|
||||||
|
$memorySize = isset($instance['ResourceSpec']) ? $instance['ResourceSpec']['Memory'] . 'G' : null;
|
||||||
|
|
||||||
|
// 提取磁盘信息
|
||||||
|
$diskSize = isset($instance['ResourceSpec']) ? $instance['ResourceSpec']['DiskSize'] . 'G' : null;
|
||||||
|
|
||||||
|
// 提取带宽信息
|
||||||
|
$bandwidth = isset($instance['ResourceSpec']) ? $instance['ResourceSpec']['Bandwidth'] . 'Mbps' : null;
|
||||||
|
|
||||||
|
// 提取操作系统信息
|
||||||
|
$osType = null;
|
||||||
|
if (isset($instance['Image'])) {
|
||||||
|
$osType = $instance['Image']['OsType'] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取IP地址
|
||||||
|
$ipAddress = $instance['PublicIpAddress'] ?? null;
|
||||||
|
|
||||||
|
// 提取实例名称
|
||||||
|
$productName = $instance['InstanceName'] ?? null;
|
||||||
|
|
||||||
|
// 提取到期时间
|
||||||
|
$nextduedate = null;
|
||||||
|
if (isset($instance['ExpiredTime'])) {
|
||||||
|
$expiredTime = $instance['ExpiredTime'];
|
||||||
|
if ($expiredTime !== '' && $expiredTime !== null) {
|
||||||
|
$nextduedate = strtotime($expiredTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查记录是否存在
|
||||||
|
$existing = $listDb->queryOne(
|
||||||
|
'SELECT id FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $vpsId]
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($existing) {
|
||||||
|
// 更新现有记录
|
||||||
|
$listDb->execute(
|
||||||
|
'UPDATE vps_list SET domain = ?, ip_address = ?, product_name = ?, cpu_cores = ?, memory_size = ?, disk_size = ?, bandwidth = ?, os_type = ?, nextduedate = ?, last_check = CURRENT_TIMESTAMP WHERE id = ?',
|
||||||
|
[
|
||||||
|
$region,
|
||||||
|
$ipAddress,
|
||||||
|
$productName,
|
||||||
|
$cpuCores,
|
||||||
|
$memorySize,
|
||||||
|
$diskSize,
|
||||||
|
$bandwidth,
|
||||||
|
$osType,
|
||||||
|
$nextduedate,
|
||||||
|
$existing['id']
|
||||||
|
]
|
||||||
|
);
|
||||||
|
Logger::info("[updateAliyunSwasToDatabase] SWAS {$vpsId} 详细信息已更新", 'updateAliyunSwasToDatabase');
|
||||||
|
} else {
|
||||||
|
// 插入新记录
|
||||||
|
$listDb->execute(
|
||||||
|
'INSERT INTO vps_list (config_id, vps_id, domain, ip_address, product_name, cpu_cores, memory_size, disk_size, bandwidth, os_type, status, nextduedate, last_check) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, CURRENT_TIMESTAMP)',
|
||||||
|
[
|
||||||
|
$configId,
|
||||||
|
$vpsId,
|
||||||
|
$region,
|
||||||
|
$ipAddress,
|
||||||
|
$productName,
|
||||||
|
$cpuCores,
|
||||||
|
$memorySize,
|
||||||
|
$diskSize,
|
||||||
|
$bandwidth,
|
||||||
|
$osType,
|
||||||
|
$nextduedate
|
||||||
|
]
|
||||||
|
);
|
||||||
|
Logger::info("[updateAliyunSwasToDatabase] SWAS {$vpsId} 新记录已插入", 'updateAliyunSwasToDatabase');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新VPS状态到数据库
|
||||||
|
*/
|
||||||
|
function updateVpsStatusInDatabaseAliyun($configId, $vpsId, $status) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT id FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $vpsId]
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($vpsInfo) {
|
||||||
|
$listDb->execute(
|
||||||
|
'UPDATE vps_list SET status = ?, last_check = CURRENT_TIMESTAMP WHERE id = ?',
|
||||||
|
[$status, $vpsInfo['id']]
|
||||||
|
);
|
||||||
|
Logger::info("[updateVpsStatusInDatabaseAliyun] VPS {$vpsId} 状态已更新为: {$status}", 'updateVpsStatusInDatabaseAliyun');
|
||||||
|
} else {
|
||||||
|
$listDb->execute(
|
||||||
|
'INSERT INTO vps_list (config_id, vps_id, status, last_check) VALUES (?, ?, ?, CURRENT_TIMESTAMP)',
|
||||||
|
[$configId, $vpsId, $status]
|
||||||
|
);
|
||||||
|
Logger::info("[updateVpsStatusInDatabaseAliyun] VPS {$vpsId} 新记录已插入,状态: {$status}", 'updateVpsStatusInDatabaseAliyun');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新指定配置的ECS列表(遍历所有区域)
|
||||||
|
*/
|
||||||
|
function refreshAliyunEcsListForConfig($configId) {
|
||||||
|
$db = getVpsDB();
|
||||||
|
$config = $db->queryOne('SELECT * FROM configs WHERE id = ?', [$configId]);
|
||||||
|
|
||||||
|
if (!$config || $config['site_type'] !== 'aliyun') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先获取区域列表
|
||||||
|
$regions = getAliyunRegions($configId);
|
||||||
|
$totalInstances = 0;
|
||||||
|
|
||||||
|
Logger::info("[refreshAliyunEcsListForConfig] 开始遍历所有区域获取ECS列表", 'refreshAliyunEcsListForConfig');
|
||||||
|
|
||||||
|
foreach ($regions as $region) {
|
||||||
|
try {
|
||||||
|
$nextToken = null;
|
||||||
|
do {
|
||||||
|
$result = aliyunGetEcsList($configId, $region, 100, $nextToken);
|
||||||
|
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
$instances = $result['data']['Instances']['Instance'] ?? [];
|
||||||
|
|
||||||
|
if (!empty($instances)) {
|
||||||
|
Logger::info("[refreshAliyunEcsListForConfig] 区域 {$region} 找到 " . count($instances) . " 台ECS", 'refreshAliyunEcsListForConfig');
|
||||||
|
|
||||||
|
foreach ($instances as $instance) {
|
||||||
|
updateAliyunEcsToDatabase($configId, $instance);
|
||||||
|
|
||||||
|
// 获取状态
|
||||||
|
aliyunGetEcsStatus($configId, $instance['InstanceId'], $region, true);
|
||||||
|
|
||||||
|
$totalInstances++;
|
||||||
|
|
||||||
|
// 避免频繁请求
|
||||||
|
usleep(300000); // 300毫秒
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否有下一页
|
||||||
|
$nextToken = $result['data']['NextToken'] ?? null;
|
||||||
|
} else {
|
||||||
|
Logger::warning("[refreshAliyunEcsListForConfig] 区域 {$region} 获取失败: " . ($result['msg'] ?? '未知错误'), 'refreshAliyunEcsListForConfig');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while ($nextToken);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Logger::error("[refreshAliyunEcsListForConfig] 区域 {$region} 异常: " . $e->getMessage(), 'refreshAliyunEcsListForConfig');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 区域之间稍作延迟
|
||||||
|
usleep(500000); // 500毫秒
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger::info("[refreshAliyunEcsListForConfig] ECS列表刷新完成,共获取 {$totalInstances} 台实例", 'refreshAliyunEcsListForConfig');
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新指定配置的轻量应用服务器列表(遍历所有区域)
|
||||||
|
*/
|
||||||
|
function refreshAliyunSwasListForConfig($configId) {
|
||||||
|
$db = getVpsDB();
|
||||||
|
$config = $db->queryOne('SELECT * FROM configs WHERE id = ?', [$configId]);
|
||||||
|
|
||||||
|
if (!$config || $config['site_type'] !== 'aliyun_swas') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先获取区域列表
|
||||||
|
$regions = getAliyunSwasRegions($configId);
|
||||||
|
$totalInstances = 0;
|
||||||
|
|
||||||
|
Logger::info("[refreshAliyunSwasListForConfig] 开始遍历所有区域获取轻量应用服务器列表", 'refreshAliyunSwasListForConfig');
|
||||||
|
|
||||||
|
foreach ($regions as $region) {
|
||||||
|
try {
|
||||||
|
$pageNumber = 1;
|
||||||
|
do {
|
||||||
|
$result = aliyunGetSwasList($configId, $region, $pageNumber, 100);
|
||||||
|
|
||||||
|
if ($result && isset($result['status']) && $result['status'] === 200) {
|
||||||
|
$instances = $result['data']['Instances'] ?? [];
|
||||||
|
$totalCount = $result['data']['TotalCount'] ?? 0;
|
||||||
|
$pageSize = $result['data']['PageSize'] ?? 10;
|
||||||
|
|
||||||
|
if (!empty($instances)) {
|
||||||
|
Logger::info("[refreshAliyunSwasListForConfig] 区域 {$region} 找到 " . count($instances) . " 台轻量服务器", 'refreshAliyunSwasListForConfig');
|
||||||
|
|
||||||
|
foreach ($instances as $instance) {
|
||||||
|
updateAliyunSwasToDatabase($configId, $instance);
|
||||||
|
|
||||||
|
// 获取状态
|
||||||
|
aliyunGetSwasStatus($configId, $instance['InstanceId'], $region, true);
|
||||||
|
|
||||||
|
$totalInstances++;
|
||||||
|
|
||||||
|
// 避免频繁请求
|
||||||
|
usleep(300000); // 300毫秒
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否有下一页
|
||||||
|
$totalPages = ceil($totalCount / $pageSize);
|
||||||
|
$pageNumber++;
|
||||||
|
|
||||||
|
if ($pageNumber > $totalPages) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Logger::warning("[refreshAliyunSwasListForConfig] 区域 {$region} 获取失败: " . ($result['msg'] ?? '未知错误'), 'refreshAliyunSwasListForConfig');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (true);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Logger::error("[refreshAliyunSwasListForConfig] 区域 {$region} 异常: " . $e->getMessage(), 'refreshAliyunSwasListForConfig');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 区域之间稍作延迟
|
||||||
|
usleep(500000); // 500毫秒
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger::info("[refreshAliyunSwasListForConfig] 轻量应用服务器列表刷新完成,共获取 {$totalInstances} 台实例", 'refreshAliyunSwasListForConfig');
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新所有阿里云配置的实例列表(ECS + SWAS)
|
||||||
|
*/
|
||||||
|
function refreshAllAliyunVpsLists() {
|
||||||
|
$db = getVpsDB();
|
||||||
|
$configs = $db->query('SELECT * FROM configs WHERE site_type IN (?, ?)', ['aliyun', 'aliyun_swas']);
|
||||||
|
|
||||||
|
$successCount = 0;
|
||||||
|
|
||||||
|
foreach ($configs as $config) {
|
||||||
|
if ($config['site_type'] === 'aliyun') {
|
||||||
|
// 刷新ECS列表
|
||||||
|
if (refreshAliyunEcsListForConfig($config['id'])) {
|
||||||
|
$successCount++;
|
||||||
|
}
|
||||||
|
} elseif ($config['site_type'] === 'aliyun_swas') {
|
||||||
|
// 刷新轻量应用服务器列表
|
||||||
|
if (refreshAliyunSwasListForConfig($config['id'])) {
|
||||||
|
$successCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $successCount;
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -138,13 +138,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$dbSiteType = $siteType;
|
$dbSiteType = $siteType;
|
||||||
if ($siteType === 'tencent_cvm' || $siteType === 'tencent_lh') {
|
if ($siteType === 'tencent_cvm' || $siteType === 'tencent_lh') {
|
||||||
$dbSiteType = 'tencent';
|
$dbSiteType = 'tencent';
|
||||||
|
} elseif ($siteType === 'aliyun_swas') {
|
||||||
|
$dbSiteType = 'aliyun_swas';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证必填字段(腾讯云需要siteUrl)
|
// 验证必填字段(腾讯云和阿里云需要siteUrl)
|
||||||
if ($siteType === 'tencent_cvm' || $siteType === 'tencent_lh') {
|
if ($siteType === 'tencent_cvm' || $siteType === 'tencent_lh' || $siteType === 'aliyun' || $siteType === 'aliyun_swas') {
|
||||||
// 腾讯云:siteUrl必填(API域名)
|
// 腾讯云/阿里云:siteUrl必填(API域名)
|
||||||
if (empty($apiLabel) || empty($siteType) || empty($siteUrl) || empty($account) || empty($apiKey)) {
|
if (empty($apiLabel) || empty($siteType) || empty($siteUrl) || empty($account) || empty($apiKey)) {
|
||||||
$message = '<div class="error-message">❌ API标识、网站类型、API地址、SecretId和SecretKey不能为空!</div>';
|
$message = '<div class="error-message">❌ API标识、网站类型、API地址、AccessKey ID和AccessKey Secret不能为空!</div>';
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
$db = getVpsDB();
|
$db = getVpsDB();
|
||||||
@ -160,8 +162,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if ($configId) {
|
if ($configId) {
|
||||||
|
if ($siteType === 'aliyun') {
|
||||||
|
$message = '<div class="success-message">✅ 阿里云ECS配置添加成功!ID: ' . $configId . '</div>';
|
||||||
|
} elseif ($siteType === 'aliyun_swas') {
|
||||||
|
$message = '<div class="success-message">✅ 阿里云轻量应用服务器配置添加成功!ID: ' . $configId . '</div>';
|
||||||
|
} else {
|
||||||
$typeName = ($siteType === 'tencent_cvm') ? 'CVM云服务器' : '轻量应用服务器';
|
$typeName = ($siteType === 'tencent_cvm') ? 'CVM云服务器' : '轻量应用服务器';
|
||||||
$message = '<div class="success-message">✅ 腾讯云' . $typeName . '配置添加成功!ID: ' . $configId . '</div>';
|
$message = '<div class="success-message">✅ 腾讯云' . $typeName . '配置添加成功!ID: ' . $configId . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
// 如果是首次添加配置,提示运行install.sh
|
// 如果是首次添加配置,提示运行install.sh
|
||||||
$configCount = $db->queryOne('SELECT COUNT(*) as count FROM configs')['count'];
|
$configCount = $db->queryOne('SELECT COUNT(*) as count FROM configs')['count'];
|
||||||
@ -209,6 +217,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
refreshTencentLighthouseListForConfig($configId);
|
refreshTencentLighthouseListForConfig($configId);
|
||||||
}
|
}
|
||||||
$message .= '<div class="info-box">✅ 已自动获取实例列表(遍历所有区域)</div>';
|
$message .= '<div class="info-box">✅ 已自动获取实例列表(遍历所有区域)</div>';
|
||||||
|
} elseif ($dbSiteType === 'aliyun') {
|
||||||
|
// 阿里云ECS
|
||||||
|
require_once __DIR__ . '/aliyun.php';
|
||||||
|
refreshAliyunEcsListForConfig($configId);
|
||||||
|
$message .= '<div class="info-box">✅ 已自动获取ECS实例列表(遍历所有区域)</div>';
|
||||||
|
} elseif ($dbSiteType === 'aliyun_swas') {
|
||||||
|
// 阿里云轻量应用服务器
|
||||||
|
require_once __DIR__ . '/aliyun.php';
|
||||||
|
refreshAliyunSwasListForConfig($configId);
|
||||||
|
$message .= '<div class="info-box">✅ 已自动获取轻量应用服务器列表(遍历所有区域)</div>';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$message = '<div class="error-message">❌ 配置添加失败,请重试</div>';
|
$message = '<div class="error-message">❌ 配置添加失败,请重试</div>';
|
||||||
@ -387,7 +405,8 @@ $configs = $db->query('SELECT * FROM configs ORDER BY id');
|
|||||||
<label>网站类型 *</label>
|
<label>网站类型 *</label>
|
||||||
<select name="site_type" required onchange="toggleSiteUrl(this.value)">
|
<select name="site_type" required onchange="toggleSiteUrl(this.value)">
|
||||||
<option value="mofang">魔方平台</option>
|
<option value="mofang">魔方平台</option>
|
||||||
<option value="aliyun">阿里云(暂不支持)</option>
|
<option value="aliyun">阿里云 - ECS云服务器</option>
|
||||||
|
<option value="aliyun_swas">阿里云 - 轻量应用服务器</option>
|
||||||
<option value="tencent_cvm">腾讯云 - CVM云服务器</option>
|
<option value="tencent_cvm">腾讯云 - CVM云服务器</option>
|
||||||
<option value="tencent_lh">腾讯云 - 轻量应用服务器</option>
|
<option value="tencent_lh">腾讯云 - 轻量应用服务器</option>
|
||||||
</select>
|
</select>
|
||||||
@ -435,7 +454,6 @@ $configs = $db->query('SELECT * FROM configs ORDER BY id');
|
|||||||
<table class="config-table">
|
<table class="config-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>序号</th>
|
|
||||||
<th>API标识</th>
|
<th>API标识</th>
|
||||||
<th>网站类型</th>
|
<th>网站类型</th>
|
||||||
<th>网站链接</th>
|
<th>网站链接</th>
|
||||||
@ -448,13 +466,13 @@ $configs = $db->query('SELECT * FROM configs ORDER BY id');
|
|||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($configs as $config): ?>
|
<?php foreach ($configs as $config): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td><?php echo $config['id']; ?></td>
|
|
||||||
<td><strong><?php echo htmlspecialchars($config['api_label']); ?></strong></td>
|
<td><strong><?php echo htmlspecialchars($config['api_label']); ?></strong></td>
|
||||||
<td>
|
<td>
|
||||||
<?php
|
<?php
|
||||||
$typeMap = [
|
$typeMap = [
|
||||||
'mofang' => '魔方',
|
'mofang' => '魔方',
|
||||||
'aliyun' => '阿里云',
|
'aliyun' => '阿里云ECS',
|
||||||
|
'aliyun_swas' => '阿里云轻量',
|
||||||
'tencent' => '腾讯云'
|
'tencent' => '腾讯云'
|
||||||
];
|
];
|
||||||
echo $typeMap[$config['site_type']] ?? $config['site_type'];
|
echo $typeMap[$config['site_type']] ?? $config['site_type'];
|
||||||
@ -504,12 +522,21 @@ $configs = $db->query('SELECT * FROM configs ORDER BY id');
|
|||||||
accountLabel.innerHTML = '账户 * <small>(邮箱或手机号)</small>';
|
accountLabel.innerHTML = '账户 * <small>(邮箱或手机号)</small>';
|
||||||
keyLabel.textContent = 'API密钥 *';
|
keyLabel.textContent = 'API密钥 *';
|
||||||
} else if (siteType === 'aliyun') {
|
} else if (siteType === 'aliyun') {
|
||||||
// 阿里云
|
// 阿里云ECS
|
||||||
urlGroup.style.display = 'block';
|
urlGroup.style.display = 'block';
|
||||||
urlInput.placeholder = '例如: https://ecs.aliyuncs.com';
|
urlInput.value = 'https://ecs.aliyuncs.com';
|
||||||
|
urlInput.placeholder = 'https://ecs.aliyuncs.com';
|
||||||
urlInput.required = true;
|
urlInput.required = true;
|
||||||
accountLabel.innerHTML = '账户 * <small>(AccessKey ID)</small>';
|
accountLabel.innerHTML = 'AccessKey ID * <small>(阿里云访问密钥ID)</small>';
|
||||||
keyLabel.textContent = 'API密钥 *';
|
keyLabel.textContent = 'AccessKey Secret *';
|
||||||
|
} else if (siteType === 'aliyun_swas') {
|
||||||
|
// 阿里云轻量应用服务器
|
||||||
|
urlGroup.style.display = 'block';
|
||||||
|
urlInput.value = 'https://swas.aliyuncs.com';
|
||||||
|
urlInput.placeholder = 'https://swas.aliyuncs.com';
|
||||||
|
urlInput.required = true;
|
||||||
|
accountLabel.innerHTML = 'AccessKey ID * <small>(阿里云访问密钥ID)</small>';
|
||||||
|
keyLabel.textContent = 'AccessKey Secret *';
|
||||||
} else if (siteType === 'tencent_cvm') {
|
} else if (siteType === 'tencent_cvm') {
|
||||||
// CVM云服务器
|
// CVM云服务器
|
||||||
urlGroup.style.display = 'block';
|
urlGroup.style.display = 'block';
|
||||||
|
|||||||
@ -1,108 +0,0 @@
|
|||||||
<?php
|
|
||||||
require_once __DIR__ . '/tencentcloud.php';
|
|
||||||
|
|
||||||
echo "=== 腾讯云VPS获取诊断 ===\n\n";
|
|
||||||
|
|
||||||
// 1. 检查配置
|
|
||||||
echo "【步骤1】检查配置...\n";
|
|
||||||
$db = getVpsDB();
|
|
||||||
$configs = $db->query('SELECT * FROM configs WHERE site_type = ?', ['tencent']);
|
|
||||||
|
|
||||||
if (empty($configs)) {
|
|
||||||
echo "❌ 未找到腾讯云配置\n";
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "✅ 找到 " . count($configs) . " 个腾讯云配置\n\n";
|
|
||||||
|
|
||||||
foreach ($configs as $configIndex => $config) {
|
|
||||||
echo "--- 配置 #" . ($configIndex + 1) . " ---\n";
|
|
||||||
echo "ID: {$config['id']}\n";
|
|
||||||
echo "API标识: {$config['api_label']}\n";
|
|
||||||
echo "API域名: {$config['site_url']}\n";
|
|
||||||
echo "SecretId: " . substr($config['account'], 0, 15) . "...\n";
|
|
||||||
echo "\n";
|
|
||||||
|
|
||||||
// 2. 测试区域获取
|
|
||||||
echo "【步骤2】测试区域获取...\n";
|
|
||||||
try {
|
|
||||||
$regions = getTencentRegions($config['id'], 'lighthouse');
|
|
||||||
echo "✅ 获取到 " . count($regions) . " 个区域\n";
|
|
||||||
echo "前3个区域: " . implode(', ', array_slice($regions, 0, 3)) . "\n\n";
|
|
||||||
} catch (Exception $e) {
|
|
||||||
echo "❌ 区域获取失败: " . $e->getMessage() . "\n\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 测试实例列表获取
|
|
||||||
echo "【步骤3】测试实例列表获取...\n";
|
|
||||||
if (!empty($regions)) {
|
|
||||||
$testRegion = $regions[0];
|
|
||||||
echo "测试区域: {$testRegion}\n";
|
|
||||||
|
|
||||||
$result = tencentGetLighthouseList($config['id'], $testRegion, 0, 10);
|
|
||||||
|
|
||||||
if (!$result) {
|
|
||||||
echo "❌ API返回null\n\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "HTTP状态码: {$result['status']}\n";
|
|
||||||
|
|
||||||
if (isset($result['error'])) {
|
|
||||||
echo "❌ API错误: {$result['error']}\n";
|
|
||||||
if (isset($result['code'])) {
|
|
||||||
echo "错误代码: {$result['code']}\n";
|
|
||||||
}
|
|
||||||
if (isset($result['request_id'])) {
|
|
||||||
echo "Request ID: {$result['request_id']}\n";
|
|
||||||
}
|
|
||||||
echo "\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($result['status'] !== 200) {
|
|
||||||
echo "❌ HTTP状态码异常: {$result['status']}\n\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$instances = $result['data']['InstanceSet'] ?? [];
|
|
||||||
$totalCount = $result['data']['TotalCount'] ?? 0;
|
|
||||||
|
|
||||||
echo "✅ API调用成功\n";
|
|
||||||
echo "总实例数: {$totalCount}\n";
|
|
||||||
echo "当前页实例数: " . count($instances) . "\n\n";
|
|
||||||
|
|
||||||
if (!empty($instances)) {
|
|
||||||
echo "【步骤4】检查第一个实例数据...\n";
|
|
||||||
$instance = $instances[0];
|
|
||||||
echo "实例ID: " . ($instance['InstanceId'] ?? 'N/A') . "\n";
|
|
||||||
echo "实例名称: " . ($instance['InstanceName'] ?? 'N/A') . "\n";
|
|
||||||
echo "状态: " . ($instance['InstanceState'] ?? 'N/A') . "\n";
|
|
||||||
echo "CPU: " . ($instance['CPU'] ?? 'N/A') . "核\n";
|
|
||||||
echo "内存: " . ($instance['Memory'] ?? 'N/A') . "GB\n";
|
|
||||||
|
|
||||||
// 检查带宽
|
|
||||||
if (isset($instance['InternetAccessible'])) {
|
|
||||||
echo "InternetAccessible: 存在\n";
|
|
||||||
if (isset($instance['InternetAccessible']['InternetMaxBandwidthOut'])) {
|
|
||||||
echo "带宽: " . $instance['InternetAccessible']['InternetMaxBandwidthOut'] . "Mbps\n";
|
|
||||||
} else {
|
|
||||||
echo "带宽字段: 不存在\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
echo "InternetAccessible: 不存在\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "\n完整数据结构:\n";
|
|
||||||
echo json_encode($instance, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
|
|
||||||
} else {
|
|
||||||
echo "⚠️ 该区域没有实例\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "\n" . str_repeat("=", 60) . "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "诊断完成!\n";
|
|
||||||
?>
|
|
||||||
53
index.php
53
index.php
@ -3,6 +3,7 @@ require_once __DIR__ . '/app/db_helper.php';
|
|||||||
require_once __DIR__ . '/app/logger.php';
|
require_once __DIR__ . '/app/logger.php';
|
||||||
require_once __DIR__ . '/mofangidc.php';
|
require_once __DIR__ . '/mofangidc.php';
|
||||||
require_once __DIR__ . '/tencentcloud.php';
|
require_once __DIR__ . '/tencentcloud.php';
|
||||||
|
require_once __DIR__ . '/aliyun.php';
|
||||||
|
|
||||||
// 存储API_PASS
|
// 存储API_PASS
|
||||||
$tokenFile = __DIR__ . '/app/pass.php';
|
$tokenFile = __DIR__ . '/app/pass.php';
|
||||||
@ -29,12 +30,14 @@ if (!defined('API_PASS') || $pass !== API_PASS) {
|
|||||||
$message = '';
|
$message = '';
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
$action = $_POST['action'] ?? '';
|
$action = $_POST['action'] ?? '';
|
||||||
$hostId = intval($_POST['host_id'] ?? 0);
|
$hostId = $_POST['host_id'] ?? '';
|
||||||
$configId = intval($_POST['config_id'] ?? 0);
|
$configId = intval($_POST['config_id'] ?? 0);
|
||||||
|
|
||||||
if ($action && $hostId > 0 && $configId > 0) {
|
if ($action && !empty($hostId) && $configId > 0) {
|
||||||
$result = null;
|
$result = null;
|
||||||
|
|
||||||
|
Logger::info("[操作请求] action={$action}, host_id={$hostId}, config_id={$configId}", 'index.php');
|
||||||
|
|
||||||
// 获取配置信息以确定平台类型
|
// 获取配置信息以确定平台类型
|
||||||
$db = getVpsDB();
|
$db = getVpsDB();
|
||||||
$config = $db->queryOne('SELECT * FROM configs WHERE id = ?', [$configId]);
|
$config = $db->queryOne('SELECT * FROM configs WHERE id = ?', [$configId]);
|
||||||
@ -57,6 +60,24 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
} elseif ($action === 'off') {
|
} elseif ($action === 'off') {
|
||||||
$result = tencentSmartPowerOff($configId, $hostId);
|
$result = tencentSmartPowerOff($configId, $hostId);
|
||||||
}
|
}
|
||||||
|
} elseif ($config['site_type'] === 'aliyun') {
|
||||||
|
// 阿里云ECS操作
|
||||||
|
if ($action === 'reboot') {
|
||||||
|
$result = aliyunReboot($configId, $hostId);
|
||||||
|
} elseif ($action === 'on') {
|
||||||
|
$result = aliyunPowerOn($configId, $hostId);
|
||||||
|
} elseif ($action === 'off') {
|
||||||
|
$result = aliyunPowerOff($configId, $hostId);
|
||||||
|
}
|
||||||
|
} elseif ($config['site_type'] === 'aliyun_swas') {
|
||||||
|
// 阿里云轻量应用服务器操作
|
||||||
|
if ($action === 'reboot') {
|
||||||
|
$result = aliyunSwasReboot($configId, $hostId);
|
||||||
|
} elseif ($action === 'on') {
|
||||||
|
$result = aliyunSwasPowerOn($configId, $hostId);
|
||||||
|
} elseif ($action === 'off') {
|
||||||
|
$result = aliyunSwasPowerOff($configId, $hostId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +99,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$tencentCount = refreshAllTencentVpsLists();
|
$tencentCount = refreshAllTencentVpsLists();
|
||||||
$count += $tencentCount;
|
$count += $tencentCount;
|
||||||
|
|
||||||
|
// 刷新阿里云的ECS列表
|
||||||
|
$aliyunCount = refreshAllAliyunVpsLists();
|
||||||
|
$count += $aliyunCount;
|
||||||
|
|
||||||
$message = '<div class="success-message"><h3>✅ 刷新完成</h3><p>已成功刷新 ' . $count . ' 个配置的VPS列表</p></div>';
|
$message = '<div class="success-message"><h3>✅ 刷新完成</h3><p>已成功刷新 ' . $count . ' 个配置的VPS列表</p></div>';
|
||||||
|
|
||||||
// 获取每个VPS的详细信息并更新数据库
|
// 获取每个VPS的详细信息并更新数据库
|
||||||
@ -127,6 +152,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
} elseif ($config['site_type'] === 'tencent') {
|
} elseif ($config['site_type'] === 'tencent') {
|
||||||
// 腾讯云实例已在refreshAllTencentVpsLists中更新了详细信息,这里不需要额外处理
|
// 腾讯云实例已在refreshAllTencentVpsLists中更新了详细信息,这里不需要额外处理
|
||||||
Logger::info("[refresh_vps_list] 腾讯云配置 {$config['id']} 已刷新", 'index.php');
|
Logger::info("[refresh_vps_list] 腾讯云配置 {$config['id']} 已刷新", 'index.php');
|
||||||
|
} elseif ($config['site_type'] === 'aliyun') {
|
||||||
|
// 阿里云ECS实例已在refreshAllAliyunVpsLists中更新了详细信息,这里不需要额外处理
|
||||||
|
Logger::info("[refresh_vps_list] 阿里云配置 {$config['id']} 已刷新", 'index.php');
|
||||||
|
} elseif ($config['site_type'] === 'aliyun_swas') {
|
||||||
|
// 阿里云轻量应用服务器实例已在refreshAllAliyunVpsLists中更新了详细信息,这里不需要额外处理
|
||||||
|
Logger::info("[refresh_vps_list] 阿里云轻量配置 {$config['id']} 已刷新", 'index.php');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,6 +293,7 @@ foreach ($vpsList as $vps) {
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #333;
|
color: #333;
|
||||||
|
cursor: help;
|
||||||
}
|
}
|
||||||
.status-badge {
|
.status-badge {
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
@ -450,10 +482,19 @@ foreach ($vpsList as $vps) {
|
|||||||
$statusText = '处理中';
|
$statusText = '处理中';
|
||||||
$statusColor = '#ffc107';
|
$statusColor = '#ffc107';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理长ID显示
|
||||||
|
$vpsId = $vps['vps_id'];
|
||||||
|
$displayId = $vpsId;
|
||||||
|
$showTooltip = false;
|
||||||
|
if (strlen($vpsId) > 12) {
|
||||||
|
$displayId = substr($vpsId, 0, 10) . '...';
|
||||||
|
$showTooltip = true;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<div class="vps-card">
|
<div class="vps-card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="vps-id">#<?php echo $vps['vps_id']; ?></div>
|
<div class="vps-id" <?php if ($showTooltip): ?>title="<?php echo htmlspecialchars($vpsId); ?>"<?php endif; ?>>#<?php echo htmlspecialchars($displayId); ?></div>
|
||||||
<span class="status-badge" style="background-color: <?php echo $statusColor; ?>">
|
<span class="status-badge" style="background-color: <?php echo $statusColor; ?>">
|
||||||
<?php echo $statusText; ?>
|
<?php echo $statusText; ?>
|
||||||
</span>
|
</span>
|
||||||
@ -540,6 +581,12 @@ foreach ($vpsList as $vps) {
|
|||||||
<button type="submit" name="action" value="reboot" class="btn btn-warning" onclick="return confirm('确认重启?')">
|
<button type="submit" name="action" value="reboot" class="btn btn-warning" onclick="return confirm('确认重启?')">
|
||||||
🔄 重启
|
🔄 重启
|
||||||
</button>
|
</button>
|
||||||
|
<?php } elseif ($siteType === 'aliyun' || $siteType === 'aliyun_swas') {
|
||||||
|
// 阿里云(ECS或轻量):普通重启
|
||||||
|
?>
|
||||||
|
<button type="submit" name="action" value="reboot" class="btn btn-warning" onclick="return confirm('确认重启?')">
|
||||||
|
🔄 重启
|
||||||
|
</button>
|
||||||
<?php } else {
|
<?php } else {
|
||||||
// 魔方等其他平台:硬重启
|
// 魔方等其他平台:硬重启
|
||||||
?>
|
?>
|
||||||
|
|||||||
@ -300,6 +300,21 @@ function tencentGetLighthouseStatus($configId, $instanceId, $region = null, $upd
|
|||||||
* 启动CVM实例
|
* 启动CVM实例
|
||||||
*/
|
*/
|
||||||
function tencentPowerOn($configId, $instanceId, $region = null) {
|
function tencentPowerOn($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[tencentPowerOn] 无法从数据库获取 region", 'tencentPowerOn');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'InstanceIds.0' => $instanceId,
|
'InstanceIds.0' => $instanceId,
|
||||||
];
|
];
|
||||||
@ -319,6 +334,21 @@ function tencentPowerOn($configId, $instanceId, $region = null) {
|
|||||||
* 启动轻量应用服务器
|
* 启动轻量应用服务器
|
||||||
*/
|
*/
|
||||||
function tencentLighthousePowerOn($configId, $instanceId, $region = null) {
|
function tencentLighthousePowerOn($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[tencentLighthousePowerOn] 无法从数据库获取 region", 'tencentLighthousePowerOn');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'InstanceIds.0' => $instanceId,
|
'InstanceIds.0' => $instanceId,
|
||||||
];
|
];
|
||||||
@ -338,6 +368,21 @@ function tencentLighthousePowerOn($configId, $instanceId, $region = null) {
|
|||||||
* 停止CVM实例
|
* 停止CVM实例
|
||||||
*/
|
*/
|
||||||
function tencentPowerOff($configId, $instanceId, $region = null) {
|
function tencentPowerOff($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[tencentPowerOff] 无法从数据库获取 region", 'tencentPowerOff');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'InstanceIds.0' => $instanceId,
|
'InstanceIds.0' => $instanceId,
|
||||||
];
|
];
|
||||||
@ -357,6 +402,21 @@ function tencentPowerOff($configId, $instanceId, $region = null) {
|
|||||||
* 停止轻量应用服务器
|
* 停止轻量应用服务器
|
||||||
*/
|
*/
|
||||||
function tencentLighthousePowerOff($configId, $instanceId, $region = null) {
|
function tencentLighthousePowerOff($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[tencentLighthousePowerOff] 无法从数据库获取 region", 'tencentLighthousePowerOff');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'InstanceIds.0' => $instanceId,
|
'InstanceIds.0' => $instanceId,
|
||||||
];
|
];
|
||||||
@ -376,6 +436,21 @@ function tencentLighthousePowerOff($configId, $instanceId, $region = null) {
|
|||||||
* 重启CVM实例
|
* 重启CVM实例
|
||||||
*/
|
*/
|
||||||
function tencentReboot($configId, $instanceId, $region = null) {
|
function tencentReboot($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[tencentReboot] 无法从数据库获取 region", 'tencentReboot');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'InstanceIds.0' => $instanceId,
|
'InstanceIds.0' => $instanceId,
|
||||||
];
|
];
|
||||||
@ -395,6 +470,21 @@ function tencentReboot($configId, $instanceId, $region = null) {
|
|||||||
* 重启轻量应用服务器
|
* 重启轻量应用服务器
|
||||||
*/
|
*/
|
||||||
function tencentLighthouseReboot($configId, $instanceId, $region = null) {
|
function tencentLighthouseReboot($configId, $instanceId, $region = null) {
|
||||||
|
// 如果未提供region,从数据库获取
|
||||||
|
if (!$region) {
|
||||||
|
$listDb = getVpsListDB();
|
||||||
|
$vpsInfo = $listDb->queryOne(
|
||||||
|
'SELECT domain FROM vps_list WHERE config_id = ? AND vps_id = ?',
|
||||||
|
[$configId, $instanceId]
|
||||||
|
);
|
||||||
|
if ($vpsInfo && !empty($vpsInfo['domain'])) {
|
||||||
|
$region = $vpsInfo['domain'];
|
||||||
|
} else {
|
||||||
|
Logger::error("[tencentLighthouseReboot] 无法从数据库获取 region", 'tencentLighthouseReboot');
|
||||||
|
return ['status' => 400, 'error' => '无法获取实例区域信息'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'InstanceIds.0' => $instanceId,
|
'InstanceIds.0' => $instanceId,
|
||||||
];
|
];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user