From 8a2ccc237dfc121cee33c0f32027a68ba745724a Mon Sep 17 00:00:00 2001 From: Juhyung Park Date: Wed, 29 May 2019 17:18:36 +0900 Subject: [PATCH 1/3] Extract panic_message function in the panic_hook --- util/panic_hook/src/lib.rs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/util/panic_hook/src/lib.rs b/util/panic_hook/src/lib.rs index 21236e5bf3..97f2654964 100644 --- a/util/panic_hook/src/lib.rs +++ b/util/panic_hook/src/lib.rs @@ -19,7 +19,6 @@ extern crate backtrace; use backtrace::Backtrace; -use std::io::{self, Write}; use std::panic::{self, PanicInfo}; use std::thread; @@ -35,6 +34,12 @@ This is a bug. Please report it at: "; fn panic_hook(info: &PanicInfo) { + let message = panic_message(info); + eprintln!("{}", message); + exit_on_debug_mode(); +} + +fn panic_message(info: &PanicInfo) -> String { let location = info.location(); let file = location.as_ref().map(|l| l.file()).unwrap_or(""); let line = location.as_ref().map(|l| l.line()).unwrap_or(0); @@ -52,18 +57,17 @@ fn panic_hook(info: &PanicInfo) { let backtrace = Backtrace::new(); - let mut stderr = io::stderr(); - - let _ = writeln!(stderr); - let _ = writeln!(stderr, "===================="); - let _ = writeln!(stderr); - let _ = writeln!(stderr, "{:?}", backtrace); - let _ = writeln!(stderr); - let _ = writeln!(stderr, "Thread '{}' panicked at '{}', {}:{}", name, msg, file, line); - - let _ = writeln!(stderr, "{}", ABOUT_PANIC); - - exit_on_debug_mode(); + let lines = [ + "".to_string(), + "====================".to_string(), + "".to_string(), + format!("{:?}", backtrace), + "".to_string(), + format!("Thread '{}' panicked at '{}', {}:{}", name, msg, file, line), + ABOUT_PANIC.to_string(), + ]; + + lines.join("\n") } #[cfg(debug_assertions)] From b93ea6be9d852d86b575b4cf13df761ad590728b Mon Sep 17 00:00:00 2001 From: Juhyung Park Date: Wed, 29 May 2019 18:10:47 +0900 Subject: [PATCH 2/3] Send an email when a pnic occurred --- Cargo.lock | 1 + codechain/run_node.rs | 14 +++++++++----- codechain/subcommand/account_command.rs | 2 +- util/logger/src/email.rs | 1 + util/logger/src/lib.rs | 6 ++---- util/panic_hook/Cargo.toml | 1 + util/panic_hook/src/lib.rs | 14 ++++++++++++++ 7 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5437714ce7..4a0780cb4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1644,6 +1644,7 @@ name = "panic_hook" version = "0.1.0" dependencies = [ "backtrace 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "codechain-logger 0.1.0", ] [[package]] diff --git a/codechain/run_node.rs b/codechain/run_node.rs index 53da7af216..022d365b35 100644 --- a/codechain/run_node.rs +++ b/codechain/run_node.rs @@ -28,7 +28,7 @@ use ckey::{Address, NetworkId, PlatformAddress}; use ckeystore::accounts_dir::RootDiskDirectory; use ckeystore::KeyStore; use clap::ArgMatches; -use clogger::{self, EmailAlarmConfig, LoggerConfig}; +use clogger::{self, EmailAlarm, EmailAlarmConfig, LoggerConfig}; use cnetwork::{Filters, NetworkConfig, NetworkControl, NetworkService, RoutingTable, SocketAddr}; use csync::{BlockSyncExtension, BlockSyncSender, SnapshotService, TransactionSyncExtension}; use ctimer::TimerLoop; @@ -238,17 +238,21 @@ pub fn run_node(matches: &ArgMatches) -> Result<(), String> { .expect("Current time should be later than unix epoch") .subsec_nanos() as usize, ); - let email_alarm_config = if !config.email_alarm.disable.unwrap() { - match (&config.email_alarm.to, &config.email_alarm.sendgrid_key) { + let email_alarm = if !config.email_alarm.disable.unwrap() { + let config = match (&config.email_alarm.to, &config.email_alarm.sendgrid_key) { (Some(to), Some(sendgrid_key)) => Some(EmailAlarmConfig::new(to.to_string(), sendgrid_key.to_string())), (None, _) => return Err("email-alarm-to is not specified".to_string()), (_, None) => return Err("email-alarm-sendgrid-key is not specified".to_string()), - } + }; + config.as_ref().map(EmailAlarm::new) } else { None }; - clogger::init(&LoggerConfig::new(instance_id), &email_alarm_config) + clogger::init(&LoggerConfig::new(instance_id), email_alarm.clone()) .expect("Logger must be successfully initialized"); + if let Some(email_alarm) = email_alarm { + panic_hook::set_with_email_alarm(email_alarm); + } let pf = load_password_file(&config.operating.password_path)?; let base_path = config.operating.base_path.as_ref().unwrap().clone(); diff --git a/codechain/subcommand/account_command.rs b/codechain/subcommand/account_command.rs index 97c4632585..1414beafdc 100644 --- a/codechain/subcommand/account_command.rs +++ b/codechain/subcommand/account_command.rs @@ -36,7 +36,7 @@ pub fn run_account_command(matches: &ArgMatches) -> Result<(), String> { return Ok(()) } - clogger::init(&LoggerConfig::new(0), &None).expect("Logger must be successfully initialized"); + clogger::init(&LoggerConfig::new(0), None).expect("Logger must be successfully initialized"); let keys_path = get_global_argument(matches, "keys-path").unwrap_or_else(|| DEFAULT_KEYS_PATH.into()); let dir = RootDiskDirectory::create(keys_path).expect("Cannot read key path directory"); diff --git a/util/logger/src/email.rs b/util/logger/src/email.rs index 16d22ea700..fa2bdf6168 100644 --- a/util/logger/src/email.rs +++ b/util/logger/src/email.rs @@ -14,6 +14,7 @@ impl EmailAlarmConfig { } } +#[derive(Clone)] pub struct EmailAlarm { pub to: String, pub sendgrid_key: String, diff --git a/util/logger/src/lib.rs b/util/logger/src/lib.rs index 6f981fafb6..304e710611 100644 --- a/util/logger/src/lib.rs +++ b/util/logger/src/lib.rs @@ -38,8 +38,7 @@ use logger::Logger; pub use log::Level; -pub fn init(config: &LoggerConfig, email_alarm_config: &Option) -> Result<(), SetLoggerError> { - let email_alarm = email_alarm_config.as_ref().map(EmailAlarm::new); +pub fn init(config: &LoggerConfig, email_alarm: Option) -> Result<(), SetLoggerError> { let logger = Logger::new(config, email_alarm); log::set_max_level(logger.filter()); log::set_boxed_logger(Box::new(logger)) @@ -53,5 +52,4 @@ lazy_static! { pub static ref SLOGGER: StructuredLogger = StructuredLogger::create(); } -use email::EmailAlarm; -pub use email::EmailAlarmConfig; +pub use email::{EmailAlarm, EmailAlarmConfig}; diff --git a/util/panic_hook/Cargo.toml b/util/panic_hook/Cargo.toml index ce2785f0ab..c1bbfbe8ea 100644 --- a/util/panic_hook/Cargo.toml +++ b/util/panic_hook/Cargo.toml @@ -8,3 +8,4 @@ authors = ["Parity Technologies ", "CodeChain Team "); + email_alarm.send(&message_for_email); + exit_on_debug_mode(); +} + fn panic_message(info: &PanicInfo) -> String { let location = info.location(); let file = location.as_ref().map(|l| l.file()).unwrap_or(""); From 24e0430e71878b90a077ae7aca91df78e2588da6 Mon Sep 17 00:00:00 2001 From: Juhyung Park Date: Wed, 29 May 2019 18:45:31 +0900 Subject: [PATCH 3/3] Add machine's IP in the email --- Cargo.lock | 82 ++++++++++++++++++++++++++++++++++++++ util/panic_hook/Cargo.toml | 2 + util/panic_hook/src/lib.rs | 27 ++++++++++++- 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 4a0780cb4f..4d0a673f3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -119,6 +119,11 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "c_linked_list" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cargo_metadata" version = "0.5.4" @@ -752,6 +757,35 @@ dependencies = [ "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "curl" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "curl-sys 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "curl-sys" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "data-encoding" version = "2.1.2" @@ -951,6 +985,26 @@ name = "gcc" version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "get_if_addrs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "get_if_addrs-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "getopts" version = "0.2.17" @@ -1357,6 +1411,17 @@ dependencies = [ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libz-sys" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "limited-table" version = "0.1.0" @@ -1534,6 +1599,14 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "my_internet_ip" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "curl 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "native-tls" version = "0.2.3" @@ -1645,6 +1718,8 @@ version = "0.1.0" dependencies = [ "backtrace 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "codechain-logger 0.1.0", + "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "my_internet_ip 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2997,6 +3072,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum bitstring 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3e54f7b7a46d7b183eb41e2d82965261fa8a1597c68b50aced268ee1fc70272d" "checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d" "checksum bytes 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "2f1d50c876fb7545f5f289cd8b2aee3f359d073ae819eed5d6373638e2c61e59" +"checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cargo_metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ebd6272a2ca4fd39dbabbd6611eb03df45c2259b3b80b39a9ff8fbdcf42a4b3" "checksum cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e" "checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" @@ -3022,6 +3098,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" "checksum cuckoo 0.1.0 (git+https://github.com/CodeChain-io/rust-cuckoo.git?rev=280cab9c)" = "" +"checksum curl 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf20bbe084f285f215eef2165feed70d6b75ba29cad24469badb853a4a287d0" +"checksum curl-sys 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)" = "9d91a0052d5b982887d8e829bee0faffc7218ea3c6ebd3d6c2c8f678a93c9a42" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" @@ -3047,6 +3125,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" +"checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +"checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" "checksum getset 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54c7f36a235738bb25904d6a2b3dbb28f6f5736cd3918c4bf80d6bb236200782" "checksum globset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "464627f948c3190ae3d04b1bc6d7dca2f785bda0ac01278e6db129ad383dbeb6" @@ -3082,6 +3162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" "checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" "checksum libflate 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "76912aa0196b6f0e06d9c43ee877be45369157c06172ade12fe20ac3ee5ffa15" +"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" "checksum limited-table 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5edd8173067e26a4f03c90698a4de70084862bbbe0c7f2dfe65a1274c35a4d3e" "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" @@ -3101,6 +3182,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226" +"checksum my_internet_ip 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cdb0d83792d339eedcc44b29aba92c7126bab17c3087636903a46cec5f4bf615" "checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" "checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" "checksum never-type 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c026cbdf8890d6cab75bd177f36e948bf3a512c61f3e93898fd288f571da6551" diff --git a/util/panic_hook/Cargo.toml b/util/panic_hook/Cargo.toml index c1bbfbe8ea..021544e666 100644 --- a/util/panic_hook/Cargo.toml +++ b/util/panic_hook/Cargo.toml @@ -9,3 +9,5 @@ authors = ["Parity Technologies ", "CodeChain Team "); - email_alarm.send(&message_for_email); + email_alarm.send(&format!("IP: {}
{}", ip_addresses, message_for_email)); exit_on_debug_mode(); } @@ -91,3 +95,24 @@ fn exit_on_debug_mode() { #[cfg(not(debug_assertions))] fn exit_on_debug_mode() {} + +fn get_ip_addresses() -> String { + match my_internet_ip::get() { + Ok(ip) => return ip.to_string(), + Err(e) => { + eprintln!("Failed get internet IP: {:?}", e); + } + }; + + match get_if_addrs::get_if_addrs() { + Ok(interfaces) => { + let ip_addresses: Vec = + interfaces.iter().map(|interface| format!("{:?}", interface.ip())).collect(); + return ip_addresses.join(", ") + } + Err(err) => { + eprintln!("Failed to get local IPs: {}", err); + } + } + "Unknown".to_string() +}