Logo Search packages:      
Sourcecode: nagios version File versions  Download package

statuswml.c

/**************************************************************************
 *
 * STATUSWML.C -  Nagios Status CGI for WAP-enabled devices
 *
 * Copyright (c) 2001-2002 Ethan Galstad (nagios@nagios.org)
 * Last Modified: 07-28-2002
 *
 * License:
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *************************************************************************/

#include "../common/config.h"
#include "../common/locations.h"
#include "../common/common.h"
#include "../common/objects.h"
#include "../common/statusdata.h"

#include "cgiutils.h"
#include "getcgi.h"
#include "auth.h"

extern time_t          program_start;

extern char main_config_file[MAX_FILENAME_LENGTH];

extern host *host_list;
extern hostgroup *hostgroup_list;
extern hoststatus *hoststatus_list;
extern servicestatus *servicestatus_list;
extern service *service_list;

extern int      enable_notifications;
extern int      execute_service_checks;
extern int      nagios_process_state;

extern char     *ping_syntax;

#define DISPLAY_HOST                  0
#define DISPLAY_SERVICE                 1
#define DISPLAY_HOSTGROUP               2
#define DISPLAY_INDEX                   3
#define DISPLAY_PING                    4
#define DISPLAY_TRACEROUTE              5
#define DISPLAY_QUICKSTATS              6
#define DISPLAY_PROCESS                 7
#define DISPLAY_ALL_PROBLEMS            8
#define DISPLAY_UNHANDLED_PROBLEMS      9

#define DISPLAY_HOSTGROUP_SUMMARY       0
#define DISPLAY_HOSTGROUP_OVERVIEW      1

#define DISPLAY_HOST_SUMMARY            0
#define DISPLAY_HOST_SERVICES           1

void document_header(void);
void document_footer(void);
int process_cgivars(void);

int display_type=DISPLAY_INDEX;
int hostgroup_style=DISPLAY_HOSTGROUP_SUMMARY;
int host_style=DISPLAY_HOST_SUMMARY;

void display_index(void);
void display_host(void);
void display_host_services(void);
void display_service(void);
void display_hostgroup_summary(void);
void display_hostgroup_overview(void);
void display_ping(void);
void display_traceroute(void);
void display_quick_stats(void);
void display_process(void);
void display_problems(void);

char *host_name="";
char *hostgroup_name="";
char *service_desc="";
char *ping_address="";
char *traceroute_address="";

int show_all_hostgroups=TRUE;


authdata current_authdata;



int main(void){
      int result=OK;
      
      /* get the arguments passed in the URL */
      process_cgivars();

      /* reset internal variables */
      reset_cgi_vars();

      document_header();

      /* read the CGI configuration file */
      result=read_cgi_config_file(DEFAULT_CGI_CONFIG_FILE);
      if(result==ERROR){
            printf("<P>Error: Could not open CGI configuration file '%s' for reading!</P>\n",DEFAULT_CGI_CONFIG_FILE);
            document_footer();
            return ERROR;
              }

      /* read the main configuration file */
      result=read_main_config_file(main_config_file);
      if(result==ERROR){
            printf("<P>Error: Could not open main configuration file '%s' for reading!</P>\n",main_config_file);
            document_footer();
            return ERROR;
              }

      /* read all object configuration data */
      result=read_all_object_configuration_data(main_config_file,READ_ALL_OBJECT_DATA);
      if(result==ERROR){
            printf("<P>Error: Could not read some or all object configuration data!</P>\n");
            document_footer();
            return ERROR;
                }

      /* read all status data */
      result=read_all_status_data(DEFAULT_CGI_CONFIG_FILE,READ_ALL_STATUS_DATA);
      if(result==ERROR){
            printf("<P>Error: Could not read host and service status information!</P>\n");
            document_footer();
            free_memory();
            return ERROR;
                }

      /* get authentication information */
      get_authentication_information(&current_authdata);

      /* decide what to display to the user */
      if(display_type==DISPLAY_HOST && host_style==DISPLAY_HOST_SERVICES)
            display_host_services();
      else if(display_type==DISPLAY_HOST)
            display_host();
      else if(display_type==DISPLAY_SERVICE)
            display_service();
      else if(display_type==DISPLAY_HOSTGROUP && hostgroup_style==DISPLAY_HOSTGROUP_OVERVIEW)
            display_hostgroup_overview();
      else if(display_type==DISPLAY_HOSTGROUP && hostgroup_style==DISPLAY_HOSTGROUP_SUMMARY)
            display_hostgroup_summary();
      else if(display_type==DISPLAY_PING)
            display_ping();
      else if(display_type==DISPLAY_TRACEROUTE)
            display_traceroute();
      else if(display_type==DISPLAY_QUICKSTATS)
            display_quick_stats();
      else if(display_type==DISPLAY_PROCESS)
            display_process();
      else if(display_type==DISPLAY_ALL_PROBLEMS || display_type==DISPLAY_UNHANDLED_PROBLEMS)
            display_problems();
      else
            display_index();

      document_footer();

      /* free all allocated memory */
      free_memory();

      return OK;
        }


void document_header(void){
      char date_time[MAX_DATETIME_LENGTH];
      time_t expire_time;
      time_t current_time;

      time(&current_time);

      printf("Cache-Control: no-store\n");
      printf("Pragma: no-cache\n");

      get_time_string(&current_time,date_time,(int)sizeof(date_time),HTTP_DATE_TIME);
      printf("Last-Modified: %s\n",date_time);

      expire_time=(time_t)0L;
      get_time_string(&expire_time,date_time,(int)sizeof(date_time),HTTP_DATE_TIME);
      printf("Expires: %s\n",date_time);

      printf("Content-type: text/vnd.wap.wml\n\n");

      printf("<?xml version=\"1.0\"?>\n");
      printf("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");

      printf("<wml>\n");
      
      printf("<head>\n");
      printf("<meta forua=\"true\" http-equiv=\"Cache-Control\" content=\"max-age=0\"/>\n");
      printf("</head>\n");

      return;
        }


void document_footer(void){

      printf("</wml>\n");

      return;
        }


