listen part
This commit is contained in:
		
							
								
								
									
										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(())
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user