PDA

Просмотр полной версии : Скрипт php для отправки команды в консоль mangosd.exe


coftsonyk
11.12.2010, 22:35
delete

Hantet
12.12.2010, 00:01
Пример реализации коннекта к консоли на 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

TIMzs
12.12.2010, 21:22
Не сдержался ... :rofl:

Hantet
12.12.2010, 22:08
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

tempura
13.12.2010, 10:47
У меня не денвер. и не мозги?

rootor
16.03.2011, 19:54
Кто разобрался - поделитесь пожалуйста, более развернутой инструкцией по эксплуатации 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
));

Прошу прощения за элементарные вопросы - но как раз такую информацию сложнее всего нагуглить.

zhenya
17.03.2011, 05:10
Посмотри в netstat -nl на каком ипе слушается порт 7878.

rootor
18.03.2011, 05:12
Посмотри в 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

KiriX
19.03.2011, 08:45
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
разбирайся...

rootor
20.03.2011, 01:20
В примере логин и пароль:
$username = 'ADMINISTRATOR';
$password = 'ADMINISTRATOR';
От чего они? Имя пользователя и пароль при подключении к Linux?
И как пробиться к процессу, запущенному в screen?
Допустим есть несколько screen с именами mangos, mangos1 - как послать команду в консоль процесса запущенного в том или ином screen?

И если есть возможность - поделитесь ссылкой на описание работы SOAP а то не могу никак найти и продвинуться дальше.

tempura
20.03.2011, 07:41
В примере логин и пароль:
$username = 'ADMINISTRATOR';
$password = 'ADMINISTRATOR';
От чего они? Имя пользователя и пароль при подключении к Linux? Эмм... судя по коду - это логин-пароль админа мангос... Или я что-то совсем путаю? По крайней мере с этими данными отправляется команда в консоль мангос.

KiriX
21.03.2011, 10:43
Допустим есть несколько screen с именами mangos, mangos1 - как послать команду в консоль процесса запущенного в том или ином screen?

Разные порты SOAP в конфигах сервера? =)

rootor
23.03.2011, 00:16
Разные порты SOAP в конфигах сервера? =)

Хороший совет - спасибо. Но у меня видимо что-то не установлено из ПО - так как так и получаю до сих ошибку:

Command failed! Reason:
Method 'ns1:executeCommand' not implemented: method name or namespace not recognized

Суть ошибки понятна, но как исправить, что на это влияет - сколько ни гуглил, ответа найти не могу. Может кто сталкивался с подобным?
Обработать пытаюсь пример приведенный в этой теме чуть выше (он же в репо мангоса).

KiriX
23.03.2011, 12:11
Это не ПО. Настройки php ковыряй. Почему-то он не знает метод executeCommand
Но для меня более странно (может это и нормально), почему он метод пишет как ns1:executeCommand
Что такое ns1: лично я не ведаю вообще...

rootor
23.03.2011, 20:22
Вероятно у меня не хватает чего -то в 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 нет.

tempura
23.03.2011, 20:34
а само расширение php_soap в php.ini раскомментировано?
конечно глупо звучит, но все же...

rsa
23.03.2011, 20:41
Это не ПО. Настройки php ковыряй. Почему-то он не знает метод executeCommand
Но для меня более странно (может это и нормально), почему он метод пишет как ns1:executeCommand
Что такое ns1: лично я не ведаю вообще...

у него включена поддержка пространств имен в php. что это такое я сам только догадываюсь :)

Йоха
23.03.2011, 22:04
а само расширение php_soap в php.ini раскомментировано?
конечно глупо звучит, но все же...

; extension=php_soap.so

это не оно ?

tempura
23.03.2011, 22:34
это не оно ? Оно-оно, но там в принципе и выше быть может раскомментировано.

Sid
01.06.2011, 20:13
Разбираю SOAP на Qt, и пока не разобрался в правильности составления запроса для мангоса. Хотел вывести запрос в XML на пхп, но не получилось, __getLastRequest() приватная, а в пхп я не очень силен :) Кто может выложить пример запроса в XML формате? :)

wroud
13.11.2011, 15:01
добавлю к этой темке комент..
Command failed! Reason:
HTTP Error: 401 Unauthorized
Типо не получилось авторизироваться? но логин и пас ввёл от ака на котором стоит левл 4

Кот ДаWINчи
13.11.2011, 16:10
Типо не получилось авторизироваться? но логин и пас ввёл от ака на котором стоит левл 4

а в конфиге мангоса соап включен и настроен?

wroud
13.11.2011, 18:05
если бы он не был включен то , ожидание 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-расширения. (Если стоит денвер, там его точно нет)

