void bsodFatal(const char *component) { /* show no more than one bsod while shutting down/crashing */ if (bsodhandled) return; bsodhandled = true; std::ostringstream os; os << getConfigString("config.crash.debug_path", "/home/root/logs/"); os << "enigma2_crash_"; os << time(0); os << ".log"; FILE *f = fopen(os.str().c_str(), "wb"); std::string lines = getLogBuffer(); /* find python-tracebacks, and extract " File "-strings */ size_t start = 0; std::string crash_emailaddr = CRASH_EMAILADDR; std::string crash_component = "enigma2"; if (component) crash_component = component; else { while ((start = lines.find("\n File \"", start)) != std::string::npos) { start += 9; size_t end = lines.find("\"", start); if (end == std::string::npos) break; end = lines.rfind("/", end); /* skip a potential prefix to the path */ unsigned int path_prefix = lines.find("/usr/", start); if (path_prefix != std::string::npos && path_prefix < end) start = path_prefix; if (end == std::string::npos) break; std::string filename(lines.substr(start, end - start) + INFOFILE); std::ifstream in(filename.c_str()); if (in.good()) { std::getline(in, crash_emailaddr) && std::getline(in, crash_component); in.close(); } } } if (f) { time_t t = time(0); struct tm tm; char tm_str[32]; bool detailedCrash = getConfigBool("config.crash.details", true); localtime_r(&t, &tm); strftime(tm_str, sizeof(tm_str), "%a %b %_d %T %Y", &tm); XmlGenerator xml(f); xml.open("openvix"); xml.open("enigma2"); xml.string("crashdate", tm_str); xml.string("compiledate", __DATE__); xml.string("contactemail", crash_emailaddr); xml.comment("Please email this crashlog to above address"); xml.string("skin", getConfigString("config.skin.primary_skin", "Default Skin")); xml.string("sourcedate", enigma2_date); xml.string("version", PACKAGE_VERSION); xml.close(); xml.open("image"); if(access("/proc/stb/info/boxtype", F_OK) != -1) { xml.stringFromFile("stbmodel", "/proc/stb/info/boxtype"); } else if (access("/proc/stb/info/vumodel", F_OK) != -1) { xml.stringFromFile("stbmodel", "/proc/stb/info/vumodel"); } else if (access("/proc/stb/info/model", F_OK) != -1) { xml.stringFromFile("stbmodel", "/proc/stb/info/model"); } xml.cDataFromCmd("kernelversion", "uname -a"); xml.stringFromFile("kernelcmdline", "/proc/cmdline"); xml.stringFromFile("nimsockets", "/proc/bus/nim_sockets"); if (!getConfigBool("config.plugins.crashlogautosubmit.sendAnonCrashlog", true)) { xml.cDataFromFile("stbca", "/proc/stb/info/ca"); xml.cDataFromFile("enigma2settings", eEnv::resolve("${sysconfdir}/enigma2/settings"), ".password="******"config.plugins.crashlogautosubmit.addNetwork", false)) { xml.cDataFromFile("networkinterfaces", "/etc/network/interfaces"); xml.cDataFromFile("dns", "/etc/resolv.conf"); xml.cDataFromFile("defaultgateway", "/etc/default_gw"); } if (getConfigBool("config.plugins.crashlogautosubmit.addWlan", false)) xml.cDataFromFile("wpasupplicant", "/etc/wpa_supplicant.conf"); xml.cDataFromFile("imageversion", "/etc/image-version"); xml.cDataFromFile("imageissue", "/etc/issue.net"); xml.close(); if (detailedCrash) { xml.open("software"); xml.cDataFromCmd("enigma2software", "opkg list-installed 'enigma2*'"); if(access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("xtrendsoftware", "opkg list-installed 'et-*'"); } else if (access("/proc/stb/info/vumodel", F_OK) != -1) { xml.cDataFromCmd("vuplussoftware", "opkg list-installed 'vuplus*'"); } else if (access("/proc/stb/info/model", F_OK) != -1) { xml.cDataFromCmd("dreamboxsoftware", "opkg list-installed 'dream*'"); } xml.cDataFromCmd("gstreamersoftware", "opkg list-installed 'gst*'"); xml.close(); } xml.open("crashlogs"); xml.cDataFromString("enigma2crashlog", getLogBuffer()); xml.close(); xml.close(); fclose(f); } ePtr<gMainDC> my_dc; gMainDC::getInstance(my_dc); gPainter p(my_dc); p.resetOffset(); p.resetClip(eRect(ePoint(0, 0), my_dc->size())); p.setBackgroundColor(gRGB(0x010000)); p.setForegroundColor(gRGB(0xFFFFFF)); ePtr<gFont> font = new gFont("Regular", 20); p.setFont(font); p.clear(); eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100); std::string text("We are really sorry. Your receiver encountered " "a software problem, and needs to be restarted. " "Please send the logfile created in /hdd/ to " + crash_emailaddr + ".\n" "Your receiver restarts in 10 seconds!\n" "Component: " + crash_component); p.renderText(usable_area, text.c_str(), gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT); usable_area = eRect(100, 170, my_dc->size().width() - 180, my_dc->size().height() - 20); int i; start = std::string::npos + 1; for (i=0; i<20; ++i) { start = lines.rfind('\n', start - 1); if (start == std::string::npos) { start = 0; break; } } font = new gFont("Regular", 14); p.setFont(font); p.renderText(usable_area, lines.substr(start), gPainter::RT_HALIGN_LEFT); sleep(10); /* * When 'component' is NULL, we are called because of a python exception. * In that case, we'd prefer to to a clean shutdown of the C++ objects, * and this should be safe, because the crash did not occur in the * C++ part. * However, when we got here for some other reason, a segfault probably, * we prefer to stop immediately instead of performing a clean shutdown. * We'd risk destroying things with every additional instruction we're * executing here. */ if (component) raise(SIGKILL); }
bool mql4j::config::isJavaJNIVerbose() { return getConfigBool("javaJNIVerbose", MQL4J_CONFIG_DEFAULT_JAVA_JNI_VERBOSE); }
void bsodFatal(const char *component) { /* show no more than one bsod while shutting down/crashing */ if (bsodhandled) return; bsodhandled = true; std::string lines = getLogBuffer(); /* find python-tracebacks, and extract " File "-strings */ size_t start = 0; std::string crash_emailaddr = CRASH_EMAILADDR; std::string crash_component = "enigma2"; if (component) crash_component = component; else { while ((start = lines.find("\n File \"", start)) != std::string::npos) { start += 9; size_t end = lines.find("\"", start); if (end == std::string::npos) break; end = lines.rfind("/", end); /* skip a potential prefix to the path */ unsigned int path_prefix = lines.find("/usr/", start); if (path_prefix != std::string::npos && path_prefix < end) start = path_prefix; if (end == std::string::npos) break; std::string filename(lines.substr(start, end - start) + INFOFILE); std::ifstream in(filename.c_str()); if (in.good()) { std::getline(in, crash_emailaddr) && std::getline(in, crash_component); in.close(); } } } FILE *f; const char* crashlog_name; std::ostringstream os; os << getConfigString("config.crash.debug_path", "/home/root/logs/"); os << "enigma2_crash_"; os << time(0); os << ".log"; crashlog_name = os.str().c_str(); f = fopen(crashlog_name, "wb"); if (f == NULL) { /* No hardisk. If there is a crash log in /home/root, leave it * alone because we may be in a crash loop and writing this file * all night long may damage the flash. Also, usually the first * crash log is the most interesting one. */ crashlog_name = "/home/root/logs/enigma2_crash.log"; if ((access(crashlog_name, F_OK) == 0) || ((f = fopen(crashlog_name, "wb")) == NULL)) { /* Re-write the same file in /tmp/ because it's expected to * be in RAM. So the first crash log will end up in /home * and the last in /tmp */ crashlog_name = "/tmp/enigma2_crash.log"; f = fopen(crashlog_name, "wb"); } } if (f) { time_t t = time(0); struct tm tm; char tm_str[32]; bool detailedCrash = getConfigBool("config.crash.details", true); localtime_r(&t, &tm); strftime(tm_str, sizeof(tm_str), "%a %b %_d %T %Y", &tm); XmlGenerator xml(f); xml.open("inisupport"); xml.open("enigma2"); xml.string("crashdate", tm_str); xml.string("compiledate", __DATE__); xml.string("contactemail", crash_emailaddr); xml.comment("Please email this crashlog to above address"); xml.string("skin", getConfigString("config.skin.primary_skin", "Default Skin")); xml.string("sourcedate", enigma2_date); xml.string("version", PACKAGE_VERSION); xml.close(); xml.open("image"); if(access("/proc/stb/info/boxtype", F_OK) != -1) { xml.stringFromFile("stbmodel", "/proc/stb/info/boxtype"); } else if (access("/proc/stb/info/vumodel", F_OK) != -1) { xml.stringFromFile("stbmodel", "/proc/stb/info/vumodel"); } else if (access("/proc/stb/info/model", F_OK) != -1) { xml.stringFromFile("stbmodel", "/proc/stb/info/model"); } xml.cDataFromCmd("kernelversion", "uname -a"); xml.stringFromFile("kernelcmdline", "/proc/cmdline"); xml.stringFromFile("nimsockets", "/proc/bus/nim_sockets"); xml.cDataFromFile("imageversion", "/etc/image-version"); xml.cDataFromFile("imageissue", "/etc/issue.net"); xml.close(); if (detailedCrash) { xml.open("software"); xml.cDataFromCmd("enigma2software", "opkg list-installed 'enigma2*'"); if(access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("xtrendsoftware", "opkg list-installed 'et*'"); } else if (access("/proc/stb/info/vumodel", F_OK) != -1) { xml.cDataFromCmd("vuplussoftware", "opkg list-installed 'vuplus*'"); } else if (access("/proc/stb/info/model", F_OK) != -1) { xml.cDataFromCmd("dreamboxsoftware", "opkg list-installed 'dream*'"); } else if (access("/proc/stb/info/azmodel", F_OK) != -1) { xml.cDataFromCmd("azboxboxsoftware", "opkg list-installed 'az*'"); } else if (access("/proc/stb/info/gbmodel", F_OK) != -1) { xml.cDataFromCmd("gigabluesoftware", "opkg list-installed 'gb*'"); } else if (access("/proc/stb/info/hwmodel", F_OK) != -1) { xml.cDataFromCmd("technomatesoftware", "opkg list-installed 'tm*'"); } else if (access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("inisoftware", "opkg list-installed 'ini*'"); } else if (access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("maxdigitalsoftware", "opkg list-installed 'xp*'"); } else if (access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("odinsoftware", "opkg list-installed 'odin*'"); } else if (access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("eboxsoftware", "opkg list-installed 'ebox*'"); } else if (access("/proc/stb/info/boxtype", F_OK) != -1) { xml.cDataFromCmd("medialinksoftware", "opkg list-installed 'ixuss*'"); } xml.cDataFromCmd("gstreamersoftware", "opkg list-installed 'gst*'"); xml.close(); } xml.open("crashlogs"); xml.cDataFromString("enigma2crashlog", getLogBuffer()); xml.close(); xml.close(); fclose(f); } ePtr<gMainDC> my_dc; gMainDC::getInstance(my_dc); gPainter p(my_dc); p.resetOffset(); p.resetClip(eRect(ePoint(0, 0), my_dc->size())); p.setBackgroundColor(gRGB(0x010000)); p.setForegroundColor(gRGB(0xFFFFFF)); ePtr<gFont> font = new gFont("Regular", 20); p.setFont(font); p.clear(); eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100); os.str(""); os.clear(); os << "We are really sorry. Your receiver encountered " "a software problem, and needs to be restarted.\n" "Please send the logfile " << crashlog_name << " to " << crash_emailaddr << ".\n" "Your receiver restarts in 10 seconds!\n" "Component: " << crash_component; p.renderText(usable_area, os.str().c_str(), gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT); usable_area = eRect(100, 170, my_dc->size().width() - 180, my_dc->size().height() - 20); int i; start = std::string::npos + 1; for (i=0; i<20; ++i) { start = lines.rfind('\n', start - 1); if (start == std::string::npos) { start = 0; break; } } font = new gFont("Regular", 14); p.setFont(font); p.renderText(usable_area, lines.substr(start), gPainter::RT_HALIGN_LEFT); sleep(10); /* * When 'component' is NULL, we are called because of a python exception. * In that case, we'd prefer to to a clean shutdown of the C++ objects, * and this should be safe, because the crash did not occur in the * C++ part. * However, when we got here for some other reason, a segfault probably, * we prefer to stop immediately instead of performing a clean shutdown. * We'd risk destroying things with every additional instruction we're * executing here. */ if (component) raise(SIGKILL); }
bool mql4j::config::isJavaClassloaderVerbose() { return getConfigBool("javaClassloaderVerbose", MQL4J_CONFIG_DEFAULT_JAVA_CLASSLOADER_VERBOSE); }