rust: adapt to new systemd journal API
The next/previous functions were renamed, and the journal is no longer seeked to the head on open, so we have to do it manually. We did that already in most places, except one. For more information, see: https://github.com/jmesmon/rust-systemd/pull/121
This commit is contained in:
parent
9f706c09f3
commit
da0f614666
@ -191,7 +191,7 @@ fn history_get_oldest_deployment_msg_timestamp() -> Result<Option<u64>> {
|
|||||||
let mut journal = journal::Journal::open(journal::JournalFiles::System, false, true)?;
|
let mut journal = journal::Journal::open(journal::JournalFiles::System, false, true)?;
|
||||||
journal.seek(journal::JournalSeek::Head)?;
|
journal.seek(journal::JournalSeek::Head)?;
|
||||||
journal.match_add("MESSAGE_ID", RPMOSTREE_DEPLOY_MSG)?;
|
journal.match_add("MESSAGE_ID", RPMOSTREE_DEPLOY_MSG)?;
|
||||||
while let Some(rec) = journal.next_record()? {
|
while let Some(rec) = journal.next_entry()? {
|
||||||
if let Some(ts) = map_to_u64(rec.get("DEPLOYMENT_TIMESTAMP")) {
|
if let Some(ts) = map_to_u64(rec.get("DEPLOYMENT_TIMESTAMP")) {
|
||||||
return Ok(Some(ts));
|
return Ok(Some(ts));
|
||||||
}
|
}
|
||||||
@ -306,7 +306,7 @@ impl HistoryCtx {
|
|||||||
/// Goes to the next OSTree boot msg in the journal and returns its marker.
|
/// Goes to the next OSTree boot msg in the journal and returns its marker.
|
||||||
fn find_next_boot_marker(&mut self) -> Result<Option<BootMarker>> {
|
fn find_next_boot_marker(&mut self) -> Result<Option<BootMarker>> {
|
||||||
self.set_search_mode(JournalSearchMode::BootMsgs)?;
|
self.set_search_mode(JournalSearchMode::BootMsgs)?;
|
||||||
while let Some(rec) = self.journal.previous_record()? {
|
while let Some(rec) = self.journal.previous_entry()? {
|
||||||
if let Some(Marker::Boot(m)) = self.boot_record_to_marker(&rec)? {
|
if let Some(Marker::Boot(m)) = self.boot_record_to_marker(&rec)? {
|
||||||
return Ok(Some(m));
|
return Ok(Some(m));
|
||||||
}
|
}
|
||||||
@ -327,7 +327,7 @@ impl HistoryCtx {
|
|||||||
/// marker for it, and returns it.
|
/// marker for it, and returns it.
|
||||||
fn find_next_marker(&mut self) -> Result<Option<Marker>> {
|
fn find_next_marker(&mut self) -> Result<Option<Marker>> {
|
||||||
self.set_search_mode(JournalSearchMode::BootAndDeploymentMsgs)?;
|
self.set_search_mode(JournalSearchMode::BootAndDeploymentMsgs)?;
|
||||||
while let Some(rec) = self.journal.previous_record()? {
|
while let Some(rec) = self.journal.previous_entry()? {
|
||||||
if let Some(marker) = self.record_to_marker(&rec)? {
|
if let Some(marker) = self.record_to_marker(&rec)? {
|
||||||
return Ok(Some(marker));
|
return Ok(Some(marker));
|
||||||
}
|
}
|
||||||
@ -473,7 +473,7 @@ mod mock_journal {
|
|||||||
self.msg_ids.push(msg_id.into());
|
self.msg_ids.push(msg_id.into());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
pub fn previous_record(&mut self) -> Result<Option<JournalRecord>> {
|
pub fn previous_entry(&mut self) -> Result<Option<JournalRecord>> {
|
||||||
while let Some((timestamp, record)) = self.entries.pop() {
|
while let Some((timestamp, record)) = self.entries.pop() {
|
||||||
if self.msg_ids.contains(record.get("MESSAGE_ID").unwrap()) {
|
if self.msg_ids.contains(record.get("MESSAGE_ID").unwrap()) {
|
||||||
self.current_timestamp = Some(timestamp);
|
self.current_timestamp = Some(timestamp);
|
||||||
@ -483,7 +483,7 @@ mod mock_journal {
|
|||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
// This is only used by the prune path, which we're not unit testing.
|
// This is only used by the prune path, which we're not unit testing.
|
||||||
pub fn next_record(&mut self) -> Result<Option<JournalRecord>> {
|
pub fn next_entry(&mut self) -> Result<Option<JournalRecord>> {
|
||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::{bail, Result};
|
||||||
use systemd::id128::Id128;
|
use systemd::id128::Id128;
|
||||||
use systemd::journal;
|
use systemd::journal;
|
||||||
|
|
||||||
@ -27,11 +27,14 @@ fn print_staging_failure_msg(msg: Option<&str>) -> Result<()> {
|
|||||||
/// Look for a failure from ostree-finalized-stage.service in the journal of the previous boot.
|
/// Look for a failure from ostree-finalized-stage.service in the journal of the previous boot.
|
||||||
fn journal_print_staging_failure() -> Result<()> {
|
fn journal_print_staging_failure() -> Result<()> {
|
||||||
let mut j = journal::Journal::open(journal::JournalFiles::System, false, true)?;
|
let mut j = journal::Journal::open(journal::JournalFiles::System, false, true)?;
|
||||||
|
j.seek(journal::JournalSeek::Head)?;
|
||||||
|
|
||||||
// first, go to the first entry of the current boot
|
// first, go to the first entry of the current boot
|
||||||
let boot_id = Id128::from_boot()?;
|
let boot_id = Id128::from_boot()?;
|
||||||
j.match_add("_BOOT_ID", boot_id.to_string().as_str())?;
|
j.match_add("_BOOT_ID", boot_id.to_string().as_str())?;
|
||||||
j.seek(journal::JournalSeek::Head)?;
|
if j.next_entry()?.is_none() {
|
||||||
|
bail!("couldn't find current boot in journal");
|
||||||
|
}
|
||||||
j.match_flush()?;
|
j.match_flush()?;
|
||||||
|
|
||||||
// Now, go backwards until we hit the first entry from the previous boot. In theory that should
|
// Now, go backwards until we hit the first entry from the previous boot. In theory that should
|
||||||
@ -39,7 +42,7 @@ fn journal_print_staging_failure() -> Result<()> {
|
|||||||
// https://github.com/systemd/systemd/commit/dc00966228ff90c554fd034e588ea55eb605ec52
|
// https://github.com/systemd/systemd/commit/dc00966228ff90c554fd034e588ea55eb605ec52
|
||||||
let mut previous_boot_id: Id128 = boot_id.clone();
|
let mut previous_boot_id: Id128 = boot_id.clone();
|
||||||
while previous_boot_id == boot_id {
|
while previous_boot_id == boot_id {
|
||||||
match j.previous_record()? {
|
match j.previous_entry()? {
|
||||||
Some(_) => previous_boot_id = j.monotonic_timestamp()?.1,
|
Some(_) => previous_boot_id = j.monotonic_timestamp()?.1,
|
||||||
None => return Ok(()), // no previous boot!
|
None => return Ok(()), // no previous boot!
|
||||||
}
|
}
|
||||||
@ -54,7 +57,7 @@ fn journal_print_staging_failure() -> Result<()> {
|
|||||||
j.match_add("MESSAGE_ID", OSTREE_DEPLOYMENT_FINALIZING_MSG_ID)?;
|
j.match_add("MESSAGE_ID", OSTREE_DEPLOYMENT_FINALIZING_MSG_ID)?;
|
||||||
j.match_add("SYSLOG_IDENTIFIER", "ostree")?;
|
j.match_add("SYSLOG_IDENTIFIER", "ostree")?;
|
||||||
j.match_add("_BOOT_ID", previous_boot_id.as_str())?;
|
j.match_add("_BOOT_ID", previous_boot_id.as_str())?;
|
||||||
let ostree_pid = match j.previous_record()? {
|
let ostree_pid = match j.previous_entry()? {
|
||||||
None => return Ok(()), // didn't run (or staged deployment was cleaned up)
|
None => return Ok(()), // didn't run (or staged deployment was cleaned up)
|
||||||
Some(mut rec) => rec.remove("_PID").unwrap(),
|
Some(mut rec) => rec.remove("_PID").unwrap(),
|
||||||
};
|
};
|
||||||
@ -69,7 +72,7 @@ fn journal_print_staging_failure() -> Result<()> {
|
|||||||
j.match_add("_PID", ostree_pid.as_str())?;
|
j.match_add("_PID", ostree_pid.as_str())?;
|
||||||
j.match_add("_BOOT_ID", previous_boot_id.as_str())?;
|
j.match_add("_BOOT_ID", previous_boot_id.as_str())?;
|
||||||
|
|
||||||
if j.next_record()? != None {
|
if j.next_entry()? != None {
|
||||||
return Ok(()); // finished successfully!
|
return Ok(()); // finished successfully!
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +89,7 @@ fn journal_print_staging_failure() -> Result<()> {
|
|||||||
j.match_add("_BOOT_ID", previous_boot_id.as_str())?;
|
j.match_add("_BOOT_ID", previous_boot_id.as_str())?;
|
||||||
|
|
||||||
let mut exited = false;
|
let mut exited = false;
|
||||||
while let Some(rec) = j.next_record()? {
|
while let Some(rec) = j.next_entry()? {
|
||||||
if let Some(msg) = rec.get("MESSAGE") {
|
if let Some(msg) = rec.get("MESSAGE") {
|
||||||
if msg.contains("Failed with result") || msg.contains("control process exited") {
|
if msg.contains("Failed with result") || msg.contains("control process exited") {
|
||||||
if !msg.contains("exit-code") && !msg.contains("code=exited") {
|
if !msg.contains("exit-code") && !msg.contains("code=exited") {
|
||||||
@ -118,7 +121,7 @@ fn journal_print_staging_failure() -> Result<()> {
|
|||||||
// systemd can be timestamped *after* the error msg (stdout transport)...
|
// systemd can be timestamped *after* the error msg (stdout transport)...
|
||||||
j.match_add("_TRANSPORT", "stdout")?;
|
j.match_add("_TRANSPORT", "stdout")?;
|
||||||
|
|
||||||
if let Some(rec) = j.previous_record()? {
|
if let Some(rec) = j.previous_entry()? {
|
||||||
if let Some(msg) = rec.get("MESSAGE") {
|
if let Some(msg) = rec.get("MESSAGE") {
|
||||||
// only print the msg if it starts with 'error:', otherwise some other really
|
// only print the msg if it starts with 'error:', otherwise some other really
|
||||||
// weird thing happened that might span multiple lines?
|
// weird thing happened that might span multiple lines?
|
||||||
|
Loading…
Reference in New Issue
Block a user