parent
be531653a4
commit
f0566d54eb
4 changed files with 51 additions and 4 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -9163,6 +9163,7 @@ name = "remote_server"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"backtrace",
|
||||||
"cargo_toml",
|
"cargo_toml",
|
||||||
"clap",
|
"clap",
|
||||||
"client",
|
"client",
|
||||||
|
|
|
@ -22,6 +22,7 @@ test-support = ["fs/test-support"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow.workspace = true
|
anyhow.workspace = true
|
||||||
|
backtrace = "0.3"
|
||||||
clap.workspace = true
|
clap.workspace = true
|
||||||
client.workspace = true
|
client.workspace = true
|
||||||
env_logger.workspace = true
|
env_logger.workspace = true
|
||||||
|
|
|
@ -37,7 +37,7 @@ fn main() {
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
use remote_server::unix::{execute_proxy, execute_run, init_logging};
|
use remote_server::unix::{execute_proxy, execute_run, init};
|
||||||
|
|
||||||
let cli = Cli::parse();
|
let cli = Cli::parse();
|
||||||
|
|
||||||
|
@ -48,11 +48,11 @@ fn main() -> Result<()> {
|
||||||
stdin_socket,
|
stdin_socket,
|
||||||
stdout_socket,
|
stdout_socket,
|
||||||
}) => {
|
}) => {
|
||||||
init_logging(Some(log_file))?;
|
init(Some(log_file))?;
|
||||||
execute_run(pid_file, stdin_socket, stdout_socket)
|
execute_run(pid_file, stdin_socket, stdout_socket)
|
||||||
}
|
}
|
||||||
Some(Commands::Proxy { identifier }) => {
|
Some(Commands::Proxy { identifier }) => {
|
||||||
init_logging(None)?;
|
init(None)?;
|
||||||
execute_proxy(identifier)
|
execute_proxy(identifier)
|
||||||
}
|
}
|
||||||
Some(Commands::Version) => {
|
Some(Commands::Version) => {
|
||||||
|
|
|
@ -20,7 +20,13 @@ use std::{
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn init_logging(log_file: Option<PathBuf>) -> Result<()> {
|
pub fn init(log_file: Option<PathBuf>) -> Result<()> {
|
||||||
|
init_logging(log_file)?;
|
||||||
|
init_panic_hook();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_logging(log_file: Option<PathBuf>) -> Result<()> {
|
||||||
if let Some(log_file) = log_file {
|
if let Some(log_file) = log_file {
|
||||||
let target = Box::new(if log_file.exists() {
|
let target = Box::new(if log_file.exists() {
|
||||||
std::fs::OpenOptions::new()
|
std::fs::OpenOptions::new()
|
||||||
|
@ -46,6 +52,45 @@ pub fn init_logging(log_file: Option<PathBuf>) -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_panic_hook() {
|
||||||
|
std::panic::set_hook(Box::new(|info| {
|
||||||
|
let payload = info
|
||||||
|
.payload()
|
||||||
|
.downcast_ref::<&str>()
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.or_else(|| info.payload().downcast_ref::<String>().cloned())
|
||||||
|
.unwrap_or_else(|| "Box<Any>".to_string());
|
||||||
|
|
||||||
|
let backtrace = backtrace::Backtrace::new();
|
||||||
|
let mut backtrace = backtrace
|
||||||
|
.frames()
|
||||||
|
.iter()
|
||||||
|
.flat_map(|frame| {
|
||||||
|
frame
|
||||||
|
.symbols()
|
||||||
|
.iter()
|
||||||
|
.filter_map(|frame| Some(format!("{:#}", frame.name()?)))
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
// Strip out leading stack frames for rust panic-handling.
|
||||||
|
if let Some(ix) = backtrace
|
||||||
|
.iter()
|
||||||
|
.position(|name| name == "rust_begin_unwind")
|
||||||
|
{
|
||||||
|
backtrace.drain(0..=ix);
|
||||||
|
}
|
||||||
|
|
||||||
|
log::error!(
|
||||||
|
"server: panic occurred: {}\nBacktrace:\n{}",
|
||||||
|
payload,
|
||||||
|
backtrace.join("\n")
|
||||||
|
);
|
||||||
|
|
||||||
|
std::process::abort();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
fn start_server(
|
fn start_server(
|
||||||
stdin_listener: UnixListener,
|
stdin_listener: UnixListener,
|
||||||
stdout_listener: UnixListener,
|
stdout_listener: UnixListener,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue