/**************************************************************************
*
* STATUSWML.C - NetSaint Status CGI for WAP-enabled devices
*
* Copyright (c) 2001 Ethan Galstad (netsaint@netsaint.org)
* Last Modified: 11-14-2001
*
* 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 program_mode;
extern int execute_service_checks;
extern int netsaint_process_state;
#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("
Error: Could not open CGI configuration file '%s' for reading!
\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("
Error: Could not open main configuration file '%s' for reading!
\n",main_config_file);
document_footer();
return ERROR;
}
/* read all object configuration data */
result=read_all_object_configuration_data(main_config_file,READ_HOSTGROUPS|READ_CONTACTGROUPS|READ_HOSTS|READ_SERVICES);
if(result==ERROR){
printf("
Error: Could not read some or all object configuration data!
\n");
document_footer();
return ERROR;
}
/* read all status data */
result=read_all_status_data(DEFAULT_CGI_CONFIG_FILE,READ_PROGRAM_STATUS|READ_HOST_STATUS|READ_SERVICE_STATUS);
if(result==ERROR){
printf("
Error: Could not read host and service status information!
\n");
document_footer();
free_memory();
return ERROR;
}
/* get authentication information */
get_authentication_information(¤t_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(¤t_time);
printf("Cache-Control: no-store\n");
printf("Pragma: no-cache\n");
get_time_string(¤t_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("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
return;
}
void document_footer(void){
printf("\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]);
}
}
return error;
}
/* main intro screen */
void display_index(void){
/**** MAIN MENU SCREEN (CARD 1) ****/
printf("\n");
printf("
\n");
printf("\n");
return;
}
/* displays process info */
void display_process(void){
/**** MAIN SCREEN (CARD 1) ****/
printf("\n");
printf("
\n");
printf("Process Info
\n");
/* check authorization */
if(is_authorized_for_system_information(¤t_authdata)==FALSE){
printf("Error: Not authorized for process info!\n");
printf("
\n");
printf("\n");
return;
}
if(netsaint_process_state==STATE_OK)
printf("NetSaint process is running \n");
else
printf("NetSaint process may not be running \n");
if(program_mode==ACTIVE_MODE)
printf("Notifications are enabled (active mode) \n");
else
printf("Notifications are disabled (standby mode) \n");
if(execute_service_checks==TRUE)
printf("Check execution is enabled \n");
else
printf("Check execution is disabled \n");
printf(" \n");
printf("Process Commands\n");
printf("\n");
printf("\n");
/**** COMMANDS SCREEN (CARD 2) ****/
printf("\n");
printf("
\n");
printf("\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("\n");
printf("
\n");
printf(" \n");
}
if(show_all_hostgroups==FALSE)
printf("View All Hostgroups\n",STATUSWML_CGI);
printf("\n");
printf("\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("\n");
printf("
\n");
printf("\n");
printf("\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("\n");
printf("
\n");
printf("Service '%s' on host '%s' \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("Error: Could not find service!\n");
printf("
\n");
printf("\n");
return;
}
/* check authorization */
if(is_authorized_for_service(temp_service,¤t_authdata)==FALSE){
printf("Error: Not authorized for service!\n");
printf("\n");
printf("\n");
return;
}
printf("