ISP Блокируем пользователей за перерасход CPU
Добавлено: 2012-07-16 18:16:06
Сделал сегодня системную задачу в биллинге которая проверяет все заказы хостинга на предмет перерасхода cpu основываясь на данных от системного аккаунтинга в isp, sa в ос.
Раньше это были отдельные самостоятельные скрипты, а теперь все в биллинге штатно, кому надо берите.
1. sql
/www/domen/hosts/hosting/config/Config.xml
в секцию Tasks допишите задачу
в секцию Notifies
/hosts/hosting/templates/Notifies/Email
кидаем HostingNoticeCPUusage.tpl
HostingNoticeCPUusageMax.tpl
/hosts/hosting/comp/Tasks
CPUusage.comp.php
Раньше это были отдельные самостоятельные скрипты, а теперь все в биллинге штатно, кому надо берите.
1. sql
Код: Выделить всё
INSERT INTO `Tasks` (`UserID`,`TypeID`,`Params`,`IsActive`) VALUES (1,'CPUusage','[]','yes');
ALTER TABLE `HostingSchemes` ADD `ISPCPUusage` VARCHAR(255) NOT NULL ;
ALTER TABLE `HostingOrders` ADD `Cpucount` INT(12) NOT NULL;
DROP VIEW IF EXISTS `HostingOrdersOwners`;
DROP TABLE IF EXISTS `HostingOrdersOwners`;
CREATE
VIEW `HostingOrdersOwners` AS
SELECT
`HostingOrders`.*,
(SELECT `DaysRemainded` FROM `OrdersOwners` WHERE `HostingOrders`.`OrderID` = `OrdersOwners`.`ID`) AS `DaysRemainded`,
`OrdersOwners`.`OrderDate`,
`OrdersOwners`.`UserID`,
`OrdersOwners`.`ContractID`
FROM
`HostingOrders`
LEFT JOIN `OrdersOwners`
ON (`HostingOrders`.`OrderID` = `OrdersOwners`.`ID`);
/www/domen/hosts/hosting/config/Config.xml
в секцию Tasks допишите задачу
Код: Выделить всё
<CPUusage>
<Name>Учет статистики по cpu ispmanager</Name>
<Params type="array" />
<IsActive>1</IsActive>
</CPUusage>
в секцию Notifies
Код: Выделить всё
<HostingNoticeCPUusage>
<Name>Уведомление о превышение CPU</Name>
<GroupID>1</GroupID>
</HostingNoticeCPUusage>
/hosts/hosting/templates/Notifies/Email
кидаем HostingNoticeCPUusage.tpl
Код: Выделить всё
{*
* Copyright © 2012 Rootden for Dgrad-host.com
*}
{assign var=Theme value="Превышение использования CPU" scope=global}
Здравствуйте, {$User.Name|default:'$User.Name'}!
Предупреждение №{$HostingOrder.UsageCount|default:'$HostingOrder.UsageCount'}
Уведомляем Вас о том, что ваш аккаунт {$HostingOrder.Login|default:'$HostingOrder.Login'} заказ хостинга №{$HostingOrder.OrderID|string_format:"%05u"}, израсходовал все ресурсы по CPU согласно вашему тарифу {$HostingOrder.Tarif|default:'$HostingOrder.Tarif'}.
Вы использовали: {$HostingOrder.CpuUsage|default:'$HostingOrder.CpuUsage'} часа/часов процессорного времени за текущий месяц из {$HostingOrder.CpuUsageMax|default:'$HostingOrder.CpuUsageMax'}ч положенных по тарифу.
Просим вас решить эту проблему и сообщить о принятых мерах или повысить тариф, иначе аккаунт заблокируется автоматически после 3-го предупреждения.
За более детальной информацией обращайтесь в единый центр поддержки по адресу:
http://billing.dgrad-host.com/Tickets
{$From.Sign|default:'$From.Sign'}
HostingNoticeCPUusageMax.tpl
Код: Выделить всё
{*
* Copyright © 2012 Rootden for Dgrad-host.com
*}
{assign var=Theme value="Превышение использования CPU" scope=global}
Здравствуйте, {$User.Name|default:'$User.Name'}!
Ваш аккаунт заблокирован!
Уведомляем Вас о том, что вы получили 3 предупреждения и не отреагировали, ваш аккаунт {$HostingOrder.Login|default:'$HostingOrder.Login'} заказ хостинга №{$HostingOrder.OrderID|string_format:"%05u"} приостановлен.
Для разблокировки обращайтесь в единый центр поддержки по адресу:
http://billing.dgrad-host.com/Tickets
{$From.Sign|default:'$From.Sign'}
/hosts/hosting/comp/Tasks
CPUusage.comp.php
Код: Выделить всё
<?php
#-------------------------------------------------------------------------------
/** @author Rootden for Dgrad-host.com */
/******************************************************************************/
Eval(COMP_INIT);
if(Is_Error(System_Load('libs/Http.php')))
return ERROR | @Trigger_Error(500);
/******************************************************************************/
$Hostings = DB_Select('HostingOrdersOwners',Array('ID','OrderID','SchemeID','ServerID','Login','Cpucount','UserID'),Array('Where'=>"`StatusID` = 'Active'"));
#-------------------------------------------------------------------------------
switch(ValueOf($Hostings)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
# No more..
break;
case 'array':
#---------------------------------------------------------------------------
foreach($Hostings as $Hosting){
#-----------------------------------------------------------------------------
# выборка HostingSchemes нужно забрать cpu tarif
$CH = DB_Select('HostingSchemes',Array('Name','ISPCPUusage'),Array('Where'=>"`ID` = '$Hosting[SchemeID]'"));
Debug("USER_LOGIN = " . $Hosting['Login']);
#Debug("HOSTING_ID = " . $Hosting['ID']);
#Debug("SCHEME_ID = " . $Hosting['SchemeID']);
Debug("CH_TARIF = " . $CH[0]['ISPCPUusage']);
#Debug("CPU_COUNT = " . $Hosting['Cpucount']);
#-----------------------------------------------------------------------------
# Если CP isp то работаем, получаем totalresourceusage
$SRV = DB_Select('HostingServers',Array('SystemID','Address','Port','Protocol','Login','Password'),Array('Where'=>"`ID` = '$Hosting[ServerID]'"));
$SRV= $SRV[0];
if ( 'IspManager' == $SRV['SystemID'] ){
Debug("ISPMANAGER > = YES");
$authinfo = SPrintF('%s:%s',$SRV['Login'],$SRV['Password']);
$Http = Array(
'Address' => $SRV['Address'],
'Port' => $SRV['Port'],
'Host' => $SRV['Address'],
'Protocol' => $SRV['Protocol'],
'Hidden' => $authinfo,
'IsLoggin' => FALSE
);
$Response = Http_Send('/manager/ispmgr',$Http,Array('authinfo'=>$authinfo,'out'=>'xml','func'=>'totalresourceusage','elid'=>'ok'));
if(Is_Error($Response))
return ERROR | @Trigger_Error(500);
$Response = Trim($Response['Body']);
$XML = String_XML_Parse($Response);
$XML = $XML->ToArray('elem');
$Result = $XML['doc'];
#Debug(print_r($Result, true));
$found = false;
foreach ($Result as $key => $value) {
if ($value['account']==$Hosting['Login']) {
$found = $key;
$CPUusage = $value['utime'] + $value['stime'];
break;
}
}
#Debug("Key = " . $found);
#("CPUSUM_SEC = " . $CPUusage);
$cpumount = ceil($CPUusage/3600);
Debug("CPUSUM_CH = " . $cpumount);
#-----------------------------------------------------------------------------
# сравниваем и блокируем аккаунты
#if (1 == 1) {
if ($cpumount >= $CH[0]['ISPCPUusage']) {
Debug("Detect > = YES");
switch ($Hosting['Cpucount']){
case "0":
$IsUpdate = DB_Update('HostingOrders',Array('Cpucount'=>'1'),Array('ID'=>$Hosting['ID']));
if(Is_Error($IsUpdate))
return ERROR | @Trigger_Error(500);
$HostingO = Array('UsageCount' => '1', 'Login' => $Hosting['Login'], 'OrderID' => $Hosting['ID'], 'Tarif' => $CH[0]['Name'], 'CpuUsage' => $cpumount, 'CpuUsageMax' => $CH[0]['ISPCPUusage']);
$IsSend = NotificationManager::sendMsg(new Message('HostingNoticeCPUusage',$Hosting['UserID'],Array('HostingOrder'=>$HostingO)));
$Event = Array(
'UserID' => $Hosting['UserID'],
'PriorityID'=> 'Hosting',
'Text' => SPrintF('Превышение использования CPU, заказ хостинга %s, уведомление №1',$Hosting['Login'])
);
$Event = Comp_Load('Events/EventInsert',$Event);
if(!$Event)
return ERROR | @Trigger_Error(500);
break;
case "1":
$IsUpdate = DB_Update('HostingOrders',Array('Cpucount'=>'2'),Array('ID'=>$Hosting['ID']));
if(Is_Error($IsUpdate))
return ERROR | @Trigger_Error(500);
$HostingO = Array('UsageCount' => '2', 'Login' => $Hosting['Login'], 'OrderID' => $Hosting['ID'], 'Tarif' => $CH[0]['Name'], 'CpuUsage' => $cpumount, 'CpuUsageMax' => $CH[0]['ISPCPUusage']);
$IsSend = NotificationManager::sendMsg(new Message('HostingNoticeCPUusage',$Hosting['UserID'],Array('HostingOrder'=>$HostingO)));
$Event = Array(
'UserID' => $Hosting['UserID'],
'PriorityID'=> 'Hosting',
'Text' => SPrintF('Превышение использования CPU, заказ хостинга %s, уведомление №2',$Hosting['Login'])
);
$Event = Comp_Load('Events/EventInsert',$Event);
if(!$Event)
return ERROR | @Trigger_Error(500);
break;
case "2":
$IsUpdate = DB_Update('HostingOrders',Array('Cpucount'=>'3'),Array('ID'=>$Hosting['ID']));
if(Is_Error($IsUpdate))
return ERROR | @Trigger_Error(500);
$HostingO = Array('UsageCount' => '3', 'Login' => $Hosting['Login'], 'OrderID' => $Hosting['ID'], 'Tarif' => $CH[0]['Name'], 'CpuUsage' => $cpumount, 'CpuUsageMax' => $CH[0]['ISPCPUusage']);
$IsSend = NotificationManager::sendMsg(new Message('HostingNoticeCPUusage',$Hosting['UserID'],Array('HostingOrder'=>$HostingO)));
$Event = Array(
'UserID' => $Hosting['UserID'],
'PriorityID'=> 'Hosting',
'Text' => SPrintF('Превышение использования CPU, заказ хостинга %s, уведомление №3',$Hosting['Login'])
);
$Event = Comp_Load('Events/EventInsert',$Event);
if(!$Event)
return ERROR | @Trigger_Error(500);
break;
case "3":
$IsUpdate = DB_Update('HostingOrders',Array('Cpucount'=>'0'),Array('ID'=>$Hosting['ID']));
if(Is_Error($IsUpdate))
return ERROR | @Trigger_Error(500);
$HostingO = Array('UsageCount' => '1', 'Login' => $Hosting['Login'], 'OrderID' => $Hosting['ID'], 'Tarif' => $CH[0]['Name'], 'CpuUsage' => $cpumount, 'CpuUsageMax' => $CH[0]['ISPCPUusage']);
$IsSend = NotificationManager::sendMsg(new Message('HostingNoticeCPUusageMax',$Hosting['UserID'],Array('HostingOrder'=>$HostingO)));
$Comp = Comp_Load('www/API/StatusSet',Array('ModeID'=>'HostingOrders','StatusID'=>'Suspended','RowsIDs'=> $Hosting['OrderID'],'Comment'=> SPrintF('Перерасход CPU %s > тариф %s',$cpumount,$CH[0]['ISPCPUusage'])));
switch(ValueOf($Comp)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return ERROR | @Trigger_Error(400);
case 'array':
# No more...
break;
default:
return ERROR | @Trigger_Error(101);
} # end set staus
$Event = Array(
'UserID' => $Hosting['UserID'],
'PriorityID'=> 'Hosting',
'Text' => SPrintF('Превышение использования CPU, заказ хостинга %s, уведомление №%s',$Hosting['Login'],$Hosting['Cpucount'])
);
$Event = Comp_Load('Events/EventInsert',$Event);
if(!$Event)
return ERROR | @Trigger_Error(500);
break;
default:
Debug("Cpucount > 3");
return ERROR | @Trigger_Error(500);
}
} else Debug("DETECT > = NO");
}else Debug("ISPMANAGER > = NO");
}
break;
default:
return ERROR | @Trigger_Error(500);
}
#-------------------------------------------------------------------------------
return MkTime(1,30,0,Date('n'),Date('j')+1,Date('Y'));
#-------------------------------------------------------------------------------
?>