int process_cgivars(void){
      char **variables;
      int error=FALSE;
      int x;

      variables=getcgivars();

      for(x=0;variables[x]!=NULL;x++){

            /* we found the hostgroup argument */
            if(!strcmp(variables[x],"hostgroup")){
                  display_type=DISPLAY_HOSTGROUP;
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  hostgroup_name=(char *)malloc(strlen(variables[x])+1);
                  if(hostgroup_name==NULL)
                        hostgroup_name="";
                  else
                        strcpy(hostgroup_name,variables[x]);

                  if(!strcmp(hostgroup_name,"all"))
                        show_all_hostgroups=TRUE;
                  else
                        show_all_hostgroups=FALSE;
                    }

            /* we found the host argument */
            else if(!strcmp(variables[x],"host")){
                  display_type=DISPLAY_HOST;
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  host_name=(char *)malloc(strlen(variables[x])+1);
                  if(host_name==NULL)
                        host_name="";
                  else
                        strcpy(host_name,variables[x]);
                    }

            /* we found the service argument */
            else if(!strcmp(variables[x],"service")){
                  display_type=DISPLAY_SERVICE;
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  service_desc=(char *)malloc(strlen(variables[x])+1);
                  if(service_desc==NULL)
                        service_desc="";
                  else
                        strcpy(service_desc,variables[x]);
                    }


            /* we found the hostgroup style argument */
            else if(!strcmp(variables[x],"style")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(!strcmp(variables[x],"overview"))
                        hostgroup_style=DISPLAY_HOSTGROUP_OVERVIEW;
                  else if(!strcmp(variables[x],"summary"))
                        hostgroup_style=DISPLAY_HOSTGROUP_SUMMARY;
                  else if(!strcmp(variables[x],"servicedetail"))
                        host_style=DISPLAY_HOST_SERVICES;
                  else if(!strcmp(variables[x],"processinfo"))
                        display_type=DISPLAY_PROCESS;
                  else if(!strcmp(variables[x],"aprobs"))
                        display_type=DISPLAY_ALL_PROBLEMS;
                  else if(!strcmp(variables[x],"uprobs"))
                        display_type=DISPLAY_UNHANDLED_PROBLEMS;
                  else
                        display_type=DISPLAY_QUICKSTATS;
                    }                 

            /* we found the ping argument */
            else if(!strcmp(variables[x],"ping")){
                  display_type=DISPLAY_PING;
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  ping_address=(char *)malloc(strlen(variables[x])+1);
                  if(ping_address==NULL)
                        ping_address="";
                  else
                        strcpy(ping_address,variables[x]);
                    }

            /* we found the traceroute argument */
            else if(!strcmp(variables[x],"traceroute")){
                  display_type=DISPLAY_TRACEROUTE;
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  traceroute_address=(char *)malloc(strlen(variables[x])+1);
                  if(traceroute_address==NULL)
                        traceroute_address="";
                  else
                        strcpy(traceroute_address,variables[x]);
                    }

              }

      /* free memory allocated to the CGI variables */
      free_cgivars(variables);

      return error;
        }



/* main intro screen */
void display_index(void){


      /**** MAIN MENU SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Nagios WAP Interface'>\n");
      printf("<p align='center' mode='nowrap'>\n");

      printf("<b>Nagios</b><br/><b>WAP Interface</b><br/>\n");

      printf("<b><anchor title='Quick Stats'>Quick Stats<go href='%s'><postfield name='style' value='quickstats'/></go></anchor></b><br/>\n",STATUSWML_CGI);

      printf("<b><anchor title='Status Summary'>Status Summary<go href='%s'><postfield name='hostgroup' value='all'/><postfield name='style' value='summary'/></go></anchor></b><br/>\n",STATUSWML_CGI);

      printf("<b><anchor title='Status Overview'>Status Overview<go href='%s'><postfield name='hostgroup' value='all'/><postfield name='style' value='overview'/></go></anchor></b><br/>\n",STATUSWML_CGI);

      printf("<b><anchor title='All Problems'>All Problems<go href='%s'><postfield name='style' value='aprobs'/></go></anchor></b><br/>\n",STATUSWML_CGI);

      printf("<b><anchor title='Unhandled Problems'>Unhandled Problems<go href='%s'><postfield name='style' value='uprobs'/></go></anchor></b><br/>\n",STATUSWML_CGI);

      printf("<b><anchor title='Process Info'>Process Info<go href='%s'><postfield name='style' value='processinfo'/></go></anchor></b><br/>\n",STATUSWML_CGI);

      printf("<b><anchor title='Network Tools'>Tools<go href='#card2'/></anchor></b><br/>\n");

      printf("<b><anchor title='About'>About<go href='#card3'/></anchor></b><br/>\n");

      printf("</p>\n");
      printf("</card>\n");


      /**** TOOLS SCREEN (CARD 2) ****/
      printf("<card id='card2' title='Network Tools'>\n");
      printf("<p align='center' mode='nowrap'>\n");

      printf("<b>Network Tools:</b><br/>\n");

      printf("<b><anchor title='Ping Host'>Ping<go href='%s'><postfield name='ping' value=''/></go></anchor></b><br/>\n",STATUSWML_CGI);
      printf("<b><anchor title='Traceroute'>Traceroute<go href='%s'><postfield name='traceroute' value=''/></go></anchor></b><br/>\n",STATUSWML_CGI);
      printf("<b><anchor title='View Host'>View Host<go href='#card4'/></anchor></b><br/>\n");
      printf("<b><anchor title='View Hostgroup'>View Hostgroup<go href='#card5'/></anchor></b><br/>\n");

      printf("</p>\n");
      printf("</card>\n");


      /**** ABOUT SCREEN (CARD 3) ****/
      printf("<card id='card3' title='About'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>About</b><br/>\n");
      printf("</p>\n");

      printf("<p align='center' mode='wrap'>\n");
      printf("<b>Nagios %s</b><br/><b>WAP Interface</b><br/>\n",PROGRAM_VERSION);
      printf("Copyright (C) 2001 Ethan Galstad<br/>\n");
      printf("nagios@nagios.org<br/><br/>\n");
      printf("License: <b>GPL</b><br/><br/>\n");
      printf("Based in part on features found in AskAround's Wireless Network Tools<br/>\n");
      printf("<b>www.askaround.com</b><br/>\n");
      printf("</p>\n");

      printf("</card>\n");



      /**** VIEW HOST SCREEN (CARD 4) ****/
      printf("<card id='card4' title='View Host'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>View Host</b><br/>\n");
      printf("</p>\n");

      printf("<p align='center' mode='wrap'>\n");
      printf("<b>Host Name:</b><br/>\n");
      printf("<input name='hname'/>\n");
      printf("<do type='accept'>\n");
      printf("<go href='%s' method='post'><postfield name='host' value='$(hname)'/></go>\n",STATUSWML_CGI);
      printf("</do>\n");
      printf("</p>\n");

      printf("</card>\n");



      /**** VIEW HOSTGROUP SCREEN (CARD 5) ****/
      printf("<card id='card5' title='View Hostgroup'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>View Hostgroup</b><br/>\n");
      printf("</p>\n");

      printf("<p align='center' mode='wrap'>\n");
      printf("<b>Hostgroup Name:</b><br/>\n");
      printf("<input name='gname'/>\n");
      printf("<do type='accept'>\n");
      printf("<go href='%s' method='post'><postfield name='hostgroup' value='$(gname)'/><postfield name='style' value='overview'/></go>\n",STATUSWML_CGI);
      printf("</do>\n");
      printf("</p>\n");

      printf("</card>\n");


      return;
        }


