diff --git a/Cargo.lock b/Cargo.lock index e0b9020..d00e863 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1694,6 +1694,7 @@ dependencies = [ "futures-core", "libc", "log", + "nix", "pcap-file-tokio", "serde", "telcom-parser", diff --git a/lib/Cargo.toml b/lib/Cargo.toml index fc2c5e5..8b108c3 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -17,6 +17,7 @@ deku = { version = "0.16.0", features = ["logging"] } env_logger = "0.10.1" libc = "0.2.150" log = "0.4.20" +nix = { version = "0.29.0", features = ["feature"] } pcap-file-tokio = "0.1.0" thiserror = "1.0.50" telcom-parser = { path = "../telcom-parser" } diff --git a/lib/src/pcap.rs b/lib/src/pcap.rs index c776650..0fd9782 100644 --- a/lib/src/pcap.rs +++ b/lib/src/pcap.rs @@ -7,11 +7,13 @@ use tokio::io::AsyncWrite; use std::borrow::Cow; use chrono::prelude::*; use deku::prelude::*; +use nix::sys::utsname::uname; use pcap_file_tokio::pcapng::blocks::enhanced_packet::EnhancedPacketBlock; use pcap_file_tokio::pcapng::blocks::interface_description::InterfaceDescriptionBlock; use pcap_file_tokio::pcapng::blocks::section_header::{SectionHeaderBlock, SectionHeaderOption}; use pcap_file_tokio::pcapng::PcapNgWriter; use pcap_file_tokio::{Endianness, PcapError}; +use std::env::consts::OS; use thiserror::Error; #[derive(Error, Debug)] @@ -61,17 +63,25 @@ struct UdpHeader { impl GsmtapPcapWriter where T: AsyncWrite + Unpin + Send { pub async fn new(writer: T) -> Result { - let package = concat!(env!("CARGO_PKG_NAME"), " ", env!("CARGO_PKG_VERSION")); + let package = format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); let application = SectionHeaderOption::UserApplication(Cow::from(package)); + let operating_system = match uname() { + Ok(utsname) => format!( + "{} {}", + utsname.sysname().to_string_lossy(), + utsname.release().to_string_lossy() + ), + Err(_) => OS.to_owned(), + }; + let os = SectionHeaderOption::OS(Cow::from(operating_system)); let section = SectionHeaderBlock { endianness: Endianness::Big, major_version: 1, minor_version: 0, section_length: -1, - options: vec![application], + options: vec![os, application], }; let writer = PcapNgWriter::with_section_header(writer, section).await?; - Ok(GsmtapPcapWriter { writer, ip_id: 0 }) }