Использование Perl API клиента Mikrotik

Одно время для управления правилами Mikrotik использовал ssh (http://wiki.mikrotik.com/wiki/Use_SSH_to_execute_commands_(DSA_key_login)), однако заметил резкий рост потребляемой памяти :

Слева потребление памяти с использованием SSH, справа с использованием API. Реальное потребление на порядок ниже, но после изменений я так и не перезагружал маршрутизатор, а самостоятельно он память освобождать не хочет, как видно из графиков он её освобождает, но только при достижении критического значения.
Причину такого поведения мне так и не удалось выяснить, поэтому стал искать альтернативные решения, решение оказалось одно - API ( http://wiki.mikrotik.com/wiki/Manual:API ) , там же нашелся и Perl API клиент с примерами - http://forum.mikrotik.com/viewtopic.php?f=9&t=22744

Вот собственно мой пример его использования. Опять же оговорюсь - не претендую на изящество кода.



~#vi api.pl



#!/usr/bin/perl
use vars qw($error_msg $debug);
use Mtik;
$Mtik::debug = 0;
my $mtik_host = $ARGV[0];
my $mtik_username = $ARGV[1];
my $mtik_password = $ARGV[2];
my $cmd = $ARGV[3];
if (Mtik::login($mtik_host,$mtik_username,$mtik_password))
{
    my(%attrs);
    my $mtik_com = '';
    $cmd =~ s/\\"//g;
    my @tokens = split(/ /, $cmd);
    my $size_array = @tokens;
    if ($cmd !~/=/) {
        $attrs{'.id'} = $tokens [$x-1];
        for ($x=0; $x<($size_array-1); $x++){$mtik_com = $mtik_com.'/'.$tokens [$x];}
    }
    else {
        for ($x=0; $x<$size_array; $x++){
            if ($tokens [$x] =~ m/=/){
               my ($atr_name,$param_at) = split(/=/,$tokens [$x]);
               $attrs{$atr_name} = $param_at;
                }
             else {
               $mtik_com = $mtik_com.'/'.$tokens [$x];
           }
       }
    }
    my($retval,@results) = Mtik::mtik_cmd($mtik_com,\%attrs);
    if ($retval == 1){print "ok \n";}
    Mtik::logout;
}

Пример использования:
1. Добавляем адрес в адрес-лист:


~#perl ./api.pl 10.1.1.1 login password 'ip firewall address-list add address=10.10.10.10 list=allow comment=10.10.10.10'
ok


Проверяем:



[admin@mikrotik] > /ip firewall address-list print
Flags: X - disabled, D - dynamic
 #   LIST                                                                   ADDRESS
0   ;;; 10.10.10.10
     allow                                                              10.10.10.10



2.Удаляем адрес из адрес-листа:


~#perl ./api.pl 10.1.1.1 login password 'ip firewall address-list remove 10.10.10.10'
ok


Проверяем:



[admin@mikrotik] > /ip firewall address-list print
Flags: X - disabled, D - dynamic
 #   LIST                                                                   ADDRESS



Но и в этом случае нашлась ложка дёгтя - в RouterOS 4.11 список активных пользователей стримительно начал расти :


[admin@MikroTik] > /user active print count-only
80990


Тогда как в RouterOS 3.30 с этим все в порядке:


[admin@MikroTik] > /user active print count-only
1


После поиска на форуме оказалось, что проблема действительно присутствует ( http://forum.mikrotik.com/viewtopic.php?f=9&t=37075 )
Остаётся ждать её решения...
P.S. Загрузка процессора также заметно снизилась, по сравнению с SSH
P.P.S. Реальное использование памяти после перезагрузки :