1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "base/i2-base.hpp"
7 #include "base/application-ti.hpp"
8 #include "base/logger.hpp"
9 #include "base/configuration.hpp"
18 * Abstract base class for applications.
22 class Application : public ObjectImpl<Application> {
24 DECLARE_OBJECT(Application);
26 static boost::signals2::signal<void ()> OnReopenLogs;
28 ~Application() override;
30 static void InitializeBase();
31 static void UninitializeBase();
33 static Application::Ptr GetInstance();
35 static void Exit(int rc);
40 * Starts the application.
42 * @returns The exit code of the application.
44 virtual int Main() = 0;
46 static void SetResourceLimits();
49 static void SetArgC(int argc);
51 static char **GetArgV();
52 static void SetArgV(char **argv);
54 static void InstallExceptionHandlers();
56 static void RequestShutdown();
57 static void RequestRestart();
58 static void RequestReopenLogs();
60 static bool IsShuttingDown();
61 static bool IsRestarting();
63 static void SetDebuggingSeverity(LogSeverity severity);
64 static LogSeverity GetDebuggingSeverity();
66 void UpdatePidFile(const String& filename);
67 void UpdatePidFile(const String& filename, pid_t pid);
68 void ClosePidFile(bool unlink);
69 static pid_t ReadPidFile(const String& filename);
71 static String GetExePath(const String& argv0);
74 static bool IsProcessElevated();
77 static int GetDefaultRLimitFiles();
78 static int GetDefaultRLimitProcesses();
79 static int GetDefaultRLimitStack();
81 static double GetReloadTimeout();
83 static ThreadPool& GetTP();
85 static String GetAppVersion();
86 static String GetAppSpecVersion();
88 static String GetAppEnvironment();
89 static void SetAppEnvironment(const String& name);
91 static double GetStartTime();
92 static void SetStartTime(double ts);
94 static double GetMainTime();
95 static void SetMainTime(double ts);
97 static bool GetScriptDebuggerEnabled();
98 static void SetScriptDebuggerEnabled(bool enabled);
100 static double GetLastReloadFailed();
101 static void SetLastReloadFailed(double ts);
103 static void DisplayInfoMessage(std::ostream& os, bool skipVersion = false);
106 void OnConfigLoaded() override;
107 void Stop(bool runtimeRemoved) override;
111 pid_t StartReloadProcess();
113 virtual void OnShutdown();
115 void ValidateName(const Lazy<String>& lvalue, const ValidationUtils& utils) final;
118 static Application::Ptr m_Instance; /**< The application instance. */
120 static bool m_ShuttingDown; /**< Whether the application is in the process of shutting down. */
121 static bool m_RequestRestart; /**< A restart was requested through SIGHUP */
122 static pid_t m_ReloadProcess; /**< The PID of a subprocess doing a reload, only valid when l_Restarting==true */
123 static bool m_RequestReopenLogs; /**< Whether we should re-open log files. */
125 static int m_ArgC; /**< The number of command-line arguments. */
126 static char **m_ArgV; /**< Command-line arguments. */
127 FILE *m_PidFile; /**< The PID file */
128 static bool m_Debugging; /**< Whether debugging is enabled. */
129 static LogSeverity m_DebuggingSeverity; /**< Whether debugging severity is set. */
130 static double m_StartTime;
131 static double m_MainTime;
132 static bool m_ScriptDebuggerEnabled;
133 static double m_LastReloadFailed;
136 static void SigIntTermHandler(int signum);
138 static BOOL WINAPI CtrlHandler(DWORD type);
139 static LONG WINAPI SEHUnhandledExceptionFilter(PEXCEPTION_POINTERS exi);
142 static void DisplayBugMessage(std::ostream& os);
144 static void SigAbrtHandler(int signum);
145 static void SigUsr1Handler(int signum);
146 static void SigUsr2Handler(int signum);
147 static void ExceptionHandler();
149 static String GetCrashReportFilename();
151 static void AttachDebugger(const String& filename, bool interactive);
156 #endif /* APPLICATION_H */