55 lines
1.1 KiB
Rust
55 lines
1.1 KiB
Rust
use log;
|
|
use opensmtpd::{run_filter, Address, Filter, ReportEntry};
|
|
use opensmtpd_derive::register;
|
|
use simplelog::{Config, LevelFilter, WriteLogger};
|
|
use std::fs::File;
|
|
|
|
pub const DEFAULT_LOG_FILE: &str = "/tmp/counter.log";
|
|
|
|
#[derive(Default)]
|
|
struct MyCounter {
|
|
nb_connected: u64,
|
|
nb_total: u64,
|
|
}
|
|
|
|
impl Filter for MyCounter {
|
|
#[register]
|
|
fn on_report_link_connect(
|
|
&mut self,
|
|
_entry: &ReportEntry,
|
|
_rdns: &str,
|
|
_fcrdns: &str,
|
|
_src: &Address,
|
|
_dest: &Address,
|
|
) {
|
|
self.nb_connected += 1;
|
|
self.nb_total += 1;
|
|
log::info!(
|
|
"New client (connected: {}, total: {})",
|
|
self.nb_connected,
|
|
self.nb_total
|
|
);
|
|
}
|
|
|
|
#[register]
|
|
fn on_report_link_disconnect(&mut self, _entry: &ReportEntry) {
|
|
self.nb_connected -= 1;
|
|
log::info!(
|
|
"Client left (connected: {}, total: {})",
|
|
self.nb_connected,
|
|
self.nb_total
|
|
);
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let log_file = std::env::var("LOG_FILE").unwrap_or(String::from(DEFAULT_LOG_FILE));
|
|
WriteLogger::init(
|
|
LevelFilter::Info,
|
|
Config::default(),
|
|
File::create(&log_file).unwrap(),
|
|
)
|
|
.unwrap();
|
|
let mut my_counter: MyCounter = Default::default();
|
|
run_filter(&mut my_counter);
|
|
}
|