Создание модулей обработки

Материал из ISPWiki

Перейти к: навигация, поиск

В данной статье описано создание модуля обработки продуктов. Для лучшего понимания, в конце статьи приведен пример на perl.

Любой файл в каталоге /usr/local/ispmgr/sbin/ начинающийся с cp, BILLmanager считает модулем обработки. Программа должна удовлетворять следующим параметрам:

  • Принимать параметры как через shell так и как LongTask
  • обрабатывать запросы:
    • open
    • delete
    • check
    • getconfig
    • setparam
    • resume
    • suspend
    • getstats
    • fix (опционально)
    • delip (опционально)
    • newip (опционально)


В большинстве функции, биллинг передает код продукта, остальное необходимо взять из базы. Входные параметры передаются в том порядке, в каком указано в этой статье.

Содержание

open

Выполняет действия при открытии продукта. К примеру, создает аккаунт пользователя в панели управления.

 open item_id
  • item_id - Код товара. id из таблицы item.

Чтобы сообщить биллингу устанавливаемые при создании параметры, необходимо вызвать следующую команду:

 /usr/local/ispmgr/sbin/mgrctl -m billmgr product_type.open sok=ok elid=item_id param_name1=value1 param_name2=value2 ... param_nameN=valueN
  • param_nameX - имена параметров, которые необходимо заполнить при создании.
  • product_type - тип продукта. Возможны следующие значения:
    • vhost - виртуальный хостинг.
    • vds - виртуальные выделенные серверы.
    • rvds - реселлинг виртуальных выделенных серверов.
    • uniservice - собственные услуги.

delete

Удаления товара.

 delete item_id
  • item_id - Код товара. id из таблицы item.

Чтобы сообщить биллингу о завершении операции необходимо вызвать следующую команду:

 /usr/local/ispmgr/sbin/mgrctl -m billmgr item.setstatus elid=item_id status=4

suspend

Отключение товара.

 suspend item_id
  • item_id - Код товара. id из таблицы item.

Чтобы сообщить биллингу о завершении операции необходимо вызвать следующую команду:

 /usr/local/ispmgr/sbin/mgrctl -m billmgr item.setstatus elid=item_id status=3

resume

Включение товара.

 resume item_id
  • item_id - Код товара. id из таблицы item.

Чтобы сообщить биллингу о завершении операции необходимо вызвать следующую команду:

 /usr/local/ispmgr/sbin/mgrctl -m billmgr item.setstatus elid=item_id status=2

setparam

Вызывается при изменении параметров продукта.

 setparam item_id
  • item_id - Код товара. id из таблицы item.

check

Проверяет подключение к серверу.

 check ip user
  • ip - IP-Адрес.
  • user - Имя пользователя для подключения.

пароль передается на стандартный входной поток. При успешном подключении необходимо на стандартный выход подать OK\n

getconfig

Запрос конфигурации сервера. Необходима для того чтобы получать список шаблонов, возможностей.

 getconfig server_id
  • server_id - код сервера. id из таблицы server

Для того чтобы передать конфиг билингу необходимо вызвать:

 /usr/local/ispmgr/sbin/mgrctl -m billmgr server.setconfig elid=server_id config=value


getstats

Раз в день, BILLmanager запрашивает статистику сервера. Если необходимо, чтобы что-то считалось на основе статистики, то следует в обработке этого запроса добавлять статистику в таблицу itemstat. Дальше уже биллинг сам обработает. Структура таблицы itemstat:

  • item - код продукта
  • statdate - за какой день статистика
  • param - имя параметра
  • value - значение
 getstats server_id
  • server_id - код сервера. id из таблицы server

После того как добавит статистику за день, следует вызвать

 /usr/local/ispmgr/sbin/mgrctl -m billmgr billserver elid=server_id date=YYYY-MM-DD
  • in - входящий трафик
  • out - исходящи трафик

fix

Не обязательно реализовывать эту функцию. BILLmanager даже не запускает его самостоятельно. Ее стоит создавать, чтобы, к примеру, раз в день проверялось соответствие значений в биллинге и того что на серверах. К примеру, что-то могли поменять руками, а в базе другие значения. Если это не исправлять, то со временем накапливается бардак. По этому советуем реализовать такую функцию, и запускать по крону.

newip

TODO

delip

TODO


Пример

Для того чтобы на практике увидеть как можно реализовать модуль, приведем пример на perl осуществляющий создание ftp аккаунтов в панели управления ISPmanager

 #!/usr/bin/perl
 use XML::LibXML;
 use WWW::Curl::Easy;
  open(DEBUG, ">>/tmp/debug.log");
  open (FD3, '<&3');	
  my @ltparams;
  my $count = 0;
  while (<FD3>) {		
    chomp;
    $ltparams[$count] = $_;
    $count = $count + 1;
  }
  if ($count){
    my $res = longtask();
    open (FD3, '>&3');
    seek(FD3, 0, 0);
    truncate(FD3, 0);
    if($res){
      print FD3 "ERR $res\n";
   } else {
      print FD3 "OK!\n";
    }
    system "/usr/local/ispmgr/sbin/mgrctl -m billmgr longtask";
  } else {
    #значит не LongTask, можно работать в обычном режиме.
    if($ARGV[0] eq "check") {
     my $pass = <STDIN>;
      CheckServerConnection($ARGV[1], $ARGV[2], $pass);
    }
    if($ARGV[0] eq "test") {
    test();
    }
  }
  close(DEBUG);
  sub longtask(){
    #здесь можно читать параметры из массива @ltparams
    #В случае ошибки нужно будет просто вернуть не пустую строку.
   if($ltparams[1] eq "check") {
     CheckServerConnection($ltparams[2], $ltparams[3], $ltparams[4]);
   }
 }


 sub CheckServerConnection(){
   print DEBUG "$_[0]";
   my $addr = $_[0];
   my $username = $_[1];
   my $password = $_[2];
   print DEBUG "$addr   $username   $password\n";
   my $ret = curl_response("https://$addr/manager/ispmgr?out=xml&authinfo=$username:$password&func=usrparam");
   my $parser = XML::LibXML->new();
   print DEBUG "ret = $ret\n";
   my $xml = $parser->parse_string($ret);
   @testinput = $xml->getElementsByTagName('name');
   print DEBUG $testinput[0]->textContent;
   if($testinput[0]->textContent eq $username){
     print "OK\n";
   }
   return;
 }
 sub test(){
    curl_response("https://82.146.37.16/manager/ispmgr?func=register&out=xml");
 }
 
 sub curl_response(){
   my $Curl = new WWW::Curl::Easy;
   my $out;
   open (my $fileb, ">", \$out);
   $Curl->setopt(CURLOPT_SSL_VERIFYPEER, '0L');
   $Curl->setopt(CURLOPT_SSL_VERIFYHOST, '0L');
   $Curl->setopt(CURLOPT_URL, $_[0]);
   $Curl->setopt(CURLOPT_WRITEDATA, $fileb);
   my $retcode = $Curl->perform;
   if ($retcode == 0) {
   print DEBUG "Transfer went ok\n";
   print DEBUG "Received response: $out\n";
   return $out;
   } else {
      print("An error happened: ".$Curl->strerror($retcode)." ($retcode)\n");
   }
 }
Была ли эта информация полезной? Да | Нет