use std::process::Command;
use crate::error::Error;
use crate::source::{Probe, Source, SourceKind};
use crate::sources::util::normalize;
#[derive(Debug, Default, Clone)]
pub struct IllumosHostId {
_priv: (),
}
impl IllumosHostId {
#[must_use]
pub fn new() -> Self {
Self { _priv: () }
}
}
impl Source for IllumosHostId {
fn kind(&self) -> SourceKind {
SourceKind::IllumosHostId
}
fn probe(&self) -> Result<Option<Probe>, Error> {
let output = Command::new("/usr/bin/hostid")
.output()
.map_err(|e| Error::Platform {
source_kind: SourceKind::IllumosHostId,
reason: format!("hostid: {e}"),
})?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
log::debug!(
"host-identity: hostid exited with {}: {}",
output.status,
stderr.trim()
);
return Ok(None);
}
let Ok(value) = std::str::from_utf8(&output.stdout) else {
return Ok(None);
};
Ok(normalize(value).map(|v| Probe::new(SourceKind::IllumosHostId, v)))
}
}