/* displays process info */
void display_process(void){


      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Process Info'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Process Info</b><br/><br/>\n");

      /* check authorization */
      if(is_authorized_for_system_information(&current_authdata)==FALSE){

            printf("<b>Error: Not authorized for process info!</b>\n");
            printf("</p>\n");
            printf("</card>\n");
            return;
              }

      if(nagios_process_state==STATE_OK)
            printf("Nagios process is running<br/>\n");
      else
            printf("<b>Nagios process may not be running</b><br/>\n");

      if(enable_notifications==TRUE)
            printf("Notifications are enabled<br/>\n");
      else
            printf("<b>Notifications are disabled</b><br/>\n");

      if(execute_service_checks==TRUE)
            printf("Check execution is enabled<br/>\n");
      else
            printf("<b>Check execution is disabled</b><br/>\n");

      printf("<br/>\n");
      printf("<b><anchor title='Process Commands'>Process Commands<go href='#card2'/></anchor></b>\n");
      printf("</p>\n");

      printf("</card>\n");


      /**** COMMANDS SCREEN (CARD 2) ****/
      printf("<card id='card2' title='Process Commands'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Process Commands</b><br/>\n");

      if(enable_notifications==FALSE)
            printf("<b><anchor title='Enable Notifications'>Enable Notifications<go href='%s' method='post'><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,CMD_ENABLE_NOTIFICATIONS,CMDMODE_COMMIT);
      else
            printf("<b><anchor title='Disable Notifications'>Disable Notifications<go href='%s' method='post'><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,CMD_DISABLE_NOTIFICATIONS,CMDMODE_COMMIT);

      if(execute_service_checks==FALSE)
            printf("<b><anchor title='Enable Check Execution'>Enable Check Execution<go href='%s' method='post'><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,CMD_START_EXECUTING_SVC_CHECKS,CMDMODE_COMMIT);
      else
            printf("<b><anchor title='Disable Check Execution'>Disable Check Execution<go href='%s' method='post'><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,CMD_STOP_EXECUTING_SVC_CHECKS,CMDMODE_COMMIT);

      printf("</p>\n");

      printf("</card>\n");


      return;
        }



/* displays quick stats */
void display_quick_stats(void){
      host *temp_host;
      hoststatus *temp_hoststatus;
      service *temp_service;
      servicestatus *temp_servicestatus;
      int hosts_unreachable=0;
      int hosts_down=0;
      int hosts_up=0;
      int hosts_pending=0;
      int services_critical=0;
      int services_unknown=0;
      int services_warning=0;
      int services_ok=0;
      int services_pending=0;


      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Quick Stats'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Quick Stats</b><br/>\n");
      printf("</p>\n");

      /* check all hosts */
      for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next){

            if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
                  continue;

            temp_hoststatus=find_hoststatus(temp_host->name);
            if(temp_hoststatus==NULL)
                  continue;

            if(temp_hoststatus->status==HOST_UNREACHABLE)
                  hosts_unreachable++;
            else if(temp_hoststatus->status==HOST_DOWN)
                  hosts_down++;
            else if(temp_hoststatus->status==HOST_PENDING)
                  hosts_pending++;
            else
                  hosts_up++;
              }

      /* check all services */
      for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){

            if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
                  continue;

            temp_servicestatus=find_servicestatus(temp_service->host_name,temp_service->description);
            if(temp_servicestatus==NULL)
                  continue;

            if(temp_servicestatus->status==SERVICE_CRITICAL)
                  services_critical++;
            else if(temp_servicestatus->status==SERVICE_UNKNOWN)
                  services_unknown++;
            else if(temp_servicestatus->status==SERVICE_WARNING)
                  services_warning++;
            else if(temp_servicestatus->status==SERVICE_PENDING)
                  services_pending++;
            else
                  services_ok++;
              }

      printf("<p align='left' mode='nowrap'>\n");

      printf("<b>Host Totals</b>:<br/>\n");
      printf("%d UP<br/>\n",hosts_up);
      printf("%d DOWN<br/>\n",hosts_down);
      printf("%d UNREACHABLE<br/>\n",hosts_unreachable);
      printf("%d PENDING<br/>\n",hosts_pending);

      printf("<br/>\n");
      
      printf("<b>Service Totals:</b><br/>\n");
      printf("%d OK<br/>\n",services_ok);
      printf("%d WARNING<br/>\n",services_warning);
      printf("%d UNKNOWN<br/>\n",services_unknown);
      printf("%d CRITICAL<br/>\n",services_critical);
      printf("%d PENDING<br/>\n",services_pending);
      
      printf("</p>\n");

      printf("</card>\n");

      return;
        }



/* displays hostgroup status overview */
void display_hostgroup_overview(void){
      hostgroup *temp_hostgroup;
      host *temp_host;
      hoststatus *temp_hoststatus;

      
      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Status Overview'>\n");
      printf("<p align='center' mode='nowrap'>\n");

      printf("<b><anchor title='Status Overview'>Status Overview<go href='%s' method='post'><postfield name='hostgroup' value='%s'/><postfield name='style' value='summary'/></go></anchor></b><br/><br/>\n",STATUSWML_CGI,hostgroup_name);

      /* check all hostgroups */
      for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next){

            if(show_all_hostgroups==FALSE && strcmp(temp_hostgroup->group_name,hostgroup_name))
                  continue;

            if(is_authorized_for_hostgroup(temp_hostgroup,&current_authdata)==FALSE)
                  continue;

            printf("<b>%s</b>\n",temp_hostgroup->alias);

            printf("<table columns='2' align='LL'>\n");

            /* check all hosts in this hostgroup */
            for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next){

                  if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
                        continue;

                  if(is_host_member_of_hostgroup(temp_hostgroup,temp_host)==FALSE)
                        continue;

                  temp_hoststatus=find_hoststatus(temp_host->name);
                  if(temp_hoststatus==NULL)
                        continue;

                  printf("<tr><td><anchor title='%s'>",temp_host->name);
                  if(temp_hoststatus->status==HOST_UP)
                        printf("UP");
                  else if(temp_hoststatus->status==HOST_PENDING)
                        printf("PND");
                  else if(temp_hoststatus->status==HOST_DOWN)
                        printf("DWN");
                  else if(temp_hoststatus->status==HOST_UNREACHABLE)
                        printf("UNR");
                  else
                        printf("???");
                  printf("<go href='%s' method='post'><postfield name='host' value='%s'/></go></anchor></td>",STATUSWML_CGI,temp_host->name);
                  printf("<td>%s</td></tr>\n",temp_host->name);
                    }

            printf("</table>\n");

            printf("<br/>\n");
              }

      if(show_all_hostgroups==FALSE)
            printf("<b><anchor title='View All Hostgroups'>View All Hostgroups<go href='%s' method='post'><postfield name='hostgroup' value='all'/><postfield name='style' value='overview'/></go></anchor></b>\n",STATUSWML_CGI);

      printf("</p>\n");
      printf("</card>\n");

      return;
        }


