A modern C++ wrapper for the MikroTik API.
A wrapper around the MikroTik API. Uses C++17, with all of its glory. The API is platform independent and can be compiled for Windows and POSIX socket implementations as well.
The library allows creating a handle to a MikroTik device and execute arbitrary
API commands on it.
The login is abstracted away by the constructor of the api_handler
, and uses the
new RouterOS v6.43
and up scheme.
In case you wanted to define commands to execute in code a DSL, albeit a rather crude
one, exists to help you out with that:
It allows the creation of sentence
objects which are used when communicating
with the MikroTik device.
In mikrotik::api::literals
there is a _cmd
user defined literal for strings,
which creates a command
object. A command can be extended by strings with the
/ operator.
using namespace mikoritk::api::literals;
// ...
auto cmd = "system"_cmd / "resource" / "print";
This creates a command equivalent to /system/resource/print
.
[Note: C++ does not offer me a way to allow putting a forward slash before
things as is. This is sad.]
If you only need the command, you can just use that as a sentence and send it. However, if you need attributes or queries the DSL has you kind of covered.
To supply attributes to a command just use operator[]
, with a string if you
only need the name, or a braced list of two strings if you need a value as well:
using namespace mikoritk::api::literals;
// ...
auto snt =
("log"_cmd / "info")
[{"message", "Fun things are fun"}]; // => =message=Fun things are fun
// ["message"] // => =message=
You can chain the operator[]
s.
[Note: The original plan was to use operator=
but it's right associative which
breaks all the things here. This is also sad, because we now need those parentheses around
the command DSL. 💢]
You might want to use queries as well. While during the planning phase
these had better support in the DSL, because C++ sadly does not allow arbitrarily
meddling with operators' precedence and whatnot, they lost their high-class support.
Now they are used the same way as attributes, except they use operator()
instead
of operator[]
like so:
auto snt =
("interface"_cmd / "print")
({"type", "ether"}) # => ?type=ether
({"type", "vlan"}) # => ?type=vlan
("#|"); # => ?#|
[Warning: The equals sign is only present if a value is assigned to the name. If you need equals nothing use the empty string as the value]
The DSL supports queries which are present since RouterOS v3.21
, however,
currently, only RouterOS v6.43
and up are supported because the new login scheme
the library implements only works there.
Because MSVC is special, it'd basically require MS' STL to __declspec(dllexport)
almost everything,
which it does not do, therefore, building a DLL with MSVC may cause problems, so building as a static library
is advised.
GCC and Clang seem to both work with shared libraries, even on Windows.
I don't know how Clang-CL handles this issue.
For some reason, on Windows for sure, possibly elsewhere as well, Clang creates duplicate symbols
when using an already installed {fmt}
. To get around this, the project will always install a {fmt}
for itself when using Clang, even if there would be an applicable {fmt}
package on the system.
MikroTikApi is licensed under the BSD3 license. For more information see the provided LICENSE file.
{fmt} is used as a dependency, and is licensed under its own license. For more information see the provided LICENSE.fmt file.
Catch2 is used as a test dependency, and is licensed under the Boost Software License. For more information see the provided LICENSE.boost file.