diff --git a/src/api/firewall.rs b/src/api/firewall.rs index 5b41ba0..256a4da 100644 --- a/src/api/firewall.rs +++ b/src/api/firewall.rs @@ -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) { ) .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) { ) .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) { get_things!(firewall.source_nat_rules), ) .unwrap(); + + module + .register_method( + "firewall.delete_source_nat_rule", + delete_vec_thing!(firewall.source_nat_rules), + ) + .unwrap(); } diff --git a/src/api/mod.rs b/src/api/mod.rs index c730cf7..1c3abbb 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -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 { let mut module = RpcModule::new(state); diff --git a/src/api/network.rs b/src/api/network.rs index a15bbb5..3e1d238 100644 --- a/src/api/network.rs +++ b/src/api/network.rs @@ -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) { ) .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) { get_things!(network.interfaces), ) .unwrap(); + + module + .register_method( + "network.delete_interface", + delete_map_thing!(network.interfaces), + ) + .unwrap(); } diff --git a/src/api/object.rs b/src/api/object.rs index c45dd6c..71baae2 100644 --- a/src/api/object.rs +++ b/src/api/object.rs @@ -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) { ) .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) { get_things!(object.addresses), ) .unwrap(); + + module + .register_method("object.delete_address", delete_map_thing!(object.addresses)) + .unwrap(); } diff --git a/src/api/service.rs b/src/api/service.rs index 2503f9e..40b6867 100644 --- a/src/api/service.rs +++ b/src/api/service.rs @@ -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) { ) .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) { ) .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) { get_things!(service.ntp_servers), ) .unwrap(); + + module + .register_method( + "service.delete_ntp_server", + delete_vec_thing!(service.ntp_servers), + ) + .unwrap(); } diff --git a/src/api/vpn.rs b/src/api/vpn.rs index 7c6da9d..0482924 100644 --- a/src/api/vpn.rs +++ b/src/api/vpn.rs @@ -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) { ) .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) { 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 {