add create_map, update_map and update_vec macros

This commit is contained in:
Samuel Lorch 2023-11-02 00:47:54 +01:00
parent 0895f0892e
commit 8945fdeda3
6 changed files with 221 additions and 3 deletions

View file

@ -4,6 +4,7 @@ use crate::{
definitions::firewall::{DestinationNATRule, ForwardRule, SourceNATRule},
delete_vec_thing, get_vec_thing, list_things,
state::RpcState,
update_vec_thing,
};
use jsonrpsee::RpcModule;
@ -29,6 +30,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"firewall.forward_rules.update",
update_vec_thing!(firewall.forward_rules, ForwardRule),
)
.unwrap();
module
.register_method(
"firewall.forward_rules.delete",
@ -57,6 +65,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"firewall.destination_nat_rules.update",
update_vec_thing!(firewall.destination_nat_rules, DestinationNATRule),
)
.unwrap();
module
.register_method(
"firewall.destination_nat_rules.delete",
@ -85,6 +100,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"firewall.source_nat_rules.update",
update_vec_thing!(firewall.source_nat_rules, SourceNATRule),
)
.unwrap();
module
.register_method(
"firewall.source_nat_rules.delete",

View file

@ -107,6 +107,37 @@ macro_rules! list_things {
};
}
#[macro_export]
macro_rules! create_map_thing {
($( $sub_system:ident ).+, $typ:ty) => {
|params, state| {
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct CreateThing {
id: String,
thing: $typ
}
let t: CreateThing = params.parse().map_err(ApiError::ParameterDeserialize)?;
let mut cm = state.config_manager.clone();
let mut tx = cm.start_transaction();
if tx.config.$($sub_system).+.insert(t.id.clone(), t.thing).is_none() {
tx.commit(crate::config_manager::Change {
action: crate::config_manager::ChangeAction::Create,
path: stringify!($($sub_system).+),
id: t.id,
})
.map_err(ApiError::ConfigError)
} else {
tx.revert();
Err(ApiError::AlreadyExists)
}
}
};
}
#[macro_export]
macro_rules! create_vec_thing {
($( $sub_system:ident ).+, $typ:ty) => {
@ -119,12 +150,75 @@ macro_rules! create_vec_thing {
tx.config.$($sub_system).+.push(t);
let id = {tx.config.$($sub_system).+.len() - 1}.to_string();
tx.commit(crate::config_manager::Change {
action: crate::config_manager::ChangeAction::Delete,
action: crate::config_manager::ChangeAction::Create,
path: stringify!($($sub_system).+),
id,
})
.map_err(ApiError::ConfigError)
}
};
}
#[macro_export]
macro_rules! update_map_thing {
($( $sub_system:ident ).+, $typ:ty) => {
|params, state| {
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct CreateThing {
id: String,
thing: $typ
}
let t: CreateThing = params.parse().map_err(ApiError::ParameterDeserialize)?;
let mut cm = state.config_manager.clone();
let mut tx = cm.start_transaction();
if tx.config.$($sub_system).+.insert(t.id.clone(), t.thing).is_none() {
tx.revert();
Err(ApiError::NotFound)
} else {
tx.commit(crate::config_manager::Change {
action: crate::config_manager::ChangeAction::Update,
path: stringify!($($sub_system).+),
id: t.id,
})
.map_err(ApiError::ConfigError)
}
}
};
}
#[macro_export]
macro_rules! update_vec_thing {
($( $sub_system:ident ).+, $typ:ty) => {
|params, state| {
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct CreateThing {
id: i64,
thing: $typ
}
let t: CreateThing = params.parse().map_err(ApiError::ParameterDeserialize)?;
let mut cm = state.config_manager.clone();
let mut tx = cm.start_transaction();
if tx.config.$($sub_system).+.len() > t.id as usize {
tx.config.$($sub_system).+[t.id as usize] = t.thing;
tx.commit(crate::config_manager::Change {
action: crate::config_manager::ChangeAction::Update,
path: stringify!($($sub_system).+),
id: t.id.to_string(),
})
.map_err(ApiError::ConfigError)
} else {
tx.revert();
Err(ApiError::NotFound)
}
}
};
}

