echo "Usage: {$argv[0]} <host> <user> <pass> <address-list> <dns>\n"; exit; } $dnshost = $argv[5]; $list = $argv[4]; $hostname = $argv[1]; $user = $argv[2]; $pass = $argv[3]; $dnsip = array(); $dnsrecord = dns_get_record($dnshost, DNS_A); foreach ($dnsrecord as $p) { $dnsip[] = $p["ip"]; } $c = new RouterOS\Client($hostname, $user, $pass); $req = new RouterOS\Request("/ip/firewall/address-list/print"); $query = RouterOS\Query::where("list", $list)->andWhere("comment", $dnshost); $req->setQuery($query); $resp = $c->sendSync($req); $todelete = array(); $toadd = $dnsip; foreach ($resp as $r) { if ($r->getType() === RouterOS\Response::TYPE_DATA) { $pos = array_search($r->getProperty("address"), $toadd); if ($pos === FALSE) { $todelete[] = $r->getProperty(".id"); } else { unset($toadd[$pos]); } } } foreach ($toadd as $ip) {
/** * Executes a RouterOS script. * * Same as the public equivalent, with the addition of allowing you to get * the contents of the script post execution, instead of removing it. * * @param string|resource $source The source of the script, as a string or * stream. If a stream is provided, reading starts from the current * position to the end of the stream, and the pointer stays at the end * after reading is done. * @param array $params An array of parameters to make available * in the script as local variables. * Variable names are array keys, and variable values are array values. * Array values are automatically processed with * {@link static::escapeValue()}. Streams are also supported, and are * processed in chunks, each processed with * {@link static::escapeString()}. Processing starts from the current * position to the end of the stream, and the stream's pointer is left * untouched after the reading is done. * Note that the script's (generated) name is always added as the * variable "_", which will be inadvertently lost if you overwrite it * from here. * @param string $policy Allows you to specify a policy the script * must follow. Has the same format as in terminal. * If left NULL, the script has no restrictions beyond those imposed by * the username. * @param string $name The script is executed after being saved * in "/system script" under a random name (prefixed with the computer's * name), and is removed after execution. To eliminate any possibility * of name clashes, you can specify your own name. * @param bool $get Whether to get the source of the script. * * @return ResponseCollection|string Returns the response collection of the * run, allowing you to inspect errors, if any. * If the script was not added successfully before execution, the * ResponseCollection from the add attempt is going to be returned. * If $get is TRUE, returns the source of the script on success. */ private function _exec($source, array $params = array(), $policy = null, $name = null, $get = false) { $request = new Request('/system/script/add'); if (null === $name) { $name = uniqid(gethostname(), true); } $request->setArgument('name', $name); $request->setArgument('policy', $policy); $params += array('_' => $name); $finalSource = fopen('php://temp', 'r+b'); fwrite($finalSource, '/' . str_replace('/', ' ', substr($this->menu, 1)) . "\n"); static::appendScript($finalSource, $source, $params); fwrite($finalSource, "\n"); rewind($finalSource); $request->setArgument('source', $finalSource); $result = $this->client->sendSync($request); if (0 === count($result->getAllOfType(Response::TYPE_ERROR))) { $request = new Request('/system/script/run'); $request->setArgument('number', $name); $result = $this->client->sendSync($request); if ($get) { $result = $this->client->sendSync(new Request('/system/script/print .proplist="source"', Query::where('name', $name)))->getProperty('source'); } $request = new Request('/system/script/remove'); $request->setArgument('numbers', $name); $this->client->sendSync($request); } return $result; }
<?php use PEAR2\Net\RouterOS; require "PEAR2_Net_RouterOS-1.0.0b5.phar"; if ($argc < 6) { echo "Usage: {$argv[0]} <host> <user> <pass> <address-list> <IP>\n"; exit; } $ipaddr = trim($argv[5]); $list = $argv[4]; $hostname = $argv[1]; $user = $argv[2]; $pass = $argv[3]; $c = new RouterOS\Client($hostname, $user, $pass); $req = new RouterOS\Request("/ip/firewall/address-list/print"); $query = RouterOS\Query::where("address", $ipaddr)->andWhere("list", $list); $req->setQuery($query); $resp = $c->sendSync($req); $oldid = -1; $same = false; foreach ($resp as $r) { if ($r->getType() === RouterOS\Response::TYPE_DATA) { $oldid = $r->getProperty(".id"); if ($r->getProperty("address") == $ipaddr) { $same = true; } } } if (!$same) { if ($oldid > -1) { echo "Removing old {$ipaddr}...\n";
public function testInvokability() { $com = new Communicator(HOSTNAME, PORT); Client::login($com, USERNAME, PASSWORD); $request = new Request('/ping'); $request('address', HOSTNAME)->setTag('p'); $this->assertEquals(HOSTNAME, $request('address')); $this->assertEquals('p', $request->getTag()); $this->assertEquals('p', $request()); $request($com); $response = new Response($com, false, ini_get('default_socket_timeout')); $this->assertInternalType('string', $response()); $this->assertEquals(HOSTNAME, $response('host')); $request = new Request('/queue/simple/print'); $query = Query::where('target', HOSTNAME_INVALID . '/32'); $request($query); $this->assertSame($query, $request->getQuery()); $com('/quit'); $com(''); }
/** * @depends testExecArgTypes * * @return void */ public function testExecArgValues() { $printRequest = new Request('/queue/simple/print', Query::where('name', TEST_QUEUE_NAME)); $this->util->setMenu('/queue/simple'); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => 2)); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('2', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => 'test')); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('test', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => true)); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('true', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=[:pick $comment 0]', array('name' => TEST_QUEUE_NAME, 'comment' => array('hello', 'world'))); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('hello', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => array())); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame(null, $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => null)); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame(null, $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => new DateTime('1970-01-01 00:00:00.000001', new DateTimezone('UTC')))); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('00:00:00.000001', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => new DateTime('1970-01-02 00:00:01', new DateTimezone('UTC')))); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('1d00:00:01', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => new DateTime('1970-01-10 01:02:03', new DateTimezone('UTC')))); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('1w2d01:02:03', $results->getProperty('comment')); $this->util->exec('add name=$name target=0.0.0.0/0 comment=$comment', array('name' => TEST_QUEUE_NAME, 'comment' => new DateInterval('P8D'))); $results = $this->client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA); $this->util->remove(TEST_QUEUE_NAME); $this->assertCount(1, $results); $this->assertSame('1w1d00:00:00', $results->getProperty('comment')); }
public function testInvalidQuerySending() { $com = new Communicator(\HOSTNAME, PORT); Client::login($com, USERNAME, PASSWORD); $com->sendWord('/ip/arp/print'); $com->close(); try { Query::where('address', HOSTNAME_INVALID)->send($com); $com->sendWord(''); $this->fail('The query had to fail.'); } catch (SocketException $e) { $this->assertEquals(SocketException::CODE_QUERY_SEND_FAIL, $e->getCode(), 'Improper exception code.'); } }
public function testSetCharset() { if (!extension_loaded('iconv') || !function_exists('iconv')) { $this->markTestSkipped('iconv is not enabled.'); } $this->assertEquals(array(Communicator::CHARSET_REMOTE => null, Communicator::CHARSET_LOCAL => null), $this->object->setCharset(array(Communicator::CHARSET_REMOTE => 'windows-1251', Communicator::CHARSET_LOCAL => 'UTF-8'))); $addRequest = new Request('/queue/simple/add'); $addRequest->setArgument('name', TEST_QUEUE_NAME)->setArgument('target', '0.0.0.0/0'); $addRequest->setArgument('comment', 'ПРИМЕР'); $responses = $this->object->sendSync($addRequest); $this->assertEquals(1, count($responses), 'There should be only one response.'); if (count($responses) === 1 && $responses[-1]->getType() === Response::TYPE_FINAL) { $appropriateCharsets = $this->object->setCharset(array(Communicator::CHARSET_REMOTE => 'ISO-8859-1', Communicator::CHARSET_LOCAL => 'UTF-8')); $printRequest = new Request('/queue/simple/print'); $printRequest->setQuery(Query::where('name', TEST_QUEUE_NAME)); $responses = $this->object->sendSync($printRequest); $this->assertEquals(TEST_QUEUE_NAME, $responses[0]->getProperty('name')); $this->assertNotEquals('ПРИМЕР', $responses[0]->getProperty('comment')); $this->object->setCharset($appropriateCharsets); $this->assertNotEquals('ПРИМЕР', $responses[0]->getProperty('comment')); $responses = $this->object->sendSync($printRequest); $this->assertEquals(TEST_QUEUE_NAME, $responses[0]->getProperty('name')); $this->assertEquals('ПРИМЕР', $responses[0]->getProperty('comment')); $this->object->setCharset('ISO-8859-1', Communicator::CHARSET_REMOTE); $responses = $this->object->sendSync($printRequest); $this->assertNotEquals('ПРИМЕР', $responses[0]->getProperty('comment')); $this->object->setCharset('ISO-8859-1', Communicator::CHARSET_LOCAL); $responses = $this->object->sendSync($printRequest); $this->assertNotEquals('ПРИМЕР', $responses[0]->getProperty('comment')); $this->object->setCharset($appropriateCharsets); $responses = $this->object->sendSync($printRequest); $this->assertEquals('ПРИМЕР', $responses[0]->getProperty('comment')); $this->object->setStreamingResponses(true); $responses = $this->object->sendSync($printRequest); $this->assertEquals('ПРИМЕР', stream_get_contents($responses[0]->getProperty('comment'))); $this->object->setCharset('ISO-8859-1', Communicator::CHARSET_REMOTE); $responses = $this->object->sendSync($printRequest); $this->assertNotEquals('ПРИМЕР', stream_get_contents($responses[0]->getProperty('comment'))); $this->object->setCharset('windows-1251'); $responses = $this->object->sendSync($printRequest); $this->assertNotEquals('ПРИМЕР', stream_get_contents($responses[0]->getProperty('comment'))); $testQueueNameStream = fopen('php://temp', 'r+b'); fwrite($testQueueNameStream, TEST_QUEUE_NAME); rewind($testQueueNameStream); $printRequest->setQuery(Query::where('name', $testQueueNameStream)); $responses = $this->object->sendSync($printRequest); $this->assertNotEquals('ПРИМЕР', stream_get_contents($responses[0]->getProperty('comment'))); $this->object->setCharset($appropriateCharsets); $responses = $this->object->sendSync($printRequest); $this->assertEquals('ПРИМЕР', stream_get_contents($responses[0]->getProperty('comment'))); $removeRequest = new Request('/queue/simple/remove'); $removeRequest->setArgument('numbers', TEST_QUEUE_NAME); $responses = $this->object->sendSync($removeRequest); } }
public function testSendSyncReturningResponseLargeDataException() { //Required for this test $memoryLimit = ini_set('memory_limit', -1); try { $comment = fopen('php://temp', 'r+b'); $fillerString = str_repeat('t', 0xffffff); //fwrite($comment, $fillerString); for ($i = 0; $i < 256; $i++) { fwrite($comment, $fillerString); } unset($fillerString); fwrite($comment, str_repeat('t', 0xfe)); $argL = (double) sprintf('%u', ftell($comment)); rewind($comment); $maxArgL = 0xffffffff - strlen('?comment='); $this->assertGreaterThan($maxArgL, $argL, '$comment is not long enough.'); rewind($comment); $printRequest = new Request('/ip/arp/print'); $printRequest->setQuery(Query::where('comment', $comment)); $this->object->sendSync($printRequest); fclose($comment); //Clearing out for other tests. ini_set('memory_limit', $memoryLimit); $this->fail('Lengths above 0xFFFFFFFF should not be supported.'); } catch (LengthException $e) { fclose($comment); //Clearing out for other tests. ini_set('memory_limit', $memoryLimit); $this->assertEquals(LengthException::CODE_UNSUPPORTED, $e->getCode(), 'Improper exception thrown.'); } }
public function testFindById() { $originalResult = $this->client->sendSync(new Request('/queue/simple/print', Query::where('target', HOSTNAME_INVALID . '/32'))); $this->assertSame($originalResult->getProperty('.id'), $this->util->find($originalResult->getProperty('.id'))); }