Skip to content

Commit

Permalink
add support for dumping warning and error log messages to stdout upon…
Browse files Browse the repository at this point in the history
… exit
  • Loading branch information
d99kris committed Aug 3, 2024
1 parent 28ff940 commit d80accd
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 21 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ Full example of a config file `~/.config/nmail/main.conf`:
imap_host=imap.example.com
imap_port=993
inbox=Inbox
logdump_enabled=0
msg_viewer_cmd=
name=Firstname Lastname
network_timeout=30
Expand Down Expand Up @@ -423,6 +424,10 @@ IMAP port. Required for fetching emails.

IMAP inbox folder name. Required for nmail to open the proper default folder.

### logdump_enabled

Specifies whether to dump warning and error log messages to stdout upon exit.

### msg_viewer_cmd

This field allows overriding the command used for externally viewing a
Expand Down
15 changes: 14 additions & 1 deletion src/log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ std::string Log::m_Path;
int Log::m_VerboseLevel = 0;
std::mutex Log::m_Mutex;
int Log::m_LogFd = -1;
bool Log::m_HadWarnErr = false;

void Log::SetPath(const std::string& p_Path)
{
Expand All @@ -35,12 +36,22 @@ void Log::SetPath(const std::string& p_Path)
m_LogFd = open(m_Path.c_str(), O_WRONLY | O_APPEND);
}

void Log::Cleanup()
void Log::Cleanup(bool p_IsLogdumpEnabled)
{
if (m_LogFd != -1)
{
close(m_LogFd);
}

if (p_IsLogdumpEnabled && m_HadWarnErr)
{
const std::string cmd = "grep -e '| ERROR |' -e '| WARN |' " + m_Path;
const int rv = system(cmd.c_str());
if (rv != 0)
{
printf("log dump command failed: %s\n", cmd.c_str());
}
}
}

void Log::SetVerboseLevel(int p_Level)
Expand Down Expand Up @@ -84,6 +95,7 @@ void Log::Warning(const char* p_Filename, int p_LineNo, const char* p_Format, ..
va_start(vaList, p_Format);
Write(p_Filename, p_LineNo, "WARN ", p_Format, vaList);
va_end(vaList);
m_HadWarnErr = true;
}

void Log::Error(const char* p_Filename, int p_LineNo, const char* p_Format, ...)
Expand All @@ -92,6 +104,7 @@ void Log::Error(const char* p_Filename, int p_LineNo, const char* p_Format, ...)
va_start(vaList, p_Format);
Write(p_Filename, p_LineNo, "ERROR", p_Format, vaList);
va_end(vaList);
m_HadWarnErr = true;
}

void Log::Dump(const char* p_Str)
Expand Down
3 changes: 2 additions & 1 deletion src/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class Log
static const int TRACE_LEVEL = 2;

static void SetPath(const std::string& p_Path);
static void Cleanup();
static void Cleanup(bool p_IsLogdumpEnabled);
static void SetVerboseLevel(int p_Level);
static inline int GetVerboseLevel() { return m_VerboseLevel; }
static inline bool GetTraceEnabled() { return m_VerboseLevel >= TRACE_LEVEL; }
Expand All @@ -41,4 +41,5 @@ class Log
static int m_VerboseLevel;
static std::mutex m_Mutex;
static int m_LogFd;
static bool m_HadWarnErr;
};
37 changes: 20 additions & 17 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ int main(int argc, char* argv[])
{ "downloads_dir", "" },
{ "idle_timeout", "29" },
{ "sni_enabled", "1" },
{ "logdump_enabled", "0" },
};
const std::string mainConfigPath(Util::GetApplicationDir() + std::string("main.conf"));
std::shared_ptr<Config> mainConfig = std::make_shared<Config>(mainConfigPath, defaultMainConfig);
Expand Down Expand Up @@ -286,6 +287,7 @@ int main(int argc, char* argv[])
Util::SetDownloadsDir(mainConfig->Get("downloads_dir"));
const bool isCoredumpEnabled = (mainConfig->Get("coredump_enabled") == "1");
const bool sniEnabled = (mainConfig->Get("sni_enabled") == "1");
const bool isLogdumpEnabled = (mainConfig->Get("logdump_enabled") == "1");