/* displays hostgroup status summary */
void display_hostgroup_summary(void){
      hostgroup *temp_hostgroup;
      host *temp_host;
      hoststatus *temp_hoststatus;
      service *temp_service;
      servicestatus *temp_servicestatus;
      int hosts_unreachable=0;
      int hosts_down=0;
      int hosts_up=0;
      int hosts_pending=0;
      int services_critical=0;
      int services_unknown=0;
      int services_warning=0;
      int services_ok=0;
      int services_pending=0;
      int found=0;


      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Status Summary'>\n");
      printf("<p align='center' mode='nowrap'>\n");

      printf("<b><anchor title='Status Summary'>Status Summary<go href='%s' method='post'><postfield name='hostgroup' value='%s'/><postfield name='style' value='overview'/></go></anchor></b><br/><br/>\n",STATUSWML_CGI,hostgroup_name);

      /* check all hostgroups */
      for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next){

            if(show_all_hostgroups==FALSE && strcmp(temp_hostgroup->group_name,hostgroup_name))
                  continue;

            if(is_authorized_for_hostgroup(temp_hostgroup,&current_authdata)==FALSE)
                  continue;

            printf("<b><anchor title='%s'>%s<go href='%s' method='post'><postfield name='hostgroup' value='%s'/><postfield name='style' value='overview'/></go></anchor></b>\n",temp_hostgroup->group_name,temp_hostgroup->alias,STATUSWML_CGI,temp_hostgroup->group_name);

            printf("<table columns='2' align='LL'>\n");

            hosts_up=0;
            hosts_pending=0;
            hosts_down=0;
            hosts_unreachable=0;

            services_ok=0;
            services_pending=0;
            services_warning=0;
            services_unknown=0;
            services_critical=0;

            /* check all hosts in this hostgroup */
            for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next){

                  if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
                        continue;

                  if(is_host_member_of_hostgroup(temp_hostgroup,temp_host)==FALSE)
                        continue;

                  temp_hoststatus=find_hoststatus(temp_host->name);
                  if(temp_hoststatus==NULL)
                        continue;

                  if(temp_hoststatus->status==HOST_UNREACHABLE)
                        hosts_unreachable++;
                  else if(temp_hoststatus->status==HOST_DOWN)
                        hosts_down++;
                  else if(temp_hoststatus->status==HOST_PENDING)
                        hosts_pending++;
                  else
                        hosts_up++;

                  /* check all services on this host */
                  for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){

                        if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
                              continue;

                        if(strcmp(temp_service->host_name,temp_host->name))
                              continue;

                        temp_servicestatus=find_servicestatus(temp_service->host_name,temp_service->description);
                        if(temp_servicestatus==NULL)
                              continue;

                        if(temp_servicestatus->status==SERVICE_CRITICAL)
                              services_critical++;
                        else if(temp_servicestatus->status==SERVICE_UNKNOWN)
                              services_unknown++;
                        else if(temp_servicestatus->status==SERVICE_WARNING)
                              services_warning++;
                        else if(temp_servicestatus->status==SERVICE_PENDING)
                              services_pending++;
                        else
                              services_ok++;
                          }
                    }

            printf("<tr><td>Hosts:</td><td>");
            found=0;
            if(hosts_unreachable>0){
                  printf("%d UNR",hosts_unreachable);
                  found=1;
                    }
            if(hosts_down>0){
                  printf("%s%d DWN",(found==1)?", ":"",hosts_down);
                  found=1;
                    }
            if(hosts_pending>0){
                  printf("%s%d PND",(found==1)?", ":"",hosts_pending);
                  found=1;
                    }
            printf("%s%d UP",(found==1)?", ":"",hosts_up);
            printf("</td></tr>\n");
            printf("<tr><td>Services:</td><td>");
            found=0;
            if(services_critical>0){
                  printf("%d CRI",services_critical);
                  found=1;
                    }
            if(services_warning>0){
                  printf("%s%d WRN",(found==1)?", ":"",services_warning);
                  found=1;
                    }
            if(services_unknown>0){
                  printf("%s%d UNK",(found==1)?", ":"",services_unknown);
                  found=1;
                    }
            if(services_pending>0){
                  printf("%s%d PND",(found==1)?", ":"",services_pending);
                  found=1;
                    }
            printf("%s%d OK",(found==1)?", ":"",services_ok);
            printf("</td></tr>\n");

            printf("</table>\n");

            printf("<br/>\n");
              }

      if(show_all_hostgroups==FALSE)
            printf("<b><anchor title='View All Hostgroups'>View All Hostgroups<go href='%s' method='post'><postfield name='hostgroup' value='all'/><postfield name='style' value='summary'/></go></anchor></b>\n",STATUSWML_CGI);
      
      printf("</p>\n");

      printf("</card>\n");

      return;
        }



