#mikrotik #networking #api #router #router-os #software

mikrotik_lite

mikrotik_lite 是一个简单高效用于操作 Mikrotik RouterOS API 的库

1个不稳定版本

0.1.0 2023年10月19日

#3 in #software

自定义许可证

36KB
397

MikrotikLite

MikrotikLite 是一个用于与 Mikrotik 路由器交互的 Rust 库。

特性

  • 简单易用:该库提供了一个简单直观的接口,用于与 Mikrotik 路由器交互。
  • 异步:该库是异步的,使其适用于长时间运行的操作。
  • 不支持事件监听:该库不支持事件监听。这是因为它会使得库更复杂且难以使用。它还会在与并发操作工作时产生问题。未来可能会添加事件监听,但目前没有计划。

示例:以 JSON 格式检索数据

use mikrotik_lite::MikrotikLite;

let mut api = MikrotikLite::new(
    "api_login".to_string(),
    "api_pass".to_string(),
    "10.80.80.1:8728".to_string(),
).unwrap();

// Get the current user identity.
let identity_json = api.send_command_json("/system/identity/print".to_string(), None).unwrap();

// Print the JSON string.
println!("{}", identity_json);

您可以预先定义一个结构,并将响应解析到该结构中

use serde::Deserialize;
use mikrotik_lite::MikrotikLite;

// `Identity` struct
#[derive(Debug, Deserialize)]
struct Identity {
    pub name: String
}

let mut api = MikrotikLite::new(
    "api_login".to_string(),
    "api_pass".to_string(),
    "10.80.80.1:8728".to_string(),
).unwrap();

let identity = api.send_command::<Identity>(
    "/system/identity/print".to_string(),
    None
).unwrap();

println!("{:#?}", identity);

此库不提供预定义的结构,但您可以通过通过 send_command_json 发送请求并基于您需要的字段创建结构来轻松创建自己的结构。序列化和反序列化使用 serde 库处理。在处理特定字段类型时有一些考虑,因为 MikroTik 在其响应中不提供类型标记。您应使用 deserialize_bool_from_anything 用于布尔值,以及 deserialize_string_from_number 用于数值。

处理布尔值 #[serde(deserialize_with = "deserialize_bool_from_anything")]

处理数值 #[serde(deserialize_with = "deserialize_string_from_number")]

此外,一些字段名称不遵循 Rust 命名约定,应使用 serde(rename = "dst-address") 属性进行重命名。

examples 目录中,您可以找到库的使用示例。

所有方法都有带有 _async 后缀的异步对应方法,允许您使用 Tokio 进行并发请求。以下是一个示例

use mikrotik_lite::MikrotikLite;

let mut api1 = MikrotikLite::new(
    "api_login".to_string(),
    "api_pass".to_string(),
    "10.80.80.1:8728".to_string(),
).unwrap();

let mut api2 = MikrotikLite::new(
    "api_login".to_string(),
    "api_pass".to_string(),
    "10.80.80.1:8728".to_string(),
).unwrap();

let route_future = api1.send_command_json_async(
    "/ip/route/print".to_string(),
    None
);

let identity_future = api2.send_command_json_async(
    "/system/identity/print".to_string(),
    None
);
async {
    let (route, identity) = tokio::join!(route_future, identity_future);

    println!("{}", route.unwrap());
    println!("{}", identity.unwrap());
};

您可以通过这种方式将参数传递到您的命令中

use std::collections::HashMap;
use mikrotik_lite::MikrotikLite;

let mut api = MikrotikLite::new(
    "api_login".to_string(),
    "api_pass".to_string(),
    "10.80.80.1:8728".to_string(),
).unwrap();

let mut attr = HashMap::new();
attr.insert("address".to_string(), "8.8.8.8".to_string());
attr.insert("count".to_string(), "5".to_string());

let ping = api.send_command_json(
    "/ping".to_string(),
    Some(attr.clone())
).unwrap();

println!("{}", ping);

依赖项

~2.4–4MB
~65K SLoC