// Set logging verbosity level based on config, if not specified with command line arguments
if (Log::GetVerboseLevel() == Log::INFO_LEVEL)
Expand Down Expand Up @@ -390,7 +392,7 @@ int main(int argc, char* argv[])

Auth::Init(auth, authEncrypt, pass, isSetup);

Ui ui(inbox, address, name, prefetchLevel, prefetchAllHeaders);
std::shared_ptr<Ui> ui = std::make_shared<Ui>(inbox, address, name, prefetchLevel, prefetchAllHeaders);

std::shared_ptr<ImapManager> imapManager =
std::make_shared<ImapManager>(user, pass, imapHost, imapPort, online,
Expand All @@ -399,37 +401,37 @@ int main(int argc, char* argv[])
idleTimeout,
foldersExclude,
sniEnabled,
std::bind(&Ui::ResponseHandler, std::ref(ui), std::placeholders::_1,
std::bind(&Ui::ResponseHandler, ui.get(), std::placeholders::_1,
std::placeholders::_2),
std::bind(&Ui::ResultHandler, std::ref(ui), std::placeholders::_1,
std::bind(&Ui::ResultHandler, ui.get(), std::placeholders::_1,
std::placeholders::_2),
std::bind(&Ui::StatusHandler, std::ref(ui), std::placeholders::_1),
std::bind(&Ui::SearchHandler, std::ref(ui), std::placeholders::_1,
std::bind(&Ui::StatusHandler, ui.get(), std::placeholders::_1),
std::bind(&Ui::SearchHandler, ui.get(), std::placeholders::_1,
std::placeholders::_2),
idleInbox, inbox);

std::shared_ptr<SmtpManager> smtpManager =
std::make_shared<SmtpManager>(smtpUser, smtpPass, smtpHost, smtpPort, name, address, online,
networkTimeout,
std::bind(&Ui::SmtpResultHandler, std::ref(ui), std::placeholders::_1),
std::bind(&Ui::StatusHandler, std::ref(ui), std::placeholders::_1));
std::bind(&Ui::SmtpResultHandler, ui.get(), std::placeholders::_1),
std::bind(&Ui::StatusHandler, ui.get(), std::placeholders::_1));

OfflineQueue::Init(queueEncrypt, pass);

ui.SetImapManager(imapManager);
ui.SetTrashFolder(trash);
ui.SetDraftsFolder(drafts);
ui.SetSentFolder(sent);
ui.SetClientStoreSent(clientStoreSent);
ui.SetSmtpManager(smtpManager);
ui->SetImapManager(imapManager);
ui->SetTrashFolder(trash);
ui->SetDraftsFolder(drafts);
ui->SetSentFolder(sent);
ui->SetClientStoreSent(clientStoreSent);
ui->SetSmtpManager(smtpManager);

imapManager->Start();
smtpManager->Start();

ui.Run();
ui->Run();

ui.ResetSmtpManager();
ui.ResetImapManager();
ui->ResetSmtpManager();
ui->ResetImapManager();

smtpManager.reset();
imapManager.reset();
Expand All @@ -448,9 +450,10 @@ int main(int argc, char* argv[])

Util::CleanupStdErrRedirect();

ui.reset();
LOG_INFO("exit");

Log::Cleanup();
Log::Cleanup(isLogdumpEnabled);

return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion src/nmail.1
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man.
.TH NMAIL "1" "August 2024" "nmail 5.1.7" "User Commands"
.TH NMAIL "1" "August 2024" "nmail 5.1.8" "User Commands"
.SH NAME
nmail \- ncurses mail
.SH SYNOPSIS
Expand Down
2 changes: 1 addition & 1 deletion src/version.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

#include "version.h"

#define NMAIL_VERSION "5.1.7"
#define NMAIL_VERSION "5.1.8"

std::string Version::GetBuildOs()
{
Expand Down

0 comments on commit d80accd

Please sign in to comment.