From 94f580996c9b38e146c0a0cce6927884f58cd456 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Wed, 1 Nov 2023 04:39:02 +0100 Subject: [PATCH] add create vec thing macro --- src/api/firewall.rs | 22 ++++++++++++++++++++++ src/api/mod.rs | 22 ++++++++++++++++++++++ src/api/network.rs | 8 ++++++++ src/api/service.rs | 22 ++++++++++++++++++++++ 4 files changed, 74 insertions(+) diff --git a/src/api/firewall.rs b/src/api/firewall.rs index c871e44..70f1c3f 100644 --- a/src/api/firewall.rs +++ b/src/api/firewall.rs @@ -1,5 +1,6 @@ use super::ApiError; use crate::{ + create_vec_thing, definitions::firewall::{DestinationNATRule, ForwardRule, SourceNATRule}, delete_vec_thing, get_vec_thing, list_things, state::RpcState, @@ -21,6 +22,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "firewall.forward_rules.create", + create_vec_thing!(firewall.forward_rules, ForwardRule), + ) + .unwrap(); + module .register_method( "firewall.forward_rules.delete", @@ -42,6 +50,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "firewall.destination_nat_rules.create", + create_vec_thing!(firewall.destination_nat_rules, DestinationNATRule), + ) + .unwrap(); + module .register_method( "firewall.destination_nat_rules.delete", @@ -63,6 +78,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "firewall.source_nat_rules.create", + create_vec_thing!(firewall.source_nat_rules, SourceNATRule), + ) + .unwrap(); + module .register_method( "firewall.source_nat_rules.delete", diff --git a/src/api/mod.rs b/src/api/mod.rs index 437a2a2..a8d8bee 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -104,6 +104,28 @@ macro_rules! list_things { }; } +#[macro_export] +macro_rules! create_vec_thing { + ($( $sub_system:ident ).+, $typ:ty) => { + |params, state| { + let t: $typ = params.parse().map_err(ApiError::ParameterDeserialize)?; + + let mut cm = state.config_manager.clone(); + let mut tx = cm.start_transaction(); + + 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, + path: stringify!($($sub_system).+), + id, + }) + .map_err(ApiError::ConfigError) + + } + }; +} + #[macro_export] macro_rules! delete_map_thing { ($( $sub_system:ident ).+) => { diff --git a/src/api/network.rs b/src/api/network.rs index 0788126..387f93b 100644 --- a/src/api/network.rs +++ b/src/api/network.rs @@ -1,5 +1,6 @@ use super::ApiError; use crate::{ + create_vec_thing, definitions::network::{NetworkInterface, StaticRoute}, delete_map_thing, delete_vec_thing, get_map_thing, get_vec_thing, list_things, state::RpcState, @@ -22,6 +23,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "network.static_routes.create", + create_vec_thing!(network.static_routes, StaticRoute), + ) + .unwrap(); + module .register_method( "network.static_routes.delete", diff --git a/src/api/service.rs b/src/api/service.rs index 97fb6fb..51d575f 100644 --- a/src/api/service.rs +++ b/src/api/service.rs @@ -1,5 +1,6 @@ use super::ApiError; use crate::{ + create_vec_thing, definitions::service::{DHCPServer, DNSServer, NTPServer}, delete_vec_thing, get_vec_thing, list_things, state::RpcState, @@ -21,6 +22,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "service.dhcp_servers.create", + create_vec_thing!(service.dhcp_servers, DHCPServer), + ) + .unwrap(); + module .register_method( "service.dhcp_servers.delete", @@ -42,6 +50,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "service.dns_servers.create", + create_vec_thing!(service.dns_servers, DNSServer), + ) + .unwrap(); + module .register_method( "service.dns_servers.delete", @@ -63,6 +78,13 @@ pub fn register_methods(module: &mut RpcModule) { ) .unwrap(); + module + .register_method( + "service.ntp_servers.create", + create_vec_thing!(service.ntp_servers, NTPServer), + ) + .unwrap(); + module .register_method( "service.ntp_servers.delete",