wroud
13.11.2011, 19:48
да дело в том что всё есть а пишет что неверный логинили пас

Кот ДаWINчи
13.11.2011, 20:18
да дело в том что всё есть а пишет что неверный логинили пас

http://www.ru-mangos.ru/showpost.php?p=20131&postcount=19

wroud
14.11.2011, 12:35
http://www.ru-mangos.ru/showpost.php?p=20131&postcount=19
логин и пас ввёл верно пробовал пароль и как хеш и как обычный толку нет

rsa
14.11.2011, 12:56
про то что все должно быть uppercase точно не забыто? RTFM вообще-то...

wroud
14.11.2011, 13:36
про то что все должно быть 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",
если отлично от этого то ошибка индентична твоей

wroud
14.11.2011, 13:38
"style" => SOAP_RPC, требую пояснения

rsa
14.11.2011, 13:40
Бня. перечитай сообщение #32. ну нету у тебя SOAP, чего д...чить-то всухую?

wroud
14.11.2011, 14:49
ОКАЙ.
Если бы у меня соап на php не было он бы написал что клас SoapClient не найден, в прочем как и было но я нашел модуль и установил его на php и суть ошибки в том что сервер отвечает ошибка авторизации а не то что вы говорите.

tempura
15.11.2011, 14:21
ОКАЙ.
Если бы у меня соап на php не было он бы написал что клас SoapClient не найден, в прочем как и было но я нашел модуль и установил его на php и суть ошибки в том что сервер отвечает ошибка авторизации а не то что вы говорите.

Я вообще-то тут не академик, но у меня смутное подозрение, что при ошибке авторизации в Мангос, написало бы что-то типа "ошибка авторизации в мангос". А тут выдается ошибка НТТР авторизации, то есть авторизации на веб-сервер. Или оно там так и должно быть? Я не разбираюсь...

wroud
16.11.2011, 12:38
мангос со своей стороны открывает сервер http://adres:port/ на котором будет прослушивать запросы задача скрипта просто отослать на этот адрес данные в которые входит несколько этапов
1.Авторизация
2.Команда
3.Закрытие соединения(оптимально)

Hantet
21.11.2011, 14:29
Для подключения класса 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();
}
?>


Код переписывал "на коленке", посему не тестировал, но зуб даю - работает :)
Пришлось выдёргивать из своего движка.

wroud
21.11.2011, 20:41
после 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/ открываеться

о надо же...наконец-то хоть что-то прояснилось. Если телнетом порт открывается, то сервер мангоса настроен правильно. Можешь более его не трогать. теперь смотри на свой апач. Что-то в нем не настроено. И после изменения настроек не забывай перестартовывать сервис апача, иначе твои настройки не вступят в силу.

и кодировка тут не при чём.

wroud
22.11.2011, 12:39
и кодировка тут не при чём.
да я в этом убедился , но надо проверять все варианты.

Апатч? а не пхп?

наверно всёже со скриптом что-то не то

либо в моём случае нужно что то добавить

Кот ДаWINчи
22.11.2011, 16:16
да я в этом убедился , но надо проверять все варианты.

Апатч? а не пхп?



Извиняюсь, конечно ПХП. (нельзя писать дельные посты так поздно вечером) :blush::blush:

Если extension=php_soap.dll включен, то скрипт из 1-го поста этой темы должен работать. У меня заработал сразу. Только надо правильно данные подключения вписать.

wroud
22.11.2011, 17:04
так в том то и дело что модуль соап подключен в php

tr0yka
15.12.2011, 12:02
Зачем SOAP? ИМХО лучше сокеты.

Hantet
15.12.2011, 14:48
Зачем SOAP? ИМХО лучше сокеты.

fsockopen и прочие функции с сокетами требуют таймаута, то есть они асинхронные, к тому же даже если время на таймаут прошло, нельзя с уверенностью сказать, что запрос выполнен.
А в случае с SOAP можно гарантировать, что поток не вернётся к основному коду до выполнения запроса в консоль, или если консоль окончательно и бесповоротно недоступна.
Добавлю, что лично я не знаю о существовании функций а-ля select() для PHP.

rsa
15.12.2011, 16:39
Добавлю, что лично я не знаю о существовании функций а-ля 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;
}
};


старо аж жуть но пашет.

Hantet
15.12.2011, 16:53
$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;
}
};


старо аж жуть но пашет.

Интересный подход. Спасибо)
Но всё же, на мой взгляд, мыло работает побыстрее.
В общем опробуем-с :)

odvolk
10.05.2012, 00:11
так в том то и дело что модуль соап подключен в 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>


Только учтите - скрипт с дырой и без авторизации ;)