use clap::crate_version;
#[cfg(feature = "containers")]
use {
docker_sync::Docker,
k8s_sync::{errors::KubernetesError, kubernetes::Kubernetes},
};
pub fn filter_cmdline(cmdline: &str) -> String {
cmdline.replace('\"', "\\\"").replace('\n', "")
}
pub fn filter_qemu_cmdline(cmdline: &str) -> Option<String> {
if cmdline.contains("qemu-system") && cmdline.contains("guest=") {
let vmname: Vec<Vec<&str>> = cmdline
.split("guest=")
.map(|x| x.split(',').collect())
.collect();
match (vmname[1].len(), vmname[1][0].is_empty()) {
(1, _) => return None,
(_, true) => return None,
(_, false) => return Some(String::from(vmname[1][0])),
}
}
None
}
pub fn get_scaphandre_version() -> String {
let mut version_parts = crate_version!().split('.');
let major_version = version_parts.next().unwrap();
let patch_version = version_parts.next().unwrap();
let minor_version = version_parts.next().unwrap();
format!("{major_version}.{patch_version}{minor_version}")
}
pub fn get_hostname() -> String {
String::from(
hostname::get()
.expect("Fail to get system hostname")
.to_str()
.unwrap(),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_filter_qemu_cmdline_ok() {
let cmdline = "file=/var/lib/libvirt/qemu/domain-1-fedora33/master-key.aes-object-Sguest=fedora33,debug-threads=on-name/usr/bin/qemu-system-x86_64";
assert_eq!(filter_qemu_cmdline(cmdline), Some("fedora33".to_string()));
}
#[test]
fn test_filter_qemu_cmdline_ko_not_qemu() {
let cmdline = "file=/var/lib/libvirt/qemu/domain-1-fedora33/master-key.aes-object-Sguest=fedora33,debug-threads=on-name/usr/bin/bidule";
assert_eq!(filter_qemu_cmdline(cmdline), None);
}
#[test]
fn test_filter_qemu_cmdline_ko_no_guest_token() {
let cmdline = "file=/var/lib/libvirt/qemu/domain-1-fedora33/master-key.aes-object-Sfuest=fedora33,debug-threads=on-name/usr/bin/qemu-system-x86_64";
assert_eq!(filter_qemu_cmdline(cmdline), None);
}
#[test]
fn test_filter_qemu_cmdline_ko_no_comma_separator() {
let cmdline = "file=/var/lib/libvirt/qemu/domain-1-fedora33/master-key.aes-object-Sguest=fedora33#debug-threads=on-name/usr/bin/qemu-system-x86_64";
assert_eq!(filter_qemu_cmdline(cmdline), None);
}
#[test]
fn test_filter_qemu_cmdline_ko_empty_guest01() {
let cmdline = "file=/var/lib/libvirt/qemu/domain-1-fedora33/master-key.aes-object-Sguest=,,debug-threads=on-name/usr/bin/qemu-system-x86_64";
assert_eq!(filter_qemu_cmdline(cmdline), None);
}
#[test]
fn test_filter_qemu_cmdline_ko_empty_guest02() {
let cmdline = "qemu-system-x86_64,file=/var/lib/libvirt/qemu/domain-1-fedora33/master-key.aes-object-Sguest=";
assert_eq!(filter_qemu_cmdline(cmdline), None);
}
}
#[cfg(feature = "containers")]
pub fn get_docker_client() -> Result<Docker, std::io::Error> {
let docker = match Docker::connect() {
Ok(docker) => docker,
Err(err) => return Err(err),
};
Ok(docker)
}
#[cfg(feature = "containers")]
pub fn get_kubernetes_client() -> Result<Kubernetes, KubernetesError> {
match Kubernetes::connect(
Some(String::from("/root/.kube/config")),
None,
None,
None,
true,
) {
Ok(kubernetes) => Ok(kubernetes),
Err(err) => {
eprintln!("Got Kubernetes error: {err} | {err:?}");
Err(err)
}
}
}
#[test]
fn test_filter_cmdline_with_carriage_return() {
let cmdline = "bash-csleep infinity;\n> echo plop";
assert_eq!(
filter_cmdline(cmdline),
String::from("bash-csleep infinity;> echo plop")
);
}