Icinga-core 1.4.0
next gen monitoring
module/idoutils/include/ido2db.h
Go to the documentation of this file.
00001 /************************************************************************
00002  *
00003  * IDO2DB.H - IDO2DB Include File
00004  * Copyright (c) 2005-2007 Ethan Galstad
00005  * Copyright (c) 2009-2011 Icinga Development Team (http://www.icinga.org)
00006  *
00007  ************************************************************************/
00008 
00009 #ifndef _IDO2DB_IDO2DB_H
00010 #define _IDO2DB_IDO2DB_H
00011 
00012 #include "../../../include/config.h"
00013 #include "utils.h"
00014 
00015 #define IDO2DB_NAME "IDO2DB"
00016 #define IDO2DB_DATE "05-11-2011"
00017 #define IDO2DB_VERSION "1.4.0"
00018 
00019 #define IDO2DB_SCHEMA_VERSION "1.4.0"
00020 
00021 /*************** RDBMS headers *************/
00022 
00023 /* oracle */
00024 #ifdef USE_ORACLE
00025 
00026 #ifdef HAVE_CONFIG_H
00027 #undef HAVE_CONFIG_H
00028 #include <ocilib.h>
00029 #define HAVE_CONFIG_H
00030 #else
00031 #include <ocilib.h>
00032 #endif
00033 
00034 #endif
00035 
00036 /* pgsql */
00037 #ifdef HAVE_LIBPQ_FE_H
00038 #include <libpq-fe.h>
00039 #endif
00040 
00041 /* libdbi */
00042 #ifdef HAVE_DBI_DBI_H
00043 #include <dbi/dbi.h>
00044 #endif
00045 
00046 
00047 /*************** mbuf definitions *************/
00048 #define IDO2DB_MBUF_CONTACTGROUP                        0
00049 #define IDO2DB_MBUF_CONTACTGROUPMEMBER                  1
00050 #define IDO2DB_MBUF_SERVICEGROUPMEMBER                  2
00051 #define IDO2DB_MBUF_HOSTGROUPMEMBER                     3
00052 #define IDO2DB_MBUF_SERVICENOTIFICATIONCOMMAND          4
00053 #define IDO2DB_MBUF_HOSTNOTIFICATIONCOMMAND             5
00054 #define IDO2DB_MBUF_CONTACTADDRESS                      6
00055 #define IDO2DB_MBUF_TIMERANGE                           7
00056 #define IDO2DB_MBUF_PARENTHOST                          8
00057 #define IDO2DB_MBUF_CONFIGFILEVARIABLE                  9
00058 #define IDO2DB_MBUF_CONFIGVARIABLE                      10
00059 #define IDO2DB_MBUF_RUNTIMEVARIABLE                     11
00060 #define IDO2DB_MBUF_CUSTOMVARIABLE                      12
00061 #define IDO2DB_MBUF_CONTACT                             13
00062 
00063 #define IDO2DB_MAX_MBUF_ITEMS                           14
00064 
00065 #define IDO2DB_MAX_BUFLEN                               16384
00066 
00067 
00068 /***************** structures *****************/
00069 
00070 typedef struct ido2db_mbuf_struct{
00071         int used_lines;
00072         int allocated_lines;
00073         char **buffer;
00074         }ido2db_mbuf;
00075 
00076 
00077 typedef struct ido2db_dbobject_struct{
00078         char *name1;
00079         char *name2;
00080         int object_type;
00081         unsigned long object_id;
00082         struct ido2db_dbobject_struct *nexthash;
00083         }ido2db_dbobject;
00084 
00085 
00086 typedef struct ido2db_dbconninfo_struct{
00087         int server_type;
00088         int connected;
00089         int error;
00090 #ifdef USE_LIBDBI /* libdbi specific */
00091         dbi_conn dbi_conn;
00092         dbi_result dbi_result;
00093 #endif
00094 
00095 #ifdef USE_PGSQL /* pgsql specific */
00096         PGconn *pg_conn;
00097         PGresult *pg_result;
00098 #endif
00099 
00100 #ifdef USE_ORACLE /* Oracle ocilib specific */
00101         OCI_Connection* oci_connection;
00102         OCI_Statement* oci_statement;
00103         OCI_Resultset* oci_resultset;
00104         /* for bind params keep prepared statements */
00105         OCI_Statement* oci_statement_objects_insert;
00106         OCI_Statement* oci_statement_logentries_insert;
00107         OCI_Statement* oci_statement_startup_clean;
00108         OCI_Statement* oci_statement_timedevents;
00109         OCI_Statement* oci_statement_timedevents_queue;
00110         OCI_Statement* oci_statement_timedeventqueue;
00111         OCI_Statement* oci_statement_hostchecks;
00112         OCI_Statement* oci_statement_hoststatus;
00113         OCI_Statement* oci_statement_servicechecks;
00114         OCI_Statement* oci_statement_servicestatus;
00115         OCI_Statement* oci_statement_contact_notificationcommands;
00116         OCI_Statement* oci_statement_programstatus;
00117         OCI_Statement* oci_statement_systemcommanddata;
00118         OCI_Statement* oci_statement_eventhandlerdata;
00119         OCI_Statement* oci_statement_notificationdata;
00120         OCI_Statement* oci_statement_contactnotificationdata;
00121         OCI_Statement* oci_statement_contactnotificationmethoddata;
00122         OCI_Statement* oci_statement_commentdata;
00123         OCI_Statement* oci_statement_commentdata_history;
00124         OCI_Statement* oci_statement_downtimedata_scheduled_downtime;
00125         OCI_Statement* oci_statement_downtimedata_downtime_history;
00126         OCI_Statement* oci_statement_contactstatusdata;
00127         OCI_Statement* oci_statement_configfilevariables;
00128         OCI_Statement* oci_statement_configfilevariables_insert;
00129         OCI_Statement* oci_statement_runtimevariables;
00130         OCI_Statement* oci_statement_hostdefinition_definition;
00131         OCI_Statement* oci_statement_hostdefinition_parenthosts;
00132         OCI_Statement* oci_statement_hostdefinition_contactgroups;
00133         OCI_Statement* oci_statement_hostdefinition_contacts;
00134         OCI_Statement* oci_statement_hostgroupdefinition_definition;
00135         OCI_Statement* oci_statement_hostgroupdefinition_hostgroupmembers;
00136         OCI_Statement* oci_statement_servicedefinition_definition;
00137         OCI_Statement* oci_statement_servicedefinition_contactgroups;
00138         OCI_Statement* oci_statement_servicedefinition_contacts;
00139         OCI_Statement* oci_statement_servicegroupdefinition_definition;
00140         OCI_Statement* oci_statement_servicegroupdefinition_members;
00141         OCI_Statement* oci_statement_hostdependencydefinition_definition;
00142         OCI_Statement* oci_statement_servicedependencydefinition_definition;
00143         OCI_Statement* oci_statement_hostescalationdefinition_definition;
00144         OCI_Statement* oci_statement_hostescalationdefinition_contactgroups;
00145         OCI_Statement* oci_statement_hostescalationdefinition_contacts;
00146         OCI_Statement* oci_statement_serviceescalationdefinition_definition;
00147         OCI_Statement* oci_statement_serviceescalationdefinition_contactgroups;
00148         OCI_Statement* oci_statement_serviceescalationdefinition_contacts;
00149         OCI_Statement* oci_statement_commanddefinition_definition;
00150         OCI_Statement* oci_statement_timeperiodefinition_definition;
00151         OCI_Statement* oci_statement_timeperiodefinition_timeranges;
00152         OCI_Statement* oci_statement_contactdefinition_definition;
00153         OCI_Statement* oci_statement_contactdefinition_addresses;
00154         OCI_Statement* oci_statement_contactdefinition_servicenotificationcommands;
00155         OCI_Statement* oci_statement_save_custom_variables_customvariables;
00156         OCI_Statement* oci_statement_save_custom_variables_customvariablestatus;
00157         OCI_Statement* oci_statement_contactgroupdefinition_definition;
00158         OCI_Statement* oci_statement_contactgroupdefinition_contactgroupmembers;
00159         OCI_Statement* oci_statement_process_events;
00160         OCI_Statement* oci_statement_flappinghistory;
00161         OCI_Statement* oci_statement_external_commands;
00162         OCI_Statement* oci_statement_acknowledgements;
00163         OCI_Statement* oci_statement_statehistory;
00164         OCI_Statement* oci_statement_instances;
00165         OCI_Statement* oci_statement_conninfo;
00166         /* well oh well */
00167         OCI_Statement* oci_statement_objects_select_name1_name2;
00168         OCI_Statement* oci_statement_objects_select_name1_null_name2;
00169         OCI_Statement* oci_statement_objects_select_name1_name2_null;
00170         OCI_Statement* oci_statement_objects_select_name1_null_name2_null;
00171         OCI_Statement* oci_statement_objects_select_cached;
00172         /* update */
00173         OCI_Statement* oci_statement_objects_update_inactive;
00174         OCI_Statement* oci_statement_objects_update_active;
00175         OCI_Statement* oci_statement_programstatus_update;
00176         OCI_Statement* oci_statement_timedevents_update;
00177         OCI_Statement* oci_statement_comment_history_update;
00178         OCI_Statement* oci_statement_downtimehistory_update_start;
00179         OCI_Statement* oci_statement_downtimehistory_update_stop;
00180         OCI_Statement* oci_statement_conninfo_update;
00181         OCI_Statement* oci_statement_conninfo_update_checkin;
00182         /* select */
00183         OCI_Statement* oci_statement_logentries_select;
00184         OCI_Statement* oci_statement_instances_select;
00185 
00186         /* delete */
00187         OCI_Statement* oci_statement_timedeventqueue_delete;
00188         OCI_Statement* oci_statement_timedeventqueue_delete_more;
00189         OCI_Statement* oci_statement_comments_delete;
00190         OCI_Statement* oci_statement_downtime_delete;
00191         OCI_Statement* oci_statement_instances_delete;
00192         OCI_Statement* oci_statement_instances_delete_time;
00193 
00194         /* dbversion */
00195         OCI_Statement* oci_statement_dbversion_select;
00196 
00197 #endif /* Oracle ocilib specific */
00198         unsigned long instance_id;
00199         unsigned long conninfo_id;
00200         time_t latest_program_status_time;
00201         time_t latest_host_status_time;
00202         time_t latest_service_status_time;
00203         time_t latest_contact_status_time;
00204         time_t latest_queued_event_time;
00205         time_t latest_realtime_data_time;
00206         time_t latest_comment_time;
00207         int clean_event_queue;
00208         unsigned long last_notification_id;
00209         unsigned long last_contact_notification_id;
00210         unsigned long max_timedevents_age;
00211         unsigned long max_systemcommands_age;
00212         unsigned long max_servicechecks_age;
00213         unsigned long max_hostchecks_age;
00214         unsigned long max_eventhandlers_age;
00215         unsigned long max_externalcommands_age;
00216         unsigned long max_logentries_age;
00217         unsigned long max_acknowledgements_age;
00218         unsigned long trim_db_interval;
00219         unsigned long housekeeping_thread_startup_delay;
00220         unsigned long clean_realtime_tables_on_core_startup;
00221         unsigned long clean_config_tables_on_core_startup;
00222         unsigned long oci_errors_to_syslog;
00223         time_t last_table_trim_time;
00224         time_t last_logentry_time;
00225         char *last_logentry_data;
00226         char *dbversion;
00227         ido2db_dbobject **object_hashlist;
00228         }ido2db_dbconninfo;
00229 
00230 
00231 typedef struct ido2db_input_data_info_struct{
00232         int protocol_version;
00233         int disconnect_client;
00234         int ignore_client_data;
00235         char *instance_name;
00236         char *agent_name;
00237         char *agent_version;
00238         char *disposition;
00239         char *connect_source;
00240         char *connect_type;
00241         int current_input_section;
00242         int current_input_data;
00243         unsigned long bytes_processed;
00244         unsigned long lines_processed;
00245         unsigned long entries_processed;
00246         unsigned long data_start_time;
00247         unsigned long data_end_time;
00248         int current_object_config_type;
00249         char **buffered_input;
00250         ido2db_mbuf mbuf[IDO2DB_MAX_MBUF_ITEMS];
00251         ido2db_dbconninfo dbinfo;
00252         }ido2db_idi;
00253 
00254 
00255 
00256 /*************** DB server types ***************/
00257 #define IDO2DB_DBSERVER_NONE                            0
00258 #define IDO2DB_DBSERVER_MYSQL                           1
00259 #define IDO2DB_DBSERVER_PGSQL                           2
00260 #define IDO2DB_DBSERVER_DB2                             3
00261 #define IDO2DB_DBSERVER_FIREBIRD                        4
00262 #define IDO2DB_DBSERVER_FREETDS                         5
00263 #define IDO2DB_DBSERVER_INGRES                          6
00264 #define IDO2DB_DBSERVER_MSQL                            7
00265 #define IDO2DB_DBSERVER_ORACLE                          8
00266 #define IDO2DB_DBSERVER_SQLITE                          9
00267 #define IDO2DB_DBSERVER_SQLITE3                         10
00268 
00269 /*************** DBI Driver names **************/
00270 #define IDO2DB_DBI_DRIVER_MYSQL                         "mysql"
00271 #define IDO2DB_DBI_DRIVER_PGSQL                         "pgsql"
00272 #define IDO2DB_DBI_DRIVER_DB2                           "db2l"
00273 #define IDO2DB_DBI_DRIVER_FIREBIRD                      "firebird"
00274 #define IDO2DB_DBI_DRIVER_FREETDS                       "freetds"
00275 #define IDO2DB_DBI_DRIVER_INGRES                        "ingres"
00276 #define IDO2DB_DBI_DRIVER_MSQL                          "msql"
00277 #define IDO2DB_DBI_DRIVER_ORACLE                        "Oracle"
00278 #define IDO2DB_DBI_DRIVER_SQLITE                        "sqlite"
00279 #define IDO2DB_DBI_DRIVER_SQLITE3                       "sqlite3"
00280 
00281 /*************** misc definitions **************/
00282 #define IDO2DB_INPUT_BUFFER                             1024
00283 /* #define IDO2DB_OBJECT_HASHSLOTS                         1024 */
00284 #define IDO2DB_OBJECT_HASHSLOTS                         50240   /* Altinity patch: Spread the list of linked lists thinner */
00285 
00286 
00287 /*********** types of input sections ***********/
00288 #define IDO2DB_INPUT_SECTION_NONE                       0
00289 #define IDO2DB_INPUT_SECTION_HEADER                     1
00290 #define IDO2DB_INPUT_SECTION_FOOTER                     2
00291 #define IDO2DB_INPUT_SECTION_DATA                       3
00292 
00293 
00294 /************* types of input data *************/
00295 #define IDO2DB_INPUT_DATA_NONE                          0
00296 
00297 #define IDO2DB_INPUT_DATA_CONFIGDUMPSTART               1
00298 #define IDO2DB_INPUT_DATA_CONFIGDUMPEND                 2
00299 
00300 #define IDO2DB_INPUT_DATA_LOGENTRY                      10
00301 
00302 #define IDO2DB_INPUT_DATA_PROCESSDATA                   20
00303 #define IDO2DB_INPUT_DATA_TIMEDEVENTDATA                21
00304 #define IDO2DB_INPUT_DATA_LOGDATA                       22
00305 #define IDO2DB_INPUT_DATA_SYSTEMCOMMANDDATA             23
00306 #define IDO2DB_INPUT_DATA_EVENTHANDLERDATA              24
00307 #define IDO2DB_INPUT_DATA_NOTIFICATIONDATA              25
00308 #define IDO2DB_INPUT_DATA_SERVICECHECKDATA              26
00309 #define IDO2DB_INPUT_DATA_HOSTCHECKDATA                 27
00310 #define IDO2DB_INPUT_DATA_COMMENTDATA                   28
00311 #define IDO2DB_INPUT_DATA_DOWNTIMEDATA                  29
00312 #define IDO2DB_INPUT_DATA_FLAPPINGDATA                  30
00313 #define IDO2DB_INPUT_DATA_PROGRAMSTATUSDATA             31
00314 #define IDO2DB_INPUT_DATA_HOSTSTATUSDATA                32
00315 #define IDO2DB_INPUT_DATA_SERVICESTATUSDATA             33
00316 #define IDO2DB_INPUT_DATA_ADAPTIVEPROGRAMDATA           34
00317 #define IDO2DB_INPUT_DATA_ADAPTIVEHOSTDATA              35
00318 #define IDO2DB_INPUT_DATA_ADAPTIVESERVICEDATA           36
00319 #define IDO2DB_INPUT_DATA_EXTERNALCOMMANDDATA           37
00320 #define IDO2DB_INPUT_DATA_AGGREGATEDSTATUSDATA          38
00321 #define IDO2DB_INPUT_DATA_RETENTIONDATA                 39
00322 #define IDO2DB_INPUT_DATA_CONTACTNOTIFICATIONDATA       40
00323 #define IDO2DB_INPUT_DATA_CONTACTNOTIFICATIONMETHODDATA 41
00324 #define IDO2DB_INPUT_DATA_ACKNOWLEDGEMENTDATA           42
00325 #define IDO2DB_INPUT_DATA_STATECHANGEDATA               43
00326 #define IDO2DB_INPUT_DATA_CONTACTSTATUSDATA             44
00327 #define IDO2DB_INPUT_DATA_ADAPTIVECONTACTDATA           45
00328 
00329 #define IDO2DB_INPUT_DATA_MAINCONFIGFILEVARIABLES       50
00330 #define IDO2DB_INPUT_DATA_RESOURCECONFIGFILEVARIABLES   51
00331 #define IDO2DB_INPUT_DATA_CONFIGVARIABLES               52
00332 #define IDO2DB_INPUT_DATA_RUNTIMEVARIABLES              53
00333 
00334 #define IDO2DB_INPUT_DATA_HOSTDEFINITION                61
00335 #define IDO2DB_INPUT_DATA_HOSTGROUPDEFINITION           62
00336 #define IDO2DB_INPUT_DATA_SERVICEDEFINITION             63
00337 #define IDO2DB_INPUT_DATA_SERVICEGROUPDEFINITION        64
00338 #define IDO2DB_INPUT_DATA_HOSTDEPENDENCYDEFINITION      65
00339 #define IDO2DB_INPUT_DATA_SERVICEDEPENDENCYDEFINITION   66
00340 #define IDO2DB_INPUT_DATA_HOSTESCALATIONDEFINITION      67
00341 #define IDO2DB_INPUT_DATA_SERVICEESCALATIONDEFINITION   68
00342 #define IDO2DB_INPUT_DATA_COMMANDDEFINITION             69
00343 #define IDO2DB_INPUT_DATA_TIMEPERIODDEFINITION          70
00344 #define IDO2DB_INPUT_DATA_CONTACTDEFINITION             71
00345 #define IDO2DB_INPUT_DATA_CONTACTGROUPDEFINITION        72
00346 #define IDO2DB_INPUT_DATA_HOSTEXTINFODEFINITION         73
00347 #define IDO2DB_INPUT_DATA_SERVICEEXTINFODEFINITION      74
00348 
00349 
00350 /************* types of config data ************/
00351 #define IDO2DB_CONFIGTYPE_ORIGINAL                      0
00352 #define IDO2DB_CONFIGTYPE_RETAINED                      1
00353 
00354 
00355 
00356 /************* debugging levels ****************/
00357 
00358 #define IDO2DB_DEBUGL_ALL                      -1
00359 #define IDO2DB_DEBUGL_NONE                     0
00360 #define IDO2DB_DEBUGL_PROCESSINFO              1
00361 #define IDO2DB_DEBUGL_SQL                      2
00362 
00363 #define IDO2DB_DEBUGV_BASIC                    0
00364 #define IDO2DB_DEBUGV_MORE                     1
00365 #define IDO2DB_DEBUGV_MOST                     2
00366 
00367 /************* default trim db interval ********/
00368 
00369 #define DEFAULT_TRIM_DB_INTERVAL                3600
00370 
00371 /* default housekeeping thread startup delay  **/
00372 
00373 #define DEFAULT_HOUSEKEEPING_THREAD_STARTUP_DELAY 300
00374 
00375 /************* oci errors to syslog ************/
00376 
00377 #define DEFAULT_OCI_ERRORS_TO_SYSLOG            1
00378 
00379 
00380 /************* n worker threads ****************/
00381 
00382 #define IDO2DB_CLEANER_THREADS                  1
00383 #define IDO2DB_WORKER_THREADS                   1
00384 #define IDO2DB_NR_OF_THREADS                   (IDO2DB_CLEANER_THREADS+IDO2DB_WORKER_THREADS)
00385 
00386 #define IDO2DB_THREAD_POOL_CLEANER              0
00387 #define IDO2DB_THREAD_POOL_WORKER               1
00388 
00389 #define IDO2DB_DEFAULT_THREAD_STACK_SIZE        65536
00390 
00391 /***************** functions *******************/
00392 
00393 /* config */
00394 int ido2db_process_arguments(int,char **);
00395 int ido2db_process_config_var(char *);
00396 int ido2db_process_config_file(char *);
00397 
00398 /* init */
00399 int ido2db_initialize_variables(void);
00400 int ido2db_check_init_reqs(void);
00401 
00402 /* daemonize */
00403 int ido2db_drop_privileges(char *,char *);
00404 int ido2db_daemonize(void);
00405 int ido2db_cleanup_socket(void);
00406 void ido2db_parent_sighandler(int);
00407 void ido2db_child_sighandler(int);
00408 
00409 /* cleanup */
00410 int ido2db_free_program_memory(void);
00411 int ido2db_free_input_memory(ido2db_idi *);
00412 int ido2db_free_connection_memory(ido2db_idi *);
00413 
00414 /* client connection */
00415 int ido2db_wait_for_connections(void);
00416 int ido2db_handle_client_connection(int);
00417 int ido2db_idi_init(ido2db_idi *);
00418 int ido2db_check_for_client_input(ido2db_idi *);
00419 int ido2db_handle_client_input(ido2db_idi *,char *);
00420 
00421 /* data handling */
00422 int ido2db_start_input_data(ido2db_idi *);
00423 int ido2db_end_input_data(ido2db_idi *);
00424 int ido2db_add_input_data_item(ido2db_idi *,int,char *);
00425 int ido2db_add_input_data_mbuf(ido2db_idi *,int,int,char *);
00426 
00427 /* conversion */
00428 int ido2db_convert_standard_data_elements(ido2db_idi *,int *,int *,int *,struct timeval *);
00429 int ido2db_convert_string_to_int(char *,int *);
00430 int ido2db_convert_string_to_float(char *,float *);
00431 int ido2db_convert_string_to_double(char *,double *);
00432 int ido2db_convert_string_to_long(char *,long *);
00433 int ido2db_convert_string_to_unsignedlong(char *,unsigned long *);
00434 int ido2db_convert_string_to_timeval(char *,struct timeval *);
00435 
00436 /* logging */
00437 int ido2db_log_debug_info(int , int , const char *, ...);
00438 
00439 /* threads */
00440 void *ido2db_thread_cleanup(void *);
00441 void *ido2db_thread_worker(void *);
00442 int ido2db_terminate_threads(void);
00443 int terminate_worker_thread(void);
00444 int terminate_cleanup_thread(void);
00445 
00446 #endif
 All Data Structures Files Functions Variables Typedefs Defines