Community discussions

MikroTik App
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

How to create find function witch API + PHP script?

Thu Aug 30, 2012 3:09 pm

I want to create a script with this function
tool netwatch enable [find host~"192.168.1.12"]
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Thu Aug 30, 2012 3:38 pm

[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); 
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Thu Aug 30, 2012 11:04 pm

А без PEAR2 може ли да стане?
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Thu Aug 30, 2012 11:11 pm

Да. Хващаш 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.
Last edited by boen_robot on Fri Aug 31, 2012 3:02 pm, edited 7 times in total.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Fri Aug 31, 2012 2:03 am

Като цяло измислих това и работи безотказно, но искам да попитам като бързодействие кое ще се представя по-добре?
$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-а?
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Fri Aug 31, 2012 2:54 pm

Определено моя код ще е по-бърз - тука минаваш през всичко в 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.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Thu Sep 06, 2012 11:11 pm

Да не пускам нова тема искам да попитам: имаш ли идея как да направя скрипт в MT, който да записва нов ред в rsc файл?
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 12:12 am

Нещо подобно?
: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.
Last edited by boen_robot on Fri Sep 07, 2012 1:10 pm, edited 2 times in total.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 12:18 pm

Не идеята ми е в този файл да се записват всички недоставени fetch заявки, и евентуално да го пускам на определено време за преизпълнение
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 1:20 pm

Тогава вероятно файла няма да става много голям => горното ще ти свърши работа.

По принцип аз бих използвал 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.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 1:34 pm

ОК, но как да разбере външният сървър, че заявката не е пристигнала?
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 2:11 pm

Отговор винаги пристига всъщност. Въпроса е дали е отговора, който очакваш.

Ако 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:
Last edited by boen_robot on Mon Sep 10, 2012 10:21 pm, edited 1 time in total.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 3:40 pm

Това е ясно, но ще работи когато заявката за fetch се изпълнява от сървъра. А моята идея е да я изпълнява рутера
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Fri Sep 07, 2012 4:41 pm

Това е ясно, но ще работи когато заявката за 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.
Last edited by boen_robot on Mon Sep 10, 2012 10:30 pm, edited 3 times in total.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Mon Sep 10, 2012 9:01 pm

Да но точно идеята на целият код е при дадена ситуация рутера да изпраща заявка до сървъра
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Mon Sep 10, 2012 10:16 pm

Каква е тая ситуация? Я дай пълния сценарий... може би има начин да стане по-елегантно.

<< 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.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Thu Sep 13, 2012 10:39 am

Идеята ми е netwatch да следи състоянието на даден хост и при промяна в състоянието да изпраща заявка до web сървър, който да записва инфото в BD. Като целта е тази заявка винаги да достига до web сървъра, било то рано или късно.
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Thu Sep 13, 2012 1:15 pm

Вместо да записваш целия URL, може просто да записваш датите в един файл (по един файл за всеки хост; всяка дата на нов ред), и безусловно да правиш заявка към сървъра. Сървъра от своя страна ще източва файла, попълвайки базата данни, след което ще го изчисти.

По този начин пак съществува потенциала за препълване на RAM-а, но вероятността за това става значително по-малка, тъй като размера на една дата е по-малка от цял URL съдържащ същата тази дата.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Thu Sep 13, 2012 1:43 pm

Интересно решение, които ми дава друга идея, че за да не се налага по някакъв начин периодично изпълнение на скрипт от Web сървъра. Може да го организирам нещата, така че при промяна в статуса на netwatch да се стартира скрипт, който да кара web сървъра да изтегли сам записания файл и да си обнови информацията?
Така би ли следвало да се използват най-малко ресурси?
И един малък въпрос, какво би станало ако по време на четене на файла се записва в него?
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Thu Sep 13, 2012 2:12 pm

Интересно решение, които ми дава друга идея, че за да не се налага по някакъв начин периодично изпълнение на скрипт от 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);//Изчиства файла      
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Sat Nov 24, 2012 12:51 am

Здравей, не е много по темата, но и английския ми е доста зле та искам да попитам:
С течение на времето при подаване на fetch заявка ми връща резултат
failure: maximum connection count reached
Как може да се избегне това или да се нулира брояча
 
User avatar
boen_robot
Forum Guru
Forum Guru
Posts: 2400
Joined: Thu Aug 31, 2006 4:43 pm
Location: europe://Bulgaria/Plovdiv

Re: How to create find function witch API + PHP script?

Sat Nov 24, 2012 6:20 pm

WTF?

Не знаех, че има подобно нещо... това с API-то или script на самия рутер?

Ако е с API-то, предполагам, че решението е подновяване на връзката в случай на такава грешка и това е. Ако е на самия рутер, нямам представа.
 
jaredharet
newbie
Topic Author
Posts: 31
Joined: Fri Feb 23, 2007 11:25 pm
Location: Bulgarian

Re: How to create find function witch API + PHP script?

Sun Mar 03, 2013 11:50 pm

На самия рутер е


Last bumped by jaredharet on Sun Mar 03, 2013 11:50 pm.