diff options
| author | diogo464 <[email protected]> | 2026-02-15 22:05:57 +0000 |
|---|---|---|
| committer | diogo464 <[email protected]> | 2026-02-15 22:05:57 +0000 |
| commit | 56ac8740b79e291eabe6427d722921533b3a9837 (patch) | |
| tree | c244662e382263efec95d6ac445cfc9f987e4758 /src/view.rs | |
| parent | 75ccbd675c22fb3275c5763518c3b97819db4c53 (diff) | |
updated dependencies
Diffstat (limited to 'src/view.rs')
| -rw-r--r-- | src/view.rs | 59 |
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 @@ | |||
| 1 | use std::{net::SocketAddr, time::SystemTime}; | 1 | use std::{ |
| 2 | net::SocketAddr, | ||
| 3 | time::{Duration, SystemTime}, | ||
| 4 | }; | ||
| 2 | 5 | ||
| 3 | use ipnet::IpNet; | 6 | use ipnet::IpNet; |
| 4 | use netlink_packet_wireguard::{ | 7 | use netlink_packet_wireguard::{ |
| 5 | nlas::{WgAllowedIp, WgAllowedIpAttrs, WgDeviceAttrs, WgPeer, WgPeerAttrs}, | 8 | WireguardAllowedIp, WireguardAllowedIpAttr, WireguardAttribute, WireguardMessage, |
| 6 | Wireguard, | 9 | WireguardPeer, WireguardPeerAttribute, |
| 7 | }; | 10 | }; |
| 8 | 11 | ||
| 9 | use super::{Error, Key, Result}; | 12 | use 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 | ||
| 34 | pub(super) fn device_view_from_payload(wg: Wireguard) -> Result<DeviceView> { | 37 | pub(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 | ||
| 67 | fn peers_from_wg_peers(wg_peers: Vec<WgPeer>) -> Result<Vec<PeerView>> { | 70 | fn 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 | ||
| 75 | fn peer_from_wg_peer(wg_peer: WgPeer) -> Result<PeerView> { | 78 | fn 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 | ||
| 115 | fn ipnet_from_wg(wg: &WgAllowedIp) -> Result<IpNet> { | 120 | fn 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 | } |
