listen part
This commit is contained in:
commit
9a3f6897ae
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
1698
Cargo.lock
generated
Normal file
1698
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
Cargo.toml
Normal file
16
Cargo.toml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "dynip-cloudflare"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = "1.0.86"
|
||||||
|
env_logger = "0.11.3"
|
||||||
|
futures = "0.3.30"
|
||||||
|
log = "0.4.22"
|
||||||
|
netlink-packet-core = "0.7.0"
|
||||||
|
netlink-packet-route = "0.19.0"
|
||||||
|
netlink-sys = { version = "0.8.6", features = ["tokio"] }
|
||||||
|
reqwest = "0.12.5"
|
||||||
|
rtnetlink = "0.14.1" # Updated to a version compatible with netlink-packet-route v0.20.1
|
||||||
|
tokio = { version = "1.38.0", features = ["full"] }
|
79
src/main.rs
Normal file
79
src/main.rs
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
use env_logger;
|
||||||
|
use futures::stream::StreamExt;
|
||||||
|
use log::{debug, error, info, log_enabled, Level};
|
||||||
|
use netlink_packet_core::NetlinkPayload;
|
||||||
|
use netlink_packet_route::RouteNetlinkMessage as RtnlMessage;
|
||||||
|
use netlink_sys::{AsyncSocket, SocketAddr};
|
||||||
|
use rtnetlink::new_connection;
|
||||||
|
|
||||||
|
const RTNLGRP_LINK: u32 = 1;
|
||||||
|
const RTNLGRP_IPV4_IFADDR: u32 = 5;
|
||||||
|
|
||||||
|
const fn nl_mgrp(group: u32) -> u32 {
|
||||||
|
if group > 31 {
|
||||||
|
panic!("use netlink_sys::Socket::add_membership() for this group");
|
||||||
|
}
|
||||||
|
if group == 0 {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
1 << (group - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<()> {
|
||||||
|
env_logger::init();
|
||||||
|
let (mut conn, mut _handle, mut messages) = new_connection().map_err(|e| anyhow!(e))?;
|
||||||
|
let groups = nl_mgrp(RTNLGRP_LINK) | nl_mgrp(RTNLGRP_IPV4_IFADDR);
|
||||||
|
|
||||||
|
let addr = SocketAddr::new(0, groups);
|
||||||
|
|
||||||
|
if let Err(e) = conn.socket_mut().socket_mut().bind(&addr) {
|
||||||
|
error!("Failed to bind to socket: {:?}", &e);
|
||||||
|
return Err(anyhow!(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
tokio::spawn(conn);
|
||||||
|
info!("Listening for IPv4 address changes and interface connect/disconnect events...");
|
||||||
|
|
||||||
|
while let Some((message, _)) = messages.next().await {
|
||||||
|
match message.payload {
|
||||||
|
NetlinkPayload::InnerMessage(RtnlMessage::NewAddress(msg)) => {
|
||||||
|
if log_enabled!(Level::Debug) {
|
||||||
|
debug!("New IPv4 address message: {:?}", msg);
|
||||||
|
} else {
|
||||||
|
info!("New IPv4 address");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NetlinkPayload::InnerMessage(RtnlMessage::DelAddress(msg)) => {
|
||||||
|
if log_enabled!(Level::Debug) {
|
||||||
|
debug!("Deleted IPv4 address message: {:?}", msg);
|
||||||
|
} else {
|
||||||
|
info!("Deleted IPv4 address");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NetlinkPayload::InnerMessage(RtnlMessage::NewLink(link)) => {
|
||||||
|
if log_enabled!(Level::Debug) {
|
||||||
|
debug!("New link message (interface connected): {:?}", link);
|
||||||
|
} else {
|
||||||
|
info!("New link (interface connected)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NetlinkPayload::InnerMessage(RtnlMessage::DelLink(link)) => {
|
||||||
|
if log_enabled!(Level::Debug) {
|
||||||
|
debug!("Deleted link message (interface disconnected): {:?}", link);
|
||||||
|
} else {
|
||||||
|
info!("Deleted link (interface disconnected)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
if log_enabled!(Level::Debug) {
|
||||||
|
debug!("Unhandled message payload: {:?}", message.payload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user