Merge pull request #11 from pop-os/log_jammy

Don't log output of cosmic-comp/cosmic-panel, log panics
This commit is contained in:
Victoria Brekenfeld 2023-01-16 09:37:09 +01:00 committed by GitHub
commit fa898f9228
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 56 additions and 80 deletions

11
Cargo.lock generated
View file

@ -232,6 +232,7 @@ dependencies = [
"futures-util", "futures-util",
"launch-pad", "launch-pad",
"libc", "libc",
"log-panics",
"nix 0.25.0", "nix 0.25.0",
"scopeguard", "scopeguard",
"sendfd", "sendfd",
@ -484,6 +485,16 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "log-panics"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68f9dd8546191c1850ecf67d22f5ff00a935b890d0e84713159a55495cc2ac5f"
dependencies = [
"backtrace",
"log",
]
[[package]] [[package]]
name = "matchers" name = "matchers"
version = "0.1.0" version = "0.1.0"

View file

@ -13,6 +13,7 @@ color-eyre = "0.6"
futures-util = "0.3" futures-util = "0.3"
launch-pad = { git = "https://github.com/pop-os/launch-pad" } launch-pad = { git = "https://github.com/pop-os/launch-pad" }
libc = "0.2" libc = "0.2"
log-panics = { version = "2", features = ["with-backtrace"] }
nix = { version = "0.25", features = ["fs"], default-features = false } nix = { version = "0.25", features = ["fs"], default-features = false }
scopeguard = "1" scopeguard = "1"
sendfd = { version = "0.4", features = ["tokio"] } sendfd = { version = "0.4", features = ["tokio"] }

View file

@ -14,7 +14,6 @@ use tokio::{
task::JoinHandle, task::JoinHandle,
}; };
use tokio_util::sync::CancellationToken; use tokio_util::sync::CancellationToken;
use tracing::Instrument;
use crate::process::mark_as_not_cloexec; use crate::process::mark_as_not_cloexec;
@ -191,65 +190,43 @@ pub fn run_compositor(
OwnedFd::from(std_stream) OwnedFd::from(std_stream)
}; };
mark_as_not_cloexec(&comp).expect("Failed to mark fd as not cloexec"); mark_as_not_cloexec(&comp).expect("Failed to mark fd as not cloexec");
// Create a new span, marking the upcoming task as `cosmic-comp` with tracing. Ok(tokio::spawn(async move {
let span = info_span!(parent: None, "cosmic-comp"); // Create a new process handler for cosmic-comp, with our compositor socket's
let _span = span.clone(); // file descriptor as the `COSMIC_SESSION_SOCK` environment variable.
Ok(tokio::spawn( process_manager
async move { .start_process(
// Create a new process handler for cosmic-comp, with our compositor socket's Process::new()
// file descriptor as the `COSMIC_SESSION_SOCK` environment variable. .with_executable("cosmic-comp")
let stdout_span = span.clone(); .with_env([("COSMIC_SESSION_SOCK", comp.as_raw_fd().to_string())]),
let stderr_span = span.clone(); )
process_manager .await
.start_process( .expect("failed to launch compositor");
Process::new() // Create a new state object for IPC purposes.
.with_executable("cosmic-comp") let mut ipc_state = IpcState {
.with_env([("COSMIC_SESSION_SOCK", comp.as_raw_fd().to_string())]) env_tx: Some(env_tx),
.with_on_stdout(move |_, _, line| { ..IpcState::default()
let stdout_span = stdout_span.clone(); };
async move { loop {
info!("{}", line); tokio::select! {
} /*
.instrument(stdout_span) exit = receive_event(&mut rx) => if exit.is_none() {
}) break;
.with_on_stderr(move |_, _, line| { },
let stderr_span = stderr_span.clone(); */
async move { // Receive IPC messages from the process,
warn!("{}", line); // exiting the loop if IPC errors.
} result = receive_ipc(&mut ipc_state, &mut session_rx) => if let Err(err) = result {
.instrument(stderr_span) error!("failed to receive IPC: {:?}", err);
}), break;
) },
.await // Send any file descriptors we need to the compositor.
.expect("failed to launch compositor"); Some(socket) = socket_rx.recv() => {
// Create a new state object for IPC purposes. send_fd(&mut session_tx, socket)
let mut ipc_state = IpcState { .await
env_tx: Some(env_tx), .wrap_err("failed to send file descriptor to compositor")?;
..IpcState::default()
};
loop {
tokio::select! {
/*
exit = receive_event(&mut rx) => if exit.is_none() {
break;
},
*/
// Receive IPC messages from the process,
// exiting the loop if IPC errors.
result = receive_ipc(&mut ipc_state, &mut session_rx) => if let Err(err) = result {
error!("failed to receive IPC: {:?}", err);
break;
},
// Send any file descriptors we need to the compositor.
Some(socket) = socket_rx.recv() => {
send_fd(&mut session_tx, socket)
.await
.wrap_err("failed to send file descriptor to compositor")?;
}
} }
} }
Result::<()>::Ok(())
} }
.instrument(_span), Result::<()>::Ok(())
)) }))
} }

View file

@ -34,6 +34,7 @@ async fn main() -> Result<()> {
) )
.try_init() .try_init()
.wrap_err("failed to initialize logger")?; .wrap_err("failed to initialize logger")?;
log_panics::init();
info!("Starting cosmic-session"); info!("Starting cosmic-session");
@ -61,28 +62,11 @@ async fn main() -> Result<()> {
.collect::<Vec<_>>(); .collect::<Vec<_>>();
info!("got environmental variables: {:?}", env_vars); info!("got environmental variables: {:?}", env_vars);
let span = info_span!(parent: None, "cosmic-panel");
let stdout_span = span.clone();
let stderr_span = span.clone();
process_manager process_manager
.start( .start(
Process::new() Process::new()
.with_executable("cosmic-panel") .with_executable("cosmic-panel")
.with_env(env_vars.clone()) .with_env(env_vars.clone()),
.with_on_stdout(move |_, _, line| {
let stdout_span = stdout_span.clone();
async move {
info!("{}", line);
}
.instrument(stdout_span)
})
.with_on_stderr(move |_, _, line| {
let stderr_span = stderr_span.clone();
async move {
warn!("{}", line);
}
.instrument(stderr_span)
}),
) )
.await .await
.expect("failed to start panel"); .expect("failed to start panel");
@ -173,9 +157,12 @@ async fn main() -> Result<()> {
let (exit_tx, exit_rx) = oneshot::channel(); let (exit_tx, exit_rx) = oneshot::channel();
let _ = ConnectionBuilder::session()? let _ = ConnectionBuilder::session()?
.name("com.system76.CosmicSession")? .name("com.system76.CosmicSession")?
.serve_at("/com/system76/CosmicSession", service::SessionService { .serve_at(
exit_tx: Some(exit_tx), "/com/system76/CosmicSession",
})? service::SessionService {
exit_tx: Some(exit_tx),
},
)?
.build() .build()
.await?; .await?;