NAME
MikroTik::Client - Non-blocking interface to MikroTik API
SYNOPSIS
my $api = MikroTik::Client->new();
# Blocking
my $list = $api->command(
'/interface/print',
{'.proplist' => '.id,name,type'},
{type => ['ipip-tunnel', 'gre-tunnel'], running => 'true'}
);
if (my $err = $api->error) { die "$err\n" }
printf "%s: %s\n", $_->{name}, $_->{type} for @$list;
# Non-blocking
my $cv = AE::cv;
my $tag = $api->command(
'/system/resource/print',
{'.proplist' => 'board-name,version,uptime'} => sub {
my ($api, $err, $list) = @_;
...;
$cv->send;
}
);
$cv->recv;
# Subscribe
$tag = $api->subscribe(
'/interface/listen' => sub {
my ($api, $err, $el) = @_;
...;
}
);
AE::timer 3, 0, cb => sub { $api->cancel($tag) };
# Errors handling
$api->command(
'/random/command' => sub {
my ($api, $err, $list) = @_;
if ($err) {
warn "Error: $err, category: " . $list->[0]{category};
return;
}
...;
}
);
# Promises
$cv = AE::cv;
$api->cmd_p('/interface/print')
->then(sub { my $res = shift }, sub { my ($err, $attr) = @_ })
->finally($cv);
$cv->recv;
DESCRIPTION
Both blocking and non-blocking (don't mix them though) interface to a MikroTik API service. With queries, command subscriptions and optional Promises.
ATTRIBUTES
MikroTik::Client implements the following attributes.
ca
my $ca = $api->ca;
$api->ca("/etc/ssl/certs/ca-bundle.crt")
Path to TLS certificate authority file used to verify the peer certificate, defaults to the value of the MIKROTIK_CLIENT_CA
environment variable.
cert
my $cert = $api->cert;
$api->cert("./client.crt")
Path to TLS certificate file used to authenticate against the peer. Can be bundled with a private key and additional signing certificates. If file contains the private key, key attribute is optional. Defaults to the value of the MIKROTIK_CLIENT_CERT
environment variable.
error
my $last_error = $api->error;
Keeps an error from last "command" call. Empty string on successful commands.
host
my $host = $api->host;
$api = $api->host('border-gw.local');
Host name or IP address to connect to. Defaults to 192.168.88.1
.
insecure
my $insecure = $api->insecure;
$api->insecure(1);
Do not verify TLS certificates (highly discouraged). Connection will be encrypted, but a peer certificate won't be validated. Disabled by default.
key
my $key = $api->key;
$api->key("./client.crt")
Path to TLS key file. Optional if a private key bundled with a cert file. Defaults to the value of the MIKROTIK_CLIENT_KEY
environment variable.
new_login
my $new_login = $api->new_login;
$api = $api->new_login(1);
Use new login scheme introduced in RouterOS v6.43
and fallback to previous one for older systems. Since in this mode a password will be send in clear text, it will be default only for "tls" connections.
password
my $pass = $api->password;
$api = $api->password('secret');
Password for authentication. Empty string by default.
port
my $port = $api->port;
$api = $api->port(8000);
API service port for connection. Defaults to 8729
and 8728
for TLS and clear text connections respectively.
timeout
my $timeout = $api->timeout;
$api = $api->timeout(15);
Timeout in seconds for sending request and receiving response before command will be canceled. Default is 10
seconds.
tls
my $tls = $api->tls;
$api = $api->tls(1);
Use TLS for connection. Enabled by default.
user
my $user = $api->user;
$api = $api->user('admin');
User name for authentication purposes. Defaults to admin
.
METHODS
cancel
# subscribe to a command output
my $tag = $api->subscribe('/ping', {address => '127.0.0.1'} => sub {...});
# cancel command after 10 seconds
my $t = AE::timer 10, 0, sub { $api->cancel($tag) };
# or with callback
$api->cancel($tag => sub {...});
Cancels background commands. Can accept a callback as last argument.
cmd
my $list = $api->cmd('/interface/print');
An alias for "command".
cmd_p
my $promise = $api->cmd_p('/interface/print');
An alias for "command_p".
command
my $command = '/interface/print';
my $attr = {'.proplist' => '.id,name,type'};
my $query = {type => ['ipip-tunnel', 'gre-tunnel'], running => 'true'};
my $list = $api->command($command, $attr, $query);
die $api->error if $api->error;
for (@$list) {...}
$api->command('/user/set', {'.id' => 'admin', comment => 'System admin'});
# Non-blocking
$api->command('/ip/address/print' => sub {
my ($api, $err, $list) = @_;
return if $err;
for (@$list) {...}
});
# Omit attributes
$api->command('/user/print', undef, {name => 'admin'} => sub {...});
# Errors handling
$list = $api->command('/random/command');
if (my $err = $api->error) {
die "Error: $err, category: " . $list->[0]{category};
}
Executes a command on a remote host and returns list with hashrefs containing elements returned by a host. You can append a callback for non-blocking calls.
In a case of error, returned value may keep additional attributes such as category or an error code. You should never rely on defines of the result to catch errors.
For a query syntax refer to MikroTik::Client::Query.
command_p
my $promise = $api->command_p('/interface/print');
$promise->then(
sub {
my $res = shift;
...
})->catch(sub {
my ($err, $attr) = @_;
});
Same as "command", but always performs requests non-blocking and returns a promise instead of accepting a callback. Promises v0.99+ is required for this functionality.
subscribe
my $tag = $api->subscribe('/ping',
{address => '127.0.0.1'} => sub {
my ($api, $err, $res) = @_;
});
AE::timer 3, 0, sub { $api->cancel($tag) };
Subscribe to an output of commands with continuous responses such as listen
or ping
. Should be terminated with "cancel".
DEBUGGING
You can set the MIKROTIK_CLIENT_DEBUG environment variable to get some debug output printed to stderr.
Also, you can change connection timeout with the MIKROTIK_CLIENT_CONNTIMEOUT variable.
COPYRIGHT AND LICENSE
Andre Parker, 2017-2019.
This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.
SEE ALSO
https://wiki.mikrotik.com/wiki/Manual:API, https://github.com/anparker/api-mikrotik