From 1f9c2d62df5eec3d9d1bfb2bb8f88aedb499c58b Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Mon, 30 Oct 2023 22:49:55 +0100 Subject: [PATCH] split register_method calls into proper files --- src/api/config.rs | 15 +++ src/api/firewall.rs | 50 +++++++++ src/api/mod.rs | 251 ++++---------------------------------------- src/api/network.rs | 34 ++++++ src/api/object.rs | 31 ++++++ src/api/service.rs | 50 +++++++++ src/api/system.rs | 42 ++++++-- src/api/vpn.rs | 43 +++++++- 8 files changed, 277 insertions(+), 239 deletions(-) diff --git a/src/api/config.rs b/src/api/config.rs index 4b8a14d..1401ea7 100644 --- a/src/api/config.rs +++ b/src/api/config.rs @@ -1,4 +1,5 @@ use jsonrpsee::types::Params; +use jsonrpsee::RpcModule; use crate::config_manager::Change; use crate::state::RpcState; @@ -6,6 +7,20 @@ use crate::state::RpcState; use super::ApiError; use super::ApiError::ConfigError; +pub fn register_methods(module: &mut RpcModule) { + module + .register_method("config.get_pending_changelog", get_pending_changelog) + .unwrap(); + + module + .register_method("config.apply_pending_changes", apply_pending_changes) + .unwrap(); + + module + .register_method("config.discard_pending_changes", discard_pending_changes) + .unwrap(); +} + pub fn get_pending_changelog(_: Params, state: &RpcState) -> Result, ApiError> { Ok(state.config_manager.clone().get_pending_changelog()) } diff --git a/src/api/firewall.rs b/src/api/firewall.rs index 8b13789..5b41ba0 100644 --- a/src/api/firewall.rs +++ b/src/api/firewall.rs @@ -1 +1,51 @@ +use super::ApiError; +use crate::{ + definitions::firewall::{DestinationNATRule, ForwardRule, SourceNATRule}, + get_things, get_vec_thing, + state::RpcState, +}; +use jsonrpsee::RpcModule; +pub fn register_methods(module: &mut RpcModule) { + module + .register_method( + "firewall.get_forward_rule", + get_vec_thing!(firewall.forward_rules), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "firewall.get_forward_rules", + get_things!(firewall.forward_rules), + ) + .unwrap(); + + module + .register_method( + "firewall.get_destination_nat_rule", + get_vec_thing!(firewall.destination_nat_rules), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "firewall.get_destination_nat_rules", + get_things!(firewall.destination_nat_rules), + ) + .unwrap(); + + module + .register_method( + "firewall.get_source_nat_rule", + get_vec_thing!(firewall.source_nat_rules), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "firewall.get_source_nat_rules", + get_things!(firewall.source_nat_rules), + ) + .unwrap(); +} diff --git a/src/api/mod.rs b/src/api/mod.rs index c14c669..c730cf7 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -6,24 +6,11 @@ mod service; mod system; mod vpn; -use std::collections::HashMap; - -use crate::{ - definitions::{ - firewall::{DestinationNATRule, ForwardRule, SourceNATRule}, - network::{NetworkInterface, StaticRoute}, - object::{Address, Service}, - service::{DHCPServer, DNSServer, NTPServer}, - vpn::{WireguardInterface, WireguardPeer}, - }, - state::RpcState, -}; +use crate::state::RpcState; use jsonrpsee::{ types::{error::ErrorCode, ErrorObject}, RpcModule, }; - -use serde::Deserialize; use thiserror::Error; use tracing::info; @@ -53,20 +40,17 @@ impl Into> for ApiError { } } -#[derive(Deserialize)] -struct GetStringID { - id: String, -} - -#[derive(Deserialize)] -struct GetIntID { - id: i64, -} - #[macro_export] macro_rules! get_map_thing { ($( $sub_system:ident ).+) => { |params, state| { + use serde::Deserialize; + + #[derive(Deserialize)] + struct GetStringID { + id: String, + } + let t: GetStringID = params.parse().map_err(ApiError::ParameterDeserialize)?; match state @@ -86,13 +70,20 @@ macro_rules! get_map_thing { macro_rules! get_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 things = state .config_manager .get_pending_config() .$($sub_system).+; - if things.len() > t.id as usize{ + if things.len() > t.id as usize { Ok(things[t.id as usize].clone()) } else { Err(ApiError::NotFound) @@ -116,209 +107,13 @@ macro_rules! get_things { pub fn new_rpc_module(state: RpcState) -> RpcModule { let mut module = RpcModule::new(state); - module - .register_method("system.get_user", system::get_user) - .unwrap(); - - module - .register_method("system.get_users", system::get_users) - .unwrap(); - - module - .register_method("system.create_user", system::create_user) - .unwrap(); - - module - .register_method("system.update_user", system::update_user) - .unwrap(); - - module - .register_method("system.delete_user", system::delete_user) - .unwrap(); - - module - .register_method( - "network.get_static_route", - get_vec_thing!(network.static_routes), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "network.get_static_routes", - get_things!(network.static_routes), - ) - .unwrap(); - - module - .register_method("network.get_interface", get_map_thing!(network.interfaces)) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "network.get_interfaces", - get_things!(network.interfaces), - ) - .unwrap(); - - module - .register_method("object.get_service", get_map_thing!(object.services)) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "object.get_services", - get_things!(object.services), - ) - .unwrap(); - - module - .register_method("object.get_address", get_map_thing!(object.addresses)) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "object.get_addresses", - get_things!(object.addresses), - ) - .unwrap(); - - module - .register_method( - "service.get_dhcp_server", - get_vec_thing!(service.dhcp_servers), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "service.get_dhcp_servers", - get_things!(service.dhcp_servers), - ) - .unwrap(); - - module - .register_method( - "service.get_dns_server", - get_vec_thing!(service.dns_servers), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "service.get_dns_servers", - get_things!(service.dns_servers), - ) - .unwrap(); - - module - .register_method( - "service.get_ntp_server", - get_vec_thing!(service.ntp_servers), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "service.get_ntp_servers", - get_things!(service.ntp_servers), - ) - .unwrap(); - - module - .register_method( - "firewall.get_forward_rule", - get_vec_thing!(firewall.forward_rules), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "firewall.get_forward_rules", - get_things!(firewall.forward_rules), - ) - .unwrap(); - - module - .register_method( - "firewall.get_destination_nat_rule", - get_vec_thing!(firewall.destination_nat_rules), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "firewall.get_destination_nat_rules", - get_things!(firewall.destination_nat_rules), - ) - .unwrap(); - - module - .register_method( - "firewall.get_source_nat_rule", - get_vec_thing!(firewall.source_nat_rules), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "firewall.get_source_nat_rules", - get_things!(firewall.source_nat_rules), - ) - .unwrap(); - - module - .register_method( - "config.get_pending_changelog", - config::get_pending_changelog, - ) - .unwrap(); - - module - .register_method( - "config.apply_pending_changes", - config::apply_pending_changes, - ) - .unwrap(); - - module - .register_method( - "config.discard_pending_changes", - config::discard_pending_changes, - ) - .unwrap(); - - module - .register_method("vpn.wireguard.get_status", vpn::get_wireguard_status) - .unwrap(); - - module - .register_method( - "vpn.wireguard.get_interface", - get_map_thing!(vpn.wireguard.interfaces), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "vpn.wireguard.get_interfaces", - get_things!(vpn.wireguard.interfaces), - ) - .unwrap(); - - module - .register_method( - "vpn.wireguard.get_peer", - get_map_thing!(vpn.wireguard.peers), - ) - .unwrap(); - - module - .register_method::, ApiError>, _>( - "vpn.wireguard.get_peers", - get_things!(vpn.wireguard.peers), - ) - .unwrap(); + config::register_methods(&mut module); + firewall::register_methods(&mut module); + network::register_methods(&mut module); + object::register_methods(&mut module); + service::register_methods(&mut module); + system::register_methods(&mut module); + vpn::register_methods(&mut module); module } diff --git a/src/api/network.rs b/src/api/network.rs index 8b13789..a15bbb5 100644 --- a/src/api/network.rs +++ b/src/api/network.rs @@ -1 +1,35 @@ +use super::ApiError; +use crate::{ + definitions::network::{NetworkInterface, StaticRoute}, + get_map_thing, get_things, get_vec_thing, + state::RpcState, +}; +use jsonrpsee::RpcModule; +use std::collections::HashMap; +pub fn register_methods(module: &mut RpcModule) { + module + .register_method( + "network.get_static_route", + get_vec_thing!(network.static_routes), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "network.get_static_routes", + get_things!(network.static_routes), + ) + .unwrap(); + + module + .register_method("network.get_interface", get_map_thing!(network.interfaces)) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "network.get_interfaces", + get_things!(network.interfaces), + ) + .unwrap(); +} diff --git a/src/api/object.rs b/src/api/object.rs index 8b13789..c45dd6c 100644 --- a/src/api/object.rs +++ b/src/api/object.rs @@ -1 +1,32 @@ +use super::ApiError; +use crate::{ + definitions::object::{Address, Service}, + get_map_thing, get_things, + state::RpcState, +}; +use jsonrpsee::RpcModule; +use std::collections::HashMap; +pub fn register_methods(module: &mut RpcModule) { + module + .register_method("object.get_service", get_map_thing!(object.services)) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "object.get_services", + get_things!(object.services), + ) + .unwrap(); + + module + .register_method("object.get_address", get_map_thing!(object.addresses)) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "object.get_addresses", + get_things!(object.addresses), + ) + .unwrap(); +} diff --git a/src/api/service.rs b/src/api/service.rs index 8b13789..2503f9e 100644 --- a/src/api/service.rs +++ b/src/api/service.rs @@ -1 +1,51 @@ +use super::ApiError; +use crate::{ + definitions::service::{DHCPServer, DNSServer, NTPServer}, + get_things, get_vec_thing, + state::RpcState, +}; +use jsonrpsee::RpcModule; +pub fn register_methods(module: &mut RpcModule) { + module + .register_method( + "service.get_dhcp_server", + get_vec_thing!(service.dhcp_servers), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "service.get_dhcp_servers", + get_things!(service.dhcp_servers), + ) + .unwrap(); + + module + .register_method( + "service.get_dns_server", + get_vec_thing!(service.dns_servers), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "service.get_dns_servers", + get_things!(service.dns_servers), + ) + .unwrap(); + + module + .register_method( + "service.get_ntp_server", + get_vec_thing!(service.ntp_servers), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "service.get_ntp_servers", + get_things!(service.ntp_servers), + ) + .unwrap(); +} diff --git a/src/api/system.rs b/src/api/system.rs index 138c9f5..291f350 100644 --- a/src/api/system.rs +++ b/src/api/system.rs @@ -3,6 +3,7 @@ use crate::config_manager::{ }; use crate::{definitions::system::User, state::RpcState}; use jsonrpsee::types::Params; +use jsonrpsee::RpcModule; use pwhash::sha512_crypt; use serde::{Deserialize, Serialize}; @@ -11,18 +12,43 @@ use ApiError::HashError; use ApiError::NotFound; use ApiError::ParameterDeserialize; -use super::{ApiError, GetStringID}; +use super::ApiError; const USER_CHANGE_PATH: &str = "system.user"; +pub fn register_methods(module: &mut RpcModule) { + module.register_method("system.get_user", get_user).unwrap(); + + module + .register_method("system.get_users", get_users) + .unwrap(); + + module + .register_method("system.create_user", create_user) + .unwrap(); + + module + .register_method("system.update_user", update_user) + .unwrap(); + + module + .register_method("system.delete_user", delete_user) + .unwrap(); +} + #[derive(Serialize, Clone)] -pub struct GetUser { +pub struct GetUserResult { name: String, comment: String, } -pub fn get_user(p: Params, state: &RpcState) -> Result { - let u: GetStringID = p.parse().map_err(ParameterDeserialize)?; +#[derive(Deserialize)] +pub struct GetUser { + id: String, +} + +pub fn get_user(p: Params, state: &RpcState) -> Result { + let u: GetUser = p.parse().map_err(ParameterDeserialize)?; match state .config_manager @@ -31,7 +57,7 @@ pub fn get_user(p: Params, state: &RpcState) -> Result { .users .get(&u.id) { - Some(user) => Ok(GetUser { + Some(user) => Ok(GetUserResult { name: u.id, comment: user.comment.clone(), }), @@ -39,8 +65,8 @@ pub fn get_user(p: Params, state: &RpcState) -> Result { } } -pub fn get_users(_: Params, state: &RpcState) -> Result, ApiError> { - let mut res: Vec = Vec::new(); +pub fn get_users(_: Params, state: &RpcState) -> Result, ApiError> { + let mut res: Vec = Vec::new(); for u in state .config_manager .get_pending_config() @@ -48,7 +74,7 @@ pub fn get_users(_: Params, state: &RpcState) -> Result, ApiError> .users .iter() { - res.push(GetUser { + res.push(GetUserResult { name: u.0.to_string(), comment: u.1.comment.clone(), }) diff --git a/src/api/vpn.rs b/src/api/vpn.rs index 0f67842..7c6da9d 100644 --- a/src/api/vpn.rs +++ b/src/api/vpn.rs @@ -1,8 +1,45 @@ -use jsonrpsee::types::Params; - -use crate::state::RpcState; +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 jsonrpsee::types::Params; +use jsonrpsee::RpcModule; + +pub fn register_methods(module: &mut RpcModule) { + module + .register_method("vpn.wireguard.get_status", get_wireguard_status) + .unwrap(); + + module + .register_method( + "vpn.wireguard.get_interface", + get_map_thing!(vpn.wireguard.interfaces), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "vpn.wireguard.get_interfaces", + get_things!(vpn.wireguard.interfaces), + ) + .unwrap(); + + module + .register_method( + "vpn.wireguard.get_peer", + get_map_thing!(vpn.wireguard.peers), + ) + .unwrap(); + + module + .register_method::, ApiError>, _>( + "vpn.wireguard.get_peers", + get_things!(vpn.wireguard.peers), + ) + .unwrap(); +} pub fn get_wireguard_status(_: Params, _: &RpcState) -> Result { Ok("ok".to_string())