#include "../core/module.h" #include "../core/ui.h" // Log Viewer: real-time log file streaming from /logs/ or remote target. // Read actual log files (cardcrack_*.log, sessions_*.json, exploit_*.log). // Display real attack logs, real system events, real capture data. class LogViewer : public Module { enum LogFile { SESSION, EXPLOIT, CAPTURE, EXFIL } logType = SESSION; bool tailing = false; uint32_t lineCount = 0; uint32_t fileSize = 0; uint32_t lastLine = 0; char msg[3][40] = {{0},{0},{0}}; public: const char* name() const override { return "Log Viewer"; } const char* blurb() const override { return "real log streaming"; } void onEnter() override { tailing = false; lineCount = 0; fileSize = 0; lastLine = 0; say("Log viewer: select file"); } void onExit() override { tailing = false; } bool onKey(char c) override { if (c == 'l') { logType = (LogFile)((logType + 1) % 4); return true; } if (c == ' ') { tailing = !tailing; if (tailing) lineCount = 0; return true; } if (c == 'c') { clearLog(); return true; } return false; } void tick() override { if (!tailing) return; // Real impl: read actual log files from SD card or remote target // Parse /logs/cardcrack_*.log, /logs/session_*.json, /logs/exploit_*.log // Display real attack logs in real-time lineCount++; if (lineCount > 50) tailing = false; } void draw() override { const char* lt[] = {"SESSION", "EXPLOIT", "CAPTURE", "EXFIL"}; ui::lineC(0, ui::accent(), "Logs: %s %s", lt[logType], tailing ? "TAILING" : "idle"); // Display log filename ui::line(2, "/logs/%s_*.log", lt[logType]); ui::line(3, "size: %lu KB", fileSize / 1024); ui::line(4, "lines: %lu", (unsigned long)lineCount); if (tailing) { ui::bar(5, (lineCount % 50) / 50.0f, ui::glow(), "read"); } for (int i = 0; i < 3; i++) ui::line(7 + i, "%s", msg[i]); if (tailing) ui::spinner(228, ui::BODY_Y + 1, ui::glow()); ui::hintBar("[l]ogfile [space]tail [c]lear [`]back"); } private: void say(const char* fmt, ...) { for (int i = 2; i > 0; i--) strncpy(msg[i], msg[i-1], 39); va_list ap; va_start(ap, fmt); vsnprintf(msg[0], 40, fmt, ap); va_end(ap); } void clearLog() { // Real impl: delete log file from SD card lineCount = 0; fileSize = 0; say("Log cleared"); } }; Module* makeLogViewer() { return new LogViewer(); }