View file

@ -1,9 +1,10 @@
use super::ApiError;
use crate::{
create_vec_thing,
create_map_thing, create_vec_thing,
definitions::network::{NetworkInterface, StaticRoute},
delete_map_thing, delete_vec_thing, get_map_thing, get_vec_thing, list_things,
state::RpcState,
update_map_thing, update_vec_thing,
};
use jsonrpsee::RpcModule;
use std::collections::HashMap;
@ -30,6 +31,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"network.static_routes.update",
update_vec_thing!(network.static_routes, StaticRoute),
)
.unwrap();
module
.register_method(
"network.static_routes.delete",
@ -48,6 +56,20 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"network.interfaces.create",
create_map_thing!(network.interfaces, NetworkInterface),
)
.unwrap();
module
.register_method(
"network.interfaces.update",
update_map_thing!(network.interfaces, NetworkInterface),
)
.unwrap();
module
.register_method(
"network.interfaces.delete",

View file

@ -1,8 +1,10 @@
use super::ApiError;
use crate::{
create_map_thing,
definitions::object::{Address, Service},
delete_map_thing, get_map_thing, list_things,
state::RpcState,
update_map_thing,
};
use jsonrpsee::RpcModule;
use std::collections::HashMap;
@ -19,6 +21,20 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"object.services.create",
create_map_thing!(object.services, Service),
)
.unwrap();
module
.register_method(
"object.services.update",
update_map_thing!(object.services, Service),
)
.unwrap();
module
.register_method("object.services.delete", delete_map_thing!(object.services))
.unwrap();
@ -34,6 +50,20 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"object.addresses.create",
create_map_thing!(object.addresses, Address),
)
.unwrap();
module
.register_method(
"object.addresses.update",
update_map_thing!(object.addresses, Address),
)
.unwrap();
module
.register_method(
"object.addresses.delete",

View file

@ -4,6 +4,7 @@ use crate::{
definitions::service::{DHCPServer, DNSServer, NTPServer},
delete_vec_thing, get_vec_thing, list_things,
state::RpcState,
update_vec_thing,
};
use jsonrpsee::RpcModule;
@ -29,6 +30,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"service.dhcp_servers.update",
update_vec_thing!(service.dhcp_servers, DHCPServer),
)
.unwrap();
module
.register_method(
"service.dhcp_servers.delete",
@ -57,6 +65,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"service.dns_servers.update",
update_vec_thing!(service.dns_servers, DNSServer),
)
.unwrap();
module
.register_method(
"service.dns_servers.delete",
@ -85,6 +100,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"service.ntp_servers.update",
update_vec_thing!(service.ntp_servers, NTPServer),
)
.unwrap();
module
.register_method(
"service.ntp_servers.delete",

View file

@ -3,7 +3,7 @@ use std::collections::HashMap;
use super::ApiError;
use crate::definitions::vpn::{WireguardInterface, WireguardPeer};
use crate::state::RpcState;
use crate::{delete_map_thing, get_map_thing, list_things};
use crate::{create_map_thing, delete_map_thing, get_map_thing, list_things, update_map_thing};
use jsonrpsee::types::Params;
use jsonrpsee::RpcModule;
@ -26,6 +26,20 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"vpn.wireguard.interfaces.create",
create_map_thing!(vpn.wireguard.interfaces, WireguardInterface),
)
.unwrap();
module
.register_method(
"vpn.wireguard.interfaces.update",
update_map_thing!(vpn.wireguard.interfaces, WireguardInterface),
)
.unwrap();
module
.register_method(
"vpn.wireguard.interfaces.delete",
@ -47,6 +61,20 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"vpn.wireguard.peers.create",
create_map_thing!(vpn.wireguard.peers, WireguardPeer),
)
.unwrap();
module
.register_method(
"vpn.wireguard.peers.update",
update_map_thing!(vpn.wireguard.peers, WireguardPeer),
)
.unwrap();
module
.register_method(
"vpn.wireguard.peers.delete",