]> granicus.if.org Git - icinga2/commitdiff
Improve error handling for event filters
authorGunnar Beutner <gunnar.beutner@netways.de>
Fri, 2 Sep 2016 06:51:51 +0000 (08:51 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Fri, 2 Sep 2016 06:51:51 +0000 (08:51 +0200)
fixes #12621

lib/base/context.cpp
lib/base/debuginfo.cpp
lib/remote/eventqueue.cpp
lib/remote/eventqueue.hpp
lib/remote/eventshandler.cpp

index efee1e5f9dc02faf9e6dbc6cb47b113968cbdd57..921af6688d2719bd4b1b6993a4ee21b85202a59e 100644 (file)
@@ -48,6 +48,9 @@ ContextTrace::ContextTrace(void)
 
 void ContextTrace::Print(std::ostream& fp) const
 {
+       if (m_Frames.empty())
+               return;
+
        fp << std::endl;
 
        int i = 0;
index bc94c6b4b402e277df93a06776a9f84096f307d9..ce5aa3b4d1e5c5d94f12522c598661e5e212ff9a 100644 (file)
@@ -62,7 +62,7 @@ void icinga::ShowCodeLocation(std::ostream& out, const DebugInfo& di, bool verbo
        if (di.Path.IsEmpty())
                return;
 
-       out << "Location: " << di << "\n";
+       out << "Location: " << di;
 
        std::ifstream ifs;
        ifs.open(di.Path.CStr(), std::ifstream::in);
@@ -71,6 +71,9 @@ void icinga::ShowCodeLocation(std::ostream& out, const DebugInfo& di, bool verbo
        char line[1024];
 
        while (ifs.good() && lineno <= di.LastLine + EXTRA_LINES) {
+               if (lineno == 0)
+                       out << "\n";
+
                lineno++;
 
                ifs.getline(line, sizeof(line));
index 09727700b3cbafcdc72d4f203e00aca0eba03aca..211fe717c4833bcf61f9d1d32fefd39380fa3bec 100644 (file)
@@ -23,8 +23,8 @@
 
 using namespace icinga;
 
-EventQueue::EventQueue(void)
-    : m_Filter(NULL)
+EventQueue::EventQueue(const String& name)
+    : m_Name(name), m_Filter(NULL)
 { }
 
 EventQueue::~EventQueue(void)
@@ -44,8 +44,14 @@ void EventQueue::ProcessEvent(const Dictionary::Ptr& event)
        ScriptFrame frame;
        frame.Sandboxed = true;
 
-       if (!FilterUtility::EvaluateFilter(frame, m_Filter, event, "event"))
+       try {
+               if (!FilterUtility::EvaluateFilter(frame, m_Filter, event, "event"))
+                       return;
+       } catch (const std::exception& ex) {
+               Log(LogWarning, "EventQueue")
+                   << "Error occurred while evaluating event filter for queue '" << m_Name << "': " << DiagnosticInformation(ex);
                return;
+       }
 
        boost::mutex::scoped_lock lock(m_Mutex);
 
index b34b36c8b82f9108c5824b9e167326ed90b669f1..3ed9d601384418ddc19d68bdfba14b4dd12b167c 100644 (file)
@@ -38,7 +38,7 @@ class I2_REMOTE_API EventQueue : public Object
 public:
        DECLARE_PTR_TYPEDEFS(EventQueue);
 
-       EventQueue(void);
+       EventQueue(const String& name);
        ~EventQueue(void);
 
        bool CanProcessEvent(const String& type) const;
@@ -59,6 +59,8 @@ public:
        static void Unregister(const String& name);
 
 private:
+       String m_Name;
+
        mutable boost::mutex m_Mutex;
        boost::condition_variable m_CV;
 
index d782a8088b964e234da34147cb1142e666c9a57b..7a7d877357e2160645e67dc3b4581e3d267149b2 100644 (file)
@@ -75,7 +75,7 @@ bool EventsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request
        EventQueue::Ptr queue = EventQueue::GetByName(queueName);
 
        if (!queue) {
-               queue = new EventQueue();
+               queue = new EventQueue(queueName);
                EventQueue::Register(queueName, queue);
        }