Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Удаленное управление питанием сервера через Rack PDU

15.12.2012 | Категория: Web-мастеру и не только | Автор: ManHunter

Удаленное управление питанием сервера через Rack PDU

Когда-то по работе возникла необходимость автоматизированного управления серверами в стойке дата-центра. Вопрос с контролем за питанием был решен через power-свич (Switched Rack PDU), который имел возможность удаленного управления по telnet. Для эмуляции действий пользователя я написал вот такой небольшой класс на PHP. Может быть пригодится кому-нибудь еще.

Читать статью целиком »
Просмотров: 5217 | Комментариев: 0

HTTP-заголовки на PHP: Status или HTTP/1.x?

05.12.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Для управления переадресацией, установки ответов сервера и передачи пользовательских заголовков в PHP используется функция Header. C ее помощью можно, например, установить статус ошибки 404, чтобы сообщить браузеру или поисковой системе, что такой страницы сайта больше не существует. В официальной документации такой случай описывается следующим образом:
  1. <?
  2. header ("HTTP/1.0 404 Not Found");
  3. ?>
Или же, как более корректный вариант:
  1. <?
  2. Header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
  3. ?>
Теперь приступим к тестам. Для проверки поведения скрипта возьмем менеджер закачек Download Master и браузер Firefox с дополнением LiveHTTPHeaders. В качестве тестовых систем для скрипта будут два локальных компьютера и хостинговый сервер. Конфигурация локальных машин: сервер Apache 1.3 и 2.0, PHP версии 5 установлен как CGI/FastCGI, операционная система Windows XP и Windows Seven. Результат плачевный: на обеих системах скрипт рушится с Internal Server Error, а в логе Apache ошибка записана как:

malformed header from script. Bad header=HTTP/1.1 404 Not Found

Хостинговый сервер ведет себя более дружелюбно. Конфигурация: Apache 1.3, PHP версии 4 установлен как CGI, операционная система Linux. При попытке "скачать" скрипт при помощи Download Master, его лог будет вполне ожидаемым, за исключением потери нашего сообщения, что файл не найден Not Found.

Читать статью целиком »
Просмотров: 10508 | Комментариев: 7

Работа с недокументированными API WHM и cPanel

