diff --git a/client/src/App.vue b/client/src/App.vue
index f40cc93..833aca6 100644
--- a/client/src/App.vue
+++ b/client/src/App.vue
@@ -22,19 +22,19 @@ const NavStateCount = 3;
let navState = $ref(NavState.Open);
const navRoutes = {
'/': { icon: IDashboard, caption: 'Dashboard' },
- '/firewall/forwardrules': { icon: IRule, caption: 'Rules' },
- '/firewall/sourcenatrules': { icon: ISNAT, caption: 'SNAT' },
- '/firewall/destinationnatrules': { icon: IDNAT, caption: 'DNAT' },
+ '/firewall/forward_rules': { icon: IRule, caption: 'Rules' },
+ '/firewall/source_nat_rules': { icon: ISNAT, caption: 'SNAT' },
+ '/firewall/destination_nat_rules': { icon: IDNAT, caption: 'DNAT' },
'/network/interfaces': { icon: IEthernet, caption: 'Interfaces' },
- '/network/staticroutes': { icon: IStaticRoutes, caption: 'Static Routes' },
+ '/network/static_routes': { icon: IStaticRoutes, caption: 'Static Routes' },
'/object/addresses': { icon: IAddress, caption: 'Addresses' },
'/object/services': { icon: IService, caption: 'Services' },
- '/service/dhcpservers': { icon: IDHCPServer, caption: 'DHCP Server' },
- '/service/dnsservers': { icon: IDNSServer, caption: 'DNS Server' },
- '/service/ntpservers': { icon: ITimeServer, caption: 'NTP Server' },
- '/vpn/wireguardstatus': { icon: IWireguard, caption: 'Wireguard Status' },
- '/vpn/wireguardinterfaces': { icon: IWireguard, caption: 'Wireguard Interfaces' },
- '/vpn/wireguardpeers': { icon: IWireguard, caption: 'Wireguard Peers' },
+ '/service/dhcp_servers': { icon: IDHCPServer, caption: 'DHCP Server' },
+ '/service/dns_servers': { icon: IDNSServer, caption: 'DNS Server' },
+ '/service/ntp_servers': { icon: ITimeServer, caption: 'NTP Server' },
+ '/vpn/wireguard_status': { icon: IWireguard, caption: 'Wireguard Status' },
+ '/vpn/wireguard_interfaces': { icon: IWireguard, caption: 'Wireguard Interfaces' },
+ '/vpn/wireguard_peers': { icon: IWireguard, caption: 'Wireguard Peers' },
'/system/users': { icon: IUser, caption: 'Users' },
'/config/config': { icon: IConfig, caption: 'Config' },
};
diff --git a/client/src/pages/[subsystem]/[entity]/edit/[id].vue b/client/src/pages/[subsystem]/[entity]/edit/[id].vue
index 864859d..3969b02 100644
--- a/client/src/pages/[subsystem]/[entity]/edit/[id].vue
+++ b/client/src/pages/[subsystem]/[entity]/edit/[id].vue
@@ -14,9 +14,9 @@ async function load(){
loading = true;
let res: any;
if (editTypes[subsystem][entity].idType == 'Number') {
- res = await apiCall(`${editTypes[subsystem].name }.get_${ editTypes[subsystem][entity].name}`, {id: id as number - 0});
+ res = await apiCall(`${subsystem }.${entity}.get`, {id: id as number - 0});
} else {
- res = await apiCall(`${editTypes[subsystem].name }.get_${ editTypes[subsystem][entity].name}`, {id: id});
+ res = await apiCall(`${subsystem }.${entity}.get`, {id: id});
}
if (res.Error === null) {
@@ -30,7 +30,7 @@ async function load(){
async function update(value: any) {
console.debug('value', value);
- let res = await apiCall(`${editTypes[subsystem].name }.update_${ editTypes[subsystem][entity].name}`, value);
+ let res = await apiCall(`${subsystem}.${entity}.update`, value);
if (res.Error === null) {
p.toast.success(`Updated ${ editTypes[subsystem][entity].name}`);
p.router.go(-1);
diff --git a/client/src/pages/[subsystem]/[entity]/edit/index.vue b/client/src/pages/[subsystem]/[entity]/edit/index.vue
index 8f6ba41..db1726b 100644
--- a/client/src/pages/[subsystem]/[entity]/edit/index.vue
+++ b/client/src/pages/[subsystem]/[entity]/edit/index.vue
@@ -9,7 +9,7 @@ const { subsystem, entity } = $(props);
async function create(value: any) {
console.debug('value', value);
- let res = await apiCall(`${editTypes[subsystem].name }.create_${ editTypes[subsystem][entity].name}`, value);
+ let res = await apiCall(`${subsystem}.${entity}.create`, value);
if (res.Error === null) {
p.toast.success(`Created ${ editTypes[subsystem][entity].name}`);
p.router.go(-1);
diff --git a/client/src/pages/config/config.vue b/client/src/pages/config/config.vue
index 94005f2..a97bbce 100644
--- a/client/src/pages/config/config.vue
+++ b/client/src/pages/config/config.vue
@@ -28,7 +28,7 @@ const displayData = $computed(() => {
async function load(){
loading = true;
- let res = await apiCall('config.get_pending_changelog', {});
+ let res = await apiCall('config.pending_changes.log', {});
if (res.Error === null) {
console.debug('changelog', res.Data);
changelog = res.Data;
@@ -39,7 +39,7 @@ async function load(){
}
async function apply(){
- let res = await apiCall('config.apply_pending_changes', {});
+ let res = await apiCall('config.pending_changes.apply', {});
if (res.Error === null) {
console.debug('apply');
p.toast.success('Applied Pending Config');
@@ -50,7 +50,7 @@ async function apply(){
}
async function discard(){
- let res = await apiCall('config.discard_pending_changes', {});
+ let res = await apiCall('config.pending_changes.discard', {});
if (res.Error === null) {
console.debug('discard');
p.toast.success('Discarded Pending Config');
diff --git a/client/src/pages/firewall/DestinationNATRules.vue b/client/src/pages/firewall/destination_nat_rules.vue
similarity index 79%
rename from client/src/pages/firewall/DestinationNATRules.vue
rename to client/src/pages/firewall/destination_nat_rules.vue
index 3927102..1698d95 100644
--- a/client/src/pages/firewall/DestinationNATRules.vue
+++ b/client/src/pages/firewall/destination_nat_rules.vue
@@ -19,7 +19,7 @@ const columns = [
];
async function load(){
- let res = await apiCall('firewall.get_destination_nat_rules', {});
+ let res = await apiCall('firewall.destination_nat_rules.list', {});
if (res.Error === null) {
rules = res.Data;
console.debug('rules', rules);
@@ -29,7 +29,7 @@ async function load(){
}
async function deleteRule(){
- let res = await apiCall('firewall.delete_destination_nat_rule', {index: selection[0]});
+ let res = await apiCall('firewall.destination_nat_rules.delete', {id: selection[0]});
if (res.Error === null) {
console.debug('deleted rule');
p.toast.success('Deleted Rule');
@@ -41,7 +41,7 @@ async function deleteRule(){
async function draggedRow(draggedRow: number, draggedOverRow: number) {
console.log('dragged', draggedRow, draggedOverRow);
- let res = await apiCall('firewall.move_destination_nat_rule', {index: draggedRow, to_index: draggedOverRow});
+ let res = await apiCall('firewall.destination_nat_rules.move', {index: draggedRow, to_index: draggedOverRow});
if (res.Error === null) {
console.debug('moved rule');
p.toast.success('Moved Rule');
@@ -61,8 +61,8 @@ onMounted(async() => {
- Create
- Edit
+ Create
+ Edit
diff --git a/client/src/pages/firewall/ForwardRules.vue b/client/src/pages/firewall/forward_rules.vue
similarity index 80%
rename from client/src/pages/firewall/ForwardRules.vue
rename to client/src/pages/firewall/forward_rules.vue
index a692151..2ba6ea1 100644
--- a/client/src/pages/firewall/ForwardRules.vue
+++ b/client/src/pages/firewall/forward_rules.vue
@@ -18,7 +18,7 @@ const columns = [
];
async function load(){
- let res = await apiCall('firewall.get_forward_rules', {});
+ let res = await apiCall('firewall.forward_rules.list', {});
if (res.Error === null) {
rules = res.Data;
console.debug('rules', rules);
@@ -28,7 +28,7 @@ async function load(){
}
async function deleteRule(){
- let res = await apiCall('firewall.delete_forward_rule', {index: selection[0]});
+ let res = await apiCall('firewall.forward_rules.delete', {id: selection[0]});
if (res.Error === null) {
console.debug('deleted rule');
p.toast.success('Deleted Rule');
@@ -40,7 +40,7 @@ async function deleteRule(){
async function draggedRow(draggedRow: number, draggedOverRow: number) {
console.log('dragged', draggedRow, draggedOverRow);
- let res = await apiCall('firewall.move_forward_rule', {index: draggedRow, to_index: draggedOverRow});
+ let res = await apiCall('firewall.forward_rules.move', {index: draggedRow, to_index: draggedOverRow});
if (res.Error === null) {
console.debug('moved rule');
p.toast.success('Moved Rule');
@@ -60,8 +60,8 @@ onMounted(async() => {
- Create
- Edit
+ Create
+ Edit
diff --git a/client/src/pages/firewall/SourceNATRules.vue b/client/src/pages/firewall/source_nat_rules.vue
similarity index 80%
rename from client/src/pages/firewall/SourceNATRules.vue
rename to client/src/pages/firewall/source_nat_rules.vue
index 3b08d71..b2dfa5e 100644
--- a/client/src/pages/firewall/SourceNATRules.vue
+++ b/client/src/pages/firewall/source_nat_rules.vue
@@ -19,7 +19,7 @@ const columns = [
];
async function load(){
- let res = await apiCall('firewall.get_source_nat_rules', {});
+ let res = await apiCall('firewall.source_nat_rules.list', {});
if (res.Error === null) {
rules = res.Data;
console.debug('rules', rules);
@@ -29,7 +29,7 @@ async function load(){
}
async function deleteRule(){
- let res = await apiCall('firewall.delete_source_nat:rule', {index: selection[0]});
+ let res = await apiCall('firewall.source_nat_rules.delete', {id: selection[0]});
if (res.Error === null) {
console.debug('deleted rule');
p.toast.success('Deleted Rule');
@@ -41,7 +41,7 @@ async function deleteRule(){
async function draggedRow(draggedRow: number, draggedOverRow: number) {
console.log('dragged', draggedRow, draggedOverRow);
- let res = await apiCall('firewall.move_source_nat_rule', {index: draggedRow, to_index: draggedOverRow});
+ let res = await apiCall('firewall.source_nat_rules.move', {index: draggedRow, to_index: draggedOverRow});
if (res.Error === null) {
console.debug('moved rule');
p.toast.success('Moved Rule');
@@ -61,8 +61,8 @@ onMounted(async() => {
- Create
- Edit
+ Create
+ Edit
diff --git a/client/src/pages/index.vue b/client/src/pages/index.vue
index 2f19a24..30d5485 100644
--- a/client/src/pages/index.vue
+++ b/client/src/pages/index.vue
@@ -12,7 +12,7 @@ let loading = $ref(false);
async function load(){
loading = true;
- let res = await apiCall('network.get_links', {});
+ let res = await apiCall('network.links.get', {});
if (res.Error === null) {
console.debug('links', res.Data);
links = res.Data;
diff --git a/client/src/pages/network/Interfaces.vue b/client/src/pages/network/interfaces.vue
similarity index 92%
rename from client/src/pages/network/Interfaces.vue
rename to client/src/pages/network/interfaces.vue
index 7d31a85..6282523 100644
--- a/client/src/pages/network/Interfaces.vue
+++ b/client/src/pages/network/interfaces.vue
@@ -32,7 +32,7 @@ const displayData = $computed(() => {
async function load(){
loading = true;
- let res = await apiCall('network.get_interfaces', {});
+ let res = await apiCall('network.interfaces.list', {});
if (res.Error === null) {
console.debug('interfaces', res.Data);
interfaces = res.Data;
@@ -43,7 +43,7 @@ async function load(){
}
async function deleteInterface(){
- let res = await apiCall('network.delete_interface', {name: displayData[selection[0]].name});
+ let res = await apiCall('network.interfaces.delete', {id: displayData[selection[0]].name});
if (res.Error === null) {
console.debug('deleted interface');
} else {
diff --git a/client/src/pages/network/StaticRoutes.vue b/client/src/pages/network/static_routes.vue
similarity index 79%
rename from client/src/pages/network/StaticRoutes.vue
rename to client/src/pages/network/static_routes.vue
index 2ff21f3..b8f452e 100644
--- a/client/src/pages/network/StaticRoutes.vue
+++ b/client/src/pages/network/static_routes.vue
@@ -15,7 +15,7 @@ const columns = [
async function load(){
loading = true;
- let res = await apiCall('network.get_static_routes', {});
+ let res = await apiCall('network.static_routes.list', {});
if (res.Error === null) {
console.debug('staticRoutes', res.Data);
staticRoutes = res.Data;
@@ -26,7 +26,7 @@ async function load(){
}
async function deleteStaticRoutes(){
- let res = await apiCall('network.delete_static_route', {index: selection[0]});
+ let res = await apiCall('network.static_routes.delete', {id: selection[0]});
if (res.Error === null) {
console.debug('deleted static routes');
} else {
@@ -44,8 +44,8 @@ onMounted(async() => {
- Create
- Edit
+ Create
+ Edit
\ No newline at end of file
diff --git a/client/src/pages/object/Addresses.vue b/client/src/pages/object/addresses.vue
similarity index 94%
rename from client/src/pages/object/Addresses.vue
rename to client/src/pages/object/addresses.vue
index 130f3e8..1bdc751 100644
--- a/client/src/pages/object/Addresses.vue
+++ b/client/src/pages/object/addresses.vue
@@ -16,7 +16,7 @@ const columns = [
async function load(){
loading = true;
- let res = await apiCall('object.get_addresses', {});
+ let res = await apiCall('object.addresses.list', {});
if (res.Error === null) {
addresses = res.Data;
console.debug('addresses', addresses);
@@ -62,7 +62,7 @@ function getAddressValue(s: any): string {
}
async function deleteAddress(){
- let res = await apiCall('object.delete_address', {name: displayData[selection[0]].name});
+ let res = await apiCall('object.addresses_delete', {id: displayData[selection[0]].name});
if (res.Error === null) {
console.debug('deleted address');
} else {
diff --git a/client/src/pages/object/Services.vue b/client/src/pages/object/services.vue
similarity index 93%
rename from client/src/pages/object/Services.vue
rename to client/src/pages/object/services.vue
index 6727652..28f9d42 100644
--- a/client/src/pages/object/Services.vue
+++ b/client/src/pages/object/services.vue
@@ -56,7 +56,7 @@ function getServicePortRange(s:any): string {
async function load(){
loading = true;
- let res = await apiCall('object.get_services', {});
+ let res = await apiCall('object.services.list', {});
if (res.Error === null) {
console.debug('services', res.Data);
services = res.Data;
@@ -67,7 +67,7 @@ async function load(){
}
async function deleteService(){
- let res = await apiCall('object.delete_service', {name: displayData[selection[0]].name});
+ let res = await apiCall('object.services.delete', {name: displayData[selection[0]].name});
if (res.Error === null) {
console.debug('deleted service');
} else {
diff --git a/client/src/pages/service/DHCPServers.vue b/client/src/pages/service/dhcp_servers.vue
similarity index 67%
rename from client/src/pages/service/DHCPServers.vue
rename to client/src/pages/service/dhcp_servers.vue
index e27abbc..7d45b55 100644
--- a/client/src/pages/service/DHCPServers.vue
+++ b/client/src/pages/service/dhcp_servers.vue
@@ -13,7 +13,7 @@ const columns = [
];
async function load(){
- let res = await apiCall('service.get_dhcp_servers', {});
+ let res = await apiCall('service.dhcp_servers.list', {});
if (res.Error === null) {
servers = res.Data;
console.debug('rules', servers);
@@ -23,7 +23,7 @@ async function load(){
}
async function deleteRule(){
- let res = await apiCall('service.delete_dhcp_server', {index: selection[0]});
+ let res = await apiCall('service.dhcp_servers.delete', {index: selection[0]});
if (res.Error === null) {
console.debug('deleted server');
p.toast.success('Deleted DHCP Server');
@@ -41,10 +41,10 @@ onMounted(async() => {
-
+
- Create
- Edit
+ Create
+ Edit
diff --git a/client/src/pages/service/DNSServers.vue b/client/src/pages/service/dns_servers.vue
similarity index 78%
rename from client/src/pages/service/DNSServers.vue
rename to client/src/pages/service/dns_servers.vue
index ae3f22d..3a94249 100644
--- a/client/src/pages/service/DNSServers.vue
+++ b/client/src/pages/service/dns_servers.vue
@@ -13,7 +13,7 @@ const columns = [
];
async function load(){
- let res = await apiCall('service.get_dns_servers', {});
+ let res = await apiCall('service.dns_servers.list', {});
if (res.Error === null) {
servers = res.Data;
console.debug('rules', servers);
@@ -23,7 +23,7 @@ async function load(){
}
async function deleteRule(){
- let res = await apiCall('service.delete_dns_server', {index: selection[0]});
+ let res = await apiCall('service.dns_servers.delete', {index: selection[0]});
if (res.Error === null) {
console.debug('deleted server');
p.toast.success('Deleted DNS Server');
@@ -43,8 +43,8 @@ onMounted(async() => {
- Create
- Edit
+ Create
+ Edit
diff --git a/client/src/pages/service/NTPServers.vue b/client/src/pages/service/ntp_servers.vue
similarity index 79%
rename from client/src/pages/service/NTPServers.vue
rename to client/src/pages/service/ntp_servers.vue
index a4e3425..7355121 100644
--- a/client/src/pages/service/NTPServers.vue
+++ b/client/src/pages/service/ntp_servers.vue
@@ -13,7 +13,7 @@ const columns = [
];
async function load(){
- let res = await apiCall('service.get_ntp_servers', {});
+ let res = await apiCall('service.ntp_servers.list', {});
if (res.Error === null) {
servers = res.Data;
console.debug('rules', servers);
@@ -23,7 +23,7 @@ async function load(){
}
async function deleteRule(){
- let res = await apiCall('service.delete_ntp_server', {index: selection[0]});
+ let res = await apiCall('service.ntp_server.delete', {id: selection[0]});
if (res.Error === null) {
console.debug('deleted server');
p.toast.success('Deleted NTP Server');
@@ -43,8 +43,8 @@ onMounted(async() => {
- Create
- Edit
+ Create
+ Edit
diff --git a/client/src/pages/system/Users.vue b/client/src/pages/system/users.vue
similarity index 90%
rename from client/src/pages/system/Users.vue
rename to client/src/pages/system/users.vue
index e51a426..001be1c 100644
--- a/client/src/pages/system/Users.vue
+++ b/client/src/pages/system/users.vue
@@ -14,7 +14,7 @@ const columns = [
async function load(){
loading = true;
- let res = await apiCall('system.get_users', {});
+ let res = await apiCall('system.users.list', {});
if (res.Error === null) {
users = res.Data;
console.debug('users', users);
@@ -25,7 +25,7 @@ async function load(){
}
async function deleteUser(){
- let res = await apiCall('system.delete_user', {name: users[selection[0]].name});
+ let res = await apiCall('system.users.delete', {name: users[selection[0]].name});
if (res.Error === null) {
console.debug('deleted user');
} else {
diff --git a/client/src/pages/vpn/WireguardInterfaces.vue b/client/src/pages/vpn/wireguard_interfaces.vue
similarity index 82%
rename from client/src/pages/vpn/WireguardInterfaces.vue
rename to client/src/pages/vpn/wireguard_interfaces.vue
index e719415..8b6de3a 100644
--- a/client/src/pages/vpn/WireguardInterfaces.vue
+++ b/client/src/pages/vpn/wireguard_interfaces.vue
@@ -31,7 +31,7 @@ const displayData = $computed(() => {
async function load(){
loading = true;
- let res = await apiCall('vpn.wireguard.get_interfaces', {});
+ let res = await apiCall('vpn.wireguard.interfaces.list', {});
if (res.Error === null) {
console.debug('interfaces', res.Data);
interfaces = res.Data;
@@ -42,7 +42,7 @@ async function load(){
}
async function deleteInterface(){
- let res = await apiCall('vpn.wireguard_delete_interface', {name: displayData[selection[0]].name});
+ let res = await apiCall('vpn.wireguard.interfaces.delete', {name: displayData[selection[0]].name});
if (res.Error === null) {
console.debug('deleted interface');
} else {
@@ -52,7 +52,7 @@ async function deleteInterface(){
}
async function editInterface() {
- p.router.push(`/vpn/wireguardinterfaces/edit/${ displayData[selection[0]].name}`);
+ p.router.push(`/vpn/wireguard_interfaces/edit/${ displayData[selection[0]].name}`);
}
onMounted(async() => {
@@ -64,7 +64,7 @@ onMounted(async() => {
- Create
+ Create
diff --git a/client/src/pages/vpn/WireguardPeers.vue b/client/src/pages/vpn/wireguard_peers.vue
similarity index 83%
rename from client/src/pages/vpn/WireguardPeers.vue
rename to client/src/pages/vpn/wireguard_peers.vue
index e07881e..ab9ba09 100644
--- a/client/src/pages/vpn/WireguardPeers.vue
+++ b/client/src/pages/vpn/wireguard_peers.vue
@@ -32,7 +32,7 @@ const displayData = $computed(() => {
async function load(){
loading = true;
- let res = await apiCall('vpn.wireguard.get_peers', {});
+ let res = await apiCall('vpn.wireguard.peers.list', {});
if (res.Error === null) {
console.debug('peers', res.Data);
peers = res.Data;
@@ -43,7 +43,7 @@ async function load(){
}
async function deletePeer(){
- let res = await apiCall('vpn.wireguard.delete_peer', {name: displayData[selection[0]].name});
+ let res = await apiCall('vpn.wireguard.peers.delete', {name: displayData[selection[0]].name});
if (res.Error === null) {
console.debug('deleted peer');
} else {
@@ -53,7 +53,7 @@ async function deletePeer(){
}
async function editPeer() {
- p.router.push(`/vpn/wireguardpeers/edit/${ displayData[selection[0]].name}`);
+ p.router.push(`/vpn/wireguard_peers/edit/${ displayData[selection[0]].name}`);
}
onMounted(async() => {
@@ -65,7 +65,7 @@ onMounted(async() => {
- Create
+ Create
diff --git a/client/src/pages/vpn/WireguardStatus.vue b/client/src/pages/vpn/wireguard_status.vue
similarity index 92%
rename from client/src/pages/vpn/WireguardStatus.vue
rename to client/src/pages/vpn/wireguard_status.vue
index 89279c0..493fc43 100644
--- a/client/src/pages/vpn/WireguardStatus.vue
+++ b/client/src/pages/vpn/wireguard_status.vue
@@ -6,7 +6,7 @@ let loading = $ref(false);
async function load() {
loading = true;
- let res = await apiCall('vpn.wireguard.get_status', {});
+ let res = await apiCall('vpn.wireguard.status', {});
if (res.Error === null) {
console.debug('status', res.Data);
status = res.Data;
diff --git a/src/api/config.rs b/src/api/config.rs
index 1401ea7..945e037 100644
--- a/src/api/config.rs
+++ b/src/api/config.rs
@@ -9,15 +9,15 @@ use super::ApiError::ConfigError;
pub fn register_methods(module: &mut RpcModule) {
module
- .register_method("config.get_pending_changelog", get_pending_changelog)
+ .register_method("config.pending_changes.log", get_pending_changelog)
.unwrap();
module
- .register_method("config.apply_pending_changes", apply_pending_changes)
+ .register_method("config.pending_changes.apply", apply_pending_changes)
.unwrap();
module
- .register_method("config.discard_pending_changes", discard_pending_changes)
+ .register_method("config.pending_changes.discard", discard_pending_changes)
.unwrap();
}
diff --git a/src/api/firewall.rs b/src/api/firewall.rs
index 5b41ba0..70f1c3f 100644
--- a/src/api/firewall.rs
+++ b/src/api/firewall.rs
@@ -1,7 +1,8 @@
use super::ApiError;
use crate::{
+ create_vec_thing,
definitions::firewall::{DestinationNATRule, ForwardRule, SourceNATRule},
- get_things, get_vec_thing,
+ delete_vec_thing, get_vec_thing, list_things,
state::RpcState,
};
use jsonrpsee::RpcModule;
@@ -9,43 +10,85 @@ use jsonrpsee::RpcModule;
pub fn register_methods(module: &mut RpcModule) {
module
.register_method(
- "firewall.get_forward_rule",
+ "firewall.forward_rules.get",
get_vec_thing!(firewall.forward_rules),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "firewall.get_forward_rules",
- get_things!(firewall.forward_rules),
+ "firewall.forward_rules.list",
+ list_things!(firewall.forward_rules),
)
.unwrap();
module
.register_method(
- "firewall.get_destination_nat_rule",
+ "firewall.forward_rules.create",
+ create_vec_thing!(firewall.forward_rules, ForwardRule),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "firewall.forward_rules.delete",
+ delete_vec_thing!(firewall.forward_rules),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "firewall.destination_nat_rules.get",
get_vec_thing!(firewall.destination_nat_rules),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "firewall.get_destination_nat_rules",
- get_things!(firewall.destination_nat_rules),
+ "firewall.destination_nat_rules.list",
+ list_things!(firewall.destination_nat_rules),
)
.unwrap();
module
.register_method(
- "firewall.get_source_nat_rule",
+ "firewall.destination_nat_rules.create",
+ create_vec_thing!(firewall.destination_nat_rules, DestinationNATRule),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "firewall.destination_nat_rules.delete",
+ delete_vec_thing!(firewall.destination_nat_rules),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "firewall.source_nat_rules.get",
get_vec_thing!(firewall.source_nat_rules),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "firewall.get_source_nat_rules",
- get_things!(firewall.source_nat_rules),
+ "firewall.source_nat_rules.list",
+ list_things!(firewall.source_nat_rules),
+ )
+ .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",
+ delete_vec_thing!(firewall.source_nat_rules),
)
.unwrap();
}
diff --git a/src/api/mod.rs b/src/api/mod.rs
index c730cf7..a8d8bee 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -93,7 +93,7 @@ macro_rules! get_vec_thing {
}
#[macro_export]
-macro_rules! get_things {
+macro_rules! list_things {
($( $sub_system:ident ).+) => {
|_, state| {
Ok(state
@@ -104,6 +104,93 @@ macro_rules! get_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 ).+) => {
+ |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..387f93b 100644
--- a/src/api/network.rs
+++ b/src/api/network.rs
@@ -1,7 +1,8 @@
use super::ApiError;
use crate::{
+ create_vec_thing,
definitions::network::{NetworkInterface, StaticRoute},
- get_map_thing, get_things, get_vec_thing,
+ delete_map_thing, delete_vec_thing, get_map_thing, get_vec_thing, list_things,
state::RpcState,
};
use jsonrpsee::RpcModule;
@@ -10,26 +11,47 @@ use std::collections::HashMap;
pub fn register_methods(module: &mut RpcModule) {
module
.register_method(
- "network.get_static_route",
+ "network.static_routes.get",
get_vec_thing!(network.static_routes),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "network.get_static_routes",
- get_things!(network.static_routes),
+ "network.static_routes.list",
+ list_things!(network.static_routes),
)
.unwrap();
module
- .register_method("network.get_interface", get_map_thing!(network.interfaces))
+ .register_method(
+ "network.static_routes.create",
+ create_vec_thing!(network.static_routes, StaticRoute),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "network.static_routes.delete",
+ delete_vec_thing!(network.static_routes),
+ )
+ .unwrap();
+
+ module
+ .register_method("network.interfaces.get", get_map_thing!(network.interfaces))
.unwrap();
module
.register_method::, ApiError>, _>(
- "network.get_interfaces",
- get_things!(network.interfaces),
+ "network.interfaces.list",
+ list_things!(network.interfaces),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "network.interfaces.delete",
+ delete_map_thing!(network.interfaces),
)
.unwrap();
}
diff --git a/src/api/object.rs b/src/api/object.rs
index c45dd6c..b62615f 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, list_things,
state::RpcState,
};
use jsonrpsee::RpcModule;
@@ -9,24 +9,35 @@ use std::collections::HashMap;
pub fn register_methods(module: &mut RpcModule) {
module
- .register_method("object.get_service", get_map_thing!(object.services))
+ .register_method("object.services.get", get_map_thing!(object.services))
.unwrap();
module
.register_method::, ApiError>, _>(
- "object.get_services",
- get_things!(object.services),
+ "object.services.list",
+ list_things!(object.services),
)
.unwrap();
module
- .register_method("object.get_address", get_map_thing!(object.addresses))
+ .register_method("object.services.delete", delete_map_thing!(object.services))
+ .unwrap();
+
+ module
+ .register_method("object.addresses.get", get_map_thing!(object.addresses))
.unwrap();
module
.register_method::, ApiError>, _>(
- "object.get_addresses",
- get_things!(object.addresses),
+ "object.addresses.list",
+ list_things!(object.addresses),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "object.addresses.delete",
+ delete_map_thing!(object.addresses),
)
.unwrap();
}
diff --git a/src/api/service.rs b/src/api/service.rs
index 2503f9e..51d575f 100644
--- a/src/api/service.rs
+++ b/src/api/service.rs
@@ -1,7 +1,8 @@
use super::ApiError;
use crate::{
+ create_vec_thing,
definitions::service::{DHCPServer, DNSServer, NTPServer},
- get_things, get_vec_thing,
+ delete_vec_thing, get_vec_thing, list_things,
state::RpcState,
};
use jsonrpsee::RpcModule;
@@ -9,43 +10,85 @@ use jsonrpsee::RpcModule;
pub fn register_methods(module: &mut RpcModule) {
module
.register_method(
- "service.get_dhcp_server",
+ "service.dhcp_servers.get",
get_vec_thing!(service.dhcp_servers),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "service.get_dhcp_servers",
- get_things!(service.dhcp_servers),
+ "service.dhcp_servers.list",
+ list_things!(service.dhcp_servers),
)
.unwrap();
module
.register_method(
- "service.get_dns_server",
+ "service.dhcp_servers.create",
+ create_vec_thing!(service.dhcp_servers, DHCPServer),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "service.dhcp_servers.delete",
+ delete_vec_thing!(service.dhcp_servers),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "service.dns_servers.get",
get_vec_thing!(service.dns_servers),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "service.get_dns_servers",
- get_things!(service.dns_servers),
+ "service.dns_servers.list",
+ list_things!(service.dns_servers),
)
.unwrap();
module
.register_method(
- "service.get_ntp_server",
+ "service.dns_servers.create",
+ create_vec_thing!(service.dns_servers, DNSServer),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "service.dns_servers.delete",
+ delete_vec_thing!(service.dns_servers),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "service.ntp_servers.get",
get_vec_thing!(service.ntp_servers),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "service.get_ntp_servers",
- get_things!(service.ntp_servers),
+ "service.ntp_servers.list",
+ list_things!(service.ntp_servers),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "service.ntp_servers.create",
+ create_vec_thing!(service.ntp_servers, NTPServer),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "service.ntp_servers.delete",
+ delete_vec_thing!(service.ntp_servers),
)
.unwrap();
}
diff --git a/src/api/system.rs b/src/api/system.rs
index 291f350..4461a14 100644
--- a/src/api/system.rs
+++ b/src/api/system.rs
@@ -17,22 +17,24 @@ 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)
+ .register_method("system.users.get", get_user)
.unwrap();
module
- .register_method("system.create_user", create_user)
+ .register_method("system.users.list", get_users)
.unwrap();
module
- .register_method("system.update_user", update_user)
+ .register_method("system.users.create", create_user)
.unwrap();
module
- .register_method("system.delete_user", delete_user)
+ .register_method("system.users.update", update_user)
+ .unwrap();
+
+ module
+ .register_method("system.users.delete", delete_user)
.unwrap();
}
diff --git a/src/api/vpn.rs b/src/api/vpn.rs
index 7c6da9d..bfc1e98 100644
--- a/src/api/vpn.rs
+++ b/src/api/vpn.rs
@@ -3,44 +3,58 @@ 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, list_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)
+ .register_method("vpn.wireguard.status", wireguard_status)
.unwrap();
module
.register_method(
- "vpn.wireguard.get_interface",
+ "vpn.wireguard.interfaces.get",
get_map_thing!(vpn.wireguard.interfaces),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "vpn.wireguard.get_interfaces",
- get_things!(vpn.wireguard.interfaces),
+ "vpn.wireguard.interfaces.list",
+ list_things!(vpn.wireguard.interfaces),
)
.unwrap();
module
.register_method(
- "vpn.wireguard.get_peer",
+ "vpn.wireguard.interfaces.delete",
+ delete_map_thing!(vpn.wireguard.interfaces),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "vpn.wireguard.peers.get",
get_map_thing!(vpn.wireguard.peers),
)
.unwrap();
module
.register_method::, ApiError>, _>(
- "vpn.wireguard.get_peers",
- get_things!(vpn.wireguard.peers),
+ "vpn.wireguard.peers.list",
+ list_things!(vpn.wireguard.peers),
+ )
+ .unwrap();
+
+ module
+ .register_method(
+ "vpn.wireguard.peers.delete",
+ delete_map_thing!(vpn.wireguard.peers),
)
.unwrap();
}
-pub fn get_wireguard_status(_: Params, _: &RpcState) -> Result {
+pub fn wireguard_status(_: Params, _: &RpcState) -> Result {
Ok("ok".to_string())
}
diff --git a/src/definitions/object.rs b/src/definitions/object.rs
index 59f7758..1cbc6f1 100644
--- a/src/definitions/object.rs
+++ b/src/definitions/object.rs
@@ -34,16 +34,12 @@ pub struct Service {
#[serde(rename_all = "snake_case")]
pub enum ServiceType {
TCP {
- source_port: u64,
- source_port_end: Option,
- destination_port: u64,
- destination_port_end: Option,
+ source: PortDefinition,
+ destination: PortDefinition,
},
UDP {
- source_port: u64,
- source_port_end: Option,
- destination_port: u64,
- destination_port_end: Option,
+ source: PortDefinition,
+ destination: PortDefinition,
},
ICMP {
code: u8,
@@ -52,3 +48,10 @@ pub enum ServiceType {
children: Vec,
},
}
+
+#[derive(Serialize, Deserialize, Clone, Debug)]
+#[serde(rename_all = "snake_case")]
+pub enum PortDefinition {
+ Single { port: u64 },
+ Range { start_port: u64, end_port: u64 },
+}