serve_accounting_async

Function serve_accounting_async 

Source
pub async fn serve_accounting_async<F, Fut>(
    addr: &str,
    dict: Arc<Dictionary>,
    secret: &str,
    handler: F,
) -> Result<(), Box<dyn Error>>
where F: Fn(RadiusPacket) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<(), String>> + Send,
Expand description

Serves incoming Accounting-Request packets and responds

Examples found in repository?
examples/server.rs (lines 19-25)
10async fn main() -> Result<(), Box<dyn std::error::Error>> {
11    let dict = Arc::new(Dictionary::load_embedded()?);
12    let secret = "test123";
13
14    let dict_acct = dict.clone();
15    let dict_auth = dict.clone();
16    let secret_acct = secret.to_string();
17    let secret_auth = secret.to_string();
18
19    let acct_server = serve_accounting_async("0.0.0.0:1813", dict_acct, &secret_acct, move |packet| async move {
20        println!("📨 Accounting ID {} from {:?}", packet.identifier, packet.username());
21        for attr in packet.attributes {
22            println!("  → Type {}: {:?}", attr.typ, attr.value);
23        }
24        Ok(())
25    });
26
27    let auth_server = serve_async("0.0.0.0:1812", dict_auth, &secret_auth, move |packet| async move {
28        println!("🔍 Incoming ID {} from {:?}", packet.identifier, packet.username());
29      let acc_pkt: AccountingPacket = packet.clone().into();
30    println!("{:?}", acc_pkt);
31
32        if let Some(username) = packet.username() {
33            if username.trim() == " " {
34                Ok(packet.reply_accept(vec![
35                    RadiusAttribute::session_timeout(3600),
36                    RadiusAttribute::reply_message("Welcome, admin."),
37                ]))
38            } else {
39                Ok(packet.reply_reject("User not allowed"))
40            }
41        } else {
42            Ok(packet.reply_reject("Missing username"))
43        }
44    });
45
46    // Run both servers concurrently
47    tokio::try_join!(acct_server, auth_server)?;
48
49    Ok(())
50}