Просмотр полной версии : Скрипт php для отправки команды в консоль mangosd.exe
coftsonyk
11.12.2010, 22:35
delete
Пример реализации коннекта к консоли на SOAP есть в оффициальном репозитории gitgub.
https://github.com/mangos/mangos/blob/master/contrib/soap/example.php
coftsonyk
12.12.2010, 00:34
delete
Feel the Power
12.12.2010, 01:24
если не затруднит можно ссылочку?
http://github.com/mangos/mangos
coftsonyk
12.12.2010, 17:00
delete
Кот ДаWINчи
12.12.2010, 17:50
конфиг хорошо продокументирован. Переводи, вникай, настраивай.
coftsonyk
12.12.2010, 21:02
delete
EPIC FAAAAIL!
coftsonyk, Class 'SoapClient' not found = Класс 'SoapClient' не найден.
Гугл умнее тебя: http://forum.dklab.ru/viewtopic.php?t=9707
ghostpast
13.12.2010, 06:52
У меня не денвер.
extension=php_soap.dll или extension=php_soap.so
У меня не денвер. и не мозги?
Кто разобрался - поделитесь пожалуйста, более развернутой инструкцией по эксплуатации SOAP.
В PHP все настроено:
В конфиге сервера - тоже разрешено все и 127.0.0.1 IP
Порт 7878 открыт в iptables
Но выдает ошибку - не может подключиться
Command failed! Reason:
Could not connect to host
Подскажите к чему задается пароль и что такое MaNGOS - это имя процесса или имя screen в котором этот процесс запущен?
Пароль и логин - это произвольные для повышения безопасности или от чего-то еще.
$username = 'ADMINISTRATOR';
$password = 'ADMINISTRATOR';
$host = "localhost";
$soapport = 7878;
$command = "server info";
$client = new SoapClient(NULL,
array(
"location" => "http://$host:$soapport/",
"uri" => "urn:MaNGOS",
"style" => SOAP_RPC,
'login' => $username,
'password' => $password
));
Прошу прощения за элементарные вопросы - но как раз такую информацию сложнее всего нагуглить.
Посмотри в netstat -nl на каком ипе слушается порт 7878.
Посмотри в netstat -nl на каком ипе слушается порт 7878.
tcp 0 0 127.0.0.1:7878 0.0.0.0:* LISTEN
Сейчас выдается такая ошибка:
Command failed! Reason:
Method 'ns1:executeCommand' not implemented: method name or namespace not recognized
tcp 0 0 127.0.0.1:7878 0.0.0.0:* LISTEN
Сейчас выдается такая ошибка:
Command failed! Reason:
Method 'ns1:executeCommand' not implemented: method name or namespace not recognized
разбирайся...
В примере логин и пароль:
$username = 'ADMINISTRATOR';
$password = 'ADMINISTRATOR';
От чего они? Имя пользователя и пароль при подключении к Linux?
И как пробиться к процессу, запущенному в screen?
Допустим есть несколько screen с именами mangos, mangos1 - как послать команду в консоль процесса запущенного в том или ином screen?
И если есть возможность - поделитесь ссылкой на описание работы SOAP а то не могу никак найти и продвинуться дальше.
В примере логин и пароль:
$username = 'ADMINISTRATOR';
$password = 'ADMINISTRATOR';
От чего они? Имя пользователя и пароль при подключении к Linux? Эмм... судя по коду - это логин-пароль админа мангос... Или я что-то совсем путаю? По крайней мере с этими данными отправляется команда в консоль мангос.
Допустим есть несколько screen с именами mangos, mangos1 - как послать команду в консоль процесса запущенного в том или ином screen?
Разные порты SOAP в конфигах сервера? =)
Разные порты SOAP в конфигах сервера? =)
Хороший совет - спасибо. Но у меня видимо что-то не установлено из ПО - так как так и получаю до сих ошибку:
Command failed! Reason:
Method 'ns1:executeCommand' not implemented: method name or namespace not recognized
Суть ошибки понятна, но как исправить, что на это влияет - сколько ни гуглил, ответа найти не могу. Может кто сталкивался с подобным?
Обработать пытаюсь пример приведенный в этой теме чуть выше (он же в репо мангоса).
Это не ПО. Настройки php ковыряй. Почему-то он не знает метод executeCommand
Но для меня более странно (может это и нормально), почему он метод пишет как ns1:executeCommand
Что такое ns1: лично я не ведаю вообще...
Вероятно у меня не хватает чего -то в PHP.
Версия PhP 5.3.6-2
в php.ini:
[soap]
; Enables or disables WSDL caching feature.
; http://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1
; extension=php_soap.so
; Sets the directory name where SOAP extension will put cache files.
; http://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
; http://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400
; Sets the size of the cache limit. (Max. number of WSDL files to cache)
soap.wsdl_cache_limit = 5
Более ничего про SOAP нет.
а само расширение php_soap в php.ini раскомментировано?
конечно глупо звучит, но все же...
Это не ПО. Настройки php ковыряй. Почему-то он не знает метод executeCommand
Но для меня более странно (может это и нормально), почему он метод пишет как ns1:executeCommand
Что такое ns1: лично я не ведаю вообще...
у него включена поддержка пространств имен в php. что это такое я сам только догадываюсь :)
а само расширение php_soap в php.ini раскомментировано?
конечно глупо звучит, но все же...
; extension=php_soap.so
это не оно ?
это не оно ? Оно-оно, но там в принципе и выше быть может раскомментировано.
Разбираю SOAP на Qt, и пока не разобрался в правильности составления запроса для мангоса. Хотел вывести запрос в XML на пхп, но не получилось, __getLastRequest() приватная, а в пхп я не очень силен :) Кто может выложить пример запроса в XML формате? :)
добавлю к этой темке комент..
Command failed! Reason:
HTTP Error: 401 Unauthorized
Типо не получилось авторизироваться? но логин и пас ввёл от ака на котором стоит левл 4
Кот ДаWINчи
13.11.2011, 16:10
Типо не получилось авторизироваться? но логин и пас ввёл от ака на котором стоит левл 4
а в конфиге мангоса соап включен и настроен?
если бы он не был включен то , ожидание 30 секунд и дальше ошибка тайм аут.
Настроен?
SOAP.Enabled = 1
SOAP.IP = 127.0.0.1
SOAP.Port = 7878
Кот ДаWINчи
13.11.2011, 19:04
1. Убедись, что у сервера soap работает. Для этого подключись телнетом к 127.0.0.1 7878
2. Если подключается, то проверь свой пхп на наличие soap-расширения. (Если стоит денвер, там его точно нет)
да дело в том что всё есть а пишет что неверный логинили пас
Кот ДаWINчи
13.11.2011, 20:18
да дело в том что всё есть а пишет что неверный логинили пас
http://www.ru-mangos.ru/showpost.php?p=20131&postcount=19
http://www.ru-mangos.ru/showpost.php?p=20131&postcount=19
логин и пас ввёл верно пробовал пароль и как хеш и как обычный толку нет
про то что все должно быть uppercase точно не забыто? RTFM вообще-то...
про то что все должно быть uppercase точно не забыто? RTFM вообще-то...
А?:laugh2: я чесно не понял) либо с мангосом либо с скриптом что-то не то
Добавлено через 4 минуты
tcp 0 0 127.0.0.1:7878 0.0.0.0:* LISTEN
Сейчас выдается такая ошибка:
Command failed! Reason:
Method 'ns1:executeCommand' not implemented: method name or namespace not recognized
накопал кое что
"uri" => "urn:MaNGOS",
если отлично от этого то ошибка индентична твоей
"style" => SOAP_RPC, требую пояснения
Бня. перечитай сообщение #32. ну нету у тебя SOAP, чего д...чить-то всухую?
ОКАЙ.
Если бы у меня соап на php не было он бы написал что клас SoapClient не найден, в прочем как и было но я нашел модуль и установил его на php и суть ошибки в том что сервер отвечает ошибка авторизации а не то что вы говорите.
ОКАЙ.
Если бы у меня соап на php не было он бы написал что клас SoapClient не найден, в прочем как и было но я нашел модуль и установил его на php и суть ошибки в том что сервер отвечает ошибка авторизации а не то что вы говорите.
Я вообще-то тут не академик, но у меня смутное подозрение, что при ошибке авторизации в Мангос, написало бы что-то типа "ошибка авторизации в мангос". А тут выдается ошибка НТТР авторизации, то есть авторизации на веб-сервер. Или оно там так и должно быть? Я не разбираюсь...
мангос со своей стороны открывает сервер http://adres:port/ на котором будет прослушивать запросы задача скрипта просто отослать на этот адрес данные в которые входит несколько этапов
1.Авторизация
2.Команда
3.Закрытие соединения(оптимально)
Для подключения класса SOAP к PHP откройте файл php.ini, найдите строку
; extension=php_soap.so (или ; extension=php_soap.dll) и удалите перед ней точку с запятой.
Внимание! Вполне возможно, что библиотека php_soap.dll в вашем PHP может отсутствовать. В этом случае необходимо найти эту самую библиотеку в сети и поместить в папку с остальными похожими библиотеками (порыскайте в папке php - там на "поверхности" всё), она обязательно должна быть той же версии, что и сам PHP. А вообще, я рекомендую загрузить исходники PHP и фактически переставить его, это будет и проще, и быстрее, и библиотеки там все нужные сразу есть.
# Для настройки технологии SOAP в MaNGOS откройте mangosd.conf, найдите и выставьте следующие параметры:
#
# SOAP.Enabled = 1
# SOAP.IP = 127.0.0.1
# SOAP.Port = 7878
Если у вас работает фаерволл (или антивирус с соотв. защитой),
обязательно убедитесь, что указанный в скрипте порт (в примере это
7878) открыт для подключения к mangosd.exe с локального хоста.
<?php
$command = 'server info';
$host = '127.0.0.1';
$port = 7878;
$user = 'admin';
$pass = 'admin';
if(!class_exists('SoapClient'))
die('Error: class SOAP is undefined');
$client = new SoapClient(NULL, array(
'location' => 'http://'.$host.':'.$port.'/',
'uri' => 'urn:MaNGOS',
'style' => SOAP_RPC,
'login' => $user,
'password' => $pass,
'encoding' => 'windows-1251'
));
try
{
echo $client->executeCommand(new SoapParam($command, 'command'));
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
Код переписывал "на коленке", посему не тестировал, но зуб даю - работает :)
Пришлось выдёргивать из своего движка.
после 2 этапа ответ сервера на поступившие данные
Добавлено через 1 минуту
Если у вас работает фаерволл (или антивирус с соотв. защитой),
обязательно убедитесь, что указанный в скрипте порт (в примере это
7878) открыт для подключения к mangosd.exe с локального хоста.
надо посмореть
HTTP Error: 401 Unauthorized
сейчас гляну на каких портал работает сервер
мб там что найду
нет соап у сервера точно работает.
мб из за кодировки?
Но в консоли при команде нет статус данного порта нет так же как и 80 и тп но http://127.0.0.1:7878/ открываеться
Кот ДаWINчи
21.11.2011, 21:04
мб из за кодировки?
Но в консоли при команде нет статус данного порта нет так же как и 80 и тп но http://127.0.0.1:7878/ открываеться
о надо же...наконец-то хоть что-то прояснилось. Если телнетом порт открывается, то сервер мангоса настроен правильно. Можешь более его не трогать. теперь смотри на свой апач. Что-то в нем не настроено. И после изменения настроек не забывай перестартовывать сервис апача, иначе твои настройки не вступят в силу.
и кодировка тут не при чём.
и кодировка тут не при чём.
да я в этом убедился , но надо проверять все варианты.
Апатч? а не пхп?
наверно всёже со скриптом что-то не то
либо в моём случае нужно что то добавить
Кот ДаWINчи
22.11.2011, 16:16
да я в этом убедился , но надо проверять все варианты.
Апатч? а не пхп?
Извиняюсь, конечно ПХП. (нельзя писать дельные посты так поздно вечером) :blush::blush:
Если extension=php_soap.dll включен, то скрипт из 1-го поста этой темы должен работать. У меня заработал сразу. Только надо правильно данные подключения вписать.
так в том то и дело что модуль соап подключен в php
Зачем SOAP? ИМХО лучше сокеты.
Зачем SOAP? ИМХО лучше сокеты.
fsockopen и прочие функции с сокетами требуют таймаута, то есть они асинхронные, к тому же даже если время на таймаут прошло, нельзя с уверенностью сказать, что запрос выполнен.
А в случае с SOAP можно гарантировать, что поток не вернётся к основному коду до выполнения запроса в консоль, или если консоль окончательно и бесповоротно недоступна.
Добавлю, что лично я не знаю о существовании функций а-ля select() для PHP.
Добавлю, что лично я не знаю о существовании функций а-ля select() для PHP.
$sock = fsockopen("localhost", 3443, $errno, $errstr);
if (!$sock)
{
echo("$errno($errstr)");
return NULL;
}
else
{
stream_set_timeout($sock, 5);
$temp = fgets( $sock );
$temp = fread($sock,9);
fputs ($sock, "admin\r");
$temp = fread($sock,9);
fputs ($sock, "password\r");
$temp = fread($sock,10);
fputs($sock, ".server info\r\n");
$temp = fread($sock,1024);
return $sock;
}
};
старо аж жуть но пашет.
$sock = fsockopen("localhost", 3443, $errno, $errstr);
if (!$sock)
{
echo("$errno($errstr)");
return NULL;
}
else
{
stream_set_timeout($sock, 5);
$temp = fgets( $sock );
$temp = fread($sock,9);
fputs ($sock, "admin\r");
$temp = fread($sock,9);
fputs ($sock, "password\r");
$temp = fread($sock,10);
fputs($sock, ".server info\r\n");
$temp = fread($sock,1024);
return $sock;
}
};
старо аж жуть но пашет.
Интересный подход. Спасибо)
Но всё же, на мой взгляд, мыло работает побыстрее.
В общем опробуем-с :)
так в том то и дело что модуль соап подключен в php
конечно может быть я не внимательно читал тему, но почему-то мне кажется что у него апач с пхп и сервер на разных машинах......ибо если сервер слушает порт, то скрипт должен работать, а не выдавать 401 ошибку авторизации.
Зачем SOAP? ИМХО лучше сокеты.
мыло быстрее работает и надежнее ;) проверено ;)
Кот ДаWINчи
11.05.2012, 22:35
для тех кто хочет поразбираться с отправкой команд через SOAP вот рабочий примерчик:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
<form method="POST">
<input type="text" name="cmd" size=60>
<input type="submit" value="SEND"></form><hr>
<?php
function soap_send($command, $username, $password, $host = '127.0.0.1', $soapport = 7878)
{
$client = new SoapClient(NULL,
array(
"location" => "http://$host:$soapport/",
"uri" => "urn:MaNGOS",
// "uri" => "urn:TC",
"style" => SOAP_RPC,
'login' => $username,
'password' => $password
));
try
{
$result = @$client->executeCommand(new SoapParam($command, "command"));
} catch (Exception $e)
{
echo "SOAP Error: " . $e->faultcode . " - " . $e->faultstring;
$result = FALSE;
}
return $result;
}
if (isset($_POST['cmd'])) {
$command = $_POST['cmd'];
} else {
$command = '';
}
// config !!!
$username = 'ADMINISTRATOR';
$password = 'ADMINISTRATOR';
$host = '127.0.0.1';
//--------
if ($command !== '') {
$q = soap_send($command, $username, $password);
if ($q !== false)
{echo $q;}
echo '<hr>send: ' . $command;
}
?>
</body>
</html>
Только учтите - скрипт с дырой и без авторизации ;)
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot