src/plugin.[ch]: Added a notification type and auxiliary functions.
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sun, 28 Oct 2007 17:45:46 +0000 (18:45 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sun, 28 Oct 2007 17:45:46 +0000 (18:45 +0100)
src/plugin.c
src/plugin.h

index 37c91a9..67d6188 100644 (file)
@@ -54,6 +54,7 @@ static llist_t *list_write;
 static llist_t *list_shutdown;
 static llist_t *list_data_set;
 static llist_t *list_log;
+static llist_t *list_notification;
 
 static char *plugindir = NULL;
 
@@ -463,6 +464,12 @@ int plugin_register_log (char *name,
        return (register_callback (&list_log, name, (void *) callback));
 } /* int plugin_register_log */
 
+int plugin_register_notification (const char *name,
+               int (*callback) (const notification_t *notif))
+{
+       return (register_callback (&list_log, name, (void *) callback));
+} /* int plugin_register_log */
+
 int plugin_unregister_config (const char *name)
 {
        cf_unregister (name);
@@ -534,6 +541,11 @@ int plugin_unregister_log (const char *name)
        return (plugin_unregister (list_log, name));
 }
 
+int plugin_unregister_notification (const char *name)
+{
+       return (plugin_unregister (list_notification, name));
+}
+
 void plugin_init_all (void)
 {
        int (*callback) (void);
@@ -697,6 +709,28 @@ int plugin_dispatch_values (const char *name, value_list_t *vl)
        return (0);
 } /* int plugin_dispatch_values */
 
+int plugin_dispatch_notification (const notification_t *notif)
+{
+       int (*callback) (const notification_t *);
+       llentry_t *le;
+       /* Possible TODO: Add flap detection here */
+
+       /* Nobody cares for notifications */
+       if (list_notification == NULL)
+               return (-1);
+
+       le = llist_head (list_notification);
+       while (le != NULL)
+       {
+               callback = (int (*) (const notification_t *)) le->value;
+               (*callback) (notif);
+
+               le = le->next;
+       }
+
+       return (0);
+} /* int plugin_dispatch_notification */
+
 void plugin_log (int level, const char *format, ...)
 {
        char msg[512];
index 4ca6c77..8c5acab 100644 (file)
 # define LOG_DEBUG 7
 #endif
 
+#define NOTIF_MAX_MSG_LEN 128
+
+#define NOTIF_FAILURE 1
+#define NOTIF_WARNING 2
+#define NOTIF_OKAY    4
+
 /*
  * Public data types
  */
@@ -97,6 +103,14 @@ typedef struct complain_s
        unsigned int delay;    /* how many more iterations we still need to wait */
 } complain_t;
 
+typedef struct notification_s
+{
+       int    severity;
+       char   message[NOTIF_MAX_MSG_LEN];
+       time_t time;
+       char   host[DATA_MAX_NAME_LEN];
+} notification_t;
+
 /*
  * NAME
  *  plugin_set_dir
@@ -160,6 +174,8 @@ int plugin_register_shutdown (char *name,
 int plugin_register_data_set (const data_set_t *ds);
 int plugin_register_log (char *name,
                void (*callback) (int, const char *));
+int plugin_register_notification (const char *name,
+               int (*callback) (const notification_t *notif));
 
 int plugin_unregister_config (const char *name);
 int plugin_unregister_complex_config (const char *name);
@@ -169,6 +185,7 @@ int plugin_unregister_write (const char *name);
 int plugin_unregister_shutdown (const char *name);
 int plugin_unregister_data_set (const char *name);
 int plugin_unregister_log (const char *name);
+int plugin_unregister_notification (const char *name);
 
 
 /*
@@ -188,6 +205,8 @@ int plugin_unregister_log (const char *name);
  */
 int plugin_dispatch_values (const char *name, value_list_t *vl);
 
+int plugin_dispatch_notification (const notification_t *notif);
+
 void plugin_log (int level, const char *format, ...);
 #define ERROR(...)   plugin_log (LOG_ERR,     __VA_ARGS__)
 #define WARNING(...) plugin_log (LOG_WARNING, __VA_ARGS__)