Skip to content

Commit 650fde5

Browse files
committed
Include /var/adm/messages in archived zone logs
System messages on illumos are logged to `/var/adm/messages`. In the event of a hardware or kernel issue, an archive of these logs can be for understanding the nature of the failure. Currently we archive all Oxide service logs from the global zone and any zones we create, but not `/var/adm/messages`. Update the archiver to include the latter as well.
1 parent 42adbe5 commit 650fde5

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

sled-agent/config-reconciler/src/dump_setup.rs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,15 +1101,22 @@ impl DumpSetupWorker {
11011101
let oxz_zones = self.zone_invoker.get_zones().await?;
11021102
for zone in oxz_zones {
11031103
let logdir = if zone.global() {
1104-
PathBuf::from("/var/svc/log")
1104+
zone.path.join("var/svc/log")
11051105
} else {
11061106
zone.path().join("root/var/svc/log")
11071107
};
11081108
let zone_name = zone.name();
11091109
self.archive_logs_from_zone_path(
1110-
debug_dir, logdir, zone_name, false,
1110+
debug_dir, logdir, "*.log", zone_name, false,
11111111
)
11121112
.await?;
1113+
if zone.global() {
1114+
let adm_logdir = zone.path.join("var/adm");
1115+
self.archive_logs_from_zone_path(
1116+
debug_dir, adm_logdir, "messages", zone_name, false,
1117+
)
1118+
.await?;
1119+
}
11131120
}
11141121
Ok(())
11151122
}
@@ -1129,6 +1136,7 @@ impl DumpSetupWorker {
11291136
.archive_logs_from_zone_path(
11301137
debug_dir,
11311138
logdir.into(),
1139+
"*.log",
11321140
zone_name,
11331141
true,
11341142
)
@@ -1149,13 +1157,14 @@ impl DumpSetupWorker {
11491157
&self,
11501158
debug_dir: &DebugDataset,
11511159
logdir: PathBuf,
1160+
log_name_pattern: &str,
11521161
zone_name: &str,
11531162
include_live: bool,
11541163
) -> Result<(), ArchiveLogsError> {
11551164
let mut rotated_log_files = Vec::new();
11561165
if include_live {
11571166
let pattern = logdir
1158-
.join("*.log*")
1167+
.join(format!("{log_name_pattern}*"))
11591168
.to_str()
11601169
.ok_or_else(|| ArchiveLogsError::Utf8(zone_name.to_string()))?
11611170
.to_string();
@@ -1166,7 +1175,7 @@ impl DumpSetupWorker {
11661175
// any
11671176
for n in 1..9 {
11681177
let pattern = logdir
1169-
.join(format!("*.log.{}", "[0-9]".repeat(n)))
1178+
.join(format!("{log_name_pattern}.{}", "[0-9]".repeat(n)))
11701179
.to_str()
11711180
.ok_or_else(|| {
11721181
ArchiveLogsError::Utf8(zone_name.to_string())
@@ -1794,8 +1803,13 @@ mod tests {
17941803
let core_dir = tempdir.path().join(CRASH_DATASET);
17951804
let debug_dir = tempdir.path().join(DUMP_DATASET);
17961805
let zone_logs = tempdir.path().join("root/var/svc/log");
1806+
let adm_logs = tempdir.path().join("var/adm");
17971807

17981808
let tempdir_path = tempdir.path().as_str().to_string();
1809+
let global_zone = Zone::from_str(&format!(
1810+
"0:global:running:{tempdir_path}::ipkg:shared"
1811+
))
1812+
.unwrap();
17991813
let zone = Zone::from_str(&format!(
18001814
"1:myzone:running:{tempdir_path}::ipkg:shared"
18011815
))
@@ -1831,14 +1845,15 @@ mod tests {
18311845
.into_iter()
18321846
.collect(),
18331847
}),
1834-
Box::new(FakeZone { zones: vec![zone.clone()] }),
1848+
Box::new(FakeZone { zones: vec![global_zone, zone.clone()] }),
18351849
logctx.log.clone(),
18361850
tokio::sync::mpsc::channel(1).1,
18371851
);
18381852

18391853
tokio::fs::create_dir_all(&core_dir).await.unwrap();
18401854
tokio::fs::create_dir_all(&debug_dir).await.unwrap();
18411855
tokio::fs::create_dir_all(&zone_logs).await.unwrap();
1856+
tokio::fs::create_dir_all(&adm_logs).await.unwrap();
18421857
const LOG_NAME: &'static str = "foo.log.0";
18431858
tokio::fs::File::create(zone_logs.join(LOG_NAME))
18441859
.await
@@ -1847,6 +1862,14 @@ mod tests {
18471862
.await
18481863
.expect("writing fake log");
18491864

1865+
const ADM_LOG_NAME: &'static str = "messages.0";
1866+
tokio::fs::File::create(adm_logs.join(ADM_LOG_NAME))
1867+
.await
1868+
.expect("creating fake adm log")
1869+
.write_all(b"admin stuff")
1870+
.await
1871+
.expect("writing fake adm log");
1872+
18501873
const CORE_NAME: &str = "core.myzone.myexe.123.1690540950";
18511874
tokio::fs::File::create(core_dir.join(CORE_NAME))
18521875
.await
@@ -1878,6 +1901,12 @@ mod tests {
18781901
debug_dir.join(zone.name()).join(LOG_NAME.replace(".0", ".*"));
18791902
assert_eq!(glob::glob(log_glob.as_str()).unwrap().count(), 1);
18801903
assert!(!zone_logs.join(LOG_NAME).is_file());
1904+
1905+
let adm_glob =
1906+
debug_dir.join("global").join(ADM_LOG_NAME.replace(".0", ".*"));
1907+
assert_eq!(glob::glob(adm_glob.as_str()).unwrap().count(), 1);
1908+
assert!(!adm_logs.join(ADM_LOG_NAME).is_file());
1909+
18811910
assert!(debug_dir.join(CORE_NAME).is_file());
18821911
assert!(!core_dir.join(CORE_NAME).is_file());
18831912
logctx.cleanup_successful();

0 commit comments

Comments
 (0)