20.10.2008 | Категория: Web-мастеру и не только | Автор: ManHunter
cPanel является одной из самых популярных коммерческих панелей управления аккаунтами на серверах виртуального хостинга. Все действия выполняются обычно через web-интерфейс, но для использования в ваших проектах авторами предоставляется API. К сожалению вообще никакой вменяемой документации разработчикам не предоставляется. Эту позорную отмазку на официальном сайте назвать технической документацией трудно, поэтому при разработке очередного проекта пришлось создавать собственный класс для работы с cPanel. Попутно удалось реализовать несколько недокументированных функций и расширить функционал уже имеющихся.
  1. <?
  2. // -------------------------------------------------------------
  3. // Класс для работы с WHM/cPanel через API
  4. // (C) ManHunter / PCL
  5. // http://www.manhunter.ru
  6. // -------------------------------------------------------------
  7. class cpanel_class {
  8.   var $cpanelaccterr;
  9.   var $host;
  10.   var $user;
  11.   var $accesshash;
  12.   var $usessl;
  13.  
  14.   // -------------------------------------------------------------
  15.   // Изменить пароль на аккаунте
  16.   // Для выполнения нужна авторизация только с рутовым доступом
  17.   // $chuser - аккаунт на сервере
  18.   // $password - новый пароль
  19.   // -------------------------------------------------------------
  20.   function chgpassword ($chuser$password) {
  21.     if ($this->user!="root") {
  22.       $this->cpanelaccterr="Root privileges required";
  23.       return;
  24.     }
  25.     $result $this->whmreq("/scripts/passwd?user=${chuser}&password=${password}&password2=${password}");
  26.     $result=eregi_replace("[\n]{1,}","\n",strip_tags($result));
  27.     if ($this->cpanelaccterr != "") { return; }
  28.     if (strpos($result,"could not be changed")!==false) {
  29.       $this->cpanelaccterr=$result;
  30.       return;
  31.     }
  32.     return $result;
  33.   }
  34.  
  35.   // -------------------------------------------------------------
  36.   // Заблокировать аккаунт
  37.   // $suspenduser - аккаунт на сервере
  38.   // $reason - причина блокировки, сделано на перспективу,
  39.   //           фактически параметр панелью игнорируется
  40.   // -------------------------------------------------------------
  41.   function suspend ($suspenduser$reason="") {
  42.     $reason=str_replace(" ","+",$reason);
  43.     $result $this->whmreq("/scripts/remote_suspend?user=${suspenduser}&reason=${reason}");
  44.     if ($this->cpanelaccterr != "") { return; }
  45.     if (strpos($result,"Access Denied")!==false) {
  46.       $this->cpanelaccterr=$result;
  47.       return;
  48.     }
  49.     return $result;
  50.   }
  51.  
  52.   // -------------------------------------------------------------
  53.   // Разблокировать аккаунт
  54.   // $unsuspenduser - аккаунт на сервере
  55.   // -------------------------------------------------------------
  56.   function unsuspend ($unsuspenduser) {
  57.     $result $this->whmreq("/scripts/remote_unsuspend?user=${unsuspenduser}");
  58.     if ($this->cpanelaccterr != "") { return; }
  59.     if (strpos($result,"Access Denied")!==false) {
  60.       $this->cpanelaccterr=$result;
  61.       return;
  62.     }
  63.     return $result;
  64.   }
  65.  
  66.   // -------------------------------------------------------------
  67.   // Удалить аккаунт
  68.   // $killuser - аккаунт на сервере
  69.   // -------------------------------------------------------------
  70.   function killacct ($killuser) {
  71.     $result $this->whmreq("/scripts/killacct?user=${killuser}&nohtml=1");
  72.     if ($this->cpanelaccterr != "") { return; }
  73.     return $result;
  74.   }
  75.  
  76.   // -------------------------------------------------------------
  77.   // Показать версию WHM/cPanel
  78.   // -------------------------------------------------------------
  79.   function showversion () {
  80.     $result $this->whmreq("/scripts2/showversion");
  81.     if ($this->cpanelaccterr != "") { return; }
  82.     return $result;
  83.   }
  84.  
  85.   // -------------------------------------------------------------
  86.   // Перевести аккаунт на новый тарифный план
  87.   // $upuser - аккаунт на сервере
  88.   // $acctplan - новый тарифный план
  89.   // -------------------------------------------------------------
  90.   function update ($upuser$acctplan) {
  91.     $acctplan=str_replace(" ","+",$acctplan);
  92.     $result $this->whmreq("/scripts2/upacct?user=${upuser}&pkg=${acctplan}");
  93.     if ($this->cpanelaccterr != "") { return; }
  94.     return $result;
  95.   }
  96.  
  97.   // -------------------------------------------------------------
  98.   // Открыть новый аккаунт
  99.   // $acctdomain - домен
  100.   // $acctuser - логин для аккаунта
  101.   // $acctpass - пароль для аккаунта
  102.   // $acctplan - тарифный план
  103.   // $accemail - контактный email аккаунта
  104.   // $acccpmod - стиль cPanel по умолчанию
  105.   // -------------------------------------------------------------
  106.   function createacct ($acctdomain$acctuser$acctpass$acctplan$accemail,
  107.            $acccpmod="bluelagoon") {
  108.     if (!eregi("^[-a-z0-9\.]{4,}$",$acctdomain)) {
  109.       $this->cpanelaccterr="Invalid domain name";
  110.       return;
  111.     }
  112.     $acctplan=str_replace(" ","+",$acctplan);
  113.     $accemail=str_replace("@","%40",$accemail);
  114.     $result $this->whmreq("/scripts/wwwacct?remote=1&nohtml=1&username=${acctuser}&password=${acctpass}&domain=${acctdomain}&plan=${acctplan}&contactemail=${accemail}&cpmod=${acccpmod}");
  115.     if ($this->cpanelaccterr != "") { return; }
  116.     return $result;
  117.   }
  118.  
  119.   // -------------------------------------------------------------
  120.   // Показать список имеющихся на сервере аккаунтов
  121.   // -------------------------------------------------------------
  122.   function listaccts () {
  123.     $result $this->whmreq("/scripts2/listaccts?nohtml=1&viewall=1");
  124.     if ($this->cpanelaccterr != "") { return; }
  125.  
  126.     $page split("\n",$result);
  127.     foreach ($page as $line) {
  128.       list($acct,$contents) = split("="$line);
  129.       if ($acct != "") {
  130.         $allc split(","$contents);
  131.         $accts[$acct] = $allc;
  132.       }
  133.     }
  134.     return($accts);
  135.   }
  136.  
  137.   // -------------------------------------------------------------
  138.   // Показать список заведенных на сервере тарифных планов
  139.   // -------------------------------------------------------------
  140.   function listpkgs () {
  141.     $result $this->whmreq("/scripts/remote_listpkg");
  142.     if ($this->cpanelaccterr != "") { return; }
  143.  
  144.     $page split("\n",$result);
  145.     foreach ($page as $line) {
  146.       list($pkg,$contents) = split("="$line);
  147.       if ($pkg != "") {
  148.         $allc split(","$contents);
  149.         $pkgs[$pkg] = $allc;
  150.       }
  151.     }
  152.     return($pkgs);
  153.   }
  154.  
  155.   // -------------------------------------------------------------
  156.   // Запрос к WHM/cPanel. Используется только для работы внутри
  157.   // класса, извне вызываться не должен
  158.   // -------------------------------------------------------------
  159.   function whmreq ($request) {
  160.     $cleanaccesshash preg_replace("'(\r|\n)'","",$this->accesshash);
  161.     $authstr $this->user ":" $cleanaccesshash;
  162.     $this->cpanelaccterr "";
  163.  
  164.     if (function_exists("curl_init")) {
  165.       $ch curl_init();
  166.       if ($this->usessl) {
  167.         curl_setopt($chCURLOPT_SSL_VERIFYPEER,0);                
  168.         curl_setopt($chCURLOPT_SSL_VERIFYHOST,0);
  169.         curl_setopt($chCURLOPT_URL"https://".$this->host.":2087" $request);
  170.       }
  171.       else {
  172.         curl_setopt($chCURLOPT_URL"http://".$this->host.":2086" $request);
  173.       }
  174.       curl_setopt($chCURLOPT_HEADER0);
  175.       curl_setopt($chCURLOPT_RETURNTRANSFER,1);
  176.       $curlheaders[0] = "Authorization: WHM $authstr";
  177.       curl_setopt($ch,CURLOPT_HTTPHEADER,$curlheaders);
  178.       $data=curl_exec ($ch);
  179.       curl_close ($ch);
  180.     }
  181.     elseif (function_exists("socket_create")) {
  182.       if ($this->usessl) {
  183.         $this->cpanelaccterr "SSL Support requires curl";
  184.         return;
  185.       }
  186.       $service_port 2086;
  187.       $address gethostbyname($this->host);
  188.       $socket socket_create (AF_INETSOCK_STREAM0);
  189.       if ($socket 0) {
  190.         $this->cpanelaccterr "socket_create() failed";
  191.         return;
  192.       }
  193.       $result socket_connect ($socket$address$service_port);
  194.       if ($result 0) {
  195.         $this->cpanelaccterr "socket_connect() failed";
  196.         return;
  197.       }
  198.       $in "GET $request HTTP/1.0\n";
  199.       socket_write($socket,$in,strlen($in));    
  200.       $in "Connection: close\n";
  201.       socket_write($socket,$in,strlen($in));    
  202.       $in "Authorization: WHM $authstr\n\n\n";
  203.       socket_write($socket,$in,strlen($in));    
  204.  
  205.       $inheader 1;
  206.       while(($buf socket_read($socket512)) != false) {
  207.         if (!$inheader) {
  208.           $data .= $buf;
  209.         }
  210.         if (preg_match("'\r\n\r\n$'s"$buf)) {
  211.           $inheader 0;
  212.         }
  213.         if (preg_match("'\n\n$'s"$buf)) {
  214.           $inheader 0;
  215.         }
  216.         if (preg_match("'\r\n$'s"$buf)) {
  217.           $inheader 0;
  218.         }
  219.       }
  220.     }
  221.     else {
  222.       $this->cpanelaccterr "php not compiled with --enable-sockets OR curl";
  223.       return;
  224.     }
  225.     return $data;    
  226.   }
  227. }
  228. ?>
Для работы с этими функциями требуется доступ с правами администратора, и только для chgpassword требуется рутовый доступ. PHP должен быть собран с модулем curl или enable-sockets. При наличии навыков класс можно легко расширять другими функциями, доступными через web-интерфейс WHM/cPanel.

Читать статью целиком »
Просмотров: 7236 | Комментариев: 9

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 3 (0.0026 сек.) / Память: 4.5 Mb
Наверх