Add RPC Delete Macro

This commit is contained in:
Samuel Lorch 2023-11-01 03:23:29 +01:00
parent 7d2ef675f7
commit eecdb51509
6 changed files with 148 additions and 5 deletions

View file

@ -1,7 +1,7 @@
use super::ApiError;
use crate::{
definitions::firewall::{DestinationNATRule, ForwardRule, SourceNATRule},
get_things, get_vec_thing,
delete_vec_thing, get_things, get_vec_thing,
state::RpcState,
};
use jsonrpsee::RpcModule;
@ -21,6 +21,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"firewall.delete_forward_rule",
delete_vec_thing!(firewall.forward_rules),
)
.unwrap();
module
.register_method(
"firewall.get_destination_nat_rule",
@ -35,6 +42,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"firewall.delete_destination_nat_rule",
delete_vec_thing!(firewall.destination_nat_rules),
)
.unwrap();
module
.register_method(
"firewall.get_source_nat_rule",
@ -48,4 +62,11 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
get_things!(firewall.source_nat_rules),
)
.unwrap();
module
.register_method(
"firewall.delete_source_nat_rule",
delete_vec_thing!(firewall.source_nat_rules),
)
.unwrap();
}

View file

@ -104,6 +104,71 @@ macro_rules! get_things {
};
}
#[macro_export]
macro_rules! delete_map_thing {
($( $sub_system:ident ).+) => {
|params, state| {
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct GetStringID {
id: String,
}
let t: GetStringID = params.parse().map_err(ApiError::ParameterDeserialize)?;
let mut cm = state.config_manager.clone();
let mut tx = cm.start_transaction();
match tx.config.$($sub_system).+.remove(&t.id) {
Some(_) => tx
.commit(crate::config_manager::Change {
action: crate::config_manager::ChangeAction::Delete,
path: stringify!($($sub_system).+),
id: t.id,
})
.map_err(ApiError::ConfigError),
None => {
tx.revert();
Err(ApiError::NotFound)
}
}
}
};
}
#[macro_export]
macro_rules! delete_vec_thing {
($( $sub_system:ident ).+) => {
|params, state| {
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct GetIntID {
id: i64,
}
let t: GetIntID = 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).+.remove(t.id as usize);
tx.commit(crate::config_manager::Change {
action: crate::config_manager::ChangeAction::Delete,
path: stringify!($($sub_system).+),
id: t.id.to_string(),
})
.map_err(ApiError::ConfigError)
} else {
tx.revert();
Err(ApiError::NotFound)
}
}
};
}
pub fn new_rpc_module(state: RpcState) -> RpcModule<RpcState> {
let mut module = RpcModule::new(state);

View file

@ -1,7 +1,7 @@
use super::ApiError;
use crate::{
definitions::network::{NetworkInterface, StaticRoute},
get_map_thing, get_things, get_vec_thing,
delete_map_thing, delete_vec_thing, get_map_thing, get_things, get_vec_thing,
state::RpcState,
};
use jsonrpsee::RpcModule;
@ -22,6 +22,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"network.delete_static_route",
delete_vec_thing!(network.static_routes),
)
.unwrap();
module
.register_method("network.get_interface", get_map_thing!(network.interfaces))
.unwrap();
@ -32,4 +39,11 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
get_things!(network.interfaces),
)
.unwrap();
module
.register_method(
"network.delete_interface",
delete_map_thing!(network.interfaces),
)
.unwrap();
}

View file

@ -1,7 +1,7 @@
use super::ApiError;
use crate::{
definitions::object::{Address, Service},
get_map_thing, get_things,
delete_map_thing, get_map_thing, get_things,
state::RpcState,
};
use jsonrpsee::RpcModule;
@ -19,6 +19,10 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method("object.delete_service", delete_map_thing!(object.services))
.unwrap();
module
.register_method("object.get_address", get_map_thing!(object.addresses))
.unwrap();
@ -29,4 +33,8 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
get_things!(object.addresses),
)
.unwrap();
module
.register_method("object.delete_address", delete_map_thing!(object.addresses))
.unwrap();
}

View file

@ -1,7 +1,7 @@
use super::ApiError;
use crate::{
definitions::service::{DHCPServer, DNSServer, NTPServer},
get_things, get_vec_thing,
delete_vec_thing, get_things, get_vec_thing,
state::RpcState,
};
use jsonrpsee::RpcModule;
@ -21,6 +21,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"service.delete_dhcp_server",
delete_vec_thing!(service.dhcp_servers),
)
.unwrap();
module
.register_method(
"service.get_dns_server",
@ -35,6 +42,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"service.delete_dns_server",
delete_vec_thing!(service.dns_servers),
)
.unwrap();
module
.register_method(
"service.get_ntp_server",
@ -48,4 +62,11 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
get_things!(service.ntp_servers),
)
.unwrap();
module
.register_method(
"service.delete_ntp_server",
delete_vec_thing!(service.ntp_servers),
)
.unwrap();
}

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::{get_map_thing, get_things};
use crate::{delete_map_thing, get_map_thing, get_things};
use jsonrpsee::types::Params;
use jsonrpsee::RpcModule;
@ -26,6 +26,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
)
.unwrap();
module
.register_method(
"vpn.wireguard.delete_interface",
delete_map_thing!(vpn.wireguard.interfaces),
)
.unwrap();
module
.register_method(
"vpn.wireguard.get_peer",
@ -39,6 +46,13 @@ pub fn register_methods(module: &mut RpcModule<RpcState>) {
get_things!(vpn.wireguard.peers),
)
.unwrap();
module
.register_method(
"vpn.wireguard.delete_peer",
delete_map_thing!(vpn.wireguard.peers),
)
.unwrap();
}
pub fn get_wireguard_status(_: Params, _: &RpcState) -> Result<String, ApiError> {