Быстрый поиск
Введите фрагмент названия статьи для поиска
Удаленное управление питанием сервера через Rack PDU
15.12.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Удаленное управление питанием сервера через Rack PDU
Когда-то по работе возникла необходимость автоматизированного управления серверами в стойке дата-центра. Вопрос с контролем за питанием был решен через power-свич (Switched Rack PDU), который имел возможность удаленного управления по telnet. Для эмуляции действий пользователя я написал вот такой небольшой класс на PHP. Может быть пригодится кому-нибудь еще.
Читать статью целиком »
Просмотров: 5342 | Комментариев: 0
HTTP-заголовки на PHP: Status или HTTP/1.x?
05.12.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Для управления переадресацией, установки ответов сервера и передачи пользовательских заголовков в PHP используется функция Header. C ее помощью можно, например, установить статус ошибки 404, чтобы сообщить браузеру или поисковой системе, что такой страницы сайта больше не существует. В официальной документации такой случай описывается следующим образом:Code (PHP) : Убрать нумерацию
- <?
- header ("HTTP/1.0 404 Not Found");
- ?>
Code (PHP) : Убрать нумерацию
- <?
- Header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
- ?>
malformed header from script. Bad header=HTTP/1.1 404 Not Found
Хостинговый сервер ведет себя более дружелюбно. Конфигурация: Apache 1.3, PHP версии 4 установлен как CGI, операционная система Linux. При попытке "скачать" скрипт при помощи Download Master, его лог будет вполне ожидаемым, за исключением потери нашего сообщения, что файл не найден Not Found.
Читать статью целиком »
Просмотров: 10636 | Комментариев: 7
Работа с недокументированными API WHM и cPanel
20.10.2008 | Категория: Web-мастеру и не только | Автор: ManHunter
cPanel является одной из самых популярных коммерческих панелей управления аккаунтами на серверах виртуального хостинга. Все действия выполняются обычно через web-интерфейс, но для использования в ваших проектах авторами предоставляется API. К сожалению вообще никакой вменяемой документации разработчикам не предоставляется. Эту позорную отмазку на официальном сайте назвать технической документацией трудно, поэтому при разработке очередного проекта пришлось создавать собственный класс для работы с cPanel. Попутно удалось реализовать несколько недокументированных функций и расширить функционал уже имеющихся.Code (PHP) : Убрать нумерацию
- <?
- // -------------------------------------------------------------
- // Класс для работы с WHM/cPanel через API
- // (C) ManHunter / PCL
- // http://www.manhunter.ru
- // -------------------------------------------------------------
- class cpanel_class {
- var $cpanelaccterr;
- var $host;
- var $user;
- var $accesshash;
- var $usessl;
- // -------------------------------------------------------------
- // Изменить пароль на аккаунте
- // Для выполнения нужна авторизация только с рутовым доступом
- // $chuser - аккаунт на сервере
- // $password - новый пароль
- // -------------------------------------------------------------
- function chgpassword ($chuser, $password) {
- if ($this->user!="root") {
- $this->cpanelaccterr="Root privileges required";
- return;
- }
- $result = $this->whmreq("/scripts/passwd?user=${chuser}&password=${password}&password2=${password}");
- $result=eregi_replace("[\n]{1,}","\n",strip_tags($result));
- if ($this->cpanelaccterr != "") { return; }
- if (strpos($result,"could not be changed")!==false) {
- $this->cpanelaccterr=$result;
- return;
- }
- return $result;
- }
- // -------------------------------------------------------------
- // Заблокировать аккаунт
- // $suspenduser - аккаунт на сервере
- // $reason - причина блокировки, сделано на перспективу,
- // фактически параметр панелью игнорируется
- // -------------------------------------------------------------
- function suspend ($suspenduser, $reason="") {
- $reason=str_replace(" ","+",$reason);
- $result = $this->whmreq("/scripts/remote_suspend?user=${suspenduser}&reason=${reason}");
- if ($this->cpanelaccterr != "") { return; }
- if (strpos($result,"Access Denied")!==false) {
- $this->cpanelaccterr=$result;
- return;
- }
- return $result;
- }
- // -------------------------------------------------------------
- // Разблокировать аккаунт
- // $unsuspenduser - аккаунт на сервере
- // -------------------------------------------------------------
- function unsuspend ($unsuspenduser) {
- $result = $this->whmreq("/scripts/remote_unsuspend?user=${unsuspenduser}");
- if ($this->cpanelaccterr != "") { return; }
- if (strpos($result,"Access Denied")!==false) {
- $this->cpanelaccterr=$result;
- return;
- }
- return $result;
- }
- // -------------------------------------------------------------
- // Удалить аккаунт
- // $killuser - аккаунт на сервере
- // -------------------------------------------------------------
- function killacct ($killuser) {
- $result = $this->whmreq("/scripts/killacct?user=${killuser}&nohtml=1");
- if ($this->cpanelaccterr != "") { return; }
- return $result;
- }
- // -------------------------------------------------------------
- // Показать версию WHM/cPanel
- // -------------------------------------------------------------
- function showversion () {
- $result = $this->whmreq("/scripts2/showversion");
- if ($this->cpanelaccterr != "") { return; }
- return $result;
- }
- // -------------------------------------------------------------
- // Перевести аккаунт на новый тарифный план
- // $upuser - аккаунт на сервере
- // $acctplan - новый тарифный план
- // -------------------------------------------------------------
- function update ($upuser, $acctplan) {
- $acctplan=str_replace(" ","+",$acctplan);
- $result = $this->whmreq("/scripts2/upacct?user=${upuser}&pkg=${acctplan}");
- if ($this->cpanelaccterr != "") { return; }
- return $result;
- }
- // -------------------------------------------------------------
- // Открыть новый аккаунт
- // $acctdomain - домен
- // $acctuser - логин для аккаунта
- // $acctpass - пароль для аккаунта
- // $acctplan - тарифный план
- // $accemail - контактный email аккаунта
- // $acccpmod - стиль cPanel по умолчанию
- // -------------------------------------------------------------
- function createacct ($acctdomain, $acctuser, $acctpass, $acctplan, $accemail,
- $acccpmod="bluelagoon") {
- if (!eregi("^[-a-z0-9\.]{4,}$",$acctdomain)) {
- $this->cpanelaccterr="Invalid domain name";
- return;
- }
- $acctplan=str_replace(" ","+",$acctplan);
- $accemail=str_replace("@","%40",$accemail);
- $result = $this->whmreq("/scripts/wwwacct?remote=1&nohtml=1&username=${acctuser}&password=${acctpass}&domain=${acctdomain}&plan=${acctplan}&contactemail=${accemail}&cpmod=${acccpmod}");
- if ($this->cpanelaccterr != "") { return; }
- return $result;
- }
- // -------------------------------------------------------------
- // Показать список имеющихся на сервере аккаунтов
- // -------------------------------------------------------------
- function listaccts () {
- $result = $this->whmreq("/scripts2/listaccts?nohtml=1&viewall=1");
- if ($this->cpanelaccterr != "") { return; }
- $page = split("\n",$result);
- foreach ($page as $line) {
- list($acct,$contents) = split("=", $line);
- if ($acct != "") {
- $allc = split(",", $contents);
- $accts[$acct] = $allc;
- }
- }
- return($accts);
- }
- // -------------------------------------------------------------
- // Показать список заведенных на сервере тарифных планов
- // -------------------------------------------------------------
- function listpkgs () {
- $result = $this->whmreq("/scripts/remote_listpkg");
- if ($this->cpanelaccterr != "") { return; }
- $page = split("\n",$result);
- foreach ($page as $line) {
- list($pkg,$contents) = split("=", $line);
- if ($pkg != "") {
- $allc = split(",", $contents);
- $pkgs[$pkg] = $allc;
- }
- }
- return($pkgs);
- }
- // -------------------------------------------------------------
- // Запрос к WHM/cPanel. Используется только для работы внутри
- // класса, извне вызываться не должен
- // -------------------------------------------------------------
- function whmreq ($request) {
- $cleanaccesshash = preg_replace("'(\r|\n)'","",$this->accesshash);
- $authstr = $this->user . ":" . $cleanaccesshash;
- $this->cpanelaccterr = "";
- if (function_exists("curl_init")) {
- $ch = curl_init();
- if ($this->usessl) {
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
- curl_setopt($ch, CURLOPT_URL, "https://".$this->host.":2087" . $request);
- }
- else {
- curl_setopt($ch, CURLOPT_URL, "http://".$this->host.":2086" . $request);
- }
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
- $curlheaders[0] = "Authorization: WHM $authstr";
- curl_setopt($ch,CURLOPT_HTTPHEADER,$curlheaders);
- $data=curl_exec ($ch);
- curl_close ($ch);
- }
- elseif (function_exists("socket_create")) {
- if ($this->usessl) {
- $this->cpanelaccterr = "SSL Support requires curl";
- return;
- }
- $service_port = 2086;
- $address = gethostbyname($this->host);
- $socket = socket_create (AF_INET, SOCK_STREAM, 0);
- if ($socket < 0) {
- $this->cpanelaccterr = "socket_create() failed";
- return;
- }
- $result = socket_connect ($socket, $address, $service_port);
- if ($result < 0) {
- $this->cpanelaccterr = "socket_connect() failed";
- return;
- }
- $in = "GET $request HTTP/1.0\n";
- socket_write($socket,$in,strlen($in));
- $in = "Connection: close\n";
- socket_write($socket,$in,strlen($in));
- $in = "Authorization: WHM $authstr\n\n\n";
- socket_write($socket,$in,strlen($in));
- $inheader = 1;
- while(($buf = socket_read($socket, 512)) != false) {
- if (!$inheader) {
- $data .= $buf;
- }
- if (preg_match("'\r\n\r\n$'s", $buf)) {
- $inheader = 0;
- }
- if (preg_match("'\n\n$'s", $buf)) {
- $inheader = 0;
- }
- if (preg_match("'\r\n$'s", $buf)) {
- $inheader = 0;
- }
- }
- }
- else {
- $this->cpanelaccterr = "php not compiled with --enable-sockets OR curl";
- return;
- }
- return $data;
- }
- }
- ?>
Читать статью целиком »
Просмотров: 7652 | Комментариев: 9