{rwhod,fingerd}: add ignore-user lists
This commit is contained in:
@@ -9,7 +9,10 @@ use tokio::{
|
||||
time::{Duration as TokioDuration, interval},
|
||||
};
|
||||
|
||||
use crate::{proto::Whod, server::rwhod::rwhod_status::generate_rwhod_status_update};
|
||||
use crate::{
|
||||
proto::Whod,
|
||||
server::{ignore_list::IgnoreList, rwhod::rwhod_status::generate_rwhod_status_update},
|
||||
};
|
||||
|
||||
/// Default port for rwhod communication.
|
||||
pub const RWHOD_BROADCAST_PORT: u16 = 513;
|
||||
@@ -100,13 +103,14 @@ pub async fn send_rwhod_packet_to_interface(
|
||||
pub async fn rwhod_packet_sender_task(
|
||||
socket: Arc<UdpSocket>,
|
||||
interfaces: Vec<RwhodSendTarget>,
|
||||
ignore_list: Option<IgnoreList>,
|
||||
) -> anyhow::Result<()> {
|
||||
let mut interval = interval(TokioDuration::from_secs(60));
|
||||
|
||||
loop {
|
||||
interval.tick().await;
|
||||
|
||||
let status_update = generate_rwhod_status_update()?;
|
||||
let status_update = generate_rwhod_status_update(ignore_list.as_ref())?;
|
||||
|
||||
tracing::debug!("Generated rwhod packet: {:?}", status_update);
|
||||
|
||||
|
||||
@@ -7,12 +7,21 @@ use nix::{
|
||||
};
|
||||
use uucore::utmpx::Utmpx;
|
||||
|
||||
use crate::proto::{WhodStatusUpdate, WhodUserEntry};
|
||||
use crate::{
|
||||
proto::{WhodStatusUpdate, WhodUserEntry},
|
||||
server::ignore_list::IgnoreList,
|
||||
};
|
||||
|
||||
/// Reads utmp entries to determine currently logged-in users.
|
||||
pub fn generate_rwhod_user_entries(now: DateTime<Utc>) -> anyhow::Result<Vec<WhodUserEntry>> {
|
||||
pub fn generate_rwhod_user_entries(
|
||||
now: DateTime<Utc>,
|
||||
ignore_list: Option<&IgnoreList>,
|
||||
) -> anyhow::Result<Vec<WhodUserEntry>> {
|
||||
Utmpx::iter_all_records()
|
||||
.filter(|entry| entry.is_user_process())
|
||||
.filter(|entry| {
|
||||
!ignore_list.is_some_and(|ignore_list| ignore_list.ignores_username(&entry.user()))
|
||||
})
|
||||
.map(|entry| {
|
||||
let login_time = entry
|
||||
.login_time()
|
||||
@@ -44,7 +53,9 @@ pub fn generate_rwhod_user_entries(now: DateTime<Utc>) -> anyhow::Result<Vec<Who
|
||||
}
|
||||
|
||||
/// Generate a rwhod status update packet representing the current system state.
|
||||
pub fn generate_rwhod_status_update() -> anyhow::Result<WhodStatusUpdate> {
|
||||
pub fn generate_rwhod_status_update(
|
||||
ignore_list: Option<&IgnoreList>,
|
||||
) -> anyhow::Result<WhodStatusUpdate> {
|
||||
let sysinfo = sysinfo().unwrap();
|
||||
let load_average = sysinfo.load_average();
|
||||
let uptime = sysinfo.uptime();
|
||||
@@ -61,7 +72,7 @@ pub fn generate_rwhod_status_update() -> anyhow::Result<WhodStatusUpdate> {
|
||||
(load_average.2 * 100.0).abs() as i32,
|
||||
),
|
||||
now - uptime,
|
||||
generate_rwhod_user_entries(now)?,
|
||||
generate_rwhod_user_entries(now, ignore_list)?,
|
||||
);
|
||||
|
||||
Ok(result)
|
||||
@@ -73,7 +84,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_generate_rwhod_status_update() {
|
||||
let status_update = generate_rwhod_status_update().unwrap();
|
||||
let status_update = generate_rwhod_status_update(None).unwrap();
|
||||
println!("{:?}", status_update);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user