Page 1 of 1
How to create find function witch API + PHP script?
Posted: Thu Aug 30, 2012 3:09 pm
by jaredharet
I want to create a script with this function
tool netwatch enable [find host~"192.168.1.12"]
Re: How to create find function witch API + PHP script?
Posted: Thu Aug 30, 2012 3:38 pm
by boen_robot
[edit]Всъщност... колко зле си с английския?[/edit]
The API protocol doesn't allow for regular expression filtering, but you can do such filtering on the PHP side.
Alternatively, you can abuse another characteristic that the API protocol
does allow, which is to compare IP addresses as numbers. By the look of your regex, I assume you're after IPs between 192.168.1.120 and 192.168.1.129, as well as the IP 192.168.1.12 itself.
Using my PHP client (see my signature), you can do it like so:
<?php
namespace PEAR2\Net\RouterOS;
require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';
$client = new Client('192.168.1.1', 'admin', 'password');
$printRequest = new Request(
'/tool netwatch print .proplist=.id',
Query::where('host', '192.168.1.120', Query::ACTION_GREATHER_THAN)
->andWhere('host', '192.168.1.129', Query::ACTION_LESS_THAN)
->orWhere('host', '192.168.1.120')
->orWhere('host', '192.168.1.129')
->orWhere('host', '192.168.1.12')
);
$idList = '';
foreach ($client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA) as $response) {
$idList .= $response->getArgument('.id'), ',';
}
$idList = rtrim($idList, ',');
$enableRequest = new Request('/tool netwatch enable');
$enableRequest->setArgument('numbers', $idList);
$client->sendSync($enableRequest);
Re: How to create find function witch API + PHP script?
Posted: Thu Aug 30, 2012 11:04 pm
by jaredharet
А без PEAR2 може ли да стане?
Re: How to create find function witch API + PHP script?
Posted: Thu Aug 30, 2012 11:11 pm
by boen_robot
Да. Хващаш PHAR файла и го include-ваш, както в кода горе. Всичко необходимо е вградено в самия PHAR. Не е задължително да имаш PEAR или PEAR2.
<< Translation for English speakers: >>
Can it work without PEAR2?
Yes. You get the PHAR file, and include it, as in the code above. Everything required is bundled within the PHAR. No need for you to have PEAR or PEAR2.
Re: How to create find function witch API + PHP script?
Posted: Fri Aug 31, 2012 2:03 am
by jaredharet
Като цяло измислих това и работи безотказно, но искам да попитам като бързодействие кое ще се представя по-добре?
$ARRAY = $API->comm('/tool/netwatch/print');
for ($i=0; $i<250; $i++)
{
$regtable = $ARRAY[$i];
$IP=$regtable['host'];
$id=$regtable['.id'];
if ($IP==$host) {
$ARRAY = $API->comm("/tool/netwatch/enable", array(
'.id'=> ''.$id.'',));
}
}
И още един въпрос, как караш микротика да праща заявки, защото аз за целта използвам fetch-а?
Re: How to create find function witch API + PHP script?
Posted: Fri Aug 31, 2012 2:54 pm
by boen_robot
Определено моя код ще е по-бърз - тука минаваш през всичко в netwatch-а, и го проверяваш, а при моя MikroTik-а ги проверява, след което PHP директно получава само необходимото.
А това, че така както си го написал само едно конкретно IP ще се търси (вместо всякакво IP започващо с 192.168.1.12), само междy другото.
А за пращане на (HTTP?) заявки... fetch-а разбира се. То няма друго.
<< Translation for English speakers: >>
Overall, I came up with this, and it works flawlessly, but I want to ask, in terms of performance, which is going to perform better?
And one more question, how do you make the MikroTik send requests, because for that, I use the fetch.
My code is definetly going to be faster - here, you go over everything in netwatch and check it, whereas with mine, the MikroTik checks them, after which PHP receives only the necessary.
And the fact that as you've written it, only a single specific IP is going to be searched for (instead of any IP starting with 192.168.1.12), is just "by the way".
As for sending (HTTP?) requests... the fetch of course. There isn't anything else.
Re: How to create find function witch API + PHP script?
Posted: Thu Sep 06, 2012 11:11 pm
by jaredharet
Да не пускам нова тема искам да попитам: имаш ли идея как да направя скрипт в MT, който да записва нов ред в rsc файл?
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 12:12 am
by boen_robot
Нещо подобно?
:local imeNaFaila "file.rsc"
/file set $imeNaFaila contents=([/file get $imeNaFaila contents] . "\nСъдържание на нов ред")
Самоче имай в предвид, че колкото по-голям става файла, толкова повече RAM от рутера ще ти точи това, тъй като цялото съдържание се зарежда преди да бъде допълнено. Ако искаш това да не става, ще трябва да използваш примерно PHP, където файла ще се тегли и допълва на уеб сървъра, след което резултатът ще се изпраща. В този вариант, вместо "повече RAM" ти е нужно повече време (заради прехвърлянето м-ду рутера и уеб сървъра).
Ако този файл представлява някакъв backup, май ще е най-добре ако просто правиш каквото ще правиш и пуснеш един export накрая.
<< Translation for English speakers: >>
So that I don't create a new topic, I want to ask: do you have an idea how I could make a script at MT, that would write a new line in an rsc file?
Something like this?
But keep in mind that the bigger the file gets, the more RAM it will take from the router, since the whole contents is loaded before being appended to. If you want that not to happen, you'll have to use, for example, PHP, where the file will be downloaded and appended to by the web server, after which the result will be sent back. In this way, instead of "more RAM", you need more time (due to the transfers between the router and the web server).
If this file is some sort of backup, maybe it would be best if you just do whatever you'd do, and do an export at the end.
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 12:18 pm
by jaredharet
Не идеята ми е в този файл да се записват всички недоставени fetch заявки, и евентуално да го пускам на определено време за преизпълнение
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 1:20 pm
by boen_robot
Тогава вероятно файла няма да става много голям => горното ще ти свърши работа.
По принцип аз бих използвал PHP с някаква база данни (където ще се пазят провалените заявки), след което да upload-вам каквото трябва в рутера. Даже ако ползваш API-то, upload-ване не е нужно. Просто използваш API-то да направиш fetch, и пазиш URL-а в базата при провал.
<< Translation for English speakers: >>
No, the idea is to save all undelivered fetch requests, and maybe run it at some time for reevaluation
Then the file is probably not going to get much big => the above should work for you.
I would use PHP with some database (where the failed requests will be stored), after which I'd upload what I must at the router. In fact, if you use the API, no uploading is necessary. You just use the API to make a fetch, and save the URL at the DB on failure.
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 1:34 pm
by jaredharet
ОК, но как да разбере външният сървър, че заявката не е пристигнала?
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 2:11 pm
by boen_robot
Отговор винаги пристига всъщност. Въпроса е дали е отговора, който очакваш.
Ако status-а е finished, значи заявката е дала файл с код 200 (OK). При всякакви други обстоятелства, status-а е failed.
В API протокола има един бъг с fetch-а, че не прекъсва автоматично... с моя клиент лесно се "workaround"-ва това. Примерно:
<?php
namespace PEAR2\Net\RouterOS;
require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';
$client = new Client('192.168.1.1', 'admin', 'password');
$client->sendAsync(
new Request('/tool fetch url="http://example.com/index.html" keep-result="yes"', null, 'f'),
function ($response) {
switch ($response->getArgument('status')) {
case 'failed':
//Запис в базата данни тук
//Без break;
case 'finished':
return true;
}
}
);
$client->loop();
<< Translation for English speakers: >>
OK, but how is the external server going to understand that the request hasn't been received.
Actually, a response always arrives. The only question is if it's the response you expect.
If the status is "finished", then the request produced a file with code 200 (OK). In other circumstances, the status is "failed".
There's a bug with the "fetch" command under the API protocol, in that it doesn't stop automatically... with my client, this is easy to workaround. Example:
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 3:40 pm
by jaredharet
Това е ясно, но ще работи когато заявката за fetch се изпълнява от сървъра. А моята идея е да я изпълнява рутера
Re: How to create find function witch API + PHP script?
Posted: Fri Sep 07, 2012 4:41 pm
by boen_robot
Това е ясно, но ще работи когато заявката за fetch се изпълнява от сървъра. А моята идея е да я изпълнява рутера
С горния метод, заявката се изпълнява от рутера. Сървъра просто кара рутера да изпълни заявката.
т.е. положението е
сървър --> API заявка към рутер
рутер --> HTTP заявка към външен сървър
външен сървър --> HTTP отговор към рутер (предава съдържанието на файла)
рутер --> API отговор към сървър (НЕ предава съдържанието на файла, а само статусът)
Разликата е единствено в това ТИ къде натискаш бутона/правиш график. Да, при горното ще трябва периодичното изпълнение да се настрои на сървъра, но самата заявка все пак ще се прави от рутера (и резултатът ще пристига директно там, вместо да минава през сървъра).
Би могъл вместо да настройваш график на сървъра, да настроиш рутера периодично да направи една HTTP заявка към сървъра, която от своя страна ще накара руера да изпълни всичко останало. т.е.
рутер --> HTTP заявка към сървър
сървър --> API заявка към рутер
...
По този начин хем рутера започва процедурата, хем имаш пълен контрол над цялата работа, докато си в PHP.
<< Translation for English speakers: >>
This is all right, but it will work when the fetch request is ran by the server. And my idea instead is for the router to run it.
With the code above, the request is ran by the router. The server only makes the router do the request.
i.e. the situation is
server --> API request to router
router --> HTTP request to external server
external server --> HTTP response to router (transmits file contents)
router --> API response to server (does NOT transmit file contents, but only the status)
The only difference is in where YOU click the button/schedule. Yes, with the above, the schedule will have to be on the server, but the request itself is still performed at the router (and the response goes directly there, instead of passing through the server).
Instead of scheduling the server, you could make the router periodically send a single HTTP request to the server, which would in turn make the router do everything else. i.e.
router --> HTTP request to server
server --> API request to router
...
That way, you can have both the router starting the procedure, and have full control over the whole process while in PHP.
Re: How to create find function witch API + PHP script?
Posted: Mon Sep 10, 2012 9:01 pm
by jaredharet
Да но точно идеята на целият код е при дадена ситуация рутера да изпраща заявка до сървъра
Re: How to create find function witch API + PHP script?
Posted: Mon Sep 10, 2012 10:16 pm
by boen_robot
Каква е тая ситуация? Я дай пълния сценарий... може би има начин да стане по-елегантно.
<< Translation for English speakers: >>
Yeah, but the very idea of the whole code is for the router to send a request to the server on a certain event.
What's this event? Give the full scenario... perhaps there's a way to make it more elegant.
Re: How to create find function witch API + PHP script?
Posted: Thu Sep 13, 2012 10:39 am
by jaredharet
Идеята ми е netwatch да следи състоянието на даден хост и при промяна в състоянието да изпраща заявка до web сървър, който да записва инфото в BD. Като целта е тази заявка винаги да достига до web сървъра, било то рано или късно.
Re: How to create find function witch API + PHP script?
Posted: Thu Sep 13, 2012 1:15 pm
by boen_robot
Вместо да записваш целия URL, може просто да записваш датите в един файл (по един файл за всеки хост; всяка дата на нов ред), и безусловно да правиш заявка към сървъра. Сървъра от своя страна ще източва файла, попълвайки базата данни, след което ще го изчисти.
По този начин пак съществува потенциала за препълване на RAM-а, но вероятността за това става значително по-малка, тъй като размера на една дата е по-малка от цял URL съдържащ същата тази дата.
Re: How to create find function witch API + PHP script?
Posted: Thu Sep 13, 2012 1:43 pm
by jaredharet
Интересно решение, които ми дава друга идея, че за да не се налага по някакъв начин периодично изпълнение на скрипт от Web сървъра. Може да го организирам нещата, така че при промяна в статуса на netwatch да се стартира скрипт, който да кара web сървъра да изтегли сам записания файл и да си обнови информацията?
Така би ли следвало да се използват най-малко ресурси?
И един малък въпрос, какво би станало ако по време на четене на файла се записва в него?
Re: How to create find function witch API + PHP script?
Posted: Thu Sep 13, 2012 2:12 pm
by boen_robot
Интересно решение, които ми дава друга идея, че за да не се налага по някакъв начин периодично изпълнение на скрипт от Web сървъра. Може да го организирам нещата, така че при промяна в статуса на netwatch да се стартира скрипт, който да кара web сървъра да изтегли сам записания файл и да си обнови информацията?
Така би ли следвало да се използват най-малко ресурси?
Е да де. Точно това предлагам и аз.
И един малък въпрос, какво би станало ако по време на четене на файла се записва в него?
Част от отговорността на RouterOS като операционна система е автоматично да поставя ключалки за четене и писане - ако четенето дойде първо, писането чака четенето да свърши преди да пише и обратното.
Друг е въпроса, че между всяка операция, ключалката се освобождава, т.е. ако сървъра реши да изчисти файла точно в микросекундата между
[/file get $imeNaFaila contents]
и писането на нов ред, новият файл ще съдържа старите данни (плюс новият ред) вмесо да бъде изчистен.
При положение, че пишеш датите (включително времената до секунда), това не е голям проблем - правиш си базата данни да изисква уникално съдържание за всеки запис, при което следващото обновяване просто няма да запише старите времена повторно и евентуално вече ще изчисти файла.
От друга страна, на сървъра е хубаво да си вземеш файла чрез FTP, използвайки fopen() в "r+b" режим, с цел да придобиеш пишеща ключалка (т.е. да гарантираш, че четенето на данните няма да настъпи преди изчистването на файла).
В архива на клиента се съдържа една под-библиотека - Net_Transmitter - която може да подсигури комуникацията в случая.
Примерно:
<?php
require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';
$trans = new PEAR\Net\Transmitter\Stream($file = fopen('ftp://admin:password@192.168.1.1/192.168.1.12.txt', 'r+b'));
$mysqli = new mysqli('127.0.0.1', 'root', '', 'db');
$query = "INSERT INTO `failures` (`dateTime`) VALUES ";
try {
while (true) {
//21 === strlen("mmm/DD/YYYY-HH:MM:SS\n")
$dateTime = DateTime::createFromFormat('M/j/Y-H:i:s', ucfirst(rtrim($trans->receive(21))))
->format('Y-m-d H:i:s');
$query .= "('" . $mysqli->real_escape_string($dateTime) . "'), ";
}
} catch (Exception $e) {
//Приключихме с четенето на файла ИЛИ връзката е прекъснала по време на четенето.
}
$query = rtrim($query, ', ');
$mysqli->query($query);
ftruncate($file, 0);//Изчиства файла
Re: How to create find function witch API + PHP script?
Posted: Sat Nov 24, 2012 12:51 am
by jaredharet
Здравей, не е много по темата, но и английския ми е доста зле та искам да попитам:
С течение на времето при подаване на fetch заявка ми връща резултат
failure: maximum connection count reached
Как може да се избегне това или да се нулира брояча
Re: How to create find function witch API + PHP script?
Posted: Sat Nov 24, 2012 6:20 pm
by boen_robot
WTF?
Не знаех, че има подобно нещо... това с API-то или script на самия рутер?
Ако е с API-то, предполагам, че решението е подновяване на връзката в случай на такава грешка и това е. Ако е на самия рутер, нямам представа.
Re: How to create find function witch API + PHP script?
Posted: Sun Mar 03, 2013 11:50 pm
by jaredharet
На самия рутер е