aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlafleur <lafleur@boum.org>2021-10-21 15:46:32 +0200
committerlafleur <lafleur@boum.org>2021-10-21 15:46:32 +0200
commiteaddafc10cb0eb4693dd35d890012ffaefa2884b (patch)
treee80ddd331cf992be02d911ed45a1c1ad459d874c
parentc694d5109171e51ce16f40a79b55b496002feb84 (diff)
add LogGroup and LogPrefix arguments to Log target
-rw-r--r--rustables/src/expr/log.rs74
-rw-r--r--rustables/src/expr/mod.rs9
2 files changed, 81 insertions, 2 deletions
diff --git a/rustables/src/expr/log.rs b/rustables/src/expr/log.rs
index d6e0089..4345f41 100644
--- a/rustables/src/expr/log.rs
+++ b/rustables/src/expr/log.rs
@@ -1,12 +1,82 @@
use super::{Expression, Rule};
use rustables_sys as sys;
use std::os::raw::c_char;
+use std::ffi::CString;
/// A Log expression will log all packets that match the rule.
-pub struct Log;
+pub struct Log {
+ pub group: Option<LogGroup>,
+ pub prefix: Option<LogPrefix>
+}
impl Expression for Log {
fn to_expr(&self, _rule: &Rule) -> *mut sys::nftnl_expr {
- try_alloc!(unsafe { sys::nftnl_expr_alloc(b"log\0" as *const _ as *const c_char) })
+ unsafe {
+ let expr = try_alloc!(sys::nftnl_expr_alloc(
+ b"log\0" as *const _ as *const c_char
+ ));
+ if let Some(group) = self.group {
+ sys::nftnl_expr_set_u32(
+ expr,
+ sys::NFTNL_EXPR_LOG_GROUP as u16,
+ group as u32,
+ );
+ };
+ if let Some(LogPrefix(prefix)) = &self.prefix {
+ sys::nftnl_expr_set_str(
+ expr,
+ sys::NFTNL_EXPR_LOG_PREFIX as u16,
+ prefix.as_ptr()
+ );
+ };
+
+ expr
+ }
+ }
+}
+
+
+/// Enumeration of possible NFLOG groups.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+pub enum LogGroup {
+ LogGroupZero,
+ LogGroupOne,
+ LogGroupTwo,
+ LogGroupThree,
+ LogGroupFour,
+ LogGroupFive,
+ LogGroupSix,
+ LogGroupSeven,
+}
+
+/// A prefix that will get prepended to each log line.
+#[derive(Clone)]
+pub struct LogPrefix(pub CString);
+
+impl LogPrefix {
+ /// Create a new LogPrefix from a String. Converts it to CString as needed by nftables.
+ pub fn new(prefix: &str) -> Result<Self, std::ffi::NulError> {
+ // TODO check for prefix size constraints.
+ match CString::new(prefix) {
+ Ok(string) => Ok(LogPrefix(string)),
+ Err(error)=> Err(error)
+ }
}
}
+
+
+#[macro_export]
+macro_rules! nft_expr_log {
+ (group $group:ident prefix $prefix:expr) => {
+ $crate::expr::Log { group: $group, prefix: $prefix }
+ };
+ (prefix $prefix:expr) => {
+ $crate::expr::Log { group: None, prefix: $prefix }
+ };
+ (group $group:ident) => {
+ $crate::expr::Log { group: $group, prefix: None }
+ };
+ () => {
+ $crate::expr::Log { group: None, prefix: None }
+ };
+}
diff --git a/rustables/src/expr/mod.rs b/rustables/src/expr/mod.rs
index 1364904..99ea44b 100644
--- a/rustables/src/expr/mod.rs
+++ b/rustables/src/expr/mod.rs
@@ -86,6 +86,15 @@ macro_rules! nft_expr {
(immediate $expr:ident $value:expr) => {
nft_expr_immediate!($expr $value)
};
+ (log group $group:ident prefix $prefix:expr) => {
+ nft_expr_log!(group $group prefix $prefix)
+ };
+ (log group $group:ident) => {
+ nft_expr_log!(group $group)
+ };
+ (log prefix $prefix:expr) => {
+ nft_expr_log!(prefix $prefix)
+ };
(log) => {
nft_expr_log!()
};