summaryrefslogtreecommitdiff
path: root/src/view.rs
diff options
context:
space:
mode:
authordiogo464 <[email protected]>2026-02-15 22:05:57 +0000
committerdiogo464 <[email protected]>2026-02-15 22:05:57 +0000
commit56ac8740b79e291eabe6427d722921533b3a9837 (patch)
treec244662e382263efec95d6ac445cfc9f987e4758 /src/view.rs
parent75ccbd675c22fb3275c5763518c3b97819db4c53 (diff)
updated dependencies
Diffstat (limited to 'src/view.rs')
-rw-r--r--src/view.rs59
1 files changed, 32 insertions, 27 deletions
diff --git a/src/view.rs b/src/view.rs
index 2858811..69f718a 100644
--- a/src/view.rs
+++ b/src/view.rs
@@ -1,9 +1,12 @@
1use std::{net::SocketAddr, time::SystemTime}; 1use std::{
2 net::SocketAddr,
3 time::{Duration, SystemTime},
4};
2 5
3use ipnet::IpNet; 6use ipnet::IpNet;
4use netlink_packet_wireguard::{ 7use netlink_packet_wireguard::{
5 nlas::{WgAllowedIp, WgAllowedIpAttrs, WgDeviceAttrs, WgPeer, WgPeerAttrs}, 8 WireguardAllowedIp, WireguardAllowedIpAttr, WireguardAttribute, WireguardMessage,
6 Wireguard, 9 WireguardPeer, WireguardPeerAttribute,
7}; 10};
8 11
9use super::{Error, Key, Result}; 12use super::{Error, Key, Result};
@@ -31,7 +34,7 @@ pub struct PeerView {
31 pub allowed_ips: Vec<IpNet>, 34 pub allowed_ips: Vec<IpNet>,
32} 35}
33 36
34pub(super) fn device_view_from_payload(wg: Wireguard) -> Result<DeviceView> { 37pub(super) fn device_view_from_payload(wg: WireguardMessage) -> Result<DeviceView> {
35 let mut if_index = None; 38 let mut if_index = None;
36 let mut if_name = None; 39 let mut if_name = None;
37 let mut private_key = None; 40 let mut private_key = None;
@@ -40,15 +43,15 @@ pub(super) fn device_view_from_payload(wg: Wireguard) -> Result<DeviceView> {
40 let mut fwmark = None; 43 let mut fwmark = None;
41 let mut peers = None; 44 let mut peers = None;
42 45
43 for nla in wg.nlas { 46 for attr in wg.attributes {
44 match nla { 47 match attr {
45 WgDeviceAttrs::IfIndex(v) => if_index = Some(v), 48 WireguardAttribute::IfIndex(v) => if_index = Some(v),
46 WgDeviceAttrs::IfName(v) => if_name = Some(v), 49 WireguardAttribute::IfName(v) => if_name = Some(v),
47 WgDeviceAttrs::PrivateKey(v) => private_key = Some(Key::from(v)), 50 WireguardAttribute::PrivateKey(v) => private_key = Some(Key::from(v)),
48 WgDeviceAttrs::PublicKey(v) => public_key = Some(Key::from(v)), 51 WireguardAttribute::PublicKey(v) => public_key = Some(Key::from(v)),
49 WgDeviceAttrs::ListenPort(v) => listen_port = Some(v), 52 WireguardAttribute::ListenPort(v) => listen_port = Some(v),
50 WgDeviceAttrs::Fwmark(v) => fwmark = Some(v), 53 WireguardAttribute::Fwmark(v) => fwmark = Some(v),
51 WgDeviceAttrs::Peers(v) => peers = Some(peers_from_wg_peers(v)?), 54 WireguardAttribute::Peers(v) => peers = Some(peers_from_wg_peers(v)?),
52 _ => {} 55 _ => {}
53 } 56 }
54 } 57 }
@@ -64,7 +67,7 @@ pub(super) fn device_view_from_payload(wg: Wireguard) -> Result<DeviceView> {
64 }) 67 })
65} 68}
66 69
67fn peers_from_wg_peers(wg_peers: Vec<WgPeer>) -> Result<Vec<PeerView>> { 70fn peers_from_wg_peers(wg_peers: Vec<WireguardPeer>) -> Result<Vec<PeerView>> {
68 let mut peers = Vec::with_capacity(wg_peers.len()); 71 let mut peers = Vec::with_capacity(wg_peers.len());
69 for wg_peer in wg_peers { 72 for wg_peer in wg_peers {
70 peers.push(peer_from_wg_peer(wg_peer)?); 73 peers.push(peer_from_wg_peer(wg_peer)?);
@@ -72,7 +75,7 @@ fn peers_from_wg_peers(wg_peers: Vec<WgPeer>) -> Result<Vec<PeerView>> {
72 Ok(peers) 75 Ok(peers)
73} 76}
74 77
75fn peer_from_wg_peer(wg_peer: WgPeer) -> Result<PeerView> { 78fn peer_from_wg_peer(wg_peer: WireguardPeer) -> Result<PeerView> {
76 let mut public_key = None; 79 let mut public_key = None;
77 let mut preshared_key = None; 80 let mut preshared_key = None;
78 let mut endpoint = None; 81 let mut endpoint = None;
@@ -84,14 +87,14 @@ fn peer_from_wg_peer(wg_peer: WgPeer) -> Result<PeerView> {
84 87
85 for attr in wg_peer.iter() { 88 for attr in wg_peer.iter() {
86 match attr { 89 match attr {
87 WgPeerAttrs::PublicKey(v) => public_key = Some(Key::from(v)), 90 WireguardPeerAttribute::PublicKey(v) => public_key = Some(Key::from(v)),
88 WgPeerAttrs::PresharedKey(v) => preshared_key = Some(Key::from(v)), 91 WireguardPeerAttribute::PresharedKey(v) => preshared_key = Some(Key::from(v)),
89 WgPeerAttrs::Endpoint(v) => endpoint = Some(*v), 92 WireguardPeerAttribute::Endpoint(v) => endpoint = Some(*v),
90 WgPeerAttrs::PersistentKeepalive(v) => persistent_keepalive = Some(*v), 93 WireguardPeerAttribute::PersistentKeepalive(v) => persistent_keepalive = Some(*v),
91 WgPeerAttrs::LastHandshake(v) => last_handshake = Some(*v), 94 WireguardPeerAttribute::LastHandshake(v) => last_handshake = Some(*v),
92 WgPeerAttrs::RxBytes(v) => rx_bytes = Some(*v), 95 WireguardPeerAttribute::RxBytes(v) => rx_bytes = Some(*v),
93 WgPeerAttrs::TxBytes(v) => tx_bytes = Some(*v), 96 WireguardPeerAttribute::TxBytes(v) => tx_bytes = Some(*v),
94 WgPeerAttrs::AllowedIps(v) => { 97 WireguardPeerAttribute::AllowedIps(v) => {
95 for ip in v { 98 for ip in v {
96 allowed_ips.push(ipnet_from_wg(ip)?); 99 allowed_ips.push(ipnet_from_wg(ip)?);
97 } 100 }
@@ -105,20 +108,22 @@ fn peer_from_wg_peer(wg_peer: WgPeer) -> Result<PeerView> {
105 preshared_key, 108 preshared_key,
106 endpoint, 109 endpoint,
107 persistent_keepalive, 110 persistent_keepalive,
108 last_handshake: last_handshake.ok_or_else(|| Error::message("missing last_handshake"))?, 111 last_handshake: last_handshake
112 .map(|ts| SystemTime::now() - Duration::new(ts.seconds as u64, ts.nano_seconds as u32))
113 .ok_or_else(|| Error::message("missing last_handshake"))?,
109 rx_bytes: rx_bytes.ok_or_else(|| Error::message("missing rx_bytes"))?, 114 rx_bytes: rx_bytes.ok_or_else(|| Error::message("missing rx_bytes"))?,
110 tx_bytes: tx_bytes.ok_or_else(|| Error::message("missing tx_bytes"))?, 115 tx_bytes: tx_bytes.ok_or_else(|| Error::message("missing tx_bytes"))?,
111 allowed_ips, 116 allowed_ips,
112 }) 117 })
113} 118}
114 119
115fn ipnet_from_wg(wg: &WgAllowedIp) -> Result<IpNet> { 120fn ipnet_from_wg(wg: &WireguardAllowedIp) -> Result<IpNet> {
116 let mut ip = None; 121 let mut ip = None;
117 let mut prefix = None; 122 let mut prefix = None;
118 for attr in wg.iter() { 123 for attr in wg.iter() {
119 match attr { 124 match attr {
120 WgAllowedIpAttrs::IpAddr(v) => ip = Some(*v), 125 WireguardAllowedIpAttr::IpAddr(v) => ip = Some(*v),
121 WgAllowedIpAttrs::Cidr(v) => prefix = Some(*v), 126 WireguardAllowedIpAttr::Cidr(v) => prefix = Some(*v),
122 _ => {} 127 _ => {}
123 } 128 }
124 } 129 }