Icinga-core 1.4.0
next gen monitoring
cgi/config.c
Go to the documentation of this file.
00001 /***********************************************************************
00002  *
00003  * CONFIG.C - Icinga Configuration CGI (View Only)
00004  *
00005  * Copyright (c) 1999-2009 Ethan Galstad (egalstad@nagios.org)
00006  * Copyright (c) 2009-2011 Icinga Development Team (http://www.icinga.org)
00007  *
00008  * This CGI program will display various configuration information.
00009  *
00010  *
00011  * This program is free software; you can redistribute it and/or modify
00012  * it under the terms of the GNU General Public License version 2 as
00013  * published by the Free Software Foundation.
00014  *
00015  * This program is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License
00021  * along with this program; if not, write to the Free Software
00022  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00023  ***********************************************************************/
00024 
00025 #include "../include/config.h"
00026 #include "../include/common.h"
00027 #include "../include/objects.h"
00028 #include "../include/macros.h"
00029 #include "../include/cgiutils.h"
00030 #include "../include/cgiauth.h"
00031 #include "../include/getcgi.h"
00032 
00033 static icinga_macros *mac;
00034 
00035 extern char   main_config_file[MAX_FILENAME_LENGTH];
00036 extern char   url_html_path[MAX_FILENAME_LENGTH];
00037 extern char   url_docs_path[MAX_FILENAME_LENGTH];
00038 extern char   url_images_path[MAX_FILENAME_LENGTH];
00039 extern char   url_logo_images_path[MAX_FILENAME_LENGTH];
00040 extern char   url_stylesheets_path[MAX_FILENAME_LENGTH];
00041 extern char   url_js_path[MAX_FILENAME_LENGTH];
00042 
00043 extern host *host_list;
00044 extern service *service_list;
00045 extern hostgroup *hostgroup_list;
00046 extern servicegroup *servicegroup_list;
00047 extern contactgroup *contactgroup_list;
00048 extern command *command_list;
00049 extern timeperiod *timeperiod_list;
00050 extern contact *contact_list;
00051 extern servicedependency *servicedependency_list;
00052 extern serviceescalation *serviceescalation_list;
00053 extern hostdependency *hostdependency_list;
00054 extern hostescalation *hostescalation_list;
00055 extern module *module_list;
00056 
00057 extern int display_header;
00058 extern int content_type;
00059 
00060 extern char *csv_delimiter;
00061 extern char *csv_data_enclosure;
00062 
00063 int process_cgivars(void);
00064 
00065 void display_options(void);
00066 
00067 void display_hosts(void);
00068 void display_hostgroups(void);
00069 void display_servicegroups(void);
00070 void display_contacts(void);
00071 void display_contactgroups(void);
00072 void display_services(void);
00073 void display_timeperiods(void);
00074 void display_commands(void);
00075 void display_servicedependencies(void);
00076 void display_serviceescalations(void);
00077 void display_hostdependencies(void);
00078 void display_hostescalations(void);
00079 void display_command_expansion(void);
00080 void display_modules(void);
00081 
00082 void print_export_link(void);
00083 
00084 authdata current_authdata;
00085 
00086 int display_type=DISPLAY_NONE;
00087 int show_all_hosts=TRUE;
00088 int show_all_hostgroups=TRUE;
00089 int show_all_servicegroups=TRUE;
00090 char *host_name=NULL;
00091 char *host_filter=NULL;
00092 char *hostgroup_name=NULL;
00093 char *servicegroup_name=NULL;
00094 char *service_desc=NULL;
00095 char *service_filter=NULL;
00096 char to_expand[MAX_COMMAND_BUFFER];
00097 char hashed_color[8];
00098 
00099 extern int embedded;
00100 extern int daemon_check;
00101 
00102 int CGI_ID=CONFIG_CGI_ID;
00103 
00104 void print_expand_input(int type){
00105         char *seldesc="";
00106 
00107         if (type==DISPLAY_COMMAND_EXPANSION) return;    /* Has its own form, w/ larger <input> */
00108         else if (type==DISPLAY_SERVICES){               seldesc=" Services Named or on Host";   }
00109         else if (type==DISPLAY_SERVICEDEPENDENCIES){    seldesc=" Dependencies with Host";      }
00110         else if (type==DISPLAY_SERVICEESCALATIONS){     seldesc=" Escalations on Host";         }
00111         else if (type==DISPLAY_HOSTDEPENDENCIES){       seldesc=" Dependencies on/of Host";     }
00112         else if (type==DISPLAY_HOSTESCALATIONS){        seldesc=" Escalations for Host";        }
00113         printf("<tr><td align=left class='reportSelectSubTitle'>Show Only%s:</td></tr>\n",seldesc);
00114         printf("<tr><td align=left class='reportSelectItem'><input type='text' name='expand'\n");
00115         printf("value='%s'>",html_encode(to_expand,FALSE));
00116 }
00117 
00118 int main(void){
00119         int result=OK;
00120         mac = get_global_macros();
00121 
00122         /* get the arguments passed in the URL */
00123         process_cgivars();
00124 
00125         /* reset internal variables */
00126         reset_cgi_vars();
00127 
00128         /* read the CGI configuration file */
00129         result=read_cgi_config_file(get_cgi_config_location());
00130         if(result==ERROR){
00131                 document_header(CGI_ID,FALSE);
00132                 print_error(get_cgi_config_location(), ERROR_CGI_CFG_FILE);
00133                 document_footer(CGI_ID);
00134                 return ERROR;
00135         }
00136 
00137         /* read the main configuration file */
00138         result=read_main_config_file(main_config_file);
00139         if(result==ERROR){
00140                 document_header(CGI_ID,FALSE);
00141                 print_error(main_config_file, ERROR_CGI_MAIN_CFG);
00142                 document_footer(CGI_ID);
00143                 return ERROR;
00144         }
00145 
00146         /* read all object configuration data */
00147         result=read_all_object_configuration_data(main_config_file,READ_ALL_OBJECT_DATA);
00148         if(result==ERROR){
00149                 document_header(CGI_ID,FALSE);
00150                 print_error(NULL, ERROR_CGI_OBJECT_DATA);
00151                 document_footer(CGI_ID);
00152                 return ERROR;
00153         }
00154 
00155         /* initialize macros */
00156         init_macros();
00157 
00158         document_header(CGI_ID,TRUE);
00159 
00160         /* get authentication information */
00161         get_authentication_information(&current_authdata);
00162 
00163         /* see if user is authorized to view contact information... */
00164         if(is_authorized_for_configuration_information(&current_authdata)==FALSE){
00165                 print_generic_error_message("It appears as though you do not have permission to view the configuration information you requested...","If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI and check the authorization options in your CGI configuration file.",0);
00166                 document_footer(CGI_ID);
00167                 return OK;
00168         }
00169 
00170         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
00171                 /* begin top table */
00172                 printf("<table border=0 width=100%%>\n");
00173                 printf("<tr>\n");
00174 
00175                 /* left column of the first row */
00176                 printf("<td align=left valign=top width=50%%>\n");
00177                 display_info_table("Configuration",FALSE,&current_authdata, daemon_check);
00178                 printf("</td>\n");
00179 
00180                 /* right hand column of top row */
00181                 printf("<td align=right valign=bottom width=50%%>\n");
00182 
00183                 if(display_type!=DISPLAY_NONE){
00184 
00185                         printf("<table border=0>\n");
00186                         printf("<form method=\"get\" action=\"%s\">\n",CONFIG_CGI);
00187 
00188                         printf("<tr><td align=left class='reportSelectSubTitle'>Object Type:</td></tr>\n");
00189                         printf("<tr><td align=left class='reportSelectItem'>");
00190                         printf("<select name='type'>\n");
00191                         printf("<option value='hosts' %s>Hosts\n",(display_type==DISPLAY_HOSTS)?"SELECTED":"");
00192                         printf("<option value='hostdependencies' %s>Host Dependencies\n",(display_type==DISPLAY_HOSTDEPENDENCIES)?"SELECTED":"");
00193                         printf("<option value='hostescalations' %s>Host Escalations\n",(display_type==DISPLAY_HOSTESCALATIONS)?"SELECTED":"");
00194                         printf("<option value='hostgroups' %s>Host Groups\n",(display_type==DISPLAY_HOSTGROUPS)?"SELECTED":"");
00195                         printf("<option value='services' %s>Services\n",(display_type==DISPLAY_SERVICES)?"SELECTED":"");
00196                         printf("<option value='servicegroups' %s>Service Groups\n",(display_type==DISPLAY_SERVICEGROUPS)?"SELECTED":"");
00197                         printf("<option value='servicedependencies' %s>Service Dependencies\n",(display_type==DISPLAY_SERVICEDEPENDENCIES)?"SELECTED":"");
00198                         printf("<option value='serviceescalations' %s>Service Escalations\n",(display_type==DISPLAY_SERVICEESCALATIONS)?"SELECTED":"");
00199                         printf("<option value='contacts' %s>Contacts\n",(display_type==DISPLAY_CONTACTS)?"SELECTED":"");
00200                         printf("<option value='contactgroups' %s>Contact Groups\n",(display_type==DISPLAY_CONTACTGROUPS)?"SELECTED":"");
00201                         printf("<option value='timeperiods' %s>Timeperiods\n",(display_type==DISPLAY_TIMEPERIODS)?"SELECTED":"");
00202                         printf("<option value='modules' %s>Modules\n",(display_type==DISPLAY_MODULES)?"SELECTED":"");
00203                         printf("<option value='commands' %s>Commands\n",(display_type==DISPLAY_COMMANDS)?"SELECTED":"");
00204                         printf("<option value='command' %s>Command Expansion\n",(display_type==DISPLAY_COMMAND_EXPANSION)?"SELECTED":"");
00205                         printf("</select>\n");
00206                         printf("</td></tr>\n");
00207 
00208                         print_expand_input(display_type);
00209 
00210                         printf("<tr><td class='reportSelectItem'><input type='submit' value='Update'></td></tr>\n");
00211                         printf("</form>\n");
00212                         printf("</table>\n");
00213                 }
00214         }
00215 
00216         /* display context-sensitive help */
00217         switch(display_type){
00218         case DISPLAY_HOSTS:
00219                 display_context_help(CONTEXTHELP_CONFIG_HOSTS);
00220                 break;
00221         case DISPLAY_HOSTGROUPS:
00222                 display_context_help(CONTEXTHELP_CONFIG_HOSTGROUPS);
00223                 break;
00224         case DISPLAY_SERVICEGROUPS:
00225                 display_context_help(CONTEXTHELP_CONFIG_SERVICEGROUPS);
00226                 break;
00227         case DISPLAY_CONTACTS:
00228                 display_context_help(CONTEXTHELP_CONFIG_CONTACTS);
00229                 break;
00230         case DISPLAY_CONTACTGROUPS:
00231                 display_context_help(CONTEXTHELP_CONFIG_CONTACTGROUPS);
00232                 break;
00233         case DISPLAY_SERVICES:
00234                 display_context_help(CONTEXTHELP_CONFIG_SERVICES);
00235                 break;
00236         case DISPLAY_TIMEPERIODS:
00237                 display_context_help(CONTEXTHELP_CONFIG_TIMEPERIODS);
00238                 break;
00239         case DISPLAY_COMMANDS:
00240                 display_context_help(CONTEXTHELP_CONFIG_COMMANDS);
00241                 break;
00242         case DISPLAY_SERVICEDEPENDENCIES:
00243                 display_context_help(CONTEXTHELP_CONFIG_SERVICEDEPENDENCIES);
00244                 break;
00245         case DISPLAY_SERVICEESCALATIONS:
00246                 display_context_help(CONTEXTHELP_CONFIG_HOSTESCALATIONS);
00247                 break;
00248         case DISPLAY_HOSTDEPENDENCIES:
00249                 display_context_help(CONTEXTHELP_CONFIG_HOSTDEPENDENCIES);
00250                 break;
00251         case DISPLAY_HOSTESCALATIONS:
00252                 display_context_help(CONTEXTHELP_CONFIG_HOSTESCALATIONS);
00253                 break;
00254         case DISPLAY_COMMAND_EXPANSION:
00255                 /* Reusing DISPLAY_COMMANDS help until further notice */
00256                 display_context_help(CONTEXTHELP_CONFIG_COMMANDS);
00257                 break;
00258         case DISPLAY_MODULES:
00259                 /* reuse commands context help */
00260                 display_context_help(CONTEXTHELP_CONFIG_COMMANDS);
00261                 break;
00262         case DISPLAY_ALL:
00263                 break;
00264         default:
00265                 display_context_help(CONTEXTHELP_CONFIG_MENU);
00266                 break;
00267         }
00268 
00269         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
00270                 printf("</td>\n");
00271 
00272                 /* end of top table */
00273                 printf("</tr>\n");
00274                 printf("</table>\n");
00275         }
00276 
00277 
00278         switch(display_type){
00279         case DISPLAY_HOSTS:
00280                 display_hosts();
00281                 break;
00282         case DISPLAY_HOSTGROUPS:
00283                 display_hostgroups();
00284                 break;
00285         case DISPLAY_SERVICEGROUPS:
00286                 display_servicegroups();
00287                 break;
00288         case DISPLAY_CONTACTS:
00289                 display_contacts();
00290                 break;
00291         case DISPLAY_CONTACTGROUPS:
00292                 display_contactgroups();
00293                 break;
00294         case DISPLAY_SERVICES:
00295                 display_services();
00296                 break;
00297         case DISPLAY_TIMEPERIODS:
00298                 display_timeperiods();
00299                 break;
00300         case DISPLAY_COMMANDS:
00301                 display_commands();
00302                 break;
00303         case DISPLAY_SERVICEDEPENDENCIES:
00304                 display_servicedependencies();
00305                 break;
00306         case DISPLAY_SERVICEESCALATIONS:
00307                 display_serviceescalations();
00308                 break;
00309         case DISPLAY_HOSTDEPENDENCIES:
00310                 display_hostdependencies();
00311                 break;
00312         case DISPLAY_HOSTESCALATIONS:
00313                 display_hostescalations();
00314                 break;
00315         case DISPLAY_COMMAND_EXPANSION:
00316                 display_command_expansion();
00317                 break;
00318         case DISPLAY_MODULES:
00319                 display_modules();
00320                 break;
00321         case DISPLAY_ALL:
00322                 if (content_type==JSON_CONTENT) {
00323                         display_hosts();
00324                         printf(",\n");
00325                         display_hostgroups();
00326                         printf(",\n");
00327                         display_servicegroups();
00328                         printf(",\n");
00329                         display_contacts();
00330                         printf(",\n");
00331                         display_contactgroups();
00332                         printf(",\n");
00333                         display_services();
00334                         printf(",\n");
00335                         display_timeperiods();
00336                         printf(",\n");
00337                         display_commands();
00338                         printf(",\n");
00339                         display_servicedependencies();
00340                         printf(",\n");
00341                         display_serviceescalations();
00342                         printf(",\n");
00343                         display_hostdependencies();
00344                         printf(",\n");
00345                         display_hostescalations();
00346                         printf(",\n");
00347                         display_modules();
00348                         break;
00349                 }
00350         default:
00351                 display_options();
00352                 break;
00353         }
00354 
00355         document_footer(CGI_ID);
00356 
00357         return OK;
00358 }
00359 
00360 int process_cgivars(void){
00361         char **variables;
00362         int error=FALSE;
00363         int x;
00364 
00365         variables=getcgivars();
00366         to_expand[0]='\0';
00367 
00368         for(x=0;variables[x]!=NULL;x++){
00369 
00370                 /* do some basic length checking on the variable identifier to prevent buffer overflows */
00371                 if(strlen(variables[x])>=MAX_INPUT_BUFFER-1){
00372                         x++;
00373                         continue;
00374                 }
00375 
00376                 /* we found the configuration type argument */
00377                 else if(!strcmp(variables[x],"type")){
00378                         x++;
00379                         if(variables[x]==NULL){
00380                                 error=TRUE;
00381                                 break;
00382                         }
00383 
00384                         /* what information should we display? */
00385                         if(!strcmp(variables[x],"hosts"))
00386                                 display_type=DISPLAY_HOSTS;
00387                         else if(!strcmp(variables[x],"hostgroups"))
00388                                 display_type=DISPLAY_HOSTGROUPS;
00389                         else if(!strcmp(variables[x],"servicegroups"))
00390                                 display_type=DISPLAY_SERVICEGROUPS;
00391                         else if(!strcmp(variables[x],"contacts"))
00392                                 display_type=DISPLAY_CONTACTS;
00393                         else if(!strcmp(variables[x],"contactgroups"))
00394                                 display_type=DISPLAY_CONTACTGROUPS;
00395                         else if(!strcmp(variables[x],"services"))
00396                                 display_type=DISPLAY_SERVICES;
00397                         else if(!strcmp(variables[x],"timeperiods"))
00398                                 display_type=DISPLAY_TIMEPERIODS;
00399                         else if(!strcmp(variables[x],"commands"))
00400                                 display_type=DISPLAY_COMMANDS;
00401                         else if(!strcmp(variables[x],"servicedependencies"))
00402                                 display_type=DISPLAY_SERVICEDEPENDENCIES;
00403                         else if(!strcmp(variables[x],"serviceescalations"))
00404                                 display_type=DISPLAY_SERVICEESCALATIONS;
00405                         else if(!strcmp(variables[x],"hostdependencies"))
00406                                 display_type=DISPLAY_HOSTDEPENDENCIES;
00407                         else if(!strcmp(variables[x],"hostescalations"))
00408                                 display_type=DISPLAY_HOSTESCALATIONS;
00409                         else if(!strcmp(variables[x],"command"))
00410                                 display_type=DISPLAY_COMMAND_EXPANSION;
00411                         else if(!strcmp(variables[x],"modules"))
00412                                 display_type=DISPLAY_MODULES;
00413                         else if(!strcmp(variables[x],"all"))
00414                                 display_type=DISPLAY_ALL;
00415 
00416                         /* we found the embed option */
00417                         else if(!strcmp(variables[x],"embedded"))
00418                                 embedded=TRUE;
00419 
00420                         /* we found the nodaemoncheck option */
00421                         else if(!strcmp(variables[x],"nodaemoncheck"))
00422                                 daemon_check=FALSE;
00423                         }
00424 
00425                 /* we found the string-to-expand argument */
00426                 else if(!strcmp(variables[x],"expand")){
00427                         x++;
00428                         if(variables[x]==NULL){
00429                                 error=TRUE;
00430                                 break;
00431                         }
00432                         strncpy(to_expand,variables[x],MAX_COMMAND_BUFFER);
00433                         to_expand[MAX_COMMAND_BUFFER-1]='\0';
00434                 }
00435 
00436                 /* we found the CSV output option */
00437                 else if(!strcmp(variables[x],"csvoutput")){
00438                         display_header=FALSE;
00439                         content_type=CSV_CONTENT;
00440                 }
00441 
00442                 /* we found the JSON output option */
00443                 else if(!strcmp(variables[x],"jsonoutput")){
00444                         display_header=FALSE;
00445                         content_type=JSON_CONTENT;
00446                 }
00447 
00448                 /* we received an invalid argument */
00449                 else
00450                         error=TRUE;
00451 
00452         }
00453 
00454         /* free memory allocated to the CGI variables */
00455         free_cgivars(variables);
00456 
00457         return error;
00458 }
00459 
00460 void display_hosts(void){
00461         host *temp_host=NULL;
00462         hostsmember *temp_hostsmember=NULL;
00463         contactsmember *temp_contactsmember=NULL;
00464         contactgroupsmember *temp_contactgroupsmember=NULL;
00465         char *processed_string=NULL;
00466         int options=0;
00467         int odd=0;
00468         char time_string[2][16];
00469         char *bg_class="";
00470         int contact=0;
00471         int json_start=TRUE;
00472 
00473         if(content_type==JSON_CONTENT) {
00474                 printf("\"hosts\": [\n");
00475         }else if(content_type==CSV_CONTENT) {
00476                 printf("%sHost Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00477                 printf("%sAlias/Description%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00478                 printf("%sAddress%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00479                 printf("%sAddress6%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00480                 printf("%sParent Hosts%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00481                 printf("%sMax. Check Attempts%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00482                 printf("%sCheck Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00483                 printf("%sRetry Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00484                 printf("%sHost Check Command%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00485                 printf("%sCheck Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00486                 printf("%sObsess Over%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00487                 printf("%sEnable Active Checks%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00488                 printf("%sEnable Passive Checks%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00489                 printf("%sCheck Freshness%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00490                 printf("%sFreshness Threshold%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00491                 printf("%sDefault Contacts/Groups%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00492                 printf("%sNotification Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00493                 printf("%sFirst Notification Delay%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00494                 printf("%sNotification Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00495                 printf("%sNotification Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00496                 printf("%sEvent Handler%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00497                 printf("%sEnable Event Handler%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00498                 printf("%sStalking Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00499                 printf("%sEnable Flap Detection%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00500                 printf("%sLow Flap Threshold%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00501                 printf("%sHigh Flap Threshold%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00502                 printf("%sFlap Detection Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00503                 printf("%sProcess Performance Data%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00504                 printf("%sEnable Failure Prediction%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00505                 printf("%sFailure Prediction Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00506                 printf("%sNotes%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00507                 printf("%sNotes URL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00508                 printf("%sAction URL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00509                 printf("%s2-D Coords%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00510                 printf("%s3-D Coords%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00511                 printf("%sStatusmap Image%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00512                 printf("%sVRML Image%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00513                 printf("%sLogo Image%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00514                 printf("%sImage Alt%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00515                 printf("%sRetention Options%s",csv_data_enclosure,csv_data_enclosure);
00516                 printf("\n");
00517         } else {
00518                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Host%s%s</DIV></P>\n",
00519                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
00520 
00521                 printf("<P><DIV ALIGN=CENTER>\n");
00522                 printf("<TABLE BORDER=0 CLASS='data'>\n");
00523 
00524                 print_export_link();
00525 
00526                 printf("<TR>\n");
00527                 printf("<TH CLASS='data'>Host Name</TH>");
00528                 printf("<TH CLASS='data'>Alias/Description</TH>");
00529                 printf("<TH CLASS='data'>Address</TH>");
00530                 printf("<TH CLASS='data'>Address6</TH>");
00531                 printf("<TH CLASS='data'>Parent Hosts</TH>");
00532                 printf("<TH CLASS='data'>Max. Check Attempts</TH>");
00533                 printf("<TH CLASS='data'>Check Interval</TH>\n");
00534                 printf("<TH CLASS='data'>Retry Interval</TH>\n");
00535                 printf("<TH CLASS='data'>Host Check Command</TH>");
00536                 printf("<TH CLASS='data'>Check Period</TH>");
00537                 printf("<TH CLASS='data'>Obsess Over</TH>\n");
00538                 printf("<TH CLASS='data'>Enable Active Checks</TH>\n");
00539                 printf("<TH CLASS='data'>Enable Passive Checks</TH>\n");
00540                 printf("<TH CLASS='data'>Check Freshness</TH>\n");
00541                 printf("<TH CLASS='data'>Freshness Threshold</TH>\n");
00542                 printf("<TH CLASS='data'>Default Contacts/Groups</TH>\n");
00543                 printf("<TH CLASS='data'>Notification Interval</TH>");
00544                 printf("<TH CLASS='data'>First Notification Delay</TH>");
00545                 printf("<TH CLASS='data'>Notification Options</TH>");
00546                 printf("<TH CLASS='data'>Notification Period</TH>");
00547                 printf("<TH CLASS='data'>Event Handler</TH>");
00548                 printf("<TH CLASS='data'>Enable Event Handler</TH>");
00549                 printf("<TH CLASS='data'>Stalking Options</TH>\n");
00550                 printf("<TH CLASS='data'>Enable Flap Detection</TH>");
00551                 printf("<TH CLASS='data'>Low Flap Threshold</TH>");
00552                 printf("<TH CLASS='data'>High Flap Threshold</TH>");
00553                 printf("<TH CLASS='data'>Flap Detection Options</TH>\n");
00554                 printf("<TH CLASS='data'>Process Performance Data</TH>");
00555                 printf("<TH CLASS='data'>Enable Failure Prediction</TH>");
00556                 printf("<TH CLASS='data'>Failure Prediction Options</TH>");
00557                 printf("<TH CLASS='data'>Notes</TH>");
00558                 printf("<TH CLASS='data'>Notes URL</TH>");
00559                 printf("<TH CLASS='data'>Action URL</TH>");
00560                 printf("<TH CLASS='data'>2-D Coords</TH>");
00561                 printf("<TH CLASS='data'>3-D Coords</TH>");
00562                 printf("<TH CLASS='data'>Statusmap Image</TH>");
00563                 printf("<TH CLASS='data'>VRML Image</TH>");
00564                 printf("<TH CLASS='data'>Logo Image</TH>");
00565                 printf("<TH CLASS='data'>Image Alt</TH>");
00566                 printf("<TH CLASS='data'>Retention Options</TH>");
00567                 printf("</TR>\n");
00568         }
00569 
00570         /* check all the hosts... */
00571         for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next) if (((*to_expand)=='\0')||!strcmp(to_expand,temp_host->name)){
00572 
00573                 /* grab macros */
00574                 grab_host_macros_r(mac, temp_host);
00575 
00576                 if(odd){
00577                         odd=0;
00578                         bg_class="dataOdd";
00579                 }else{
00580                         odd=1;
00581                         bg_class="dataEven";
00582                 }
00583 
00584                 /* print list in json format */
00585                 if(content_type==JSON_CONTENT) {
00586                         // always add a comma, except for the first line
00587                         if (json_start==FALSE)
00588                                 printf(",\n");
00589                         json_start=FALSE;
00590                         printf("{ \"host_name\": \"%s\", ",json_encode(temp_host->name));
00591                         printf("\"alias\": \"%s\", ",json_encode(temp_host->alias));
00592                         printf("\"address\": \"%s\", ",temp_host->address);
00593                         printf("\"address6\": \"%s\", ",temp_host->address6);
00594                         printf("\"parent_hosts\": [ ");
00595 
00596                 /* print list in csv format */
00597                 }else if(content_type==CSV_CONTENT) {
00598                         printf("%s%s%s%s",csv_data_enclosure,temp_host->name,csv_data_enclosure,csv_delimiter);
00599                         printf("%s%s%s%s",csv_data_enclosure,temp_host->alias,csv_data_enclosure,csv_delimiter);
00600                         printf("%s%s%s%s",csv_data_enclosure,temp_host->address,csv_data_enclosure,csv_delimiter);
00601                         printf("%s%s%s%s",csv_data_enclosure,temp_host->address6,csv_data_enclosure,csv_delimiter);
00602                         printf("%s",csv_data_enclosure);
00603                 } else {
00604                         printf("<TR CLASS='%s'>\n",bg_class);
00605 
00606                         /* find a solution to print display_name if once set in host definition */
00607                         /* printf("<TD CLASS='%s'><a name='%s'>%s</a></TD>\n",bg_class,url_encode(temp_host->name),(temp_host->display_name!=NULL)?temp_host->display_name:temp_host->name); */
00608                         printf("<TD CLASS='%s'><a name='%s'><a href='%s?type=services&expand=%s'>%s</a></a></TD>\n",bg_class,
00609                                 url_encode(temp_host->name),CONFIG_CGI,url_encode(temp_host->name),html_encode(temp_host->name,FALSE));
00610                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_host->alias,FALSE));
00611                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_host->address,FALSE));
00612                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_host->address6,FALSE));
00613                         printf("<TD CLASS='%s'>",bg_class);
00614                 }
00615 
00616                 for(temp_hostsmember=temp_host->parent_hosts;temp_hostsmember!=NULL;temp_hostsmember=temp_hostsmember->next){
00617 
00618                         if(temp_hostsmember!=temp_host->parent_hosts)
00619                                 printf(", ");
00620 
00621                         if(content_type==JSON_CONTENT)
00622                                 printf("{ \"host_name\": \"%s\" } ",json_encode(temp_hostsmember->host_name));
00623                         else if(content_type==CSV_CONTENT)
00624                                 printf("%s",temp_hostsmember->host_name);
00625                         else
00626                                 printf("<a href='%s?type=hosts&expand=%s'>%s</a>",CONFIG_CGI,url_encode(temp_hostsmember->host_name),html_encode(temp_hostsmember->host_name,FALSE));
00627                 }
00628 
00629                 if(temp_host->parent_hosts==NULL)
00630                         printf("%s",(content_type==CSV_CONTENT || content_type==JSON_CONTENT)?"":"&nbsp;");
00631 
00632                 get_interval_time_string(temp_host->check_interval,time_string[0],sizeof(time_string[0]));
00633                 get_interval_time_string(temp_host->retry_interval,time_string[1],sizeof(time_string[1]));
00634 
00635                 if(content_type==JSON_CONTENT) {
00636                         printf("], ");
00637                         printf("\"max_check_attempts\": %d, ",temp_host->max_attempts);
00638                         printf("\"check_interval\": \"%s\", ",time_string[0]);
00639                         printf("\"retry_interval\": \"%s\", ",time_string[1]);
00640 
00641                         if (temp_host->host_check_command==NULL)
00642                                 printf("\"host_check_command\":  null, ");
00643                         else
00644                                 printf("\"host_check_command\": \"%s\", ",json_encode(temp_host->host_check_command));
00645 
00646                         if (temp_host->check_period==NULL)
00647                                 printf("\"check_period\":  null, ");
00648                         else
00649                                 printf("\"check_period\": \"%s\", ",json_encode(temp_host->check_period));
00650 
00651                         printf("\"obsess_over\":  %s, ",(temp_host->obsess_over_host==TRUE)?"true":"false");
00652                         printf("\"enable_active_checks\":  %s, ",(temp_host->checks_enabled==TRUE)?"true":"false");
00653                         printf("\"enable_passive_checks\":  %s, ",(temp_host->accept_passive_host_checks==TRUE)?"true":"false");
00654                         printf("\"check_freshness\":  %s, ",(temp_host->check_freshness==TRUE)?"true":"false");
00655                         if(temp_host->freshness_threshold==0)
00656                                 printf("\"freshness_threshold\":  \"auto-determined value\", ");
00657                         else
00658                                 printf("\"freshness_threshold\": %d, ",temp_host->freshness_threshold);
00659 
00660                         printf("\"default_contacts_default_groups\": [ ");
00661                 }else if(content_type==CSV_CONTENT){
00662                         printf("%s%s",csv_data_enclosure,csv_delimiter);
00663                         printf("%s%d%s%s",csv_data_enclosure,temp_host->max_attempts,csv_data_enclosure,csv_delimiter);
00664                         printf("%s%s%s%s",csv_data_enclosure,time_string[0],csv_data_enclosure,csv_delimiter);
00665                         printf("%s%s%s%s",csv_data_enclosure,time_string[1],csv_data_enclosure,csv_delimiter);
00666                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->host_check_command==NULL)?"":temp_host->host_check_command,csv_data_enclosure,csv_delimiter);
00667                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->check_period==NULL)?"":temp_host->check_period,csv_data_enclosure,csv_delimiter);
00668                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->obsess_over_host==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00669                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->checks_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00670                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->accept_passive_host_checks==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00671                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->check_freshness==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00672                         printf("%s",csv_data_enclosure);
00673                         if(temp_host->freshness_threshold==0)
00674                                 printf("Auto-determined value");
00675                         else
00676                                 printf("%d",temp_host->freshness_threshold);
00677                         printf("%s%s",csv_data_enclosure,csv_delimiter);
00678                         printf("%s",csv_data_enclosure);
00679                 }else{
00680                         printf("</TD>\n");
00681 
00682                         printf("<TD CLASS='%s'>%d</TD>\n",bg_class,temp_host->max_attempts);
00683                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,time_string[0]);
00684                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,time_string[1]);
00685 
00686                         printf("<TD CLASS='%s'>",bg_class);
00687                         if(temp_host->host_check_command==NULL)
00688                                 printf("&nbsp;");
00689                         else
00690                                 printf("<a href='%s?type=command&expand=%s'>%s</a>",CONFIG_CGI,url_encode(temp_host->host_check_command),html_encode(temp_host->host_check_command,FALSE));
00691                         printf("</TD>\n");
00692 
00693                         printf("<TD CLASS='%s'>",bg_class);
00694                         if(temp_host->check_period==NULL)
00695                                 printf("&nbsp;");
00696                         else
00697                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_host->check_period),html_encode(temp_host->check_period,FALSE));
00698                         printf("</TD>\n");
00699 
00700                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->obsess_over_host==TRUE)?"Yes":"No");
00701 
00702                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->checks_enabled==TRUE)?"Yes":"No");
00703 
00704                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->accept_passive_host_checks==TRUE)?"Yes":"No");
00705 
00706                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->check_freshness==TRUE)?"Yes":"No");
00707 
00708                         printf("<TD CLASS='%s'>",bg_class);
00709                         if(temp_host->freshness_threshold==0)
00710                                 printf("Auto-determined value");
00711                         else
00712                                 printf("%d seconds",temp_host->freshness_threshold);
00713                         printf("</TD>\n");
00714 
00715                         printf("<TD CLASS='%s'>",bg_class);
00716                 }
00717 
00718                 /* find all the contacts for this host... */
00719                 contact=0;
00720                 for(temp_contactsmember=temp_host->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
00721                         contact++;
00722                         if(contact>1)
00723                                 printf(", ");
00724 
00725                         if(content_type==JSON_CONTENT)
00726                                 printf("{ \"contact_name\": \"%s\" } ",json_encode(temp_contactsmember->contact_name));
00727                         else if(content_type==CSV_CONTENT)
00728                                 printf("%s",temp_contactsmember->contact_name);
00729                         else
00730                                 printf("<A HREF='%s?type=contacts&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contactsmember->contact_name),html_encode(temp_contactsmember->contact_name,FALSE));
00731                 }
00732                 for(temp_contactgroupsmember=temp_host->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){
00733                         contact++;
00734                         if(contact>1)
00735                                 printf(", ");
00736 
00737                         if(content_type==JSON_CONTENT)
00738                                 printf("{ \"contactgroup_name\": \"%s\" } ",json_encode(temp_contactgroupsmember->group_name));
00739                         else if(content_type==CSV_CONTENT)
00740                                 printf("%s",temp_contactgroupsmember->group_name);
00741                         else
00742                                 printf("<A HREF='%s?type=contactgroups&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contactgroupsmember->group_name),html_encode(temp_contactgroupsmember->group_name,FALSE));
00743                 }
00744                 if(contact==0)
00745                         printf("%s",(content_type==CSV_CONTENT || content_type==JSON_CONTENT)?"":"&nbsp;");
00746 
00747                 get_interval_time_string(temp_host->notification_interval,time_string[0],sizeof(time_string[0]));
00748                 get_interval_time_string(temp_host->first_notification_delay,time_string[1],sizeof(time_string[1]));
00749 
00750                 if(content_type==JSON_CONTENT) {
00751                         printf("], ");
00752                         printf("\"notification_interval\": \"%s\", ",time_string[0]);
00753                         printf("\"first_notification_delay\": \"%s\", ",time_string[1]);
00754                         printf("\"notification_options\": [ ");
00755                 }else if(content_type==CSV_CONTENT){
00756                         printf("%s%s",csv_data_enclosure,csv_delimiter);
00757                         printf("%s%s%s%s",csv_data_enclosure,time_string[0],csv_data_enclosure,csv_delimiter);
00758                         printf("%s%s%s%s",csv_data_enclosure,time_string[1],csv_data_enclosure,csv_delimiter);
00759                         printf("%s",csv_data_enclosure);
00760                 }else{
00761                         printf("</TD>\n");
00762                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->notification_interval==0)?"<i>No Re-notification</I>":html_encode(time_string[0],FALSE));
00763                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,time_string[1]);
00764                         printf("<TD CLASS='%s'>",bg_class);
00765                 }
00766 
00767                 options=0;
00768                 if(temp_host->notify_on_down==TRUE){
00769                         options=1;
00770                         printf("%sDown%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00771                 }
00772                 if(temp_host->notify_on_unreachable==TRUE){
00773                         printf("%s%sUnreachable%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00774                         options=1;
00775                 }
00776                 if(temp_host->notify_on_recovery==TRUE){
00777                         printf("%s%sRecovery%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00778                         options=1;
00779                 }
00780                 if(temp_host->notify_on_flapping==TRUE){
00781                         printf("%s%sFlapping%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00782                         options=1;
00783                 }
00784                 if(temp_host->notify_on_downtime==TRUE){
00785                         printf("%s%sDowntime%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00786                         options=1;
00787                 }
00788                 if(options==0 && content_type!=JSON_CONTENT)
00789                         printf("None");
00790 
00791                 if(content_type==JSON_CONTENT) {
00792                         printf(" ], ");
00793                         if (temp_host->notification_period==NULL)
00794                                 printf("\"notification_period\": null, ");
00795                         else
00796                                 printf("\"notification_period\": \"%s\", ",json_encode(temp_host->notification_period));
00797 
00798                         if (temp_host->event_handler==NULL)
00799                                 printf("\"event_handler\": null, ");
00800                         else
00801                                 printf("\"event_handler\": \"%s\", ",json_encode(temp_host->event_handler));
00802 
00803                         printf("\"enable_event_handler\": %s, ",(temp_host->event_handler_enabled==TRUE)?"true":"false");
00804                         printf("\"stalking_options\": [ ");
00805                 }else if(content_type==CSV_CONTENT) {
00806                         printf("%s%s",csv_data_enclosure,csv_delimiter);
00807                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->notification_period==NULL)?"":temp_host->notification_period,csv_data_enclosure,csv_delimiter);
00808                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->event_handler==NULL)?"":temp_host->event_handler,csv_data_enclosure,csv_delimiter);
00809                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->event_handler_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00810                         printf("%s",csv_data_enclosure);
00811                 }else{
00812                         printf("</TD>\n");
00813 
00814                         printf("<TD CLASS='%s'>",bg_class);
00815 
00816                         if(temp_host->notification_period==NULL)
00817                                 printf("&nbsp;");
00818                         else
00819                                 printf("<a href='%s?type=timeperiods&expand=%s'>%s</a>",CONFIG_CGI,url_encode(temp_host->notification_period),html_encode(temp_host->notification_period,FALSE));
00820                         printf("</TD>\n");
00821 
00822                         printf("<TD CLASS='%s'>",bg_class);
00823                         if(temp_host->event_handler==NULL)
00824                                 printf("&nbsp");
00825                         else
00826                                 /* printf("<a href='%s?type=commands&expand=%s'>%s</a></TD>\n",CONFIG_CGI,url_encode(strtok(temp_host->event_handler,"!")),html_encode(temp_host->event_handler,FALSE)); */
00827                                 printf("<a href='%s?type=command&expand=%s'>%s</a>",CONFIG_CGI,url_encode(temp_host->event_handler),html_encode(temp_host->event_handler,FALSE));
00828 
00829                         printf("</TD>\n");
00830 
00831                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->event_handler_enabled==TRUE)?"Yes":"No");
00832 
00833                         printf("<TD CLASS='%s'>",bg_class);
00834                 }
00835 
00836                 options=0;
00837                 if(temp_host->stalk_on_up==TRUE){
00838                         options=1;
00839                         printf("%sUp%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00840                 }
00841                 if(temp_host->stalk_on_down==TRUE){
00842                         printf("%s%sDown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00843                         options=1;
00844                 }
00845                 if(temp_host->stalk_on_unreachable==TRUE){
00846                         printf("%s%sUnreachable%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00847                         options=1;
00848                 }
00849                 if(options==0 && content_type!=JSON_CONTENT)
00850                         printf("None");
00851 
00852                 if(content_type==JSON_CONTENT) {
00853                         printf(" ], ");
00854                         printf("\"enable_flap_detection\": %s, ",(temp_host->flap_detection_enabled==TRUE)?"true":"false");
00855                         if(temp_host->low_flap_threshold==0.0)
00856                                 printf("\"low_flap_threshold\": \"Program-wide value\", ");
00857                         else
00858                                 printf("\"low_flap_threshold\": %3.1f%%, ",temp_host->low_flap_threshold);
00859 
00860                         if(temp_host->high_flap_threshold==0.0)
00861                                 printf("\"high_flap_threshold\": \"Program-wide value\", ");
00862                         else
00863                                 printf("\"high_flap_threshold\": %3.1f%%, ",temp_host->high_flap_threshold);
00864 
00865                         printf("\"flap_detection_options\": [ ");
00866                 }else if(content_type==CSV_CONTENT) {
00867                         printf("%s%s",csv_data_enclosure,csv_delimiter);
00868                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->flap_detection_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00869                         if(temp_host->low_flap_threshold==0.0)
00870                                 printf("%sProgram-wide value%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00871                         else
00872                                 printf("%s%3.1f%%%s%s",csv_data_enclosure,temp_host->low_flap_threshold,csv_data_enclosure,csv_delimiter);
00873                         if(temp_host->high_flap_threshold==0.0)
00874                                 printf("%sProgram-wide value%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00875                         else
00876                                 printf("%s%3.1f%%%s%s",csv_data_enclosure,temp_host->high_flap_threshold,csv_data_enclosure,csv_delimiter);
00877                         printf("%s",csv_data_enclosure);
00878                 }else{
00879                         printf("</TD>\n");
00880 
00881                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->flap_detection_enabled==TRUE)?"Yes":"No");
00882 
00883                         printf("<TD CLASS='%s'>",bg_class);
00884                         if(temp_host->low_flap_threshold==0.0)
00885                                 printf("Program-wide value");
00886                         else
00887                                 printf("%3.1f%%",temp_host->low_flap_threshold);
00888                         printf("</TD>\n");
00889 
00890                         printf("<TD CLASS='%s'>",bg_class);
00891                         if(temp_host->high_flap_threshold==0.0)
00892                                 printf("Program-wide value");
00893                         else
00894                                 printf("%3.1f%%",temp_host->high_flap_threshold);
00895                         printf("</TD>\n");
00896 
00897                         printf("<TD CLASS='%s'>",bg_class);
00898                 }
00899 
00900                 options=0;
00901                 if(temp_host->flap_detection_on_up==TRUE){
00902                         options=1;
00903                         printf("%sUp%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00904                 }
00905                 if(temp_host->flap_detection_on_down==TRUE){
00906                         printf("%s%sDown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00907                         options=1;
00908                 }
00909                 if(temp_host->flap_detection_on_unreachable==TRUE){
00910                         printf("%s%sUnreachable%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
00911                         options=1;
00912                 }
00913                 if(options==0 && content_type!=JSON_CONTENT)
00914                         printf("None");
00915 
00916                 if(content_type==JSON_CONTENT) {
00917                         printf(" ], ");
00918                         printf("\"process_performance_data\": %s, ",(temp_host->process_performance_data==TRUE)?"true":"false");
00919                         printf("\"enable_failure_prediction\": %s, ",(temp_host->failure_prediction_enabled==TRUE)?"true":"false");
00920                         if (temp_host->failure_prediction_options==NULL)
00921                                 printf("\"failure_prediction_options\": null, ");
00922                         else
00923                                 printf("\"failure_prediction_options\": \"%s\", ",temp_host->failure_prediction_options);
00924                         if (temp_host->notes==NULL)
00925                                 printf("\"notes\": null, ");
00926                         else
00927                                 printf("\"notes\": \"%s\", ",json_encode(temp_host->notes));
00928                         if (temp_host->notes_url==NULL)
00929                                 printf("\"notes_url\": null, ");
00930                         else
00931                                 printf("\"notes_url\": \"%s\", ",json_encode(temp_host->notes_url));
00932                         if (temp_host->action_url==NULL)
00933                                 printf("\"action_url\": null, ");
00934                         else
00935                                 printf("\"action_url\": \"%s\", ",json_encode(temp_host->action_url));
00936                         if (temp_host->have_2d_coords==FALSE)
00937                                 printf("\"2d_coords\": null, ");
00938                         else
00939                                 printf("\"2d_coords\": \"%d,%d\", ",temp_host->x_2d,temp_host->y_2d);
00940                         if (temp_host->have_3d_coords==FALSE)
00941                                 printf("\"3d_coords\": null, ");
00942                         else
00943                                 printf("\"3d_coords\": \"%.2f,%.2f,%.2f\", ",temp_host->x_3d,temp_host->y_3d,temp_host->z_3d);
00944                         if (temp_host->statusmap_image==NULL)
00945                                 printf("\"statusmap_image\": null, ");
00946                         else
00947                                 printf("\"statusmap_image\": \"%s\", ",temp_host->statusmap_image);
00948                         if (temp_host->vrml_image==NULL)
00949                                 printf("\"vrml_image\": null, ");
00950                         else
00951                                 printf("\"vrml_image\": \"%s\", ",json_encode(temp_host->vrml_image));
00952                         if (temp_host->icon_image==NULL)
00953                                 printf("\"icon_image\": null, ");
00954                         else
00955                                 printf("\"icon_image\": \"%s\", ",json_encode(temp_host->icon_image));
00956                         if (temp_host->icon_image_alt==NULL)
00957                                 printf("\"icon_image_alt\": null, ");
00958                         else
00959                                 printf("\"icon_image_alt\": \"%s\", ",json_encode(temp_host->icon_image_alt));
00960                         printf("\"retention_options\": [ ");
00961                 }else if(content_type==CSV_CONTENT) {
00962                         printf("%s%s",csv_data_enclosure,csv_delimiter);
00963                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->process_performance_data==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00964                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->failure_prediction_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
00965                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->failure_prediction_options==NULL)?"":temp_host->failure_prediction_options,csv_data_enclosure,csv_delimiter);
00966                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->notes==NULL)?"":temp_host->notes,csv_data_enclosure,csv_delimiter);
00967                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->notes_url==NULL)?"":temp_host->notes_url,csv_data_enclosure,csv_delimiter);
00968                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->action_url==NULL)?"":temp_host->action_url,csv_data_enclosure,csv_delimiter);
00969                         if(temp_host->have_2d_coords==FALSE)
00970                                 printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00971                         else
00972                                 printf("%s%d,%d%s%s",csv_data_enclosure,temp_host->x_2d,temp_host->y_2d,csv_data_enclosure,csv_delimiter);
00973                         if(temp_host->have_3d_coords==FALSE)
00974                                 printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
00975                         else
00976                                 printf("%s%.2f,%.2f,%.2f%s%s",csv_data_enclosure,temp_host->x_3d,temp_host->y_3d,temp_host->z_3d,csv_data_enclosure,csv_delimiter);
00977                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->statusmap_image==NULL)?"":temp_host->statusmap_image,csv_data_enclosure,csv_delimiter);
00978                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->vrml_image==NULL)?"":temp_host->vrml_image,csv_data_enclosure,csv_delimiter);
00979                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->icon_image==NULL)?"":temp_host->icon_image,csv_data_enclosure,csv_delimiter);
00980                         printf("%s%s%s%s",csv_data_enclosure,(temp_host->icon_image_alt==NULL)?"":temp_host->icon_image_alt,csv_data_enclosure,csv_delimiter);
00981                         printf("%s",csv_data_enclosure);
00982                 }else{
00983                         printf("</TD>\n");
00984 
00985                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->process_performance_data==TRUE)?"Yes":"No");
00986 
00987                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->failure_prediction_enabled==TRUE)?"Yes":"No");
00988 
00989                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->failure_prediction_options==NULL)?"&nbsp;":html_encode(temp_host->failure_prediction_options,FALSE));
00990 
00991                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->notes==NULL)?"&nbsp;":html_encode(temp_host->notes,FALSE));
00992 
00993                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->notes_url==NULL)?"&nbsp;":html_encode(temp_host->notes_url,FALSE));
00994 
00995                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->action_url==NULL)?"&nbsp;":html_encode(temp_host->action_url,FALSE));
00996 
00997                         if(temp_host->have_2d_coords==FALSE)
00998                                 printf("<TD CLASS='%s'>&nbsp;</TD>\n",bg_class);
00999                         else
01000                                 printf("<TD CLASS='%s'>%d,%d</TD>\n",bg_class,temp_host->x_2d,temp_host->y_2d);
01001 
01002                         if(temp_host->have_3d_coords==FALSE)
01003                                 printf("<TD CLASS='%s'>&nbsp;</TD>\n",bg_class);
01004                         else
01005                                 printf("<TD CLASS='%s'>%.2f,%.2f,%.2f</TD>\n",bg_class,temp_host->x_3d,temp_host->y_3d,temp_host->z_3d);
01006 
01007                         if(temp_host->statusmap_image==NULL)
01008                                 printf("<TD CLASS='%s'>&nbsp;</TD>\n",bg_class);
01009                         else
01010                                 printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>\n",bg_class,url_logo_images_path,temp_host->statusmap_image,html_encode(temp_host->statusmap_image,FALSE));
01011 
01012                         if(temp_host->vrml_image==NULL)
01013                                 printf("<TD CLASS='%s'>&nbsp;</TD>\n",bg_class);
01014                         else
01015                                 printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>\n",bg_class,url_logo_images_path,temp_host->vrml_image,html_encode(temp_host->vrml_image,FALSE));
01016 
01017                         if(temp_host->icon_image==NULL)
01018                                 printf("<TD CLASS='%s'>&nbsp;</TD>\n",bg_class);
01019                         else{
01020                                 process_macros_r(mac, temp_host->icon_image,&processed_string,0);
01021                                 printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'>%s</TD>\n",bg_class,url_logo_images_path,processed_string,html_encode(temp_host->icon_image,FALSE));
01022                                 free(processed_string);
01023                         }
01024 
01025                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_host->icon_image_alt==NULL)?"&nbsp;":html_encode(temp_host->icon_image_alt,FALSE));
01026 
01027                         printf("<TD CLASS='%s'>",bg_class);
01028                 }
01029 
01030                 options=0;
01031                 if(temp_host->retain_status_information==TRUE){
01032                         options=1;
01033                         printf("%sStatus Information%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01034                 }
01035                 if(temp_host->retain_nonstatus_information==TRUE){
01036                         printf("%s%sNon-Status Information%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01037                         options=1;
01038                 }
01039                 if(options==0 && content_type!=JSON_CONTENT)
01040                         printf("None");
01041 
01042                 if(content_type==JSON_CONTENT)
01043                         printf(" ] }");
01044                 else if(content_type==CSV_CONTENT)
01045                         printf("%s\n",csv_data_enclosure);
01046                 else
01047                         printf("</TD>\n</TR>\n");
01048 
01049         }
01050 
01051         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
01052                 printf("</TABLE>\n");
01053                 printf("</DIV>\n");
01054                 printf("</P>\n");
01055         }else if(content_type==JSON_CONTENT)
01056                 printf("\n]\n");
01057 
01058         return;
01059 }
01060 
01061 void display_hostgroups(void){
01062         hostgroup *temp_hostgroup;
01063         hostsmember *temp_hostsmember;
01064         int odd=0;
01065         int json_start=TRUE;
01066         char *bg_class="";
01067 
01068         if(content_type==JSON_CONTENT) {
01069                 printf("\"hostgroups\": [\n");
01070         }else if(content_type==CSV_CONTENT) {
01071                 printf("%sGroup Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01072                 printf("%sDescription%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01073                 printf("%sHost Members%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01074                 printf("%sNotes%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01075                 printf("%sNotes URL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01076                 printf("%sAction URL%s\n",csv_data_enclosure,csv_data_enclosure);
01077         } else {
01078                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Host Group%s%s</DIV></P>\n",
01079                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
01080 
01081                 printf("<P>\n");
01082                 printf("<DIV ALIGN=CENTER>\n");
01083 
01084                 printf("<TABLE BORDER=0 CLASS='data'>\n");
01085 
01086                 print_export_link();
01087 
01088                 printf("<TR>\n");
01089                 printf("<TH CLASS='data'>Group Name</TH>");
01090                 printf("<TH CLASS='data'>Description</TH>");
01091                 printf("<TH CLASS='data'>Host Members</TH>");
01092                 printf("<TH CLASS='data'>Notes</TH>");
01093                 printf("<TH CLASS='data'>Notes URL</TH>");
01094                 printf("<TH CLASS='data'>Action URL</TH>");
01095                 printf("</TR>\n");
01096         }
01097 
01098         /* check all the hostgroups... */
01099         for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_hostgroup->group_name))){
01100 
01101                 if(odd){
01102                         odd=0;
01103                         bg_class="dataOdd";
01104                 }else{
01105                         odd=1;
01106                         bg_class="dataEven";
01107                 }
01108 
01109                 /* print list in json format */
01110                 if(content_type==JSON_CONTENT) {
01111                         // always add a comma, except for the first line
01112                         if (json_start==FALSE)
01113                                 printf(",\n");
01114                         json_start=FALSE;
01115                         printf("{ \"group_name\": \"%s\", ",json_encode(temp_hostgroup->group_name));
01116                         printf("\"description\": \"%s\", ",json_encode(temp_hostgroup->alias));
01117                         printf("\"hostgroup_members\": [");
01118 
01119                         /* find all the services that are members of this servicegroup... */
01120                         for(temp_hostsmember=temp_hostgroup->members;temp_hostsmember!=NULL;temp_hostsmember=temp_hostsmember->next){
01121                                 if(temp_hostsmember!=temp_hostgroup->members)
01122                                         printf(",");
01123                                 printf(" \"%s\"",json_encode(temp_hostsmember->host_name));
01124                         }
01125                         printf(" ], ");
01126                         if (temp_hostgroup->notes==NULL)
01127                                 printf("\"notes\": null, ");
01128                         else
01129                                 printf("\"notes\": \"%s\", ",json_encode(temp_hostgroup->notes));
01130                         if (temp_hostgroup->notes_url==NULL)
01131                                 printf("\"notes_url\": null, ");
01132                         else
01133                                 printf("\"notes_url\": \"%s\", ",json_encode(temp_hostgroup->notes_url));
01134                         if (temp_hostgroup->action_url==NULL)
01135                                 printf("\"action_url\": null }");
01136                         else
01137                                 printf("\"action_url\": \"%s\" }",json_encode(temp_hostgroup->action_url));
01138                 /* print list in csv format */
01139                 }else if(content_type==CSV_CONTENT) {
01140                         printf("%s%s%s%s",csv_data_enclosure,temp_hostgroup->group_name,csv_data_enclosure,csv_delimiter);
01141                         printf("%s%s%s%s",csv_data_enclosure,temp_hostgroup->alias,csv_data_enclosure,csv_delimiter);
01142                         printf("%s",csv_data_enclosure);
01143 
01144                         /* find all the services that are members of this servicegroup... */
01145                         for(temp_hostsmember=temp_hostgroup->members;temp_hostsmember!=NULL;temp_hostsmember=temp_hostsmember->next){
01146                                 if(temp_hostsmember!=temp_hostgroup->members)
01147                                         printf(", ");
01148                                 printf("%s",temp_hostsmember->host_name);
01149                         }
01150 
01151                         printf("%s%s",csv_data_enclosure,csv_delimiter);
01152                         printf("%s%s%s%s",csv_data_enclosure,(temp_hostgroup->notes==NULL)?"":temp_hostgroup->notes,csv_data_enclosure,csv_delimiter);
01153                         printf("%s%s%s%s",csv_data_enclosure,(temp_hostgroup->notes_url==NULL)?"":temp_hostgroup->notes_url,csv_data_enclosure,csv_delimiter);
01154                         printf("%s%s%s\n",csv_data_enclosure,(temp_hostgroup->action_url==NULL)?"":temp_hostgroup->action_url,csv_data_enclosure);
01155                 } else {
01156                         printf("<TR CLASS='%s'>\n",bg_class);
01157 
01158                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_hostgroup->group_name,FALSE));
01159 
01160                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_hostgroup->alias,FALSE));
01161 
01162                         printf("<TD CLASS='%s'>",bg_class);
01163 
01164                         /* find all the hosts that are members of this hostgroup... */
01165                         for(temp_hostsmember=temp_hostgroup->members;temp_hostsmember!=NULL;temp_hostsmember=temp_hostsmember->next){
01166 
01167                                 if(temp_hostsmember!=temp_hostgroup->members)
01168                                         printf(", ");
01169                                 printf("<A HREF='%s?type=hosts&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_hostsmember->host_name),html_encode(temp_hostsmember->host_name,FALSE));
01170                         }
01171                         printf("</TD>\n");
01172 
01173                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_hostgroup->notes==NULL)?"&nbsp;":html_encode(temp_hostgroup->notes,FALSE));
01174 
01175                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_hostgroup->notes_url==NULL)?"&nbsp;":html_encode(temp_hostgroup->notes_url,FALSE));
01176 
01177                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_hostgroup->action_url==NULL)?"&nbsp;":html_encode(temp_hostgroup->action_url,FALSE));
01178 
01179                         printf("</TR>\n");
01180                 }
01181         }
01182 
01183         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
01184                 printf("</TABLE>\n");
01185                 printf("</DIV>\n");
01186                 printf("</P>\n");
01187         }else if(content_type==JSON_CONTENT)
01188                 printf("\n]\n");
01189 
01190         return;
01191 }
01192 
01193 void display_servicegroups(void){
01194         servicegroup *temp_servicegroup;
01195         servicesmember *temp_servicesmember;
01196         int odd=0;
01197         char *bg_class="";
01198         int json_start=TRUE;
01199 
01200         if(content_type==JSON_CONTENT) {
01201                 printf("\"servicegroups\": [\n");
01202         }else if(content_type==CSV_CONTENT) {
01203                 printf("%sGroup Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01204                 printf("%sDescription%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01205                 printf("%sService Members%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01206                 printf("%sNotes%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01207                 printf("%sNotes URL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01208                 printf("%sAction URL%s",csv_data_enclosure,csv_data_enclosure);
01209                 printf("\n");
01210         } else {
01211                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Service Group%s%s</DIV></P>\n",
01212                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
01213 
01214                 printf("<P>\n");
01215                 printf("<DIV ALIGN=CENTER>\n");
01216 
01217                 printf("<TABLE BORDER=0 CLASS='data'>\n");
01218 
01219                 print_export_link();
01220 
01221                 printf("<TR>\n");
01222                 printf("<TH CLASS='data'>Group Name</TH>");
01223                 printf("<TH CLASS='data'>Description</TH>");
01224                 printf("<TH CLASS='data'>Service Members</TH>");
01225                 printf("<TH CLASS='data'>Notes</TH>");
01226                 printf("<TH CLASS='data'>Notes URL</TH>");
01227                 printf("<TH CLASS='data'>Action URL</TH>");
01228                 printf("</TR>\n");
01229         }
01230 
01231         /* check all the servicegroups... */
01232         for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_servicegroup->group_name))){
01233 
01234                 if(odd){
01235                         odd=0;
01236                         bg_class="dataOdd";
01237                 }else{
01238                         odd=1;
01239                         bg_class="dataEven";
01240                 }
01241 
01242                 /* print list in json format */
01243                 if(content_type==JSON_CONTENT) {
01244                         // always add a comma, except for the first line
01245                         if (json_start==FALSE)
01246                                 printf(",\n");
01247                         json_start=FALSE;
01248                         printf("{ \"group_name\": \"%s\", ",json_encode(temp_servicegroup->group_name));
01249                         printf("\"description\": \"%s\", ",json_encode(temp_servicegroup->alias));
01250                         printf("\"servicegroup_members\": [");
01251 
01252                         /* find all the services that are members of this servicegroup... */
01253                         for(temp_servicesmember=temp_servicegroup->members;temp_servicesmember!=NULL;temp_servicesmember=temp_servicesmember->next){
01254                                 if(temp_servicesmember!=temp_servicegroup->members)
01255                                         printf(",");
01256                                 printf(" { \"host_name\": \"%s\", \"service_description\": \"%s\" }",json_encode(temp_servicesmember->host_name),json_encode(temp_servicesmember->service_description));
01257                         }
01258                         printf(" ], ");
01259                         if (temp_servicegroup->notes==NULL)
01260                                 printf("\"notes\": null, ");
01261                         else
01262                                 printf("\"notes\": \"%s\", ",json_encode(temp_servicegroup->notes));
01263                         if (temp_servicegroup->notes_url==NULL)
01264                                 printf("\"notes_url\": null, ");
01265                         else
01266                                 printf("\"notes_url\": \"%s\", ",json_encode(temp_servicegroup->notes_url));
01267                         if (temp_servicegroup->action_url==NULL)
01268                                 printf("\"action_url\": null }");
01269                         else
01270                                 printf("\"action_url\": \"%s\" }",json_encode(temp_servicegroup->action_url));
01271                 /* print list in csv format */
01272                 }else if(content_type==CSV_CONTENT) {
01273                         printf("%s%s%s%s",csv_data_enclosure,temp_servicegroup->group_name,csv_data_enclosure,csv_delimiter);
01274                         printf("%s%s%s%s",csv_data_enclosure,temp_servicegroup->alias,csv_data_enclosure,csv_delimiter);
01275                         printf("%s",csv_data_enclosure);
01276 
01277                         /* find all the services that are members of this servicegroup... */
01278                         for(temp_servicesmember=temp_servicegroup->members;temp_servicesmember!=NULL;temp_servicesmember=temp_servicesmember->next)
01279                                 printf("%s%s / %s",(temp_servicesmember==temp_servicegroup->members)?"":", ",temp_servicesmember->host_name,temp_servicesmember->service_description);
01280 
01281                         printf("%s%s",csv_data_enclosure,csv_delimiter);
01282                         printf("%s%s%s%s",csv_data_enclosure,(temp_servicegroup->notes==NULL)?"":temp_servicegroup->notes,csv_data_enclosure,csv_delimiter);
01283                         printf("%s%s%s%s",csv_data_enclosure,(temp_servicegroup->notes_url==NULL)?"":temp_servicegroup->notes_url,csv_data_enclosure,csv_delimiter);
01284                         printf("%s%s%s\n",csv_data_enclosure,(temp_servicegroup->action_url==NULL)?"":temp_servicegroup->action_url,csv_data_enclosure);
01285                 } else {
01286                         printf("<TR CLASS='%s'>\n",bg_class);
01287 
01288                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_servicegroup->group_name,FALSE));
01289 
01290                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_servicegroup->alias,FALSE));
01291 
01292                         printf("<TD CLASS='%s'>",bg_class);
01293 
01294                         /* find all the services that are members of this servicegroup... */
01295                         for(temp_servicesmember=temp_servicegroup->members;temp_servicesmember!=NULL;temp_servicesmember=temp_servicesmember->next){
01296 
01297                                 printf("%s<A HREF='%s?type=hosts&expand=%s'>%s</A> / ",(temp_servicesmember==temp_servicegroup->members)?"":", ",CONFIG_CGI,url_encode(temp_servicesmember->host_name),html_encode(temp_servicesmember->host_name,FALSE));
01298 
01299                                 printf("<A HREF='%s?type=services&expand=%s#%s;",CONFIG_CGI,url_encode(temp_servicesmember->host_name),url_encode(temp_servicesmember->host_name));
01300                                 printf("%s'>%s</A>",url_encode(temp_servicesmember->service_description),html_encode(temp_servicesmember->service_description,FALSE));
01301                         }
01302 
01303                         printf("</TD>\n");
01304 
01305                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_servicegroup->notes==NULL)?"&nbsp;":html_encode(temp_servicegroup->notes,FALSE));
01306 
01307                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_servicegroup->notes_url==NULL)?"&nbsp;":html_encode(temp_servicegroup->notes_url,FALSE));
01308 
01309                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_servicegroup->action_url==NULL)?"&nbsp;":html_encode(temp_servicegroup->action_url,FALSE));
01310 
01311                         printf("</TR>\n");
01312                 }
01313         }
01314 
01315         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
01316                 printf("</TABLE>\n");
01317                 printf("</DIV>\n");
01318                 printf("</P>\n");
01319         }else if(content_type==JSON_CONTENT)
01320                 printf("\n]\n");
01321 
01322         return;
01323 }
01324 
01325 void display_contacts(void){
01326         contact *temp_contact;
01327         commandsmember *temp_commandsmember;
01328         int odd=0;
01329         int options;
01330         int found;
01331         char *bg_class="";
01332         int json_start=TRUE;
01333 
01334         if(content_type==JSON_CONTENT) {
01335                 printf("\"contacts\": [\n");
01336         }else if(content_type==CSV_CONTENT) {
01337                 printf("%sContact Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01338                 printf("%sAlias%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01339                 printf("%sEmail Address%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01340                 printf("%sPager Address/Number%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01341                 printf("%sService Notification Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01342                 printf("%sHost Notification Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01343                 printf("%sService Notification Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01344                 printf("%sHost Notification Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01345                 printf("%sService Notification Commands%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01346                 printf("%sHost Notification Commands%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01347                 printf("%sRetention Options%s",csv_data_enclosure,csv_data_enclosure);
01348                 printf("\n");
01349         } else {
01350                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Contact%s%s</DIV></P>\n",
01351                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
01352 
01353                 printf("<P>\n");
01354                 printf("<DIV ALIGN=CENTER>\n");
01355 
01356                 printf("<TABLE CLASS='data'>\n");
01357 
01358                 print_export_link();
01359 
01360                 printf("<TR>\n");
01361                 printf("<TH CLASS='data'>Contact Name</TH>");
01362                 printf("<TH CLASS='data'>Alias</TH>");
01363                 printf("<TH CLASS='data'>Email Address</TH>");
01364                 printf("<TH CLASS='data'>Pager Address/Number</TH>");
01365                 printf("<TH CLASS='data'>Service Notification Options</TH>");
01366                 printf("<TH CLASS='data'>Host Notification Options</TH>");
01367                 printf("<TH CLASS='data'>Service Notification Period</TH>");
01368                 printf("<TH CLASS='data'>Host Notification Period</TH>");
01369                 printf("<TH CLASS='data'>Service Notification Commands</TH>");
01370                 printf("<TH CLASS='data'>Host Notification Commands</TH>");
01371                 printf("<TH CLASS='data'>Retention Options</TH>");
01372                 printf("</TR>\n");
01373         }
01374 
01375         /* check all contacts... */
01376         for(temp_contact=contact_list;temp_contact!=NULL;temp_contact=temp_contact->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_contact->name))){
01377 
01378                 if(odd){
01379                         odd=0;
01380                         bg_class="dataOdd";
01381                 }else{
01382                         odd=1;
01383                         bg_class="dataEven";
01384                 }
01385 
01386                 /* print list in json format */
01387                 if(content_type==JSON_CONTENT) {
01388                         // always add a comma, except for the first line
01389                         if (json_start==FALSE)
01390                                 printf(",\n");
01391                         json_start=FALSE;
01392 
01393                         printf("{ \"contact_name\": \"%s\", ",json_encode(temp_contact->name));
01394                         printf("\"alias\": \"%s\", ",json_encode(temp_contact->alias));
01395                         if (temp_contact->email==NULL)
01396                                 printf("\"email_address\": null, ");
01397                         else
01398                                 printf("\"email_address\": \"%s\", ",json_encode(temp_contact->email));
01399                         if (temp_contact->pager==NULL)
01400                                 printf("\"pager_number\": null, ");
01401                         else
01402                                 printf("\"pager_number\": \"%s\", ",json_encode(temp_contact->pager));
01403                         printf("\"service_notification_options\": [");
01404                 /* print list in csv format */
01405                 }else if(content_type==CSV_CONTENT) {
01406                         printf("%s%s%s%s",csv_data_enclosure,temp_contact->name,csv_data_enclosure,csv_delimiter);
01407                         printf("%s%s%s%s",csv_data_enclosure,temp_contact->alias,csv_data_enclosure,csv_delimiter);
01408                         printf("%s%s%s%s",csv_data_enclosure,(temp_contact->email==NULL)?"":temp_contact->email,csv_data_enclosure,csv_delimiter);
01409                         printf("%s%s%s%s",csv_data_enclosure,(temp_contact->pager==NULL)?"":temp_contact->pager,csv_data_enclosure,csv_delimiter);
01410                         printf("%s",csv_data_enclosure);
01411                 } else {
01412                         printf("<TR CLASS='%s'>\n",bg_class);
01413 
01414                         printf("<TD CLASS='%s'><A NAME='%s'>%s</a></TD>\n",bg_class,url_encode(temp_contact->name),html_encode(temp_contact->name,FALSE));
01415                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_contact->alias,FALSE));
01416                         printf("<TD CLASS='%s'><A HREF='mailto:%s'>%s</A></TD>\n",bg_class,(temp_contact->email==NULL)?"&nbsp;":url_encode(temp_contact->email),(temp_contact->email==NULL)?"&nbsp;":html_encode(temp_contact->email,FALSE));
01417                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_contact->pager==NULL)?"&nbsp;":html_encode(temp_contact->pager,FALSE));
01418 
01419                         printf("<TD CLASS='%s'>",bg_class);
01420                 }
01421 
01422                 options=0;
01423                 if(temp_contact->notify_on_service_unknown==TRUE){
01424                         options=1;
01425                         printf("%sUnknown%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01426                 }
01427                 if(temp_contact->notify_on_service_warning==TRUE){
01428                         printf("%s%sWarning%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01429                         options=1;
01430                 }
01431                 if(temp_contact->notify_on_service_critical==TRUE){
01432                         printf("%s%sCritical%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01433                         options=1;
01434                 }
01435                 if(temp_contact->notify_on_service_recovery==TRUE){
01436                         printf("%s%sRecovery%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01437                         options=1;
01438                 }
01439                 if(temp_contact->notify_on_service_flapping==TRUE){
01440                         printf("%s%sFlapping%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01441                         options=1;
01442                 }
01443                 if(temp_contact->notify_on_service_downtime==TRUE){
01444                         printf("%s%sDowntime%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01445                         options=1;
01446                 }
01447                 if(options==0 && content_type!=JSON_CONTENT)
01448                         printf("None");
01449 
01450                 if(content_type==JSON_CONTENT) {
01451                         printf(" ], ");
01452                         printf("\"host_notification_options\": [");
01453                 }else if(content_type==CSV_CONTENT) {
01454                         printf("%s%s",csv_data_enclosure,csv_delimiter);
01455                         printf("%s",csv_data_enclosure);
01456                 } else {
01457                         printf("</TD>\n");
01458                         printf("<TD CLASS='%s'>",bg_class);
01459                 }
01460 
01461                 options=0;
01462                 if(temp_contact->notify_on_host_down==TRUE){
01463                         options=1;
01464                         printf("%sDown%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01465                 }
01466                 if(temp_contact->notify_on_host_unreachable==TRUE){
01467                         printf("%s%sUnreachable%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01468                         options=1;
01469                 }
01470                 if(temp_contact->notify_on_host_recovery==TRUE){
01471                         printf("%s%sRecovery%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01472                         options=1;
01473                 }
01474                 if(temp_contact->notify_on_host_flapping==TRUE){
01475                         printf("%s%sFlapping%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01476                         options=1;
01477                 }
01478                 if(temp_contact->notify_on_host_downtime==TRUE){
01479                         printf("%s%sDowntime%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01480                         options=1;
01481                 }
01482                 if(options==0 && content_type!=JSON_CONTENT)
01483                         printf("None");
01484 
01485                 if(content_type==JSON_CONTENT) {
01486                         printf(" ], ");
01487                         if (temp_contact->service_notification_period==NULL)
01488                                 printf("\"service_notification_period\": null, ");
01489                         else
01490                                 printf("\"service_notification_period\": \"%s\", ",json_encode(temp_contact->service_notification_period));
01491                         if (temp_contact->host_notification_period==NULL)
01492                                 printf("\"host_notification_period\": null, ");
01493                         else
01494                                 printf("\"host_notification_period\": \"%s\", ",json_encode(temp_contact->host_notification_period));
01495                         printf("\"service_notification_commands\": [ ");
01496                 }else if(content_type==CSV_CONTENT) {
01497                         printf("%s%s",csv_data_enclosure,csv_delimiter);
01498 
01499                         printf("%s%s%s%s",csv_data_enclosure,(temp_contact->service_notification_period==NULL)?"":temp_contact->service_notification_period,csv_data_enclosure,csv_delimiter);
01500                         printf("%s%s%s%s",csv_data_enclosure,(temp_contact->host_notification_period==NULL)?"":temp_contact->host_notification_period,csv_data_enclosure,csv_delimiter);
01501 
01502                         printf("%s",csv_data_enclosure);
01503                 } else {
01504                         printf("</TD>\n");
01505                         printf("<TD CLASS='%s'>",bg_class);
01506 
01507                         if(temp_contact->service_notification_period==NULL)
01508                                 printf("&nbsp;");
01509                         else
01510                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contact->service_notification_period),html_encode(temp_contact->service_notification_period,FALSE));
01511                         printf("</TD>\n");
01512 
01513                         printf("<TD CLASS='%s'>\n",bg_class);
01514                         if(temp_contact->host_notification_period==NULL)
01515                                 printf("&nbsp;");
01516                         else
01517                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contact->host_notification_period),html_encode(temp_contact->host_notification_period,FALSE));
01518                         printf("</TD>\n");
01519 
01520                         printf("<TD CLASS='%s'>",bg_class);
01521                 }
01522 
01523                 found=FALSE;
01524                 for(temp_commandsmember=temp_contact->service_notification_commands;temp_commandsmember!=NULL;temp_commandsmember=temp_commandsmember->next){
01525 
01526                         if(temp_commandsmember!=temp_contact->service_notification_commands)
01527                                 printf(", ");
01528 
01529                         if(content_type==JSON_CONTENT) {
01530                                 printf("\"%s\"",json_encode(temp_commandsmember->command));
01531                         } else if(content_type==CSV_CONTENT){
01532                                 printf("%s",temp_commandsmember->command);
01533                         } else {
01534                                 /* printf("<A HREF='%s?type=commands&expand=%s'>%s</A>",CONFIG_CGI,url_encode(strtok(temp_commandsmember->command,"!")),html_encode(temp_commandsmember->command,FALSE)); */
01535                                 printf("<A HREF='%s?type=command&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_commandsmember->command),html_encode(temp_commandsmember->command,FALSE));
01536                         }
01537 
01538                         found=TRUE;
01539                 }
01540 
01541                 if(found==FALSE && content_type!=JSON_CONTENT)
01542                         printf("None");
01543 
01544                 if(content_type==JSON_CONTENT) {
01545                         printf(" ], ");
01546                         printf("\"host_notification_commands\": [ ");
01547                 }else if(content_type==CSV_CONTENT){
01548                         printf("%s%s",csv_data_enclosure,csv_delimiter);
01549                         printf("%s",csv_data_enclosure);
01550                 } else {
01551                         printf("</TD>\n");
01552                         printf("<TD CLASS='%s'>",bg_class);
01553                 }
01554 
01555                 found=FALSE;
01556                 for(temp_commandsmember=temp_contact->host_notification_commands;temp_commandsmember!=NULL;temp_commandsmember=temp_commandsmember->next){
01557 
01558                         if(temp_commandsmember!=temp_contact->host_notification_commands)
01559                                 printf(", ");
01560 
01561                         if(content_type==JSON_CONTENT) {
01562                                 printf("\"%s\"",json_encode(temp_commandsmember->command));
01563                         } else if(content_type==CSV_CONTENT){
01564                                 printf("%s",temp_commandsmember->command);
01565                         } else {
01566                                 /* printf("<A HREF='%s?type=commands&expand=%s'>%s</A>",CONFIG_CGI,url_encode(strtok(temp_commandsmember->command,"!")),html_encode(temp_commandsmember->command,FALSE)); */
01567                                 printf("<A HREF='%s?type=command&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_commandsmember->command),html_encode(temp_commandsmember->command,FALSE));
01568                         }
01569 
01570                         found=TRUE;
01571                 }
01572                 if(found==FALSE && content_type!=JSON_CONTENT)
01573                         printf("None");
01574 
01575                 if(content_type==JSON_CONTENT) {
01576                         printf(" ], ");
01577                         printf("\"retention_options\": [ ");
01578                 }else if(content_type==CSV_CONTENT){
01579                         printf("%s%s",csv_data_enclosure,csv_delimiter);
01580                         printf("%s",csv_data_enclosure);
01581                 } else {
01582                         printf("</TD>\n");
01583                         printf("<TD CLASS='%s'>",bg_class);
01584                 }
01585 
01586                 options=0;
01587                 if(temp_contact->retain_status_information==TRUE){
01588                         options=1;
01589                         printf("%sStatus Information%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01590                 }
01591                 if(temp_contact->retain_nonstatus_information==TRUE){
01592                         printf("%s%sNon-Status Information%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
01593                         options=1;
01594                 }
01595                 if(options==0 && content_type!=JSON_CONTENT)
01596                         printf("None");
01597 
01598                 if(content_type==JSON_CONTENT)
01599                         printf(" ] }");
01600                 else if(content_type==CSV_CONTENT)
01601                         printf("%s\n",csv_data_enclosure);
01602                 else
01603                         printf("</TD>\n</TR>\n");
01604         }
01605 
01606         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
01607                 printf("</TABLE>\n");
01608                 printf("</DIV>\n");
01609                 printf("</P>\n");
01610         }else if(content_type==JSON_CONTENT)
01611                 printf("\n]\n");
01612 
01613         return;
01614 }
01615 
01616 void display_contactgroups(void){
01617         contactgroup *temp_contactgroup;
01618         contactsmember *temp_contactsmember;
01619         int odd=0;
01620         char *bg_class;
01621         int json_start=TRUE;
01622 
01623         if(content_type==JSON_CONTENT) {
01624                 printf("\"contactgroups\": [\n");
01625         }else if(content_type==CSV_CONTENT) {
01626                 printf("%sGroup Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01627                 printf("%sDescription%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01628                 printf("%sContact Members%s",csv_data_enclosure,csv_data_enclosure);
01629                 printf("\n");
01630         } else {
01631                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Contact Group%s%s</DIV></P>\n",
01632                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
01633 
01634                 printf("<P>\n");
01635                 printf("<DIV ALIGN=CENTER>\n");
01636 
01637                 printf("<TABLE BORDER=0 CELLSPACING=3 CELLPADDING=0>\n");
01638 
01639                 print_export_link();
01640 
01641                 printf("<TR>\n");
01642                 printf("<TH CLASS='data'>Group Name</TH>\n");
01643                 printf("<TH CLASS='data'>Description</TH>\n");
01644                 printf("<TH CLASS='data'>Contact Members</TH>\n");
01645                 printf("</TR>\n");
01646         }
01647 
01648         /* check all the contact groups... */
01649         for(temp_contactgroup=contactgroup_list;temp_contactgroup!=NULL;temp_contactgroup=temp_contactgroup->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_contactgroup->group_name))){
01650 
01651                 if(odd){
01652                         odd=0;
01653                         bg_class="dataOdd";
01654                 }else{
01655                         odd=1;
01656                         bg_class="dataEven";
01657                 }
01658 
01659                 /* print list in json format */
01660                 if(content_type==JSON_CONTENT) {
01661                         // always add a comma, except for the first line
01662                         if (json_start==FALSE)
01663                                 printf(",\n");
01664                         json_start=FALSE;
01665 
01666                         printf("{ \"contactgroup_name\": \"%s\", ",json_encode(temp_contactgroup->group_name));
01667                         printf("\"alias\": \"%s\", ",json_encode(temp_contactgroup->alias));
01668                         printf("\"contactgroup_members\": [");
01669                         for(temp_contactsmember=temp_contactgroup->members;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
01670                                 if(temp_contactsmember!=temp_contactgroup->members)
01671                                         printf(",");
01672 
01673                                 printf(" \"%s\"",json_encode(temp_contactsmember->contact_name));
01674                         }
01675                         printf(" ] }");
01676                 /* print list in csv format */
01677                 }else if(content_type==CSV_CONTENT) {
01678                         printf("%s%s%s%s",csv_data_enclosure,temp_contactgroup->group_name,csv_data_enclosure,csv_delimiter);
01679                         printf("%s%s%s%s",csv_data_enclosure,temp_contactgroup->alias,csv_data_enclosure,csv_delimiter);
01680                         printf("%s",csv_data_enclosure);
01681                         for(temp_contactsmember=temp_contactgroup->members;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
01682                                 if(temp_contactsmember!=temp_contactgroup->members)
01683                                         printf(", ");
01684 
01685                                 printf("%s",temp_contactsmember->contact_name);
01686                         }
01687                         printf("%s\n",csv_data_enclosure);
01688                 } else {
01689 
01690                         printf("<TR CLASS='%s'>\n",bg_class);
01691 
01692                         printf("<TD CLASS='%s'><A NAME='%s'></A>%s</TD>\n",bg_class,url_encode(temp_contactgroup->group_name),html_encode(temp_contactgroup->group_name,FALSE));
01693                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_contactgroup->alias,FALSE));
01694 
01695                         /* find all the contact who are members of this contact group... */
01696                         printf("<TD CLASS='%s'>",bg_class);
01697                         for(temp_contactsmember=temp_contactgroup->members;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
01698 
01699                                 if(temp_contactsmember!=temp_contactgroup->members)
01700                                         printf(", ");
01701 
01702                                 printf("<A HREF='%s?type=contacts&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contactsmember->contact_name),html_encode(temp_contactsmember->contact_name,FALSE));
01703                         }
01704                         printf("</TD>\n");
01705                         printf("</TR>\n");
01706                 }
01707         }
01708 
01709         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
01710                 printf("</TABLE>\n");
01711                 printf("</DIV>\n");
01712                 printf("</P>\n");
01713         }else if(content_type==JSON_CONTENT)
01714                 printf("\n]\n");
01715 
01716         return;
01717 }
01718 
01719 void display_services(void){
01720         service *temp_service=NULL;
01721         contactsmember *temp_contactsmember=NULL;
01722         contactgroupsmember *temp_contactgroupsmember=NULL;
01723         char *processed_string=NULL;
01724         char command_line[MAX_INPUT_BUFFER];
01725         int options;
01726         int odd=0;
01727         char time_string[2][16];
01728         char *bg_class;
01729         int contact=0;
01730         int json_start=TRUE;
01731 
01732         if(content_type==JSON_CONTENT) {
01733                 printf("\"services\": [\n");
01734         }else if(content_type==CSV_CONTENT) {
01735                 printf("%sHost%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01736                 printf("%sDescription%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01737                 printf("%sMax. Check Attempts%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01738                 printf("%sNormal Check Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01739                 printf("%sRetry Check Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01740                 printf("%sCheck Command%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01741                 printf("%sCheck Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01742                 printf("%sParallelize%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01743                 printf("%sVolatile%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01744                 printf("%sObsess Over%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01745                 printf("%sEnable Active Checks%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01746                 printf("%sEnable Passive Checks%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01747                 printf("%sCheck Freshness%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01748                 printf("%sFreshness Threshold%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01749                 printf("%sDefault Contacts/Groups%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01750                 printf("%sEnable Notifications%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01751                 printf("%sNotification Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01752                 printf("%sFirst Notification Delay%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01753                 printf("%sNotification Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01754                 printf("%sNotification Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01755                 printf("%sEvent Handler%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01756                 printf("%sEnable Event Handler%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01757                 printf("%sStalking Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01758                 printf("%sEnable Flap Detection%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01759                 printf("%sLow Flap Threshold%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01760                 printf("%sHigh Flap Threshold%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01761                 printf("%sFlap Detection Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01762                 printf("%sProcess Performance Data%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01763                 printf("%sEnable Failure Prediction%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01764                 printf("%sFailure Prediction Options%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01765                 printf("%sNotes%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01766                 printf("%sNotes URL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01767                 printf("%sAction URL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01768                 printf("%sLogo Image%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01769                 printf("%sImage Alt%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
01770                 printf("%sRetention Options%s",csv_data_enclosure,csv_data_enclosure);
01771                 printf("\n");
01772         } else {
01773                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Service%s%s</DIV></P>\n",
01774                         (*to_expand=='\0'?"s":"s Named or on Host "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
01775 
01776                 printf("<P>\n");
01777                 printf("<DIV ALIGN=CENTER>\n");
01778 
01779                 printf("<TABLE BORDER=0 CLASS='data'>\n");
01780 
01781                 print_export_link();
01782 
01783                 printf("<TR>\n");
01784                 printf("<TH CLASS='data'>Host</TH>\n");
01785                 printf("<TH CLASS='data'>Description</TH>\n");
01786                 printf("<TH CLASS='data'>Max. Check Attempts</TH>\n");
01787                 printf("<TH CLASS='data'>Normal Check Interval</TH>\n");
01788                 printf("<TH CLASS='data'>Retry Check Interval</TH>\n");
01789                 printf("<TH CLASS='data'>Check Command</TH>\n");
01790                 printf("<TH CLASS='data'>Check Period</TH>\n");
01791                 printf("<TH CLASS='data'>Parallelize</TH>\n");
01792                 printf("<TH CLASS='data'>Volatile</TH>\n");
01793                 printf("<TH CLASS='data'>Obsess Over</TH>\n");
01794                 printf("<TH CLASS='data'>Enable Active Checks</TH>\n");
01795                 printf("<TH CLASS='data'>Enable Passive Checks</TH>\n");
01796                 printf("<TH CLASS='data'>Check Freshness</TH>\n");
01797                 printf("<TH CLASS='data'>Freshness Threshold</TH>\n");
01798                 printf("<TH CLASS='data'>Default Contacts/Groups</TH>\n");
01799                 printf("<TH CLASS='data'>Enable Notifications</TH>\n");
01800                 printf("<TH CLASS='data'>Notification Interval</TH>\n");
01801                 printf("<TH CLASS='data'>First Notification Delay</TH>\n");
01802                 printf("<TH CLASS='data'>Notification Options</TH>\n");
01803                 printf("<TH CLASS='data'>Notification Period</TH>\n");
01804                 printf("<TH CLASS='data'>Event Handler</TH>");
01805                 printf("<TH CLASS='data'>Enable Event Handler</TH>");
01806                 printf("<TH CLASS='data'>Stalking Options</TH>\n");
01807                 printf("<TH CLASS='data'>Enable Flap Detection</TH>");
01808                 printf("<TH CLASS='data'>Low Flap Threshold</TH>");
01809                 printf("<TH CLASS='data'>High Flap Threshold</TH>");
01810                 printf("<TH CLASS='data'>Flap Detection Options</TH>");
01811                 printf("<TH CLASS='data'>Process Performance Data</TH>");
01812                 printf("<TH CLASS='data'>Enable Failure Prediction</TH>");
01813                 printf("<TH CLASS='data'>Failure Prediction Options</TH>");
01814                 printf("<TH CLASS='data'>Notes</TH>");
01815                 printf("<TH CLASS='data'>Notes URL</TH>");
01816                 printf("<TH CLASS='data'>Action URL</TH>");
01817                 printf("<TH CLASS='data'>Logo Image</TH>");
01818                 printf("<TH CLASS='data'>Image Alt</TH>");
01819                 printf("<TH CLASS='data'>Retention Options</TH>");
01820                 printf("</TR>\n");
01821         }
01822 
01823         /* check all the services... */
01824         for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){
01825 
01826                 if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_service->host_name))||(!strcmp(to_expand,temp_service->description))){
01827 
01828                         /* grab macros */
01829                         grab_service_macros_r(mac, temp_service);
01830 
01831                         if(odd){
01832                                 odd=0;
01833                                 bg_class="dataOdd";
01834                         }else{
01835                                 odd=1;
01836                                 bg_class="dataEven";
01837                         }
01838 
01839                         get_interval_time_string(temp_service->check_interval,time_string[0],sizeof(time_string[0]));
01840                         get_interval_time_string(temp_service->retry_interval,time_string[1],sizeof(time_string[1]));
01841                         strncpy(command_line,temp_service->service_check_command,sizeof(command_line));
01842                         command_line[sizeof(command_line)-1]='\x0';
01843 
01844                         /* print list in json format */
01845                         if(content_type==JSON_CONTENT) {
01846                                 // always add a comma, except for the first line
01847                                 if (json_start==FALSE)
01848                                         printf(",\n");
01849                                 json_start=FALSE;
01850                                 printf("{ \"host_name\": \"%s\", ",json_encode(temp_service->host_name));
01851                                 printf("\"description\": \"%s\", ",json_encode(temp_service->description));
01852                                 printf("\"max_check_attempts\": %d, ",temp_service->max_attempts);
01853                                 printf("\"normal_check_interval\": \"%s\", ",time_string[0]);
01854                                 printf("\"retry_check_interval\": \"%s\", ",time_string[1]);
01855                                 printf("\"check_command\": \"%s\", ",json_encode(command_line));
01856                                 if (temp_service->check_period==NULL)
01857                                         printf("\"check_period\": null, ");
01858                                 else
01859                                         printf("\"check_period\": \"%s\", ",json_encode(temp_service->check_period));
01860 
01861                                 printf("\"parallelize\": %s, ",(temp_service->parallelize==TRUE)?"true":"false");
01862                                 printf("\"volatile\": %s, ",(temp_service->is_volatile==TRUE)?"true":"false");
01863                                 printf("\"obsess_over\": %s, ",(temp_service->obsess_over_service==TRUE)?"true":"false");
01864                                 printf("\"enable_active_checks\": %s, ",(temp_service->checks_enabled==TRUE)?"true":"false");
01865                                 printf("\"enable_passive_checks\": %s, ",(temp_service->accept_passive_service_checks==TRUE)?"true":"false");
01866                                 printf("\"check_freshness\": %s, ",(temp_service->check_freshness==TRUE)?"true":"false");
01867                                 if(temp_service->freshness_threshold==0)
01868                                         printf("\"freshness_threshold\":  \"auto-determined value\", ");
01869                                 else
01870                                         printf("\"freshness_threshold\":  %d, ",temp_service->freshness_threshold);
01871 
01872                                 printf("\"default_contacts_default_groups\": [ ");
01873 
01874                         /* print list in csv format */
01875                         }else if(content_type==CSV_CONTENT) {
01876                                 printf("%s%s%s%s", csv_data_enclosure,temp_service->host_name,csv_data_enclosure,csv_delimiter);
01877                                 printf("%s%s%s%s", csv_data_enclosure,temp_service->description,csv_data_enclosure,csv_delimiter);
01878                                 printf("%s%d%s%s", csv_data_enclosure,temp_service->max_attempts,csv_data_enclosure,csv_delimiter);
01879 
01880                                 printf("%s%s%s%s", csv_data_enclosure,time_string[0],csv_data_enclosure,csv_delimiter);
01881 
01882                                 printf("%s%s%s%s", csv_data_enclosure,time_string[1],csv_data_enclosure,csv_delimiter);
01883 
01884                                 printf("%s%s%s%s",csv_data_enclosure,command_line,csv_data_enclosure,csv_delimiter);
01885 
01886                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->check_period==NULL)?"":temp_service->check_period,csv_data_enclosure,csv_delimiter);
01887                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->parallelize==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01888                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->is_volatile==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01889                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->obsess_over_service==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01890                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->checks_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01891                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->accept_passive_service_checks==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01892                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->check_freshness==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01893 
01894                                 printf("%s", csv_data_enclosure);
01895                                 if(temp_service->freshness_threshold==0)
01896                                         printf("Auto-determined value");
01897                                 else
01898                                         printf("%d",temp_service->freshness_threshold);
01899 
01900                                 printf("%s%s",csv_data_enclosure,csv_delimiter);
01901 
01902                                 printf("%s", csv_data_enclosure);
01903 
01904                         } else {
01905 
01906                                 printf("<TR CLASS='%s'>\n",bg_class);
01907 
01908                                 printf("<TD CLASS='%s'><A NAME='%s;",bg_class,url_encode(temp_service->host_name));
01909                                 printf("%s'></A>",url_encode(temp_service->description));
01910                                 printf("<A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",CONFIG_CGI,url_encode(temp_service->host_name),html_encode(temp_service->host_name,FALSE));
01911 
01912                                 /* find a way to show display_name if set once */
01913                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_service->description,FALSE));
01914 
01915                                 printf("<TD CLASS='%s'>%d</TD>\n",bg_class,temp_service->max_attempts);
01916 
01917                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,time_string[0]);
01918 
01919                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,time_string[1]);
01920 
01921                                 printf("<TD CLASS='%s'><A HREF='%s?type=command&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(command_line),html_encode(command_line,FALSE));
01922 
01923                                 printf("<TD CLASS='%s'>",bg_class);
01924                                 if(temp_service->check_period==NULL)
01925                                         printf("&nbsp;");
01926                                 else
01927                                         printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_service->check_period),html_encode(temp_service->check_period,FALSE));
01928                                 printf("</TD>\n");
01929 
01930                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->parallelize==TRUE)?"Yes":"No");
01931 
01932                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->is_volatile!=FALSE)?"Yes":"No");
01933 
01934                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->obsess_over_service==TRUE)?"Yes":"No");
01935 
01936                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->checks_enabled==TRUE)?"Yes":"No");
01937 
01938                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->accept_passive_service_checks==TRUE)?"Yes":"No");
01939 
01940                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->check_freshness==TRUE)?"Yes":"No");
01941 
01942                                 printf("<TD CLASS='%s'>",bg_class);
01943                                 if(temp_service->freshness_threshold==0)
01944                                         printf("Auto-determined value");
01945                                 else
01946                                         printf("%d seconds",temp_service->freshness_threshold);
01947                                 printf("</TD>\n");
01948 
01949                                 printf("<TD CLASS='%s'>",bg_class);
01950                         }
01951 
01952                         contact=0;
01953                         for(temp_contactsmember=temp_service->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
01954                                 contact++;
01955                                 if(contact>1)
01956                                         printf(", ");
01957 
01958                                 if(content_type==JSON_CONTENT)
01959                                         printf("{ \"contact_name\": \"%s\" } ",json_encode(temp_contactsmember->contact_name));
01960                                 else if(content_type==CSV_CONTENT)
01961                                         printf("%s", temp_contactsmember->contact_name);
01962                                 else
01963                                         printf("<A HREF='%s?type=contacts&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contactsmember->contact_name),html_encode(temp_contactsmember->contact_name,FALSE));
01964                         }
01965 
01966                         for(temp_contactgroupsmember=temp_service->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){
01967                                 contact++;
01968                                 if(contact>1)
01969                                         printf(", ");
01970 
01971                                 if(content_type==JSON_CONTENT)
01972                                         printf("{ \"contactgroup_name\": \"%s\" } ",json_encode(temp_contactgroupsmember->group_name));
01973                                 else if(content_type==CSV_CONTENT)
01974                                         printf("%s", temp_contactgroupsmember->group_name);
01975                                 else
01976                                         printf("<A HREF='%s?type=contactgroups&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_contactgroupsmember->group_name),html_encode(temp_contactgroupsmember->group_name,FALSE));
01977                         }
01978                         if(contact==0)
01979                                 printf("%s",(content_type==CSV_CONTENT || content_type==JSON_CONTENT)?"":"&nbsp;");
01980 
01981                         get_interval_time_string(temp_service->notification_interval,time_string[0],sizeof(time_string[0]));
01982                         get_interval_time_string(temp_service->first_notification_delay,time_string[1],sizeof(time_string[1]));
01983 
01984                         if(content_type==JSON_CONTENT) {
01985                                 printf("], ");
01986                                 printf("\"enable_notifications\": %s, ",(temp_service->notifications_enabled==TRUE)?"true":"false");
01987                                 printf("\"notification_interval\": \"%s\", ",time_string[0]);
01988                                 printf("\"first_notification_delay\": \"%s\", ",time_string[1]);
01989                                 printf("\"notification_options\": [ ");
01990                         }else if(content_type==CSV_CONTENT){
01991                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
01992                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->notifications_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
01993                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->notification_interval==0)?"No Re-notification":time_string[0],csv_data_enclosure,csv_delimiter);
01994                                 printf("%s%s%s%s", csv_data_enclosure,time_string[1],csv_data_enclosure,csv_delimiter);
01995                                 printf("%s", csv_data_enclosure);
01996                         } else {
01997                                 printf("</TD>\n");
01998                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->notifications_enabled==TRUE)?"Yes":"No");
01999                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->notification_interval==0)?"<i>No Re-notification</i>":html_encode(time_string[0],FALSE));
02000                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,time_string[1]);
02001                                 printf("<TD CLASS='%s'>",bg_class);
02002                         }
02003 
02004                         options=0;
02005                         if(temp_service->notify_on_unknown==TRUE){
02006                                 options=1;
02007                                 printf("%sUnknown%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02008                         }
02009                         if(temp_service->notify_on_warning==TRUE){
02010                                 printf("%s%sWarning%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02011                                 options=1;
02012                         }
02013                         if(temp_service->notify_on_critical==TRUE){
02014                                 printf("%s%sCritical%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02015                                 options=1;
02016                         }
02017                         if(temp_service->notify_on_recovery==TRUE){
02018                                 printf("%s%sRecovery%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02019                                 options=1;
02020                         }
02021                         if(temp_service->notify_on_flapping==TRUE){
02022                                 printf("%s%sFlapping%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02023                                 options=1;
02024                         }
02025                         if(temp_service->notify_on_downtime==TRUE){
02026                                 printf("%s%sDowntime%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02027                                 options=1;
02028                         }
02029                         if(options==0 && content_type!=JSON_CONTENT)
02030                                 printf("None");
02031 
02032                         if(content_type==JSON_CONTENT) {
02033                                 printf(" ], ");
02034                                 if (temp_service->notification_period==NULL)
02035                                         printf("\"notification_period\": null, ");
02036                                 else
02037                                         printf("\"notification_period\": \"%s\", ",json_encode(temp_service->notification_period));
02038 
02039                                 if (temp_service->event_handler==NULL)
02040                                         printf("\"event_handler\": null, ");
02041                                 else
02042                                         printf("\"event_handler\": \"%s\", ",json_encode(temp_service->event_handler));
02043 
02044                                 printf("\"enable_event_handler\": %s, ",(temp_service->event_handler_enabled==TRUE)?"true":"false");
02045                                 printf("\"stalking_options\": [ ");
02046                         }else if(content_type==CSV_CONTENT) {
02047                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
02048                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->notification_period==NULL)?"":temp_service->notification_period,csv_data_enclosure,csv_delimiter);
02049                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->event_handler==NULL)?"":temp_service->event_handler,csv_data_enclosure,csv_delimiter);
02050                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->event_handler_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
02051                                 printf("%s", csv_data_enclosure);
02052                         }else{
02053                                 printf("</TD>\n");
02054                                 printf("<TD CLASS='%s'>",bg_class);
02055                                 if(temp_service->notification_period==NULL)
02056                                         printf("&nbsp;");
02057                                 else
02058                                         printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_service->notification_period),html_encode(temp_service->notification_period,FALSE));
02059                                 printf("</TD>\n");
02060                                 printf("<TD CLASS='%s'>",bg_class);
02061                                 if(temp_service->event_handler==NULL)
02062                                         printf("&nbsp;");
02063                                 else
02064                                         printf("<A HREF='%s?type=command&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_service->event_handler),html_encode(temp_service->event_handler,FALSE));
02065                                 printf("</TD>\n");
02066 
02067                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->event_handler_enabled==TRUE)?"Yes":"No");
02068 
02069                                 printf("<TD CLASS='%s'>",bg_class);
02070                         }
02071 
02072                         options=0;
02073                         if(temp_service->stalk_on_ok==TRUE){
02074                                 options=1;
02075                                 printf("%sOk%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02076                                 printf("Ok");
02077                         }
02078                         if(temp_service->stalk_on_warning==TRUE){
02079                                 printf("%s%sWarning%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02080                                 options=1;
02081                         }
02082                         if(temp_service->stalk_on_unknown==TRUE){
02083                                 printf("%s%sUnknown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02084                                 options=1;
02085                         }
02086                         if(temp_service->stalk_on_critical==TRUE){
02087                                 printf("%s%sCritical%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02088                                 options=1;
02089                         }
02090                         if(options==0 && content_type!=JSON_CONTENT)
02091                                 printf("None");
02092 
02093                         if(content_type==JSON_CONTENT) {
02094                                 printf(" ], ");
02095                                 printf("\"enable_flap_detection\": %s, ",(temp_service->flap_detection_enabled==TRUE)?"true":"false");
02096                                 if(temp_service->low_flap_threshold==0.0)
02097                                         printf("\"low_flap_threshold\": \"Program-wide value\", ");
02098                                 else
02099                                         printf("\"low_flap_threshold\": %3.1f%%, ",temp_service->low_flap_threshold);
02100 
02101                                 if(temp_service->high_flap_threshold==0.0)
02102                                         printf("\"high_flap_threshold\": \"Program-wide value\", ");
02103                                 else
02104                                         printf("\"high_flap_threshold\": %3.1f%%, ",temp_service->high_flap_threshold);
02105 
02106                                 printf("\"flap_detection_options\": [ ");
02107                         }else if(content_type==CSV_CONTENT) {
02108                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
02109 
02110                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->flap_detection_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
02111 
02112                                 printf("%s", csv_data_enclosure);
02113                                 if(temp_service->low_flap_threshold==0.0)
02114                                         printf("Program-wide value");
02115                                 else
02116                                         printf("%3.1f%%",temp_service->low_flap_threshold);
02117 
02118                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
02119 
02120                                 printf("%s", csv_data_enclosure);
02121                                 if(temp_service->high_flap_threshold==0.0)
02122                                         printf("Program-wide value");
02123                                 else
02124                                         printf("%3.1f%%",temp_service->high_flap_threshold);
02125 
02126                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
02127 
02128                                 printf("%s", csv_data_enclosure);
02129                         }else{
02130                                 printf("</TD>\n");
02131 
02132                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->flap_detection_enabled==TRUE)?"Yes":"No");
02133 
02134                                 printf("<TD CLASS='%s'>",bg_class);
02135                                 if(temp_service->low_flap_threshold==0.0)
02136                                         printf("Program-wide value");
02137                                 else
02138                                         printf("%3.1f%%",temp_service->low_flap_threshold);
02139                                 printf("</TD>\n");
02140 
02141                                 printf("<TD CLASS='%s'>",bg_class);
02142                                 if(temp_service->high_flap_threshold==0.0)
02143                                         printf("Program-wide value");
02144                                 else
02145                                         printf("%3.1f%%",temp_service->high_flap_threshold);
02146                                 printf("</TD>\n");
02147 
02148                                 printf("<TD CLASS='%s'>",bg_class);
02149                         }
02150 
02151                         options=0;
02152                         if(temp_service->flap_detection_on_ok==TRUE){
02153                                 options=1;
02154                                 printf("%sOk%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02155                         }
02156                         if(temp_service->flap_detection_on_warning==TRUE){
02157                                 printf("%s%sWarning%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02158                                 options=1;
02159                         }
02160                         if(temp_service->flap_detection_on_unknown==TRUE){
02161                                 printf("%s%sUnknown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02162                                 options=1;
02163                         }
02164                         if(temp_service->flap_detection_on_critical==TRUE){
02165                                 printf("%s%sCritical%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02166                                 options=1;
02167                         }
02168                         if(options==0 && content_type!=JSON_CONTENT)
02169                                 printf("None");
02170 
02171                         if(content_type==JSON_CONTENT) {
02172                                 printf(" ], ");
02173                                 printf("\"process_performance_data\": %s, ",(temp_service->process_performance_data==TRUE)?"true":"false");
02174                                 printf("\"enable_failure_prediction\": %s, ",(temp_service->failure_prediction_enabled==TRUE)?"true":"false");
02175                                 if (temp_service->failure_prediction_options==NULL)
02176                                         printf("\"failure_prediction_options\": null, ");
02177                                 else
02178                                         printf("\"failure_prediction_options\": \"%s\", ",temp_service->failure_prediction_options);
02179                                 if (temp_service->notes==NULL)
02180                                         printf("\"notes\": null, ");
02181                                 else
02182                                         printf("\"notes\": \"%s\", ",json_encode(temp_service->notes));
02183                                 if (temp_service->notes_url==NULL)
02184                                         printf("\"notes_url\": null, ");
02185                                 else
02186                                         printf("\"notes_url\": \"%s\", ",json_encode(temp_service->notes_url));
02187                                 if (temp_service->action_url==NULL)
02188                                         printf("\"action_url\": null, ");
02189                                 else
02190                                         printf("\"action_url\": \"%s\", ",json_encode(temp_service->action_url));
02191                                 if (temp_service->icon_image==NULL)
02192                                         printf("\"icon_image\": null, ");
02193                                 else {
02194                                         process_macros(temp_service->icon_image,&processed_string,0);
02195                                         printf("\"icon_image\": \"%s\", ",json_encode(processed_string));
02196                                         free(processed_string);
02197                                 }
02198                                 if (temp_service->icon_image_alt==NULL)
02199                                         printf("\"icon_image_alt\": null, ");
02200                                 else
02201                                         printf("\"icon_image_alt\": \"%s\", ",json_encode(temp_service->icon_image_alt));
02202                                 printf("\"retention_options\": [ ");
02203                         }else if(content_type==CSV_CONTENT) {
02204                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
02205 
02206                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->process_performance_data==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
02207 
02208                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->failure_prediction_enabled==TRUE)?"Yes":"No",csv_data_enclosure,csv_delimiter);
02209 
02210                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->failure_prediction_options==NULL)?"":temp_service->failure_prediction_options,csv_data_enclosure,csv_delimiter);
02211 
02212                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->notes==NULL)?"":temp_service->notes,csv_data_enclosure,csv_delimiter);
02213                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->notes_url==NULL)?"":temp_service->notes_url,csv_data_enclosure,csv_delimiter);
02214                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->action_url==NULL)?"":temp_service->action_url,csv_data_enclosure,csv_delimiter);
02215 
02216                                 printf("%s", csv_data_enclosure);
02217                                 if(temp_service->icon_image!=NULL){
02218                                         process_macros(temp_service->icon_image,&processed_string,0);
02219                                         printf("%s", processed_string);
02220                                         free(processed_string);
02221                                 }
02222                                 printf("%s%s", csv_data_enclosure,csv_delimiter);
02223 
02224                                 printf("%s%s%s%s", csv_data_enclosure,(temp_service->icon_image_alt==NULL)?"":temp_service->icon_image_alt,csv_data_enclosure,csv_delimiter);
02225 
02226                                 printf("%s", csv_data_enclosure);
02227                         }else{
02228                                 printf("</TD>\n");
02229 
02230                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->process_performance_data==TRUE)?"Yes":"No");
02231 
02232                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->failure_prediction_enabled==TRUE)?"Yes":"No");
02233 
02234                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->failure_prediction_options==NULL)?"&nbsp;":html_encode(temp_service->failure_prediction_options,FALSE));
02235 
02236                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->notes==NULL)?"&nbsp;":html_encode(temp_service->notes,FALSE));
02237 
02238                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->notes_url==NULL)?"&nbsp;":html_encode(temp_service->notes_url,FALSE));
02239 
02240                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->action_url==NULL)?"&nbsp;":html_encode(temp_service->action_url,FALSE));
02241 
02242                                 if(temp_service->icon_image==NULL)
02243                                         printf("<TD CLASS='%s'>&nbsp;</TD>\n",bg_class);
02244                                 else{
02245                                         process_macros(temp_service->icon_image,&processed_string,0);
02246                                         printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>\n",bg_class,url_logo_images_path,processed_string,html_encode(temp_service->icon_image,FALSE));
02247                                         free(processed_string);
02248                                 }
02249 
02250                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_service->icon_image_alt==NULL)?"&nbsp;":html_encode(temp_service->icon_image_alt,FALSE));
02251 
02252                                 printf("<TD CLASS='%s'>",bg_class);
02253                         }
02254 
02255                         options=0;
02256                         if(temp_service->retain_status_information==TRUE){
02257                                 options=1;
02258                                 printf("%sStatus Information%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02259                         }
02260                         if(temp_service->retain_nonstatus_information==TRUE){
02261                                 printf("%s%sNon-Status Information%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02262                                 options=1;
02263                         }
02264                         if(options==0 && content_type!=JSON_CONTENT)
02265                                 printf("None");
02266 
02267                         if(content_type==JSON_CONTENT) {
02268                                 printf(" ] }");
02269                         }else if(content_type==CSV_CONTENT){
02270                                 printf("%s\n",csv_data_enclosure);
02271                         }else{
02272                                 printf("</TD>\n");
02273                                 printf("</TR>\n");
02274                         }
02275                 }
02276         }
02277 
02278         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
02279                 printf("</TABLE>\n");
02280                 printf("</DIV>\n");
02281                 printf("</P>\n");
02282         }else if(content_type==JSON_CONTENT)
02283                 printf("\n]\n");
02284 
02285         return;
02286 }
02287 
02288 void display_timeperiods(void){
02289         timerange *temp_timerange=NULL;
02290         daterange *temp_daterange=NULL;
02291         timeperiod *temp_timeperiod=NULL;
02292         timeperiodexclusion *temp_timeperiodexclusion=NULL;
02293         char *months[12]={"january","february","march","april","may","june","july","august","september","october","november","december"};
02294         char *days[7]={"sunday","monday","tuesday","wednesday","thursday","friday","saturday"};
02295         int odd=0;
02296         int day=0;
02297         int x=0;
02298         char *bg_class="";
02299         char timestring[10];
02300         int hours=0;
02301         int minutes=0;
02302         int seconds=0;
02303         int line=0;
02304         int json_start=TRUE;
02305 
02306         if(content_type==JSON_CONTENT) {
02307                 printf("\"timeperiods\": [\n");
02308         }else if(content_type==CSV_CONTENT) {
02309                 printf("%sName%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02310                 printf("%sAlias/Description%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02311                 printf("%sExclusions%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02312                 printf("%sDays/Dates%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02313                 printf("%sTimes%s",csv_data_enclosure,csv_data_enclosure);
02314                 printf("\n");
02315         } else {
02316                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Time Period%s%s</DIV></P>\n",
02317                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
02318 
02319                 printf("<P>\n");
02320                 printf("<DIV ALIGN=CENTER>\n");
02321 
02322                 printf("<TABLE BORDER=0 CLASS='data'>\n");
02323 
02324                 print_export_link();
02325 
02326                 printf("<TR>\n");
02327                 printf("<TH CLASS='data'>Name</TH>\n");
02328                 printf("<TH CLASS='data'>Alias/Description</TH>\n");
02329                 printf("<TH CLASS='data'>Exclusions</TH>\n");
02330                 printf("<TH CLASS='data'>Days/Dates</TH>\n");
02331                 printf("<TH CLASS='data'>Times</TH>\n");
02332                 printf("</TR>\n");
02333         }
02334 
02335         /* check all the time periods... */
02336         for(temp_timeperiod=timeperiod_list;temp_timeperiod!=NULL;temp_timeperiod=temp_timeperiod->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_timeperiod->name))){
02337 
02338                 if(odd){
02339                         odd=0;
02340                         bg_class="dataOdd";
02341                 }else{
02342                         odd=1;
02343                         bg_class="dataEven";
02344                 }
02345 
02346                 /* print list in json format */
02347                 if(content_type==JSON_CONTENT) {
02348                         // always add a comma, except for the first line
02349                         if (json_start==FALSE)
02350                                 printf(",\n");
02351                         json_start=FALSE;
02352 
02353                         printf("{ \"timeperiod_name\": \"%s\", ",json_encode(temp_timeperiod->name));
02354                         printf("\"alias\": \"%s\", ",json_encode(temp_timeperiod->alias));
02355                         printf("\"exclusions\": [ ");
02356                 /* print list in csv format */
02357                 }else if(content_type==CSV_CONTENT) {
02358                         printf("%s%s%s%s",csv_data_enclosure,temp_timeperiod->name,csv_data_enclosure,csv_delimiter);
02359                         printf("%s%s%s%s",csv_data_enclosure,temp_timeperiod->alias,csv_data_enclosure,csv_delimiter);
02360                         printf("%s",csv_data_enclosure);
02361                 }else{
02362                         printf("<TR CLASS='%s'>\n",bg_class);
02363 
02364                         printf("<TD CLASS='%s'><A NAME='%s'>%s</A></TD>\n",bg_class,url_encode(temp_timeperiod->name),html_encode(temp_timeperiod->name,FALSE));
02365                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_timeperiod->alias,FALSE));
02366 
02367                         printf("<TD CLASS='%s'>",bg_class);
02368                 }
02369 
02370                 for(temp_timeperiodexclusion=temp_timeperiod->exclusions;temp_timeperiodexclusion!=NULL;temp_timeperiodexclusion=temp_timeperiodexclusion->next){
02371                         if (temp_timeperiodexclusion!=temp_timeperiod->exclusions)
02372                                 printf(", ");
02373 
02374                         if(content_type==JSON_CONTENT)
02375                                 printf("\"%s\"",temp_timeperiodexclusion->timeperiod_name);
02376                         else if(content_type==CSV_CONTENT)
02377                                 printf("%s",temp_timeperiodexclusion->timeperiod_name);
02378                         else
02379                                 printf("<A HREF='#%s'>%s</A>",url_encode(temp_timeperiodexclusion->timeperiod_name),html_encode(temp_timeperiodexclusion->timeperiod_name,FALSE));
02380                 }
02381 
02382                 if(content_type==JSON_CONTENT) {
02383                         printf(" ], ");
02384                         printf("\"days_times\": [ ");
02385                 }else if(content_type==CSV_CONTENT){
02386                         printf("%s%s",csv_data_enclosure,csv_delimiter);
02387                         printf("%s",csv_data_enclosure);
02388                 }else{
02389                         printf("</TD>\n");
02390                         printf("<TD CLASS='%s'>",bg_class);
02391                 }
02392 
02393                 line=0;
02394                 for(x=0;x<DATERANGE_TYPES;x++){
02395                         for(temp_daterange=temp_timeperiod->exceptions[x];temp_daterange!=NULL;temp_daterange=temp_daterange->next){
02396 
02397                                 line++;
02398 
02399                                 if(line>1) {
02400                                         if(content_type==JSON_CONTENT) {
02401                                                 printf(", { \"days_date\": \"");
02402                                         }else if(content_type==CSV_CONTENT){
02403                                                 printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02404                                                 printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02405                                                 printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02406                                                 printf("%s",csv_data_enclosure);
02407                                         } else
02408                                                 printf("<TR><TD COLSPAN='3'></TD>\n<TD CLASS='%s'>",bg_class);
02409                                 } else {
02410                                         if(content_type==JSON_CONTENT)
02411                                                 printf("{ \"days_date\": \"");
02412                                 }
02413 
02414                                 switch(temp_daterange->type){
02415                                 case DATERANGE_CALENDAR_DATE:
02416                                         printf("%d-%02d-%02d",temp_daterange->syear,temp_daterange->smon+1,temp_daterange->smday);
02417                                         if((temp_daterange->smday!=temp_daterange->emday) || (temp_daterange->smon!=temp_daterange->emon) || (temp_daterange->syear!=temp_daterange->eyear))
02418                                                 printf(" - %d-%02d-%02d",temp_daterange->eyear,temp_daterange->emon+1,temp_daterange->emday);
02419                                         if(temp_daterange->skip_interval>1)
02420                                                 printf(" / %d",temp_daterange->skip_interval);
02421                                         break;
02422                                 case DATERANGE_MONTH_DATE:
02423                                         printf("%s %d",months[temp_daterange->smon],temp_daterange->smday);
02424                                         if((temp_daterange->smon!=temp_daterange->emon) || (temp_daterange->smday!=temp_daterange->emday)){
02425                                                 printf(" - %s %d",months[temp_daterange->emon],temp_daterange->emday);
02426                                                 if(temp_daterange->skip_interval>1)
02427                                                         printf(" / %d",temp_daterange->skip_interval);
02428                                                 }
02429                                         break;
02430                                 case DATERANGE_MONTH_DAY:
02431                                         printf("day %d",temp_daterange->smday);
02432                                         if(temp_daterange->smday!=temp_daterange->emday){
02433                                                 printf(" - %d",temp_daterange->emday);
02434                                                 if(temp_daterange->skip_interval>1)
02435                                                         printf(" / %d",temp_daterange->skip_interval);
02436                                                 }
02437                                         break;
02438                                 case DATERANGE_MONTH_WEEK_DAY:
02439                                         printf("%s %d %s",days[temp_daterange->swday],temp_daterange->swday_offset,months[temp_daterange->smon]);
02440                                         if((temp_daterange->smon!=temp_daterange->emon) || (temp_daterange->swday!=temp_daterange->ewday) || (temp_daterange->swday_offset!=temp_daterange->ewday_offset)){
02441                                                 printf(" - %s %d %s",days[temp_daterange->ewday],temp_daterange->ewday_offset,months[temp_daterange->emon]);
02442                                                 if(temp_daterange->skip_interval>1)
02443                                                         printf(" / %d",temp_daterange->skip_interval);
02444                                                 }
02445                                         break;
02446                                 case DATERANGE_WEEK_DAY:
02447                                         printf("%s %d",days[temp_daterange->swday],temp_daterange->swday_offset);
02448                                         if((temp_daterange->swday!=temp_daterange->ewday) || (temp_daterange->swday_offset!=temp_daterange->ewday_offset)){
02449                                                 printf(" - %s %d",days[temp_daterange->ewday],temp_daterange->ewday_offset);
02450                                                 if(temp_daterange->skip_interval>1)
02451                                                         printf(" / %d",temp_daterange->skip_interval);
02452                                                 }
02453                                         break;
02454                                 default:
02455                                         break;
02456                                 }
02457 
02458                                 if(content_type==JSON_CONTENT)
02459                                         printf("\", \"time\": [ ");
02460                                 else if(content_type==CSV_CONTENT){
02461                                         printf("%s%s",csv_data_enclosure,csv_delimiter);
02462                                         printf("%s",csv_data_enclosure);
02463                                 }else
02464                                         printf("</TD>\n<TD CLASS='%s'>",bg_class);
02465 
02466                                 for(temp_timerange=temp_daterange->times;temp_timerange!=NULL;temp_timerange=temp_timerange->next){
02467 
02468                                         if(temp_timerange!=temp_daterange->times)
02469                                                 printf(", ");
02470 
02471                                         hours=temp_timerange->range_start/3600;
02472                                         minutes=(temp_timerange->range_start-(hours*3600))/60;
02473                                         seconds=temp_timerange->range_start-(hours*3600)-(minutes*60);
02474                                         snprintf(timestring,sizeof(timestring)-1,"%02d:%02d:%02d",hours,minutes,seconds);
02475                                         timestring[sizeof(timestring)-1]='\x0';
02476                                         printf("%s%s - ",(content_type==JSON_CONTENT)?"\"":"",timestring);
02477 
02478                                         hours=temp_timerange->range_end/3600;
02479                                         minutes=(temp_timerange->range_end-(hours*3600))/60;
02480                                         seconds=temp_timerange->range_end-(hours*3600)-(minutes*60);
02481                                         snprintf(timestring,sizeof(timestring)-1,"%02d:%02d:%02d",hours,minutes,seconds);
02482                                         timestring[sizeof(timestring)-1]='\x0';
02483                                         printf("%s%s",timestring,(content_type==JSON_CONTENT)?"\"":"");
02484                                 }
02485 
02486                                 if(content_type==JSON_CONTENT)
02487                                         printf(" ] }");
02488                                 else if(content_type==CSV_CONTENT)
02489                                         printf("%s\n",csv_data_enclosure);
02490                                 else{
02491                                         printf("</TD>\n");
02492                                         printf("</TR>\n");
02493                                 }
02494                         }
02495                 }
02496                 for(day=0;day<7;day++){
02497 
02498                         if(temp_timeperiod->days[day]==NULL)
02499                                 continue;
02500 
02501                         line++;
02502 
02503                         if(line>1) {
02504                                 if(content_type==JSON_CONTENT)
02505                                         printf(", { \"days_date\": \"%s\",  \"time\": [ ",days[day]);
02506                                 else if(content_type==CSV_CONTENT){
02507                                         printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02508                                         printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02509                                         printf("%s%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02510                                         printf("%s%s%s%s",csv_data_enclosure,days[day],csv_data_enclosure,csv_delimiter);
02511                                         printf("%s",csv_data_enclosure);
02512                                 } else
02513                                         printf("<TR><TD COLSPAN='3'></TD>\n<TD CLASS='%s'>",bg_class);
02514                         } else {
02515                                 if(content_type==JSON_CONTENT)
02516                                         printf("{ \"days_date\": \"%s\",  \"time\": [ ",days[day]);
02517                                 else if(content_type==CSV_CONTENT){
02518                                         printf("%s%s%s",days[day],csv_data_enclosure,csv_delimiter);
02519                                         printf("%s",csv_data_enclosure);
02520                                 }else
02521                                         printf("%s</TD>\n<TD CLASS='%s'>",days[day],bg_class);
02522                         }
02523 
02524 
02525                         for(temp_timerange=temp_timeperiod->days[day];temp_timerange!=NULL;temp_timerange=temp_timerange->next){
02526 
02527                                 if(temp_timerange!=temp_timeperiod->days[day])
02528                                         printf(", ");
02529 
02530                                 hours=temp_timerange->range_start/3600;
02531                                 minutes=(temp_timerange->range_start-(hours*3600))/60;
02532                                 seconds=temp_timerange->range_start-(hours*3600)-(minutes*60);
02533                                 snprintf(timestring,sizeof(timestring)-1,"%02d:%02d:%02d",hours,minutes,seconds);
02534                                 timestring[sizeof(timestring)-1]='\x0';
02535                                 printf("%s%s - ",(content_type==JSON_CONTENT)?"\"":"",timestring);
02536 
02537                                 hours=temp_timerange->range_end/3600;
02538                                 minutes=(temp_timerange->range_end-(hours*3600))/60;
02539                                 seconds=temp_timerange->range_end-(hours*3600)-(minutes*60);
02540                                 snprintf(timestring,sizeof(timestring)-1,"%02d:%02d:%02d",hours,minutes,seconds);
02541                                 timestring[sizeof(timestring)-1]='\x0';
02542                                 printf("%s%s",timestring,(content_type==JSON_CONTENT)?"\"":"");
02543                         }
02544 
02545                         if(content_type==JSON_CONTENT)
02546                                 printf(" ] }");
02547                         else if(content_type==CSV_CONTENT)
02548                                 printf("%s\n",csv_data_enclosure);
02549                         else{
02550                                 printf("</TD>\n");
02551                                 printf("</TR>\n");
02552                         }
02553                 }
02554 
02555                 if(content_type==JSON_CONTENT)
02556                         printf(" ] }\n");
02557 
02558                 if(line==0 && content_type!=JSON_CONTENT){
02559 
02560                         if(content_type==CSV_CONTENT) {
02561                                 printf("%s%s",csv_data_enclosure,csv_delimiter);
02562                                 printf("%s%s\n",csv_data_enclosure,csv_data_enclosure);
02563                         }else{
02564                                 printf("</TD>\n<TD></TD>\n");
02565                                 printf("</TR>\n");
02566                         }
02567                 }
02568         }
02569 
02570         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
02571                 printf("</TABLE>\n");
02572                 printf("</DIV>\n");
02573                 printf("</P>\n");
02574         }else if(content_type==JSON_CONTENT)
02575                 printf("\n]\n");
02576 
02577         return;
02578 }
02579 
02580 void display_commands(void){
02581         command *temp_command;
02582         int odd=0;
02583         char *bg_class="";
02584         int json_start=TRUE;
02585 
02586         if(content_type==JSON_CONTENT) {
02587                 printf("\"commands\": [\n");
02588         }else if(content_type==CSV_CONTENT) {
02589                 printf("%sCommand Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02590                 printf("%sCommand Line%s",csv_data_enclosure,csv_data_enclosure);
02591                 printf("\n");
02592         } else {
02593                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Command%s%s</DIV></P>\n",
02594                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
02595 
02596                 printf("<P><DIV ALIGN=CENTER>\n");
02597                 printf("<TABLE BORDER=0 CLASS='data'>\n");
02598 
02599                 print_export_link();
02600 
02601                 printf("<TR><TH CLASS='data'>Command Name</TH><TH CLASS='data'>Command Line</TH></TR>\n");
02602         }
02603 
02604         /* check all commands */
02605         for(temp_command=command_list;temp_command!=NULL;temp_command=temp_command->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_command->name))){
02606 
02607                 if(odd){
02608                         odd=0;
02609                         bg_class="dataEven";
02610                 }else{
02611                         odd=1;
02612                         bg_class="dataOdd";
02613                 }
02614 
02615                 /* print list in json format */
02616                 if(content_type==JSON_CONTENT) {
02617                         // always add a comma, except for the first line
02618                         if (json_start==FALSE)
02619                                 printf(",\n");
02620                         json_start=FALSE;
02621 
02622                         printf("{ \"command_name\": \"%s\", ",json_encode(temp_command->name));
02623                         printf("\"command_line\": \"%s\" }",json_encode(temp_command->command_line));
02624                 /* print list in csv format */
02625                 }else if(content_type==CSV_CONTENT) {
02626                         printf("%s%s%s%s",csv_data_enclosure,temp_command->name,csv_data_enclosure,csv_delimiter);
02627                         printf("%s%s%s\n",csv_data_enclosure,temp_command->command_line,csv_data_enclosure);
02628                 }else{
02629                         printf("<TR CLASS='%s'>\n",bg_class);
02630 
02631                         printf("<TD CLASS='%s'><A NAME='%s'></A>%s</TD>\n",bg_class,url_encode(temp_command->name),html_encode(temp_command->name,FALSE));
02632                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_command->command_line,FALSE));
02633 
02634                         printf("</TR>\n");
02635                 }
02636         }
02637 
02638         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
02639                 printf("</TABLE>\n");
02640                 printf("</DIV>\n");
02641                 printf("</P>\n");
02642         }else if(content_type==JSON_CONTENT)
02643                 printf("\n]\n");
02644 
02645         return;
02646 }
02647 
02648 void display_servicedependencies(void){
02649         servicedependency *temp_sd;
02650         int odd=0;
02651         int options;
02652         char *bg_class="";
02653         int json_start=TRUE;
02654 
02655         if(content_type==JSON_CONTENT) {
02656                 printf("\"servicedependencies\": [\n");
02657         }else if(content_type==CSV_CONTENT) {
02658                 printf("%sDependent Host%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02659                 printf("%sDependent Service%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02660                 printf("%sMaster Host%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02661                 printf("%sMaster Service%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02662                 printf("%sDependency Type%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02663                 printf("%sDependency Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02664                 printf("%sDependency Failure Options%s\n",csv_data_enclosure,csv_data_enclosure);
02665         } else {
02666                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Service Dependencie%s%s</DIV></P>\n",
02667                         (*to_expand=='\0'?"s":"s Involving Host "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
02668 
02669                 printf("<P>\n");
02670                 printf("<DIV ALIGN=CENTER>\n");
02671 
02672                 printf("<TABLE BORDER=0 CLASS='data'>\n");
02673 
02674                 print_export_link();
02675 
02676                 printf("<TR>\n");
02677                 printf("<TH CLASS='data' COLSPAN=2>Dependent Service</TH>");
02678                 printf("<TH CLASS='data' COLSPAN=2>Master Service</TH>");
02679                 printf("</TR>\n");
02680                 printf("<TR>\n");
02681                 printf("<TH CLASS='data'>Host</TH>");
02682                 printf("<TH CLASS='data'>Service</TH>");
02683                 printf("<TH CLASS='data'>Host</TH>");
02684                 printf("<TH CLASS='data'>Service</TH>");
02685                 printf("<TH CLASS='data'>Dependency Type</TH>");
02686                 printf("<TH CLASS='data'>Dependency Period</TH>");
02687                 printf("<TH CLASS='data'>Dependency Failure Options</TH>");
02688                 printf("</TR>\n");
02689         }
02690 
02691         /* check all the service dependencies... */
02692         for(temp_sd=servicedependency_list;temp_sd!=NULL;temp_sd=temp_sd->next)
02693                 if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_sd->dependent_host_name))||(!strcmp(to_expand,temp_sd->host_name))){
02694 
02695                 if(odd){
02696                         odd=0;
02697                         bg_class="dataOdd";
02698                 }else{
02699                         odd=1;
02700                         bg_class="dataEven";
02701                 }
02702 
02703                 /* print list in json format */
02704                 if(content_type==JSON_CONTENT) {
02705                         // always add a comma, except for the first line
02706                         if (json_start==FALSE)
02707                                 printf(",\n");
02708                         json_start=FALSE;
02709 
02710                         printf("{ \"dependent_host_name\": \"%s\", ",json_encode(temp_sd->dependent_host_name));
02711                         printf("\"dependent_service_description\": \"%s\", ",json_encode(temp_sd->dependent_service_description));
02712                         printf("\"master_host_name\": \"%s\", ",json_encode(temp_sd->host_name));
02713                         printf("\"master_service_description\": \"%s\", ",json_encode(temp_sd->service_description));
02714                         printf("\"dependency_type\": \"%s\", ",(temp_sd->dependency_type==NOTIFICATION_DEPENDENCY)?"Notification":"Check Execution");
02715 
02716                         if (temp_sd->dependency_period==NULL)
02717                                 printf("\"dependency_period\": null, ");
02718                         else
02719                                 printf("\"dependency_period\": \"%s\", ",json_encode(temp_sd->dependency_period));
02720 
02721                         printf("\"dependency_failure_options\": [");
02722                 /* print list in csv format */
02723                 }else if(content_type==CSV_CONTENT) {
02724                         printf("%s%s%s%s",csv_data_enclosure,temp_sd->dependent_host_name,csv_data_enclosure,csv_delimiter);
02725                         printf("%s%s%s%s",csv_data_enclosure,temp_sd->dependent_service_description,csv_data_enclosure,csv_delimiter);
02726                         printf("%s%s%s%s",csv_data_enclosure,temp_sd->host_name,csv_data_enclosure,csv_delimiter);
02727                         printf("%s%s%s%s",csv_data_enclosure,temp_sd->service_description,csv_data_enclosure,csv_delimiter);
02728                         printf("%s%s%s%s",csv_data_enclosure,(temp_sd->dependency_type==NOTIFICATION_DEPENDENCY)?"Notification":"Check Execution",csv_data_enclosure,csv_delimiter);
02729                         printf("%s%s%s%s",csv_data_enclosure,(temp_sd->dependency_period==NULL)?"":temp_sd->dependency_period,csv_data_enclosure,csv_delimiter);
02730                         printf("%s",csv_data_enclosure);
02731                 }else{
02732                         printf("<TR CLASS='%s'>\n",bg_class);
02733 
02734                         printf("<TD CLASS='%s'><A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(temp_sd->dependent_host_name),html_encode(temp_sd->dependent_host_name,FALSE));
02735 
02736                         printf("<TD CLASS='%s'><A HREF='%s?type=services&expand=%s#%s;",bg_class,CONFIG_CGI,url_encode(temp_sd->dependent_host_name),url_encode(temp_sd->dependent_host_name));
02737                         printf("%s'>%s</A></TD>\n",url_encode(temp_sd->dependent_service_description),html_encode(temp_sd->dependent_service_description,FALSE));
02738 
02739                         printf("<TD CLASS='%s'><A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(temp_sd->host_name),html_encode(temp_sd->host_name,FALSE));
02740 
02741                         printf("<TD CLASS='%s'><A HREF='%s?type=services&expand=%s#%s;",bg_class,CONFIG_CGI,url_encode(temp_sd->host_name),url_encode(temp_sd->host_name));
02742                         printf("%s'>%s</A></TD>\n",url_encode(temp_sd->service_description),html_encode(temp_sd->service_description,FALSE));
02743 
02744                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_sd->dependency_type==NOTIFICATION_DEPENDENCY)?"Notification":"Check Execution");
02745 
02746                         printf("<TD CLASS='%s'>",bg_class);
02747                         if(temp_sd->dependency_period==NULL)
02748                                 printf("&nbsp;");
02749                         else
02750                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_sd->dependency_period),html_encode(temp_sd->dependency_period,FALSE));
02751                         printf("</TD>\n");
02752 
02753                         printf("<TD CLASS='%s'>",bg_class);
02754                 }
02755 
02756                 options=0;
02757                 if(temp_sd->fail_on_ok==TRUE){
02758                         printf("%sOk%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02759                         options=1;
02760                 }
02761                 if(temp_sd->fail_on_warning==TRUE){
02762                         printf("%s%sWarning%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02763                         options=1;
02764                 }
02765                 if(temp_sd->fail_on_unknown==TRUE){
02766                         printf("%s%sUnknown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02767                         options=1;
02768                 }
02769                 if(temp_sd->fail_on_critical==TRUE){
02770                         printf("%s%sCritical%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02771                         options=1;
02772                 }
02773                 if(temp_sd->fail_on_pending==TRUE){
02774                         printf("%s%sPending%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
02775                         options=1;
02776                 }
02777                 if(options==0 && content_type!=JSON_CONTENT)
02778                         printf("None");
02779 
02780                 if(content_type==JSON_CONTENT)
02781                         printf(" ] }");
02782                 else if(content_type==CSV_CONTENT)
02783                         printf("%s\n",csv_data_enclosure);
02784                 else
02785                         printf("</TD>\n</TR>\n");
02786         }
02787 
02788         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
02789                 printf("</TABLE>\n");
02790                 printf("</DIV>\n");
02791                 printf("</P>\n");
02792         }else if(content_type==JSON_CONTENT)
02793                 printf("\n]\n");
02794 
02795         return;
02796 }
02797 
02798 void display_serviceescalations(void){
02799         serviceescalation *temp_se=NULL;
02800         contactsmember *temp_contactsmember=NULL;
02801         contactgroupsmember *temp_contactgroupsmember=NULL;
02802         char time_string[16]="";
02803         int options=FALSE;
02804         int odd=0;
02805         char *bg_class="";
02806         int contact=0;
02807         int json_start=TRUE;
02808 
02809         if(content_type==JSON_CONTENT) {
02810                 printf("\"serviceescalations\": [\n");
02811         }else if(content_type==CSV_CONTENT) {
02812                 printf("%sHost%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02813                 printf("%sDescription%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02814                 printf("%sContacts/Groups%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02815                 printf("%sFirst Notification%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02816                 printf("%sLast Notification%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02817                 printf("%sNotification Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02818                 printf("%sEscalation Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
02819                 printf("%sEscalation Options%s\n",csv_data_enclosure,csv_data_enclosure);
02820         } else {
02821                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Service Escalation%s%s</DIV></P>\n",
02822                         (*to_expand=='\0'?"s":"s on Host "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
02823 
02824                 printf("<P>\n");
02825                 printf("<DIV ALIGN=CENTER>\n");
02826 
02827                 printf("<TABLE BORDER=0 CLASS='data'>\n");
02828 
02829                 print_export_link();
02830 
02831                 printf("<TR>\n");
02832                 printf("<TH CLASS='data'>Host</TH>");
02833                 printf("<TH CLASS='data'>Description</TH>");
02834                 printf("<TH CLASS='data'>Contacts/Groups</TH>");
02835                 printf("<TH CLASS='data'>First Notification</TH>");
02836                 printf("<TH CLASS='data'>Last Notification</TH>");
02837                 printf("<TH CLASS='data'>Notification Interval</TH>");
02838                 printf("<TH CLASS='data'>Escalation Period</TH>");
02839                 printf("<TH CLASS='data'>Escalation Options</TH>");
02840                 printf("</TR>\n");
02841         }
02842 
02843         /* check all the service escalations... */
02844         for(temp_se=serviceescalation_list;temp_se!=NULL;temp_se=temp_se->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_se->host_name))){
02845 
02846                 if(odd){
02847                         odd=0;
02848                         bg_class="dataOdd";
02849                 }else{
02850                         odd=1;
02851                         bg_class="dataEven";
02852                 }
02853 
02854                 /* print list in json format */
02855                 if(content_type==JSON_CONTENT) {
02856                         // always add a comma, except for the first line
02857                         if (json_start==FALSE)
02858                                 printf(",\n");
02859                         json_start=FALSE;
02860 
02861                         printf("{ \"host_name\": \"%s\", ",json_encode(temp_se->host_name));
02862                         printf("\"service_description\": \"%s\", ",json_encode(temp_se->description));
02863                         printf("\"contacts_contactgroups\": [");
02864                 /* print list in csv format */
02865                 }else if(content_type==CSV_CONTENT) {
02866                         printf("%s%s%s%s",csv_data_enclosure,temp_se->host_name,csv_data_enclosure,csv_delimiter);
02867                         printf("%s%s%s%s",csv_data_enclosure,temp_se->description,csv_data_enclosure,csv_delimiter);
02868                         printf("%s",csv_data_enclosure);
02869                 }else{
02870                         printf("<TR CLASS='%s'>\n",bg_class);
02871 
02872                         printf("<TD CLASS='%s'><A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(temp_se->host_name),html_encode(temp_se->host_name,FALSE));
02873 
02874                         printf("<TD CLASS='%s'><A HREF='%s?type=services&expand=%s#%s;",bg_class,CONFIG_CGI,url_encode(temp_se->host_name),url_encode(temp_se->host_name));
02875                         printf("%s'>%s</A></TD>\n",url_encode(temp_se->description),html_encode(temp_se->description,FALSE));
02876 
02877                         printf("<TD CLASS='%s'>",bg_class);
02878                 }
02879 
02880                 contact=0;
02881                 for(temp_contactsmember=temp_se->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
02882                         contact++;
02883                         if(contact>1)
02884                                 printf(", ");
02885 
02886                         if(content_type==JSON_CONTENT)
02887                                 printf("{ \"contact_name\": \"%s\" } ",json_encode(temp_contactsmember->contact_name));
02888                         else if(content_type==CSV_CONTENT)
02889                                 printf("%s",temp_contactsmember->contact_name);
02890                         else
02891                                 printf("<A HREF='%s?type=contacts&expand=%s'>%s</A>\n",CONFIG_CGI,url_encode(temp_contactsmember->contact_name),html_encode(temp_contactsmember->contact_name,FALSE));
02892                 }
02893                 for(temp_contactgroupsmember=temp_se->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){
02894                         contact++;
02895                         if(contact>1)
02896                                 printf(", ");
02897 
02898                         if(content_type==JSON_CONTENT)
02899                                 printf("{ \"contactgroup_name\": \"%s\" } ",json_encode(temp_contactgroupsmember->group_name));
02900                         else if(content_type==CSV_CONTENT)
02901                                 printf("%s",temp_contactgroupsmember->group_name);
02902                         else
02903                                 printf("<A HREF='%s?type=contactgroups&expand=%s'>%s</A>\n",CONFIG_CGI,url_encode(temp_contactgroupsmember->group_name),html_encode(temp_contactgroupsmember->group_name,FALSE));
02904                 }
02905                 if(contact==0)
02906                         printf("%s",(content_type==CSV_CONTENT || content_type==JSON_CONTENT)?"":"&nbsp;");
02907 
02908                 if(content_type==JSON_CONTENT) {
02909                         printf(" ], ");
02910                         printf("\"first_notification\": %d, ",temp_se->first_notification);
02911 #ifdef USE_ST_BASED_ESCAL_RANGES
02912                         printf("\"first_warning_notification\": %d, ",temp_se->first_warning_notification);
02913                         printf("\"first_critical_notification\": %d, ",temp_se->first_critical_notification);
02914                         printf("\"first_unknown_notification\": %d, ",temp_se->first_unknown_notification);
02915 #endif
02916                         if(temp_se->last_notification==0)
02917                                 printf("\"last_notification\": null, ");
02918                         else
02919                                 printf("\"last_notification\": %d, ",temp_se->last_notification);
02920 #ifdef USE_ST_BASED_ESCAL_RANGES
02921                         if(temp_se->last_warning_notification==0)
02922                                 printf("\"last_warning_notification\": null, ");
02923                         else
02924                                 printf("\"last_warning_notification\": %d, ",temp_se->last_warning_notification);
02925                         if(temp_se->last_critical_notification==0)
02926                                 printf("\"last_warning_notification\": null, ");
02927                         else
02928                                 printf("\"last_warning_notification\": %d, ",temp_se->last_critical_notification);
02929                         if(temp_se->last_unknown_notification==0)
02930                                 printf("\"last_warning_notification\": null, ");
02931                         else
02932                                 printf("\"last_warning_notification\": %d, ",temp_se->last_unknown_notification);
02933 #endif
02934                 } else if(content_type==CSV_CONTENT){
02935                         printf("%s%s",csv_data_enclosure,csv_delimiter);
02936 
02937 #ifndef USE_ST_BASED_ESCAL_RANGES
02938                         printf("%s%d%s%s",csv_data_enclosure,temp_se->first_notification,csv_data_enclosure,csv_delimiter);
02939 #else
02940                         printf("%s%d, %d, %d, %d%s%s",csv_data_enclosure,temp_se->first_notification,temp_se->first_warning_notification,temp_se->first_critical_notification,temp_se->first_unknown_notification,csv_data_enclosure,csv_delimiter);
02941 #endif
02942                         printf("%s",csv_data_enclosure);
02943                 }else{
02944                         printf("</TD>\n");
02945 
02946 #ifndef USE_ST_BASED_ESCAL_RANGES
02947                         printf("<TD CLASS='%s'>%d</TD>\n",bg_class,temp_se->first_notification);
02948 #else
02949                         printf("<TD CLASS='%s'>%d, %d, %d, %d</TD>\n",bg_class,temp_se->first_notification,temp_se->first_warning_notification,temp_se->first_critical_notification,temp_se->first_unknown_notification);
02950 #endif
02951 
02952                         printf("<TD CLASS='%s'>",bg_class);
02953                 }
02954 
02955                 if(content_type!=JSON_CONTENT) {
02956 #ifdef USE_ST_BASED_ESCAL_RANGES
02957                         if(temp_se->last_notification==0)
02958                                 printf("Infinity, ");
02959                         else
02960                                 printf("%d, ",temp_se->last_notification);
02961                         if(temp_se->last_warning_notification==0)
02962                                 printf("Infinity, ");
02963                         else
02964                                 printf("%d, ",temp_se->last_warning_notification);
02965                         if(temp_se->last_critical_notification==0)
02966                                 printf("Infinity, ");
02967                         else
02968                                 printf("%d, ",temp_se->last_critical_notification);
02969                         if(temp_se->last_unknown_notification==0)
02970                                 printf("Infinity");
02971                         else
02972                                 printf("%d", temp_se->last_unknown_notification);
02973 #else
02974                         if(temp_se->last_notification==0)
02975                                 printf("Infinity");
02976                         else
02977                                 printf("%d",temp_se->last_notification);
02978 #endif
02979                 }
02980 
02981                 get_interval_time_string(temp_se->notification_interval,time_string,sizeof(time_string));
02982 
02983                 if(content_type==JSON_CONTENT) {
02984                         printf("\"notification_interval\": \"%s\", ",(temp_se->notification_interval==0.0)?"Notify Only Once (No Re-notification)":time_string);
02985                         if (temp_se->escalation_period==NULL)
02986                                 printf("\"escalation_period\": null, ");
02987                         else
02988                                 printf("\"escalation_period\": \"%s\", ",json_encode(temp_se->escalation_period));
02989                         printf("\"escalation_options\": [ ");
02990                 }else if(content_type==CSV_CONTENT){
02991                         printf("%s%s",csv_data_enclosure,csv_delimiter);
02992                         printf("%s%s%s%s",csv_data_enclosure,(temp_se->notification_interval==0.0)?"Notify Only Once (No Re-notification)":time_string,csv_data_enclosure,csv_delimiter);
02993                         printf("%s%s%s%s",csv_data_enclosure,(temp_se->escalation_period==NULL)?"":temp_se->escalation_period,csv_data_enclosure,csv_delimiter);
02994                         printf("%s",csv_data_enclosure);
02995                 }else{
02996                         printf("</TD>\n");
02997 
02998                         printf("<TD CLASS='%s'>",bg_class);
02999                         if(temp_se->notification_interval==0.0)
03000                                 printf("Notify Only Once (No Re-notification)");
03001                         else
03002                                 printf("%s",time_string);
03003                         printf("</TD>\n");
03004 
03005                         printf("<TD CLASS='%s'>",bg_class);
03006                         if(temp_se->escalation_period==NULL)
03007                                 printf("&nbsp;");
03008                         else
03009                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_se->escalation_period),html_encode(temp_se->escalation_period,FALSE));
03010                         printf("</TD>\n");
03011 
03012                         printf("<TD CLASS='%s'>",bg_class);
03013                 }
03014 
03015                 options=0;
03016                 if(temp_se->escalate_on_warning==TRUE){
03017                         printf("%sWarning%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03018                         options=1;
03019                 }
03020                 if(temp_se->escalate_on_unknown==TRUE){
03021                         printf("%s%sUnknown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03022                         options=1;
03023                 }
03024                 if(temp_se->escalate_on_critical==TRUE){
03025                         printf("%s%sCritical%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03026                         options=1;
03027                 }
03028                 if(temp_se->escalate_on_recovery==TRUE){
03029                         printf("%s%sRecovery%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03030                         options=1;
03031                 }
03032                 if(options==0 && content_type!=JSON_CONTENT)
03033                         printf("None");
03034 
03035                 if(content_type==JSON_CONTENT)
03036                         printf(" ] }");
03037                 else if(content_type==CSV_CONTENT)
03038                         printf("%s\n",csv_data_enclosure);
03039                 else
03040                         printf("</TD>\n</TR>\n");
03041         }
03042 
03043         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
03044                 printf("</TABLE>\n");
03045                 printf("</DIV>\n");
03046                 printf("</P>\n");
03047         }else if(content_type==JSON_CONTENT)
03048                 printf("\n]\n");
03049 
03050         return;
03051 }
03052 
03053 void display_hostdependencies(void){
03054         hostdependency *temp_hd;
03055         int odd=0;
03056         int options;
03057         char *bg_class="";
03058         int json_start=TRUE;
03059 
03060         if(content_type==JSON_CONTENT) {
03061                 printf("\"hostdependencies\": [\n");
03062         }else if(content_type==CSV_CONTENT) {
03063                 printf("%sDependent Host%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03064                 printf("%sMaster Host%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03065                 printf("%sDependency Type%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03066                 printf("%sDependency Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03067                 printf("%sDependency Failure Options%s\n",csv_data_enclosure,csv_data_enclosure);
03068         } else {
03069                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Host Dependencie%s%s</DIV></P>\n",
03070                         (*to_expand=='\0'?"s":"s Involving Host "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
03071 
03072                 printf("<P>\n");
03073                 printf("<DIV ALIGN=CENTER>\n");
03074 
03075                 printf("<TABLE BORDER=0 CLASS='data'>\n");
03076 
03077                 print_export_link();
03078 
03079                 printf("<TR>\n");
03080                 printf("<TH CLASS='data'>Dependent Host</TH>");
03081                 printf("<TH CLASS='data'>Master Host</TH>");
03082                 printf("<TH CLASS='data'>Dependency Type</TH>");
03083                 printf("<TH CLASS='data'>Dependency Period</TH>");
03084                 printf("<TH CLASS='data'>Dependency Failure Options</TH>");
03085                 printf("</TR>\n");
03086         }
03087 
03088         /* check all the host dependencies... */
03089         for(temp_hd=hostdependency_list;temp_hd!=NULL;temp_hd=temp_hd->next)
03090                 if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_hd->dependent_host_name))||(!strcmp(to_expand,temp_hd->host_name))){
03091 
03092                 if(odd){
03093                         odd=0;
03094                         bg_class="dataOdd";
03095                 }else{
03096                         odd=1;
03097                         bg_class="dataEven";
03098                 }
03099 
03100                 /* print list in json format */
03101                 if(content_type==JSON_CONTENT) {
03102                         // always add a comma, except for the first line
03103                         if (json_start==FALSE)
03104                                 printf(",\n");
03105                         json_start=FALSE;
03106 
03107                         printf("{ \"dependent_host_name\": \"%s\", ",json_encode(temp_hd->dependent_host_name));
03108                         printf("\"master_host_name\": \"%s\", ",json_encode(temp_hd->host_name));
03109                         printf("\"dependency_type\": \"%s\", ",(temp_hd->dependency_type==NOTIFICATION_DEPENDENCY)?"Notification":"Check Execution");
03110 
03111                         if (temp_hd->dependency_period==NULL)
03112                                 printf("\"dependency_period\": null, ");
03113                         else
03114                                 printf("\"dependency_period\": \"%s\", ",json_encode(temp_hd->dependency_period));
03115 
03116                         printf("\"dependency_failure_options\": [");
03117                 /* print list in csv format */
03118                 }else if(content_type==CSV_CONTENT) {
03119                         printf("%s%s%s%s",csv_data_enclosure,temp_hd->dependent_host_name,csv_data_enclosure,csv_delimiter);
03120                         printf("%s%s%s%s",csv_data_enclosure,temp_hd->host_name,csv_data_enclosure,csv_delimiter);
03121                         printf("%s%s%s%s",csv_data_enclosure,(temp_hd->dependency_type==NOTIFICATION_DEPENDENCY)?"Notification":"Check Execution",csv_data_enclosure,csv_delimiter);
03122                         printf("%s%s%s%s",csv_data_enclosure,(temp_hd->dependency_period==NULL)?"":temp_hd->dependency_period,csv_data_enclosure,csv_delimiter);
03123                         printf("%s",csv_data_enclosure);
03124                 }else{
03125                         printf("<TR CLASS='%s'>\n",bg_class);
03126 
03127                         printf("<TD CLASS='%s'><A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(temp_hd->dependent_host_name),html_encode(temp_hd->dependent_host_name,FALSE));
03128 
03129                         printf("<TD CLASS='%s'><A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(temp_hd->host_name),html_encode(temp_hd->host_name,FALSE));
03130 
03131                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_hd->dependency_type==NOTIFICATION_DEPENDENCY)?"Notification":"Check Execution");
03132 
03133                         printf("<TD CLASS='%s'>",bg_class);
03134                         if(temp_hd->dependency_period==NULL)
03135                                 printf("&nbsp;");
03136                         else
03137                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_hd->dependency_period),html_encode(temp_hd->dependency_period,FALSE));
03138                         printf("</TD>\n");
03139 
03140                         printf("<TD CLASS='%s'>",bg_class);
03141                 }
03142 
03143                 options=0;
03144                 if(temp_hd->fail_on_up==TRUE){
03145                         printf("%sUp%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03146                         options=1;
03147                 }
03148                 if(temp_hd->fail_on_down==TRUE){
03149                         printf("%s%sDown%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03150                         options=1;
03151                 }
03152                 if(temp_hd->fail_on_unreachable==TRUE){
03153                         printf("%s%sUnreachable%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03154                         options=1;
03155                 }
03156                 if(temp_hd->fail_on_pending==TRUE){
03157                         printf("%s%sPending%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03158                         options=1;
03159                 }
03160 
03161                 if(options==0 && content_type!=JSON_CONTENT)
03162                         printf("None");
03163 
03164                 if(content_type==JSON_CONTENT)
03165                         printf(" ] }");
03166                 else if(content_type==CSV_CONTENT)
03167                         printf("%s\n",csv_data_enclosure);
03168                 else
03169                         printf("</TD>\n</TR>\n");
03170         }
03171 
03172         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
03173                 printf("</TABLE>\n");
03174                 printf("</DIV>\n");
03175                 printf("</P>\n");
03176         }else if(content_type==JSON_CONTENT)
03177                 printf("\n]\n");
03178 
03179         return;
03180 }
03181 
03182 void display_hostescalations(void){
03183         hostescalation *temp_he=NULL;
03184         contactsmember *temp_contactsmember=NULL;
03185         contactgroupsmember *temp_contactgroupsmember=NULL;
03186         char time_string[16]="";
03187         int options=FALSE;
03188         int odd=0;
03189         char *bg_class="";
03190         int contact=0;
03191         int json_start=TRUE;
03192 
03193         if(content_type==JSON_CONTENT) {
03194                 printf("\"hostescalations\": [\n");
03195         }else if(content_type==CSV_CONTENT) {
03196                 printf("%sHost%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03197                 printf("%sContacts/Groups%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03198                 printf("%sFirst Notification%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03199                 printf("%sLast Notification%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03200                 printf("%sNotification Interval%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03201                 printf("%sEscalation Period%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03202                 printf("%sEscalation Options%s\n",csv_data_enclosure,csv_data_enclosure);
03203         } else {
03204                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Host Escalation%s%s</DIV></P>\n",
03205                         (*to_expand=='\0'?"s":"s for Host "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
03206 
03207                 printf("<P>\n");
03208                 printf("<DIV ALIGN=CENTER>\n");
03209 
03210                 printf("<TABLE BORDER=0 CLASS='data'>\n");
03211 
03212                 print_export_link();
03213 
03214                 printf("<TR>\n");
03215                 printf("<TH CLASS='data'>Host</TH>");
03216                 printf("<TH CLASS='data'>Contacts/Groups</TH>");
03217                 printf("<TH CLASS='data'>First Notification</TH>");
03218                 printf("<TH CLASS='data'>Last Notification</TH>");
03219                 printf("<TH CLASS='data'>Notification Interval</TH>");
03220                 printf("<TH CLASS='data'>Escalation Period</TH>");
03221                 printf("<TH CLASS='data'>Escalation Options</TH>");
03222                 printf("</TR>\n");
03223         }
03224 
03225         /* check all the host escalations... */
03226         for(temp_he=hostescalation_list;temp_he!=NULL;temp_he=temp_he->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_he->host_name))){
03227 
03228                 if(odd){
03229                         odd=0;
03230                         bg_class="dataOdd";
03231                 }else{
03232                         odd=1;
03233                         bg_class="dataEven";
03234                 }
03235 
03236                 /* print list in json format */
03237                 if(content_type==JSON_CONTENT) {
03238                         // always add a comma, except for the first line
03239                         if (json_start==FALSE)
03240                                 printf(",\n");
03241                         json_start=FALSE;
03242 
03243                         printf("{ \"host_name\": \"%s\", ",json_encode(temp_he->host_name));
03244                         printf("\"contacts_contactgroups\": [");
03245                 /* print list in csv format */
03246                 }else if(content_type==CSV_CONTENT) {
03247                         printf("%s%s%s%s",csv_data_enclosure,temp_he->host_name,csv_data_enclosure,csv_delimiter);
03248                         printf("%s",csv_data_enclosure);
03249                 }else{
03250                         printf("<TR CLASS='%s'>\n",bg_class);
03251 
03252                         printf("<TD CLASS='%s'><A HREF='%s?type=hosts&expand=%s'>%s</A></TD>\n",bg_class,CONFIG_CGI,url_encode(temp_he->host_name),html_encode(temp_he->host_name,FALSE));
03253 
03254                         printf("<TD CLASS='%s'>",bg_class);
03255                 }
03256                 contact=0;
03257                 for(temp_contactsmember=temp_he->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){
03258                         contact++;
03259                         if(contact>1)
03260                                 printf(", ");
03261                         if(content_type==JSON_CONTENT)
03262                                 printf("{ \"contact_name\": \"%s\" } ",json_encode(temp_contactsmember->contact_name));
03263                         else if(content_type==CSV_CONTENT)
03264                                 printf("%s",temp_contactsmember->contact_name);
03265                         else
03266                                 printf("<A HREF='%s?type=contacts&expand=%s'>%s</A>\n",CONFIG_CGI,url_encode(temp_contactsmember->contact_name),html_encode(temp_contactsmember->contact_name,FALSE));
03267                 }
03268                 for(temp_contactgroupsmember=temp_he->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){
03269                         contact++;
03270                         if(contact>1)
03271                                 printf(", ");
03272                         if(content_type==JSON_CONTENT)
03273                                 printf("{ \"contactgroup_name\": \"%s\" } ",json_encode(temp_contactgroupsmember->group_name));
03274                         else if(content_type==CSV_CONTENT)
03275                                 printf("%s",temp_contactgroupsmember->group_name);
03276                         else
03277                                 printf("<A HREF='%s?type=contactgroups&expand=%s'>%s</A>\n",CONFIG_CGI,url_encode(temp_contactgroupsmember->group_name),html_encode(temp_contactgroupsmember->group_name,FALSE));
03278                 }
03279                 if(contact==0)
03280                         printf("%s",(content_type==CSV_CONTENT || content_type==JSON_CONTENT)?"":"&nbsp;");
03281 
03282                 if(content_type==JSON_CONTENT) {
03283                         printf(" ], ");
03284                         printf("\"first_notification\": %d, ",temp_he->first_notification);
03285 #ifdef USE_ST_BASED_ESCAL_RANGES
03286                         printf("\"first_down_notification\": %d, ",temp_he->first_down_notification);
03287                         printf("\"first_unreachable_notification\": %d, ",temp_he->first_unreachable_notification);
03288 #endif
03289                         if(temp_he->last_notification==0)
03290                                 printf("\"last_notification\": null, ");
03291                         else
03292                                 printf("\"last_notification\": %d, ",temp_he->last_notification);
03293 #ifdef USE_ST_BASED_ESCAL_RANGES
03294                         if(temp_he->last_down_notification==0)
03295                                 printf("\"last_down_notification\": null, ");
03296                         else
03297                                 printf("\"last_down_notification\": %d, ",temp_he->last_down_notification);
03298                         if(temp_he->last_unreachable_notification==0)
03299                                 printf("\"last_unreachable_notification\": null, ");
03300                         else
03301                                 printf("\"last_unreachable_notification\": %d, ",temp_he->last_unreachable_notification);
03302 #endif
03303                 }else if(content_type==CSV_CONTENT){
03304                         printf("%s%s",csv_data_enclosure,csv_delimiter);
03305 
03306 #ifndef USE_ST_BASED_ESCAL_RANGES
03307                         printf("%s%d%s%s",csv_data_enclosure,temp_he->first_notification,csv_data_enclosure,csv_delimiter);
03308 #else
03309                         printf("%s%d, %d, %d%s%s",csv_data_enclosure,temp_he->first_notification,temp_he->first_down_notification,temp_he->first_unreachable_notification,csv_data_enclosure,csv_delimiter);
03310 #endif
03311                         printf("%s",csv_data_enclosure);
03312                 }else{
03313                         printf("</TD>\n");
03314 
03315 #ifndef USE_ST_BASED_ESCAL_RANGES
03316                         printf("<TD CLASS='%s'>%d</TD>",bg_class,temp_he->first_notification);
03317 #else
03318                         printf("<TD CLASS='%s'>%d, %d, %d</TD>",bg_class,temp_he->first_notification,temp_he->first_down_notification,temp_he->first_unreachable_notification);
03319 #endif
03320                         printf("<TD CLASS='%s'>",bg_class);
03321                 }
03322 
03323                 if(content_type!=JSON_CONTENT) {
03324 #ifdef USE_ST_BASED_ESCAL_RANGES
03325                         if(temp_he->last_notification==0)
03326                                 printf("Infinity, ");
03327                         else
03328                                 printf("%d, ",temp_he->last_notification);
03329                         if(temp_he->last_down_notification==0)
03330                                 printf("Infinity, ");
03331                         else
03332                                 printf("%d, ",temp_he->last_down_notification);
03333                         if(temp_he->last_unreachable_notification==0)
03334                                 printf("Infinity");
03335                         else
03336                                 printf("%d",temp_he->last_unreachable_notification);
03337 #else
03338                         if(temp_he->last_notification==0)
03339                                 printf("Infinity");
03340                         else
03341                                 printf("%d",temp_he->last_notification);
03342 #endif
03343         }
03344 
03345                 get_interval_time_string(temp_he->notification_interval,time_string,sizeof(time_string));
03346 
03347                 if(content_type==JSON_CONTENT) {
03348                         printf("\"notification_interval\": \"%s\", ",(temp_he->notification_interval==0.0)?"Notify Only Once (No Re-notification)":time_string);
03349                         if (temp_he->escalation_period==NULL)
03350                                 printf("\"escalation_period\": null, ");
03351                         else
03352                                 printf("\"escalation_period\": \"%s\", ",json_encode(temp_he->escalation_period));
03353                         printf("\"escalation_options\": [ ");
03354                 }else if(content_type==CSV_CONTENT){
03355                         printf("%s%s",csv_data_enclosure,csv_delimiter);
03356                         printf("%s%s%s%s",csv_data_enclosure,(temp_he->notification_interval==0.0)?"Notify Only Once (No Re-notification)":time_string,csv_data_enclosure,csv_delimiter);
03357                         printf("%s%s%s%s",csv_data_enclosure,(temp_he->escalation_period==NULL)?"":temp_he->escalation_period,csv_data_enclosure,csv_delimiter);
03358                         printf("%s",csv_data_enclosure);
03359                 }else{
03360                         printf("</TD>\n");
03361                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,(temp_he->notification_interval==0.0)?"Notify Only Once (No Re-notification)":time_string);
03362 
03363                         printf("<TD CLASS='%s'>",bg_class);
03364                         if(temp_he->escalation_period==NULL)
03365                                 printf("&nbsp;");
03366                         else
03367                                 printf("<A HREF='%s?type=timeperiods&expand=%s'>%s</A>",CONFIG_CGI,url_encode(temp_he->escalation_period),html_encode(temp_he->escalation_period,FALSE));
03368                         printf("</TD>\n");
03369 
03370                         printf("<TD CLASS='%s'>",bg_class);
03371                 }
03372 
03373                 options=0;
03374                 if(temp_he->escalate_on_down==TRUE){
03375                         printf("%sDown%s",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03376                         options=1;
03377                 }
03378                 if(temp_he->escalate_on_unreachable==TRUE){
03379                         printf("%s%sUnreachable%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03380                         options=1;
03381                 }
03382                 if(temp_he->escalate_on_recovery==TRUE){
03383                         printf("%s%sRecovery%s",(options)?", ":"",(content_type==JSON_CONTENT)?"\"":"",(content_type==JSON_CONTENT)?"\"":"");
03384                         options=1;
03385                 }
03386                 if(options==0 && content_type!=JSON_CONTENT)
03387                         printf("None");
03388 
03389                 if(content_type==JSON_CONTENT)
03390                         printf(" ] }");
03391                 else if(content_type==CSV_CONTENT)
03392                         printf("%s\n",csv_data_enclosure);
03393                 else
03394                         printf("</TD>\n</TR>\n");
03395         }
03396 
03397         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
03398                 printf("</TABLE>\n");
03399                 printf("</DIV>\n");
03400                 printf("</P>\n");
03401         }else if(content_type==JSON_CONTENT)
03402                 printf("\n]\n");
03403 
03404         return;
03405 }
03406 
03407 
03408 void display_modules(void){
03409         module *temp_module;
03410         int odd=0;
03411         char *bg_class="";
03412         int json_start=TRUE;
03413 
03414         if(content_type==JSON_CONTENT) {
03415                 printf("\"modules\": [\n");
03416         }else if(content_type==CSV_CONTENT) {
03417                 printf("%sModule Name%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03418                 printf("%sModule Type%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03419                 printf("%sModule Path%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter);
03420                 printf("%sModule Args%s",csv_data_enclosure,csv_data_enclosure);
03421                 printf("\n");
03422         } else {
03423                 printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Module%s%s</DIV></P>\n",
03424                         (*to_expand=='\0'?"s":" "),(*to_expand=='\0'?"":html_encode(to_expand,FALSE)));
03425 
03426                 printf("<P><DIV ALIGN=CENTER>\n");
03427                 printf("<TABLE BORDER=0 CLASS='data'>\n");
03428 
03429                 print_export_link();
03430 
03431                 printf("<TR><TH CLASS='data'>Module Name</TH><TH CLASS='data'>Module Type</TH><TH CLASS='data'>Module Path</TH><TH CLASS='data'>Module Args</TH></TR>\n");
03432         }
03433 
03434         /* check all modules */
03435         for(temp_module=module_list;temp_module!=NULL;temp_module=temp_module->next) if (((*to_expand)=='\0')||(!strcmp(to_expand,temp_module->name))){
03436 
03437                 if(odd){
03438                         odd=0;
03439                         bg_class="dataEven";
03440                 }else{  
03441                         odd=1;
03442                         bg_class="dataOdd";
03443                 }
03444 
03445                 /* print list in json format */
03446                 if(content_type==JSON_CONTENT) {
03447                         // always add a comma, except for the first line
03448                         if (json_start==FALSE)
03449                                 printf(",\n");
03450                         json_start=FALSE;
03451 
03452                         printf("{ \"module_name\": \"%s\", ",json_encode(temp_module->name));
03453                         printf("\"module_type\": \"%s\", ",json_encode(temp_module->type));
03454                         printf("\"module_path\": \"%s\", ",json_encode(temp_module->path));
03455                         printf("\"module_args\": \"%s\" }",json_encode(temp_module->args));
03456                 /* print list in csv format */
03457                 }else if(content_type==CSV_CONTENT) {
03458                         printf("%s%s%s%s",csv_data_enclosure,temp_module->name,csv_data_enclosure,csv_delimiter);
03459                         printf("%s%s%s%s",csv_data_enclosure,temp_module->type,csv_data_enclosure,csv_delimiter);
03460                         printf("%s%s%s%s",csv_data_enclosure,temp_module->path,csv_data_enclosure,csv_delimiter);
03461                         printf("%s%s%s\n",csv_data_enclosure,temp_module->args,csv_data_enclosure);
03462                 }else{
03463                         printf("<TR CLASS='%s'>\n",bg_class);
03464 
03465                         printf("<TD CLASS='%s'><A NAME='%s'></A>%s</TD>\n",bg_class,url_encode(temp_module->name),html_encode(temp_module->name,FALSE));
03466                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_module->type,FALSE));
03467                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_module->path,FALSE));
03468                         printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_module->args,FALSE));
03469 
03470                         printf("</TR>\n");
03471                 }
03472         }
03473 
03474         if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){
03475                 printf("</TABLE>\n");
03476                 printf("</DIV>\n");
03477                 printf("</P>\n");
03478         }else if(content_type==JSON_CONTENT)
03479                 printf("\n]\n");
03480 
03481         return;
03482 }
03483 
03484 
03485 
03486 char *hash_color(int i){
03487         char c;
03488 
03489         /* This is actually optimized for MAX_COMMAND_ARGUMENTS==32 ... */
03490 
03491         if ((i%32)<16){
03492                 if ((i%32)<8) c='7'; else c='4';
03493         } else {
03494                 if ((i%32)<24) c='6'; else c='5';
03495         }
03496 
03497         /* Computation for standard case */
03498         hashed_color[0]='#';
03499         hashed_color[1]=hashed_color[2]=((i%2)?c:'0');
03500         hashed_color[3]=hashed_color[4]=(((i/2)%2)?c:'0');
03501         hashed_color[5]=hashed_color[6]=(((i/4)%2)?c:'0');
03502         hashed_color[7]='\0';
03503 
03504         /* Override shades of grey */
03505         if ((i%8)==7) hashed_color[1]=hashed_color[3]='0';
03506         if ((i%8)==0) hashed_color[2]=hashed_color[3]=hashed_color[4]=hashed_color[6]=c;
03507 
03508         return(hashed_color);
03509 }
03510 
03511 void display_command_expansion(void){
03512         command *temp_command;
03513         int odd=0;
03514         char *bg_class="";
03515         int i, j;
03516         char *c, *cc;
03517         char commandline[MAX_COMMAND_BUFFER];
03518         char *command_args[MAX_COMMAND_ARGUMENTS];
03519         int arg_count[MAX_COMMAND_ARGUMENTS];
03520         int lead_space[MAX_COMMAND_ARGUMENTS];
03521         int trail_space[MAX_COMMAND_ARGUMENTS];
03522 
03523         printf("<P><DIV ALIGN=CENTER CLASS='dataTitle'>Command Expansion</DIV></P>\n");
03524 
03525         /* Parse to_expand into parts */
03526         for (i=0;i<MAX_COMMAND_ARGUMENTS;i++) command_args[i]=NULL;
03527         for (i=0,command_args[0]=cc=c=strdup(to_expand);c&&((*c)!='\0')&&(i<MAX_COMMAND_ARGUMENTS);c++,cc++){
03528                 if ((*c)=='\\') c++;
03529                 else if ((*c)=='!'){
03530                         (*cc)='\0';
03531                         cc=c++;
03532                         command_args[++i]=(c--);
03533                 }
03534                 (*cc)=(*c);
03535         }
03536         if ((*c)=='\0') (*cc)='\0';
03537         /* Precompute indexes of dangling whitespace */
03538         for (i=0;i<MAX_COMMAND_ARGUMENTS;i++){
03539                 for (cc=command_args[i],lead_space[i]=0;cc&&isspace(*cc);cc++,lead_space[i]++) ;
03540                 trail_space[i]=0;
03541                 for (;cc&&((*cc)!='\0');cc++) if (isspace(*cc)) trail_space[i]++; else trail_space[i]=0;
03542         }
03543 
03544         printf("<P><DIV ALIGN=CENTER>\n");
03545         printf("<TABLE BORDER=0 CLASS='data'>\n");
03546         printf("<TR><TH CLASS='data'>Command Name</TH><TH CLASS='data'>Command Line</TH></TR>\n");
03547 
03548         if ((*to_expand)!='\0'){
03549                 arg_count[0]=0;
03550 
03551                 printf("<TR CLASS='dataEven'><TD CLASS='dataEven'>To expand:</TD><TD CLASS='dataEven'>%s",command_args[0]);
03552                 for (i=1;(i<MAX_COMMAND_ARGUMENTS)&&command_args[i];i++)
03553                         printf("!<FONT\n   COLOR='%s'>%s</FONT>",hash_color(i),command_args[i]);
03554                 printf("\n</TD></TR>\n");
03555 
03556                 /* check all commands */
03557                 for(temp_command=command_list;temp_command!=NULL;temp_command=temp_command->next){
03558 
03559                         if (!strcmp(temp_command->name,command_args[0])){
03560 
03561                                 arg_count[0]++;
03562 
03563                                 if(odd){
03564                                         odd=0;
03565                                         bg_class="dataEven";
03566                                 }else{
03567                                         odd=1;
03568                                         bg_class="dataOdd";
03569                                 }
03570 
03571                                 printf("<TR CLASS='%s'>\n",bg_class);
03572 
03573                                 printf("<TD CLASS='%s'><A NAME='%s'></A>%s</TD>\n",bg_class,url_encode(temp_command->name),html_encode(temp_command->name,FALSE));
03574                                 printf("<TD CLASS='%s'>%s</TD>\n",bg_class,html_encode(temp_command->command_line,FALSE));
03575 
03576                                 printf("</TR>\n<TR CLASS='%s'>\n",bg_class);
03577 
03578                                 for (i=1;i<MAX_COMMAND_ARGUMENTS;i++) arg_count[i]=0;
03579 
03580                                 printf("<TD CLASS='%s' ALIGN='right'>-&gt;</TD>\n",bg_class);
03581                                 printf("<TD CLASS='%s'>",bg_class);
03582                                 strncpy(commandline,temp_command->command_line,MAX_COMMAND_BUFFER);
03583                                 commandline[MAX_COMMAND_BUFFER-1]='\0';
03584                                 for (c=commandline;c&&(cc=strstr(c,"$"));){
03585                                         (*(cc++))='\0';
03586                                         printf("%s",html_encode(c,FALSE));
03587                                         if ((*cc)=='$'){
03588                                                 /* Escaped '$' */
03589                                                 printf("<FONT COLOR='#444444'>$</FONT>");
03590                                                 c=(++cc);
03591                                                 }
03592                                         else if (strncmp("ARG",cc,3)){
03593                                                 /* Non-$ARGn$ macro */
03594                                                 c=strstr(cc,"$");
03595                                                 if (c) (*(c++))='\0';
03596                                                 printf("<FONT COLOR='#777777'>$%s%s</FONT>",html_encode(cc,FALSE),(c?"$":""));
03597                                                 if (!c) printf("<FONT COLOR='#FF0000'> (not properly terminated)</FONT>");
03598                                                 }
03599                                         else{
03600                                                 /* $ARGn$ macro */
03601                                                 for (c=(cc+=3);isdigit(*c);c++) ;
03602                                                 if (((*c)=='\0')||((*c)=='$')){
03603                                                         /* Index is numeric */
03604                                                         i=atoi(cc);
03605                                                         if ((i>0)&&(i<=MAX_COMMAND_ARGUMENTS)){
03606                                                                 arg_count[i]++;
03607                                                                 if (command_args[i]){
03608                                                                         if (*(command_args[i])!='\0') printf("<FONT COLOR='%s'><B>%s%s%s</B></FONT>",
03609                                                                                 hash_color(i),((lead_space[i]>0)||(trail_space[i]>0)?"<U>&zwj;":""),
03610                                                                                 html_encode(command_args[i],FALSE),((lead_space[i]>0)||(trail_space[i]>0)?"&zwj;</U>":""));
03611                                                                         else printf("<FONT COLOR='#0000FF'>(empty)</FONT>");
03612                                                                         }
03613                                                                 else printf("<FONT COLOR='#0000FF'>(undefined)</FONT>");
03614                                                                 }
03615                                                         else printf("<FONT COLOR='#FF0000'>(not a valid $ARGn$ index: %u)</FONT>",i);
03616                                                         if ((*c)!='\0') c++;
03617                                                         else printf("<FONT COLOR='#FF0000'> (not properly terminated)</FONT>");
03618                                                         }
03619                                                 else{
03620                                                         /* Syntax err in index */
03621                                                         c=strstr(cc,"$");
03622                                                         printf("<FONT COLOR='#FF0000'>(not an $ARGn$ index: &quot;%s&quot;)</FONT>",html_encode(strtok(cc,"$"),FALSE));
03623                                                         if (c) c++;
03624                                                         }
03625                                                 }
03626                                         }
03627                                 if (c) printf("%s",html_encode(c,FALSE));
03628 
03629                                 printf("</TD></TR>\n");
03630 
03631                                 for (i=1;(i<MAX_COMMAND_ARGUMENTS)&&(command_args[i]);i++){
03632                                         if (arg_count[i]==0){
03633                                                 printf("<TR CLASS='%s'><TD CLASS='%s' ALIGN='right'><FONT COLOR='#FF0000'>unused:</FONT></TD>\n",bg_class,bg_class);
03634                                                 printf("<TD CLASS='%s'>$ARG%u$=<FONT COLOR='%s'>%s%s%s</FONT></TD></TR>\n",bg_class,i,hash_color(i),
03635                                                         ((lead_space[i]>0)||(trail_space[i]>0)?"<U>&zwj;":""),html_encode(command_args[i],FALSE),
03636                                                         ((lead_space[i]>0)||(trail_space[i]>0)?"&zwj;</U>":""));
03637                                                 }
03638                                         else if (arg_count[i]>1){
03639                                                 printf("<TR CLASS='%s'><TD CLASS='%s' ALIGN='right'>used %u x:</TD>\n",bg_class,bg_class,i);
03640                                                 printf("<TD CLASS='%s'>$ARG%u$=<FONT COLOR='%s'>%s%s%s</FONT></TD></TR>\n",bg_class,i,hash_color(i),
03641                                                         ((lead_space[i]>0)||(trail_space[i]>0)?"<U>&zwj;":""),html_encode(command_args[i],FALSE),
03642                                                         ((lead_space[i]>0)||(trail_space[i]>0)?"&zwj;</U>":""));
03643                                                 }
03644                                         if ((lead_space[i]>0)||(trail_space[i]>0)){
03645                                                 printf("<TR CLASS='%s'><TD CLASS='%s' ALIGN='right'><FONT COLOR='#0000FF'>dangling whitespace:</FONT></TD>\n",bg_class,bg_class);
03646                                                 printf("<TD CLASS='%s'>$ARG%u$=<FONT COLOR='#0000FF'>",bg_class,i);
03647                                                 for (c=command_args[i],j=0;c&&isspace(*c);c++,j++)
03648                                                         if ((*c)==' ')          printf("[SP]");
03649                                                         else if ((*c)=='\f')    printf("[FF]");
03650                                                         else if ((*c)=='\n')    printf("[LF]");
03651                                                         else if ((*c)=='\r')    printf("[CR]");
03652                                                         else if ((*c)=='\t')    printf("[HT]");
03653                                                         else if ((*c)=='\v')    printf("[VT]");
03654                                                         else                    printf("[0x%x]",*c);
03655                                                 printf("</FONT><FONT COLOR='%s'>",hash_color(i));
03656                                                 for (;c&&((*c)!='\0')&&(j<strlen(command_args[i])-trail_space[i]);c++,j++) putchar(*c);
03657                                                 printf("</FONT><FONT COLOR='#0000FF'>");
03658                                                 for (;c&&((*c)!='\0');c++)
03659                                                         if ((*c)==' ')          printf("[SP]");
03660                                                         else if ((*c)=='\f')    printf("[FF]");
03661                                                         else if ((*c)=='\n')    printf("[LF]");
03662                                                         else if ((*c)=='\r')    printf("[CR]");
03663                                                         else if ((*c)=='\t')    printf("[HT]");
03664                                                         else if ((*c)=='\v')    printf("[VT]");
03665                                                         else                    printf("[0x%x]",*c);
03666                                                 printf("</FONT></TD></TR>\n");
03667                                                 }
03668                                         }
03669                                 }
03670 
03671                         }
03672 
03673                         if (!arg_count[0]){
03674                                 printf("<TR CLASS='dataOdd'><TD CLASS='dataOdd' ALIGN='right'><FONT\n");
03675                                 printf("COLOR='#FF0000'>Error:</FONT></TD><TD CLASS='dataOdd'><FONT COLOR='#FF0000'>No\n");
03676                                 printf("command &quot;%s&quot; found</FONT></TD></TR>\n",html_encode(command_args[0],FALSE));
03677                         }
03678         }
03679 
03680         printf("<TR CLASS='dataEven'><TD CLASS='dataEven'>To expand:</TD><TD CLASS='dataEven'><FORM\n");
03681         printf("METHOD='GET' ACTION='%s'><INPUT TYPE='HIDDEN' NAME='type' VALUE='command'><INPUT\n",CONFIG_CGI);
03682         printf("TYPE='text' NAME='expand' SIZE='100%%' VALUE='%s'>\n",html_encode(to_expand,FALSE));
03683         printf("<INPUT TYPE='SUBMIT' VALUE='Go'></FORM></TD></TR>\n");
03684 
03685         printf("</TABLE>\n");
03686         printf("</DIV></P>\n");
03687 
03688         return;
03689 }
03690 
03691 void display_options(void){
03692 
03693         printf("<br><br>\n");
03694 
03695         printf("<div align=center class='reportSelectTitle'>Select Type of Config Data You Wish To View</div>\n");
03696 
03697         printf("<br><br>\n");
03698 
03699         printf("<form method=\"get\" action=\"%s\">\n",CONFIG_CGI);
03700 
03701         printf("<div align=center>\n");
03702         printf("<table border=0>\n");
03703 
03704         printf("<tr><td align=left class='reportSelectSubTitle'>Object Type:</td></tr>\n");
03705         printf("<tr><td align=left class='reportSelectItem'>");
03706         printf("<select name='type'>\n");
03707         printf("<option value='hosts' %s>Hosts\n",(display_type==DISPLAY_HOSTS)?"SELECTED":"");
03708         printf("<option value='hostdependencies' %s>Host Dependencies\n",(display_type==DISPLAY_HOSTDEPENDENCIES)?"SELECTED":"");
03709         printf("<option value='hostescalations' %s>Host Escalations\n",(display_type==DISPLAY_HOSTESCALATIONS)?"SELECTED":"");
03710         printf("<option value='hostgroups' %s>Host Groups\n",(display_type==DISPLAY_HOSTGROUPS)?"SELECTED":"");
03711         printf("<option value='services' %s>Services\n",(display_type==DISPLAY_SERVICES)?"SELECTED":"");
03712         printf("<option value='servicegroups' %s>Service Groups\n",(display_type==DISPLAY_SERVICEGROUPS)?"SELECTED":"");
03713         printf("<option value='servicedependencies' %s>Service Dependencies\n",(display_type==DISPLAY_SERVICEDEPENDENCIES)?"SELECTED":"");
03714         printf("<option value='serviceescalations' %s>Service Escalations\n",(display_type==DISPLAY_SERVICEESCALATIONS)?"SELECTED":"");
03715         printf("<option value='contacts' %s>Contacts\n",(display_type==DISPLAY_CONTACTS)?"SELECTED":"");
03716         printf("<option value='contactgroups' %s>Contact Groups\n",(display_type==DISPLAY_CONTACTGROUPS)?"SELECTED":"");
03717         printf("<option value='timeperiods' %s>Timeperiods\n",(display_type==DISPLAY_TIMEPERIODS)?"SELECTED":"");
03718         printf("<option value='modules' %s>Modules\n",(display_type==DISPLAY_MODULES)?"SELECTED":"");
03719         printf("<option value='commands' %s>Commands\n",(display_type==DISPLAY_COMMANDS)?"SELECTED":"");
03720         printf("<option value='command' %s>Command Expansion\n",(display_type==DISPLAY_COMMAND_EXPANSION)?"SELECTED":"");
03721         printf("</select>\n");
03722         printf("</td></tr>\n");
03723 
03724         printf("<tr><td class='reportSelectItem'><input type='submit' value='Continue'></td></tr>\n");
03725         printf("</table>\n");
03726         printf("</div>\n");
03727 
03728         printf("</form>\n");
03729 
03730         return;
03731 }
03732 
03733 void print_export_link(void){
03734         printf("<TR>\n<td><div class='csv_export_link' style='text-align:left;'>");
03735         /* add export to csv link */
03736         printf("<a href='%s' target='_blank'>Export to CSV</a></div></td>\n</TR>\n",get_export_csv_link(CONFIG_CGI));
03737 }
 All Data Structures Files Functions Variables Typedefs Defines