pharos-plugins 0.1.0

CoreDNS-compatible Plugins for the Pharos DNS server
Documentation
#![forbid(unsafe_code)]
#![cfg(feature = "plugin-cache")]
#![recursion_limit = "512"]

use pharos_corefile::{configure, parse};
use pharos_plugins::{Chain, directives};

fn configure_cache(directive: &str) -> bool {
    let text = format!(".:53 {{\n{directive}\n}}");
    parse("Corefile", &text)
        .and_then(|blocks| configure::<Chain>(&blocks, directives()))
        .is_ok()
}

#[test]
fn accepts_coredns_cache_setup_cases() {
    for text in [
        "cache",
        "cache {}",
        "cache example.nl {\n success 10\n}",
        "cache example.nl {\n success 10 1800 30\n denial 10 15 2\n}",
        "cache 25 example.nl {\n success 10\n denial 10 15 5\n}",
        "cache aaa example.nl",
        "cache {\n prefetch 10 1m 90%\n}",
        "cache {\n serve_stale 1h VERIFY 100ms 30s 30s\n serve_stale_policy prefer_positive\n}",
        "cache {\n serve_stale 1h immediate 30s 30s\n}",
        "cache {\n servfail 5m\n disable denial example.com example.org\n disable success\n keepttl\n}",
    ] {
        assert!(configure_cache(text), "rejected {text}");
    }
}

#[test]
fn rejects_coredns_invalid_cache_setup_cases() {
    for text in [
        "cache 0 example.nl",
        "cache -1 example.nl",
        "cache\n cache",
        "cache {\n success\n}",
        "cache {\n denial aaa\n}",
        "cache {\n positive 15\n}",
        "cache {\n prefetch -1\n}",
        "cache {\n prefetch 0 blurp\n}",
        "cache {\n prefetch 1 1m 9%\n}",
        "cache {\n prefetch 1 1m 91%\n}",
        "cache {\n serve_stale -20m\n}",
        "cache {\n serve_stale 1m nono\n}",
        "cache {\n serve_stale 1h immediate 100ms\n}",
        "cache {\n serve_stale 1h verify -1ms\n}",
        "cache {\n serve_stale_policy prefer_positive\n}",
        "cache {\n servfail 6m\n}",
        "cache {\n disable invalid example.com\n}",
        "cache {\n keepttl arg1\n}",
    ] {
        assert!(!configure_cache(text), "accepted {text}");
    }
}