Files
LumberJack_TUI/log_parsing/log_parsing.cpp
rapturate 42f50c9e9a 1) First draft of the TUI functionality
2) Added env_reader functions (env.hpp and env.cpp)
3) Program looks for a .env on startup and creates one based on user input if not found.
4) Refactored log_parsing and ip_to_geo to use the global env variables for parsing and ip lookup from the local .mmdb database
5) CMakeLists.txt is now cross platform functional
6) Added various cross platform checks for creating .env variables
2026-06-09 14:29:42 -04:00

123 lines
4.6 KiB
C++

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <ostream>
#include <string>
#include <vector>
#include <regex>
#include "log_parsing.hpp"
#include "../ip_to_geo/ip_to_geo.hpp"
p_logs::p_logs(std::string log_path) {
if(log_path.empty()){
log_path = std::getenv("LOG_PATH");
}
std::ifstream file(log_path);
if (!file.is_open()) {
std::cerr << "Error loading " << log_path << std::endl;
return;
}
std::regex log_pattern(R"((\S+)\s+-\s+-\s+\[([^\]]+)\]\s+\"([^\"]+)\"\s+(\d+)\s+(\d+|-)\s+\"([^\"]*)\"\s+\"([^\"]*)\")");
std::string line;
std::smatch match;
while (getline(file, line)) {
if (regex_search(line, match, log_pattern)) {
Entry current_entry;
current_entry.ip = match[1].str();
current_entry.timestamp = match[2].str();
current_entry.request = match[3].str();
current_entry.status = match[4].str();
current_entry.bytes = match[5].str();
current_entry.referer = match[6].str();
std::string raw_ua = match[7].str();
if (raw_ua.find("Windows NT 10.0") != std::string::npos) current_entry.os = "Windows 10/11";
else if (raw_ua.find("Windows NT 6.1") != std::string::npos) current_entry.os = "Windows 7";
else if (raw_ua.find("iPhone") != std::string::npos) current_entry.os = "iOS (iPhone)";
else if (raw_ua.find("iPad") != std::string::npos) current_entry.os = "iOS (iPad)";
else if (raw_ua.find("Android") != std::string::npos) current_entry.os = "Android";
else if (raw_ua.find("Macintosh") != std::string::npos) current_entry.os = "macOS";
else if (raw_ua.find("Linux") != std::string::npos) current_entry.os = "Linux";
else current_entry.os = "Unknown OS";
if (raw_ua.find("Edg/") != std::string::npos) current_entry.browser = "Microsoft Edge";
else if (raw_ua.find("OPR/") != std::string::npos) current_entry.browser = "Opera";
else if (raw_ua.find("Chrome/") != std::string::npos) current_entry.browser = "Google Chrome";
else if (raw_ua.find("Safari/") != std::string::npos) current_entry.browser = "Apple Safari";
else if (raw_ua.find("Firefox/") != std::string::npos) current_entry.browser = "Mozilla Firefox";
else if (raw_ua.find("curl/") != std::string::npos) current_entry.browser = "curl (CLI Tool)";
else current_entry.browser = "Unknown Browser/Bot";
current_entry.location = iplookup(current_entry.ip);
logs.push_back(current_entry);
}
}
file.close();
}
std::vector<Entry> p_logs::get_all_logs(){
return logs;
}
std::string p_logs::entryx_ip(int x){
return logs[x].ip;
}
std::string p_logs::entryx_timestamp(int x){
return logs[x].timestamp;
}
std::string p_logs::entryx_request(int x){
return logs[x].request;
}
std::string p_logs::entryx_status(int x){
return logs[x].status;
}
std::string p_logs::entryx_bytes(int x){
return logs[x].bytes;
}
std::string p_logs::entryx_referer(int x){
return logs[x].referer;
}
std::string p_logs::entryx_os(int x){
return logs[x].os;
}
std::string p_logs::entryx_browser(int x){
return logs[x].browser;
}
void p_logs::print_logs() {
std::ios_base::sync_with_stdio(false);
for (const auto& log : logs) {
std::cout << "IP: " << log.ip.c_str() << "\n"
<< "Location Data:" << "\n"
<< "\tCountry: " << log.location.country << "\n"
<< "\tSubdivision: " << log.location.subdivision << "\n"
<< "\tCity: " << log.location.city << "\n"
<< "\tLongitude: " << log.location.longitude << "\n"
<< "\tLatitude: " << log.location.latitutde << "\n"
<< "Timestamp: " << log.timestamp.c_str() << "\n"
<< "Request: " << log.request.c_str() << "\n"
<< "Status: " << log.status.c_str() << "\n"
<< "Bytes: " << log.bytes.c_str() << "\n"
<< "Referer: " << log.referer.c_str() << "\n"
<< "OS: " << log.os.c_str() << "\n"
<< "Browser: " << log.browser.c_str() << "\n\n"
<< "-----------------------------\n\n";
}
std::cout.flush();
}