/* displays host status */
void display_host(void){
      host *temp_host;
      hoststatus *temp_hoststatus;
      char last_check[MAX_DATETIME_LENGTH];
      int days;
      int hours;
      int minutes;
      int seconds;
      time_t current_time;
      time_t t;
      char state_duration[48];
      int found;

      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Host Status'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Host '%s'</b><br/>\n",host_name);

      /* find the host */
      temp_host=find_host(host_name,NULL);
      temp_hoststatus=find_hoststatus(host_name);
      if(temp_host==NULL || temp_hoststatus==NULL){

            printf("<b>Error: Could not find host!</b>\n");
            printf("</p>\n");
            printf("</card>\n");
            return;
              }

      /* check authorization */
      if(is_authorized_for_host(temp_host,&current_authdata)==FALSE){

            printf("<b>Error: Not authorized for host!</b>\n");
            printf("</p>\n");
            printf("</card>\n");
            return;
              }


      printf("<table columns='2' align='LL'>\n");

      printf("<tr><td>Status:</td><td>");
      if(temp_hoststatus->status==HOST_UP)
            printf("UP");
      else if(temp_hoststatus->status==HOST_PENDING)
            printf("PENDING");
      else if(temp_hoststatus->status==HOST_DOWN)
            printf("DOWN");
      else if(temp_hoststatus->status==HOST_UNREACHABLE)
            printf("UNREACHABLE");
      else
            printf("?");
      printf("</td></tr>\n");

      printf("<tr><td>Info:</td><td>%s</td></tr>\n",temp_hoststatus->information);

      get_time_string(&temp_hoststatus->last_check,last_check,sizeof(last_check)-1,SHORT_DATE_TIME);
      printf("<tr><td>Last Check:</td><td>%s</td></tr>\n",last_check);

      current_time=time(NULL);
      if(temp_hoststatus->last_state_change==(time_t)0)
            t=current_time-program_start;
      else
            t=current_time-temp_hoststatus->last_state_change;
      get_time_breakdown((unsigned long)t,&days,&hours,&minutes,&seconds);
      snprintf(state_duration,sizeof(state_duration)-1,"%2dd %2dh %2dm %2ds%s",days,hours,minutes,seconds,(temp_hoststatus->last_state_change==(time_t)0)?"+":"");
      printf("<tr><td>Duration:</td><td>%s</td></tr>\n",state_duration);

      printf("<tr><td>Properties:</td><td>");
      found=0;
      if(temp_hoststatus->checks_enabled==FALSE){
            printf("%sChecks disabled",(found==1)?", ":"");
            found=1;
              }
      if(temp_hoststatus->notifications_enabled==FALSE){
            printf("%sNotifications disabled",(found==1)?", ":"");
            found=1;
              }
      if(temp_hoststatus->problem_has_been_acknowledged==TRUE){
            printf("%sProblem acknowledged",(found==1)?", ":"");
            found=1;
              }
      if(temp_hoststatus->scheduled_downtime_depth>0){
            printf("%sIn scheduled downtime",(found==1)?", ":"");
            found=1;
              }
      if(found==0)
            printf("N/A");
      printf("</td></tr>\n");

      printf("</table>\n");
      printf("<br/>\n");
      printf("<b><anchor title='View Services'>View Services<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='style' value='servicedetail'/></go></anchor></b>\n",STATUSWML_CGI,host_name);
      printf("<b><anchor title='Host Commands'>Host Commands<go href='#card2'/></anchor></b>\n");
      printf("</p>\n");

      printf("</card>\n");


      /**** COMMANDS SCREEN (CARD 2) ****/
      printf("<card id='card2' title='Host Commands'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Host Commands</b><br/>\n");

      printf("<b><anchor title='Ping Host'>Ping Host<go href='%s' method='post'><postfield name='ping' value='%s'/></go></anchor></b>\n",STATUSWML_CGI,temp_host->address);
      printf("<b><anchor title='Traceroute'>Traceroute<go href='%s' method='post'><postfield name='traceroute' value='%s'/></go></anchor></b>\n",STATUSWML_CGI,temp_host->address);

      if(temp_hoststatus->status!=HOST_UP && temp_hoststatus->status!=HOST_PENDING)
            printf("<b><anchor title='Acknowledge Problem'>Acknowledge Problem<go href='#card3'/></anchor></b>\n");

      if(temp_hoststatus->checks_enabled==FALSE)
            printf("<b><anchor title='Enable Host Checks'>Enable Host Checks<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_ENABLE_HOST_CHECK,CMDMODE_COMMIT);
      else
            printf("<b><anchor title='Disable Host Checks'>Disable Host Checks<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_DISABLE_HOST_CHECK,CMDMODE_COMMIT);

      if(temp_hoststatus->notifications_enabled==FALSE)
            printf("<b><anchor title='Enable Host Notifications'>Enable Host Notifications<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_ENABLE_HOST_NOTIFICATIONS,CMDMODE_COMMIT);
      else
            printf("<b><anchor title='Disable Host Notifications'>Disable Host Notifications<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_DISABLE_HOST_NOTIFICATIONS,CMDMODE_COMMIT);


      printf("<b><anchor title='Enable All Service Checks'>Enable All Service Checks<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_ENABLE_HOST_SVC_CHECKS,CMDMODE_COMMIT);

      printf("<b><anchor title='Disable All Service Checks'>Disable All Service Checks<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_DISABLE_HOST_SVC_CHECKS,CMDMODE_COMMIT);

      printf("<b><anchor title='Enable All Service Notifications'>Enable All Service Notifications<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_ENABLE_HOST_SVC_NOTIFICATIONS,CMDMODE_COMMIT);

      printf("<b><anchor title='Disable All Service Notifications'>Disable All Service Notifications<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,CMD_DISABLE_HOST_SVC_NOTIFICATIONS,CMDMODE_COMMIT);

      printf("</p>\n");

      printf("</card>\n");


      /**** ACKNOWLEDGEMENT SCREEN (CARD 3) ****/
      printf("<card id='card3' title='Acknowledge Problem'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Acknowledge Problem</b><br/>\n");
      printf("</p>\n");

      printf("<p align='center' mode='wrap'>\n");
      printf("<b>Your Name:</b><br/>\n");
      printf("<input name='name'/><br/>\n");
      printf("<b>Comment:</b><br/>\n");
      printf("<input name='comment'/>\n");

      printf("<do type='accept'>\n");
      printf("<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='com_author' value='$(name)'/><postfield name='com_data' value='$(comment)'/><postfield name='persistent' value=''/><postfield name='send_notification' value=''/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go>\n",COMMAND_CGI,host_name,CMD_ACKNOWLEDGE_HOST_PROBLEM,CMDMODE_COMMIT);
      printf("</do>\n");

      printf("</p>\n");

      printf("</card>\n");

      return;
        }



/* displays services on a host */
void display_host_services(void){
      service *temp_service;
      servicestatus *temp_servicestatus;

      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Host Services'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Host <anchor title='%s'>'%s'<go href='%s' method='post'><postfield name='host' value='%s'/></go></anchor> Services</b><br/>\n",host_name,host_name,STATUSWML_CGI,host_name);

      printf("<table columns='2' align='LL'>\n");

      /* check all services */
      for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){

            if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
                  continue;

            if(strcmp(temp_service->host_name,host_name))
                  continue;

            temp_servicestatus=find_servicestatus(temp_service->host_name,temp_service->description);
            if(temp_servicestatus==NULL)
                  continue;

            printf("<tr><td><anchor title='%s'>",temp_service->description);
            if(temp_servicestatus->status==SERVICE_OK || temp_servicestatus->status==SERVICE_RECOVERY)
                  printf("OK");
            else if(temp_servicestatus->status==SERVICE_PENDING)
                  printf("PND");
            else if(temp_servicestatus->status==SERVICE_WARNING)
                  printf("WRN");
            else if(temp_servicestatus->status==SERVICE_UNKNOWN)
                  printf("UNK");
            else if(temp_servicestatus->status==SERVICE_CRITICAL)
                  printf("CRI");
            else
                  printf("???");

            printf("<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/></go></anchor></td>",STATUSWML_CGI,temp_service->host_name,temp_service->description);
            printf("<td>%s</td></tr>\n",temp_service->description);
              }

      printf("</table>\n");

      printf("</p>\n");

      printf("</card>\n");

      return;
        }



/* displays service status */
void display_service(void){
      service *temp_service;
      servicestatus *temp_servicestatus;
      char last_check[MAX_DATETIME_LENGTH];
      int days;
      int hours;
      int minutes;
      int seconds;
      time_t current_time;
      time_t t;
      char state_duration[48];
      int found;

      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Service Status'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Service '%s' on host '%s'</b><br/>\n",service_desc,host_name);

      /* find the service */
      temp_service=find_service(host_name,service_desc,NULL);
      temp_servicestatus=find_servicestatus(host_name,service_desc);
      if(temp_service==NULL || temp_servicestatus==NULL){

            printf("<b>Error: Could not find service!</b>\n");
            printf("</p>\n");
            printf("</card>\n");
            return;
              }

      /* check authorization */
      if(is_authorized_for_service(temp_service,&current_authdata)==FALSE){

            printf("<b>Error: Not authorized for service!</b>\n");
            printf("</p>\n");
            printf("</card>\n");
            return;
              }


      printf("<table columns='2' align='LL'>\n");

      printf("<tr><td>Status:</td><td>");
      if(temp_servicestatus->status==SERVICE_OK || temp_servicestatus->status==SERVICE_RECOVERY)
            printf("OK");
      else if(temp_servicestatus->status==SERVICE_PENDING)
            printf("PENDING");
      else if(temp_servicestatus->status==SERVICE_WARNING)
            printf("WARNING");
      else if(temp_servicestatus->status==SERVICE_UNKNOWN)
            printf("UNKNOWN");
      else if(temp_servicestatus->status==SERVICE_CRITICAL)
            printf("CRITICAL");
      else
            printf("?");
      printf("</td></tr>\n");

      printf("<tr><td>Info:</td><td>%s</td></tr>\n",temp_servicestatus->information);

      get_time_string(&temp_servicestatus->last_check,last_check,sizeof(last_check)-1,SHORT_DATE_TIME);
      printf("<tr><td>Last Check:</td><td>%s</td></tr>\n",last_check);

      current_time=time(NULL);
      if(temp_servicestatus->last_state_change==(time_t)0)
            t=current_time-program_start;
      else
            t=current_time-temp_servicestatus->last_state_change;
      get_time_breakdown((unsigned long)t,&days,&hours,&minutes,&seconds);
      snprintf(state_duration,sizeof(state_duration)-1,"%2dd %2dh %2dm %2ds%s",days,hours,minutes,seconds,(temp_servicestatus->last_state_change==(time_t)0)?"+":"");
      printf("<tr><td>Duration:</td><td>%s</td></tr>\n",state_duration);

      printf("<tr><td>Properties:</td><td>");
      found=0;
      if(temp_servicestatus->checks_enabled==FALSE){
            printf("%sChecks disabled",(found==1)?", ":"");
            found=1;
              }
      if(temp_servicestatus->notifications_enabled==FALSE){
            printf("%sNotifications disabled",(found==1)?", ":"");
            found=1;
              }
      if(temp_servicestatus->problem_has_been_acknowledged==TRUE){
            printf("%sProblem acknowledged",(found==1)?", ":"");
            found=1;
              }
      if(temp_servicestatus->scheduled_downtime_depth>0){
            printf("%sIn scheduled downtime",(found==1)?", ":"");
            found=1;
              }
      if(found==0)
            printf("N/A");
      printf("</td></tr>\n");

      printf("</table>\n");
      printf("<br/>\n");
      printf("<b><anchor title='View Host'>View Host<go href='%s' method='post'><postfield name='host' value='%s'/></go></anchor></b>\n",STATUSWML_CGI,host_name);
      printf("<b><anchor title='Service Commands'>Svc. Commands<go href='#card2'/></anchor></b>\n");
      printf("</p>\n");

      printf("</card>\n");


      /**** COMMANDS SCREEN (CARD 2) ****/
      printf("<card id='card2' title='Service Commands'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Service Commands</b><br/>\n");

      if(temp_servicestatus->status!=SERVICE_OK && temp_servicestatus->status!=SERVICE_RECOVERY && temp_servicestatus->status!=SERVICE_PENDING)
            printf("<b><anchor title='Acknowledge Problem'>Acknowledge Problem<go href='#card3'/></anchor></b>\n");

      if(temp_servicestatus->checks_enabled==FALSE)
            printf("<b><anchor title='Enable Checks'>Enable Checks<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,service_desc,CMD_ENABLE_SVC_CHECK,CMDMODE_COMMIT);
      else{
            printf("<b><anchor title='Disable Checks'>Disable Checks<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,service_desc,CMD_DISABLE_SVC_CHECK,CMDMODE_COMMIT);
            printf("<b><anchor title='Schedule Immediate Check'>Schedule Immediate Check<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,service_desc,CMD_IMMEDIATE_SVC_CHECK,CMDMODE_COMMIT);
              }

      if(temp_servicestatus->notifications_enabled==FALSE)
            printf("<b><anchor title='Enable Notifications'>Enable Notifications<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,service_desc,CMD_ENABLE_SVC_NOTIFICATIONS,CMDMODE_COMMIT);
      else
            printf("<b><anchor title='Disable Notifications'>Disable Notifications<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go></anchor></b><br/>\n",COMMAND_CGI,host_name,service_desc,CMD_DISABLE_SVC_NOTIFICATIONS,CMDMODE_COMMIT);

      printf("</p>\n");

      printf("</card>\n");


      /**** ACKNOWLEDGEMENT SCREEN (CARD 3) ****/
      printf("<card id='card3' title='Acknowledge Problem'>\n");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>Acknowledge Problem</b><br/>\n");
      printf("</p>\n");

      printf("<p align='center' mode='wrap'>\n");
      printf("<b>Your Name:</b><br/>\n");
      printf("<input name='name'/><br/>\n");
      printf("<b>Comment:</b><br/>\n");
      printf("<input name='comment'/>\n");

      printf("<do type='accept'>\n");
      printf("<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/><postfield name='com_author' value='$(name)'/><postfield name='com_data' value='$(comment)'/><postfield name='persistent' value=''/><postfield name='send_notification' value=''/><postfield name='cmd_typ' value='%d'/><postfield name='cmd_mod' value='%d'/><postfield name='content' value='wml'/></go>\n",COMMAND_CGI,host_name,service_desc,CMD_ACKNOWLEDGE_SVC_PROBLEM,CMDMODE_COMMIT);
      printf("</do>\n");

      printf("</p>\n");

      printf("</card>\n");

      return;
        }


/* displays ping results */
void display_ping(void){
      char input_buffer[MAX_INPUT_BUFFER];
      char buffer[MAX_INPUT_BUFFER];
      char *temp_ptr;
      FILE *fp;
      int odd=0;
      int in_macro=FALSE;

      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Ping'>\n");

      if(!strcmp(ping_address,"")){

            printf("<p align='center' mode='nowrap'>\n");
            printf("<b>Ping Host</b><br/>\n");
            printf("</p>\n");

            printf("<p align='center' mode='wrap'>\n");
            printf("<b>Host Name/Address:</b><br/>\n");
            printf("<input name='address'/>\n");
            printf("<do type='accept'>\n");
            printf("<go href='%s'><postfield name='ping' value='$(address)'/></go>\n",STATUSWML_CGI);
            printf("</do>\n");
            printf("</p>\n");
              }

      else{

            printf("<p align='center' mode='nowrap'>\n");
            printf("<b>Results For Ping Of %s:</b><br/>\n",ping_address);
            printf("</p>\n");

            printf("<p mode='nowrap'>\n");

            if(ping_syntax==NULL)
                  printf("ping_syntax in CGI config file is NULL!\n");
      
            else{

                  /* process macros in the ping syntax */
                  strcpy(buffer,"");
                  strncpy(input_buffer,ping_syntax,sizeof(input_buffer)-1);
                  input_buffer[strlen(ping_syntax)-1]='\x0';
                  for(temp_ptr=my_strtok(input_buffer,"$");temp_ptr!=NULL;temp_ptr=my_strtok(NULL,"$")){

                        if(in_macro==FALSE){
                              if(strlen(buffer)+strlen(temp_ptr)<sizeof(buffer)-1){
                                    strncat(buffer,temp_ptr,sizeof(buffer)-strlen(buffer)-1);
                                    buffer[sizeof(buffer)-1]='\x0';
                                      }
                              in_macro=TRUE;
                                }
                        else{

                              if(strlen(buffer)+strlen(temp_ptr) < sizeof(buffer)-1){

                                    if(!strcmp(temp_ptr,"HOSTADDRESS"))
                                          strncat(buffer,ping_address,sizeof(buffer)-strlen(buffer)-1);
                                      }

                              in_macro=FALSE;
                                }
                          }

                  /* run the ping command */
                  fp=popen(buffer,"r");
                  if(fp){
                        while(1){
                              fgets(buffer,sizeof(buffer)-1,fp);
                              if(feof(fp))
                                    break;

                              strip(buffer);

                              if(odd){
                                    odd=0;
                                    printf("%s<br/>\n",buffer);
                                          }
                              else{
                                    odd=1;
                                    printf("<b>%s</b><br/>\n",buffer);
                                          }
                                    }
                              }
                  else
                        printf("Error executing ping!\n");

                  pclose(fp);
                    }

            printf("</p>\n");
              }

      printf("</card>\n");

      return;
        }


/* displays traceroute results */
void display_traceroute(void){
      char buffer[MAX_INPUT_BUFFER];
      FILE *fp;
      int odd=0;

      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='Traceroute'>\n");

      if(!strcmp(traceroute_address,"")){

            printf("<p align='center' mode='nowrap'>\n");
            printf("<b>Traceroute</b><br/>\n");
            printf("</p>\n");

            printf("<p align='center' mode='wrap'>\n");
            printf("<b>Host Name/Address:</b><br/>\n");
            printf("<input name='address'/>\n");
            printf("<do type='accept'>\n");
            printf("<go href='%s'><postfield name='traceroute' value='$(address)'/></go>\n",STATUSWML_CGI);
            printf("</do>\n");
            printf("</p>\n");
              }

      else{

            printf("<p align='center' mode='nowrap'>\n");
            printf("<b>Results For Traceroute To %s:</b><br/>\n",traceroute_address);
            printf("</p>\n");

            printf("<p mode='nowrap'>\n");
      
            snprintf(buffer,sizeof(buffer)-1,"%s %s",TRACEROUTE_COMMAND,traceroute_address);
            buffer[sizeof(buffer)-1]='\x0';

            fp=popen(buffer,"r");
            if(fp){
                  while(1){
                        fgets(buffer,sizeof(buffer)-1,fp);
                        if(feof(fp))
                              break;

                        strip(buffer);

                        if(odd){
                              odd=0;
                              printf("%s<br/>\n",buffer);
                                  }
                        else{
                              odd=1;
                              printf("<b>%s</b><br/>\n",buffer);
                                  }
                           }
                      }
            else
                  printf("Error executing traceroute!\n");

            pclose(fp);

            printf("</p>\n");
              }

      printf("</card>\n");

      return;
        }



/* displays problems */
void display_problems(void){
      host *temp_host;
      service *temp_service;
      hoststatus *temp_hoststatus;
      int total_host_problems=0;
      servicestatus *temp_servicestatus;
      int total_service_problems=0;

      /**** MAIN SCREEN (CARD 1) ****/
      printf("<card id='card1' title='%s Problems'>\n",(display_type==DISPLAY_ALL_PROBLEMS)?"All":"Unhandled");
      printf("<p align='center' mode='nowrap'>\n");
      printf("<b>%s Problems</b><br/><br/>\n",(display_type==DISPLAY_ALL_PROBLEMS)?"All":"Unhandled");

      printf("<b>Host Problems:</b>\n");

      printf("<table columns='2' align='LL'>\n");

      /* check all hosts */
      for(temp_hoststatus=hoststatus_list;temp_hoststatus!=NULL;temp_hoststatus=temp_hoststatus->next){

            temp_host=find_host(temp_hoststatus->host_name,NULL);
            if(temp_host==NULL)
                  continue;

            if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
                  continue;

            if(temp_hoststatus->status==HOST_UP || temp_hoststatus->status==HOST_PENDING)
                  continue;

            if(display_type==DISPLAY_UNHANDLED_PROBLEMS){
                  if(temp_hoststatus->problem_has_been_acknowledged==TRUE)
                        continue;
                  if(temp_hoststatus->checks_enabled==FALSE)
                        continue;
                  if(temp_hoststatus->notifications_enabled==FALSE)
                        continue;
                  if(temp_hoststatus->scheduled_downtime_depth>0)
                        continue;
                    }

            total_host_problems++;

            printf("<tr><td><anchor title='%s'>",temp_host->name);
            if(temp_hoststatus->status==HOST_DOWN)
                  printf("DWN");
            else if(temp_hoststatus->status==HOST_UNREACHABLE)
                  printf("UNR");
            else
                  printf("???");
            printf("<go href='%s' method='post'><postfield name='host' value='%s'/></go></anchor></td>",STATUSWML_CGI,temp_host->name);
            printf("<td>%s</td></tr>\n",temp_host->name);
              }

      if(total_host_problems==0)
            printf("<tr><td>No problems</td></tr>\n");

      printf("</table>\n");

      printf("<br/>\n");


      printf("<b>Svc Problems:</b>\n");

      printf("<table columns='2' align='LL'>\n");

      /* check all services */
      for(temp_servicestatus=servicestatus_list;temp_servicestatus!=NULL;temp_servicestatus=temp_servicestatus->next){
            
            temp_service=find_service(temp_servicestatus->host_name,temp_servicestatus->description,NULL);
            if(temp_service==NULL)
                  continue;

            if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
                  continue;

            if(temp_servicestatus->status==SERVICE_OK || temp_servicestatus->status==SERVICE_RECOVERY || temp_servicestatus->status==SERVICE_PENDING)
                  continue;

            if(display_type==DISPLAY_UNHANDLED_PROBLEMS){
                  if(temp_servicestatus->problem_has_been_acknowledged==TRUE)
                        continue;
                  if(temp_servicestatus->checks_enabled==FALSE)
                        continue;
                  if(temp_servicestatus->notifications_enabled==FALSE)
                        continue;
                  if(temp_servicestatus->scheduled_downtime_depth>0)
                        continue;
                    }

            total_service_problems++;

            printf("<tr><td><anchor title='%s'>",temp_servicestatus->description);
            if(temp_servicestatus->status==SERVICE_CRITICAL)
                  printf("CRI");
            else if(temp_servicestatus->status==SERVICE_WARNING)
                  printf("WRN");
            else if(temp_servicestatus->status==SERVICE_UNKNOWN)
                  printf("UNK");
            else
                  printf("???");
            printf("<go href='%s' method='post'><postfield name='host' value='%s'/><postfield name='service' value='%s'/></go></anchor></td>",STATUSWML_CGI,temp_service->host_name,temp_service->description);
            printf("<td>%s/%s</td></tr>\n",temp_service->host_name,temp_service->description);
              }

      if(total_service_problems==0)
            printf("<tr><td>No problems</td></tr>\n");

      printf("</table>\n");

      printf("</p>\n");

      printf("</card>\n");

      return;
        }




Generated by  Doxygen 1.6.0   Back to index