1181 lines
45 KiB
Plaintext
1181 lines
45 KiB
Plaintext
|
#!@PERL@
|
||
|
|
||
|
# Nagios Business Process View and Nagios Business Process Analysis
|
||
|
# Copyright (C) 2003-2010 Sparda-Datenverarbeitung eG, Nuernberg, Germany
|
||
|
# Bernd Stroessreuther <berny1@users.sourceforge.net>
|
||
|
#
|
||
|
# 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; version 2 of the License.
|
||
|
#
|
||
|
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
|
||
|
#Load modules
|
||
|
use lib ('@libdir@');
|
||
|
#CGI-Modul
|
||
|
use CGI;
|
||
|
#restrict maximum size of posted data
|
||
|
$CGI::POST_MAX=5000;
|
||
|
#disallow uploads
|
||
|
$CGI::DISABLE_UPLOADS=1;
|
||
|
#log to the log of webserver
|
||
|
use CGI::Carp;
|
||
|
#require a good programming
|
||
|
use strict;
|
||
|
#cgi simple for url encoding and decoding
|
||
|
use CGI::Simple;
|
||
|
#some useful functions
|
||
|
use bsutils;
|
||
|
#functions for getting states from the ndo database
|
||
|
use ndodb;
|
||
|
#functions for parsing nagios_bp_config file
|
||
|
use nagiosBp;
|
||
|
#get installation specific parameters: path variables and so on
|
||
|
use settings;
|
||
|
#for JSON import/export
|
||
|
use JSON::XS;
|
||
|
#for debug only
|
||
|
#use Data::Dumper;
|
||
|
|
||
|
|
||
|
#some Variables
|
||
|
my $settings = getSettings();
|
||
|
# where is the cgi.cfg file located?
|
||
|
# from this we take the credentials and location of the database
|
||
|
my $nagios_bp_conf = $settings->{'NAGIOSBP_ETC'} . "/";
|
||
|
my $own_url = $ENV{"SCRIPT_NAME"};
|
||
|
my $rowcount = 0;
|
||
|
my $session_dir = $settings->{'NAGIOSBP_VAR'} . "/nagios_bp.sessions";
|
||
|
my $new_session = 0;
|
||
|
my $cgi_cfg_file = $settings->{'NAGIOS_ETC'} . "/cgi.cfg";
|
||
|
my $default_language = "de";
|
||
|
my $cgi_simple = new CGI::Simple; #Instance of CGI simple
|
||
|
my $query = new CGI; #Instance of CGI module
|
||
|
my %trafficlight_linkmap = ( "yes" => "yes", "no" => "no", "short" => "no", "only" => "yes" );
|
||
|
|
||
|
my ($in, $i, $j, $its_in, $key, @fields_state, $hardstates, $statusinfos, $rowclass, $components, $display, $display_status, @services, @aggregations, $aggregation, $host, $service, $service_for_url, $operator, $title, $prev_host, $script_out, $info_url, %dbparam, $param, $value, $dbh, $sql, $sth , $min_ok, $tmp_host, $tmp_service, $traffic_light_prio, $db_prefix, $RC, $nagios_check_cmd, $language, $languages, @defined_priorities, @used_priorities, $prio, %json, %json_data, $json_coder, @localtime, $timestamp);
|
||
|
|
||
|
|
||
|
#query parameters
|
||
|
# in this parameter you can give the name of a business process
|
||
|
# if set, print out detail view of this business process
|
||
|
my $detail = $query->param("detail");
|
||
|
# in this parameter you can give the name of a business process
|
||
|
# if set, print out tree view of this business process
|
||
|
my $tree = $query->param("tree");
|
||
|
# with this parameter you decide, if you want to display the traffic light showing infos for each prio in total
|
||
|
# my be "yes" display it together with the other view
|
||
|
# or "no" do not display
|
||
|
# or "only" display traffic light only
|
||
|
# or "short" display traffic light only without headline
|
||
|
my $trafficlight = $query->param("trafficlight");
|
||
|
# which configfile do we work on
|
||
|
my $conf = $query->param("conf");
|
||
|
# there are two modes "act" works on actual states from nagios, this one is the default
|
||
|
# "bi" is the business impact analysis and works on states set by the user
|
||
|
my $mode = $query->param("mode");
|
||
|
# sessions are only used in mode "bi"
|
||
|
my $sessionid = $query->param("sessionid");
|
||
|
# base is defined only in mode "bi" and only necessary in the beginning of a business impact analysis
|
||
|
# "act" tells to start with the actual values for each component
|
||
|
# "ok" tells to start with all components set to ok state
|
||
|
my $base = $query->param("base");
|
||
|
# set is used in mode "bi" to set a state
|
||
|
my $set = $query->param("set");
|
||
|
# to can be used with set and is a value to which the state should be set
|
||
|
my $to = $query->param("to");
|
||
|
# lang can be used if you want to use a dedicated language, not the language submitted in Accept Language Header
|
||
|
my $lang = $query->param("lang");
|
||
|
# with disprio you can tell the overview page to just display one single priority
|
||
|
my $display_prio = $query->param("disprio");
|
||
|
# decides if the output is created as html (for display directly in a browser) or json (for use in scripts, etc.)
|
||
|
# possible valuse are "html" or "json", defaults to "html"
|
||
|
my $output_format = $query->param("outformat");
|
||
|
|
||
|
|
||
|
#set defaults
|
||
|
if ($mode ne "bi") { $mode = "act" }
|
||
|
if ($trafficlight ne "yes" && $trafficlight ne "only" && $trafficlight ne "short") { $trafficlight = "no" }
|
||
|
if ($base ne "ok" && $base ne "" ) { $base = "act" }
|
||
|
if ($to ne "" && $to !~ m/^(OK|WARNING|CRITICAL|UNKNOWN)$/ ) { $to = "UNKNOWN" }
|
||
|
$set =~ s/(\/|\.\.|<|>)//g;
|
||
|
if ($sessionid !~ m/^[0-9]+\.[0-9]+$/ ) { $sessionid = "" }
|
||
|
if ($detail eq "" || $detail !~ m/^[a-zA-Z0-9_\-]+$/ ) { $detail = "none" }
|
||
|
if ($tree eq "" || $tree !~ m/^[a-zA-Z0-9_\-]+$/ ) { $tree = "none" }
|
||
|
if ($conf eq "" || $conf !~ m/^[a-zA-Z0-9_\-]+$/ ) { $conf = "nagios-bp" }
|
||
|
$nagios_bp_conf .= $conf . ".conf";
|
||
|
if ($display_prio !~ m/^[0-9]+$/ ) { $display_prio = "all" }
|
||
|
if ($output_format ne "json" ) { $output_format = "html" }
|
||
|
|
||
|
@localtime = localtime(time);
|
||
|
$localtime[0] = sprintf("%02d", $localtime[0]);
|
||
|
$localtime[1] = sprintf("%02d", $localtime[1]);
|
||
|
$localtime[2] = sprintf("%02d", $localtime[2]);
|
||
|
$localtime[3] = sprintf("%02d", $localtime[3]);
|
||
|
$localtime[4] = sprintf("%02d", ++$localtime[4]);
|
||
|
$localtime[5] += 1900;
|
||
|
$timestamp = "$localtime[5]-$localtime[4]-$localtime[3] $localtime[2]:$localtime[1]:$localtime[0]";
|
||
|
|
||
|
|
||
|
#load korrekt i18n language file
|
||
|
#print "Content-Type: text/plain\n\n";
|
||
|
if ($lang =~ m/^[a-z][a-z]$/)
|
||
|
{
|
||
|
&read_language_file($lang, $default_language);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
&read_language_file($ENV{"HTTP_ACCEPT_LANGUAGE"}, $default_language);
|
||
|
}
|
||
|
|
||
|
|
||
|
# error handling
|
||
|
# parameter conf
|
||
|
if ( ! -f $nagios_bp_conf || ! -r $nagios_bp_conf )
|
||
|
{
|
||
|
&printPageHead("html", "norefresh");
|
||
|
print "<div class=\'statusTitle\' id=\'nbp_error_head\'>" . &get_lang_string("error_wrong_parameter_conf_head") . "</div>\n";
|
||
|
print "<p id=\'nbp_error_text\'>\n";
|
||
|
print &get_lang_string("error_wrong_parameter_conf_body", $nagios_bp_conf) . "\n";
|
||
|
print "</p>\n";
|
||
|
&printPageFoot("html");
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
# check if Nagios is running
|
||
|
open (IN, "<$cgi_cfg_file") or die "unable to read Nagios CGI configfile $cgi_cfg_file\n";
|
||
|
while ($in = <IN>)
|
||
|
{
|
||
|
if ($in =~ m/\s*nagios_check_command\s*=\s*(.+)/)
|
||
|
{
|
||
|
#print "$in";
|
||
|
#print "1: $1\n";
|
||
|
$nagios_check_cmd = $1;
|
||
|
}
|
||
|
}
|
||
|
close(IN);
|
||
|
|
||
|
if ($nagios_check_cmd eq "")
|
||
|
{
|
||
|
$RC=0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
#$RC=system('/usr/local/nagios/libexec/check_nagios_with_db -e 3 -C \'/usr/local/nagios/bin/nagios -d\'');
|
||
|
$RC=system($nagios_check_cmd . ">/dev/null");
|
||
|
}
|
||
|
|
||
|
if ($RC != 0)
|
||
|
{
|
||
|
&printPageHead("html");
|
||
|
print "<p id=\'nbp_error_text\'>\n";
|
||
|
print &get_lang_string("error_nagios_not_running") . "\n";
|
||
|
print "</p>\n";
|
||
|
&printPageFoot("html");
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
#read the status data
|
||
|
if ($mode eq "act")
|
||
|
{
|
||
|
# in mode act, read from the db
|
||
|
($hardstates, $statusinfos) = &getStates();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# in mode bi it depends...
|
||
|
if ($base eq "" && $sessionid ne "")
|
||
|
{
|
||
|
# ... on a existing session take states from the peristent files
|
||
|
&loadSession($sessionid);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ($sessionid eq "")
|
||
|
{
|
||
|
# create a session id
|
||
|
$sessionid=time . ".$$";
|
||
|
$new_session=1;
|
||
|
}
|
||
|
|
||
|
# ... on a new session, we read from the db
|
||
|
($hardstates, $statusinfos) = &getStates();
|
||
|
|
||
|
# even if we start with all komponents set to ok, we take the states from the db and overwrite
|
||
|
# where necessary here, this way we get quite good statusinfos
|
||
|
if ($base eq "ok")
|
||
|
{
|
||
|
foreach $key (keys %$hardstates)
|
||
|
{
|
||
|
if ($hardstates->{$key} ne "OK")
|
||
|
{
|
||
|
$hardstates->{$key}="OK";
|
||
|
$statusinfos->{$key}=&get_lang_string("manually_set_to_ok");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# save the session
|
||
|
&saveSession($sessionid);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# process the given nagios_bp_conf file
|
||
|
|
||
|
($display, $display_status, $script_out, $info_url, $components) = &getBPs($nagios_bp_conf, $hardstates);
|
||
|
|
||
|
# look which priorities are defined
|
||
|
foreach $key (sort keys %$display)
|
||
|
{
|
||
|
$defined_priorities[$display_status->{$key}] = 1 if ($display_status->{$key} != 0);
|
||
|
}
|
||
|
|
||
|
#print "Priorities:\n";
|
||
|
#for ($i=0; $i<@defined_priorities; $i++)
|
||
|
#{
|
||
|
# if (defined $defined_priorities[$i])
|
||
|
# {
|
||
|
# print "$i\n";
|
||
|
# }
|
||
|
#}
|
||
|
|
||
|
# compute the status for a whole prio (for traffic light)
|
||
|
##print "Content-Type: text/html\n\n";
|
||
|
for ($traffic_light_prio=1; $traffic_light_prio<=@defined_priorities; $traffic_light_prio++)
|
||
|
{
|
||
|
if (defined $defined_priorities[$traffic_light_prio])
|
||
|
{
|
||
|
@fields_state = ();
|
||
|
foreach $key (sort keys %$display)
|
||
|
{
|
||
|
if ($display_status->{$key} == $traffic_light_prio)
|
||
|
{
|
||
|
#print "$traffic_light_prio: $key $display_status->{$key} $hardstates{$key}<br>\n";
|
||
|
push (@fields_state, $hardstates->{$key});
|
||
|
}
|
||
|
}
|
||
|
$hardstates->{"__prio$traffic_light_prio"} = &and(@fields_state);
|
||
|
#print "result $traffic_light_prio: " . $hardstates->{"__prio$traffic_light_prio"} . "\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
# in mode "bi" set the submitted state, if there is one
|
||
|
if ( $mode eq "bi" && $set ne "" && $to ne "" )
|
||
|
{
|
||
|
$set = $cgi_simple->url_decode($set);
|
||
|
#print "Content-Type: text/html\n\n";
|
||
|
#print "setting $set to $to<br><br>\n";
|
||
|
if ($set =~ m/;/)
|
||
|
{
|
||
|
$hardstates->{$set}=$to;
|
||
|
$statusinfos->{$set}=&get_lang_string("manually_set_to", $to);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
foreach $key (sort keys %$hardstates)
|
||
|
{
|
||
|
if ($key =~ m/^$set;/)
|
||
|
{
|
||
|
$hardstates->{$key}=$to;
|
||
|
$statusinfos->{$key}=&get_lang_string("manually_set_to", $to);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
&saveSession($sessionid);
|
||
|
}
|
||
|
|
||
|
# print out the results as an HTML page
|
||
|
if ( $mode eq "bi" && $base eq "" && $new_session == 1 )
|
||
|
{
|
||
|
# page: select starting point for business impact analysis
|
||
|
|
||
|
&printPageHead("html");
|
||
|
print " <div class=\'statusTitle\' id=\'nbp_head_bi\'>". &get_lang_string("bi_head") ."</div>\n";
|
||
|
print " <p class=\'nbp_text_small\'>" . &get_lang_string("bi_explanation") . "</p>\n";
|
||
|
print " <p class=\'nbp_sub_head\'>" . &get_lang_string("bi_start_session") . "</p>\n";
|
||
|
print " <span class=\'nbpText\'>" . &get_lang_string("bi_select_starting_point") . "</span>\n";
|
||
|
print " <form action=\"$own_url\" method=\"get\" id=\'nbp_startingpoint_form_bi\'>\n";
|
||
|
print " <input type=\"hidden\" name=\"conf\" value=\"$conf\">\n";
|
||
|
print " <input type=\"hidden\" name=\"mode\" value=\"$mode\">\n";
|
||
|
print " <input type=\"hidden\" name=\"lang\" value=\"$lang\">\n";
|
||
|
print " <input type=\"hidden\" name=\"sessionid\" value=\"$sessionid\">\n";
|
||
|
print " <input type=\"hidden\" name=\"trafficlight\" value=\"$trafficlight\">\n";
|
||
|
print " <input type=\"hidden\" name=\"disprio\" value=\"$display_prio\">\n";
|
||
|
print " <input type=\"radio\" name=\"base\" value=\"act\" checked=\"checked\"> " . &get_lang_string("bi_actual_state") . "<br>\n";
|
||
|
print " <input type=\"radio\" name=\"base\" value=\"ok\"> " . &get_lang_string("bi_all_set_to_ok") . "<br><br>\n";
|
||
|
print " <input type=\"submit\" value=\"OK\">\n";
|
||
|
print " </form>\n";
|
||
|
print " <p class=\'nbp_text_small\'>" . &get_lang_string("bi_hint_session_timeout") . "</p>\n";
|
||
|
&printPageFoot("html");
|
||
|
|
||
|
}
|
||
|
elsif ( $mode eq "bi" && $set ne "" && $to eq "")
|
||
|
{
|
||
|
# page: set new state for host/service in business impact analysis
|
||
|
|
||
|
&printPageHead("html");
|
||
|
($tmp_host, $tmp_service) = split(/;/, $set);
|
||
|
print " <div class=\'statusTitle\' id=\'nbp_head_bi\'>" . &get_lang_string("bi_head") . ": " . &get_lang_string("bi_set_status") . "</div>\n";
|
||
|
if ($tmp_service eq "")
|
||
|
{
|
||
|
print " <span class=\'nbpText\'>" . &get_lang_string("bi_set_host_status_to", $tmp_host) . "</span><br>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <span class=\'nbpText\'>" . &get_lang_string("bi_set_service_status_to", $tmp_service, $tmp_host) . "</span><br>\n";
|
||
|
}
|
||
|
print " <form action=\"$own_url\" method=\"get\" id=\'nbp_select_state_form_bi\'>\n";
|
||
|
print " <input type=\"hidden\" name=\"conf\" value=\"$conf\">\n";
|
||
|
print " <input type=\"hidden\" name=\"mode\" value=\"$mode\">\n";
|
||
|
print " <input type=\"hidden\" name=\"lang\" value=\"$lang\">\n";
|
||
|
print " <input type=\"hidden\" name=\"detail\" value=\"$detail\">\n";
|
||
|
print " <input type=\"hidden\" name=\"tree\" value=\"$tree\">\n";
|
||
|
print " <input type=\"hidden\" name=\"sessionid\" value=\"$sessionid\">\n";
|
||
|
print " <input type=\"hidden\" name=\"trafficlight\" value=\"$trafficlight\">\n";
|
||
|
print " <input type=\"hidden\" name=\"disprio\" value=\"$display_prio\">\n";
|
||
|
print " <input type=\"hidden\" name=\"set\" value=\"" . $cgi_simple->url_encode($set) . "\">\n";
|
||
|
print " <input type=\"radio\" name=\"to\" value=\"OK\" checked=\"checked\"> OK<br>\n";
|
||
|
print " <input type=\"radio\" name=\"to\" value=\"WARNING\"> WARNING<br>\n";
|
||
|
print " <input type=\"radio\" name=\"to\" value=\"CRITICAL\"> CRITICAL<br>\n";
|
||
|
print " <input type=\"radio\" name=\"to\" value=\"UNKNOWN\"> UNKNOWN<br><br>\n";
|
||
|
print " <input type=\"submit\" value=\"OK\">\n";
|
||
|
print " </form>\n";
|
||
|
&printPageFoot("html");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( $detail eq "none" )
|
||
|
{
|
||
|
if ( $tree eq "none" )
|
||
|
{
|
||
|
if ( $output_format eq "html" )
|
||
|
{
|
||
|
# Display the default view (overview page) in html
|
||
|
|
||
|
&printPageHead("html");
|
||
|
print " <div id=\'nbpTopLevelBox\'>\n";
|
||
|
|
||
|
if ( $trafficlight eq "yes" || $trafficlight eq "only" || $trafficlight eq "short")
|
||
|
{
|
||
|
# display the traffic light section
|
||
|
print " <div id=\"nbp_trafficlight_${trafficlight}_box\">\n";
|
||
|
print " <div class=\'statusTitle\' id=\'nbp_trafficlight_${trafficlight}_head\'>" . &get_lang_string("short_summary_head") . "</div>\n";
|
||
|
print " <table class=\'status\' id=\'nbp_trafficlight_${trafficlight}_table\'>\n";
|
||
|
print " <tr>\n";
|
||
|
print " <th class=\'status\'><a class=\'status\' href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&lang=$lang&trafficlight=$trafficlight_linkmap{$trafficlight}&disprio=all\">" . &get_lang_string("prio") . "</a></th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status") . "</th>\n";
|
||
|
print " </tr>\n";
|
||
|
|
||
|
for ($traffic_light_prio=1; $traffic_light_prio<=@defined_priorities; $traffic_light_prio++)
|
||
|
{
|
||
|
if (defined $defined_priorities[$traffic_light_prio])
|
||
|
{
|
||
|
if ($traffic_light_prio%2 == 0) { $rowclass = "statusEven" }
|
||
|
else { $rowclass = "statusOdd" }
|
||
|
print " <tr>\n";
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&lang=$lang&trafficlight=$trafficlight_linkmap{$trafficlight}&disprio=$traffic_light_prio\">" . &get_lang_string("prio") . " $traffic_light_prio</a></td>\n";
|
||
|
print " <td class=\'miniStatus" .$hardstates->{"__prio$traffic_light_prio"} . "\'>" .$hardstates->{"__prio$traffic_light_prio"} . "</td>\n";
|
||
|
print " </tr>\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print " </table>\n";
|
||
|
print " </div>\n";
|
||
|
}
|
||
|
|
||
|
if ( $trafficlight eq "yes" || $trafficlight eq "no" )
|
||
|
{
|
||
|
# main tree view area
|
||
|
print " <div id=\"nbp_cental_table_box_tl_${trafficlight}\">\n";
|
||
|
print " <div class=\'statusTitle\' id=\'nbp_head_${mode}\'>";
|
||
|
if ($mode eq "act")
|
||
|
{
|
||
|
print &get_lang_string("short_summary_head") . ": " . &get_lang_string("all_bp")
|
||
|
}
|
||
|
elsif ($mode eq "bi")
|
||
|
{
|
||
|
print &get_lang_string("bi_head") . ": " . &get_lang_string("all_bp")
|
||
|
}
|
||
|
if ($display_prio ne "all")
|
||
|
{
|
||
|
print " - " . &get_lang_string("priority_" . $display_prio . "_headline");
|
||
|
}
|
||
|
print "</div>\n";
|
||
|
print " <div id=\'nbp_central_element\'>\n";
|
||
|
print " <table id=\'nbp_central_table\' class=\'status\'>\n";
|
||
|
|
||
|
if ($display_prio eq "all")
|
||
|
{
|
||
|
for ($prio=1; $prio<@defined_priorities; $prio++)
|
||
|
{
|
||
|
if (defined $defined_priorities[$prio])
|
||
|
{
|
||
|
&displayPrio($prio);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (defined $defined_priorities[$display_prio])
|
||
|
{
|
||
|
&displayPrio($display_prio);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print " </table>\n";
|
||
|
|
||
|
# buttons below main tree view table: prio selection
|
||
|
print " <div id=\'nbp_button_bar\'>\n";
|
||
|
print " <span id=\'nbp_prio_selection\'>\n";
|
||
|
if ($display_prio eq "all")
|
||
|
{
|
||
|
print " <span class=\"nbp_nobr\">[" . &get_lang_string("all_prios") . "]</span>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <span class=\"nbp_nobr\"><a href=\"$own_url?conf=$conf&ode=$mode&sessionid=$sessionid&lang=$lang&trafficlight=$trafficlight&disprio=all\">[" . &get_lang_string("all_prios") . "]</a></span>\n";
|
||
|
}
|
||
|
for ($prio=1; $prio<@defined_priorities; $prio++)
|
||
|
{
|
||
|
if (defined $defined_priorities[$prio])
|
||
|
{
|
||
|
if ($display_prio == $prio)
|
||
|
{
|
||
|
print " <span class=\"nbp_nobr\">[" . &get_lang_string("prio") . " $prio]</span>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <span class=\"nbp_nobr\"><a href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&lang=$lang&trafficlight=$trafficlight&disprio=$prio\">[" . &get_lang_string("prio") . " $prio]</a></span>\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
print " </span>\n";
|
||
|
|
||
|
# buttons below main tree view table to switch traffic light on/off
|
||
|
print " <span id=\'nbp_trafficlight_switch\'>\n";
|
||
|
if ($trafficlight eq "yes")
|
||
|
{
|
||
|
print " <span class=\"nbp_nobr\"><a href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&lang=$lang&trafficlight=no&disprio=$display_prio\">[" . &get_lang_string("hide_trafficlight") . "]</a></span>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <span class=\"nbp_nobr\"><a href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&lang=$lang&trafficlight=yes&disprio=$display_prio\">[" . &get_lang_string("show_trafficlight") . "]</a></span>\n";
|
||
|
}
|
||
|
print " </span>\n";
|
||
|
print " </div>\n";
|
||
|
print " </div>\n";
|
||
|
print " </div>\n";
|
||
|
}
|
||
|
|
||
|
print " </div>\n";
|
||
|
&printPageFoot("html");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Display the default view in json
|
||
|
# (all business processes, all sub processes with all information)
|
||
|
|
||
|
&printPageHead("json");
|
||
|
|
||
|
foreach $key (sort keys %$display)
|
||
|
{
|
||
|
chomp($script_out->{$key});
|
||
|
my (%tmp_hash, @tmp_array);
|
||
|
|
||
|
if ($components->{$key} =~ m/&/) { $operator = "and" }
|
||
|
elsif ($components->{$key} =~ m/\+/) { $operator = "of" }
|
||
|
else { $operator = "or" }
|
||
|
undef $min_ok;
|
||
|
if ($operator eq "of")
|
||
|
{
|
||
|
$components->{$key} =~ m/^(\d+) *of: *(.+)/;
|
||
|
$min_ok = $1;
|
||
|
$components->{$key} = $2;
|
||
|
}
|
||
|
@services = split(/ *&|\||\+ /, $components->{$key});
|
||
|
for ($i=0; $i<@services; $i++)
|
||
|
{
|
||
|
$services[$i] = &cutOffSpaces($services[$i]);
|
||
|
|
||
|
my %tmp_hash2;
|
||
|
# print "\n";
|
||
|
|
||
|
if ( $services[$i] =~ m/;/ )
|
||
|
{
|
||
|
# this output, if it is a single service
|
||
|
($host, $service) = split(/;/, $services[$i]);
|
||
|
# print "host: $host\n";
|
||
|
# print "service: $service\n";
|
||
|
$tmp_hash2{"host"} = $host;
|
||
|
$tmp_hash2{"service"} = $service;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# this output, if it is an aggregated service
|
||
|
# print "subprocess: $services[$i]\n";
|
||
|
# print "displayname: $display->{$services[$i]}\n";
|
||
|
# print "external_info: $script_out->{$services[$i]}\n" if (defined $script_out->{$services[$i]});
|
||
|
|
||
|
$tmp_hash2{"subprocess"} = $services[$i];
|
||
|
$tmp_hash2{"display_prio"} = $display_status->{$services[$i]};
|
||
|
$tmp_hash2{"display_name"} = $display->{$services[$i]};
|
||
|
$tmp_hash2{"info_url"} = $info_url->{$services[$i]} if (defined $info_url->{$services[$i]});
|
||
|
$tmp_hash2{"external_info"} = $script_out->{$services[$i]} if (defined $script_out->{$services[$i]});
|
||
|
}
|
||
|
# print "hardstate: $hardstates->{$services[$i]}\n";
|
||
|
# print "statusinfo: $statusinfos->{$services[$i]}\n" if (defined $statusinfos->{$services[$i]});
|
||
|
|
||
|
$tmp_hash2{"hardstate"} = $hardstates->{$services[$i]};
|
||
|
$tmp_hash2{"plugin_output"} = $statusinfos->{$services[$i]} if (defined $statusinfos->{$services[$i]});
|
||
|
|
||
|
push(@tmp_array, \%tmp_hash2);
|
||
|
}
|
||
|
|
||
|
#print "bp_id: $key\n";
|
||
|
#print " display_prio: $display_status->{$key}\n";
|
||
|
#print " display_name: $display->{$key}\n";
|
||
|
#print " hardstate: $hardstates->{$key}\n";
|
||
|
#print " info_url: $info_url->{$key}\n";
|
||
|
#print " external_info: $script_out->{$key}\n";
|
||
|
#print " components: $components->{$key}\n";
|
||
|
#print " operator: $operator\n";
|
||
|
#print " min_ok: $min_ok\n\n";
|
||
|
|
||
|
$tmp_hash{"display_prio"} = $display_status->{$key};
|
||
|
#if ($display_status->{$key} != 0)
|
||
|
#{
|
||
|
# $tmp_hash{"display_prio_headline"} = &get_lang_string("priority_" . $display_status->{$key} . "_headline");
|
||
|
# $tmp_hash{"display_prio_description"} = &get_lang_string("priority_" . $display_status->{$key} . "_description");
|
||
|
#}
|
||
|
$tmp_hash{"display_name"} = $display->{$key};
|
||
|
$tmp_hash{"hardstate"} = $hardstates->{$key};
|
||
|
$tmp_hash{"info_url"} = $info_url->{$key} if (defined $info_url->{$key});
|
||
|
$tmp_hash{"external_info"} = $script_out->{$key} if (defined $script_out->{$key});
|
||
|
$tmp_hash{"components"} = \@tmp_array;
|
||
|
$tmp_hash{"operator"} = $operator;
|
||
|
$tmp_hash{"min_ok"} = $min_ok if (defined $min_ok);
|
||
|
|
||
|
$json_data{$key} = \%tmp_hash;
|
||
|
}
|
||
|
|
||
|
$json{'business_processes'} = \%json_data;
|
||
|
$json{'priority_definitions'} = getPriorityDescriptions(@defined_priorities);
|
||
|
$json{'json_created'} = $timestamp;
|
||
|
|
||
|
#print "\n\nDEBUG:\n";
|
||
|
#printHash(\%json);
|
||
|
#print "\n\nDEBUG dump:\n";
|
||
|
#print Dumper(\%json);
|
||
|
#print "\n\nDEBUG JSON:\n";
|
||
|
#print encode_json(\%json);
|
||
|
$json_coder = JSON::XS->new->ascii->pretty->allow_nonref;
|
||
|
print $json_coder->encode (\%json);
|
||
|
print "\n";
|
||
|
|
||
|
&printPageFoot("json");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Display the tree view
|
||
|
|
||
|
#print "tree: $tree\n";
|
||
|
#print "components: $components->{$tree}\n";
|
||
|
if ($components->{$tree} =~ m/&/) { $operator = "and" }
|
||
|
elsif ($components->{$tree} =~ m/\+/) { $operator = "of" }
|
||
|
else { $operator = "or" }
|
||
|
|
||
|
undef $min_ok;
|
||
|
if ($operator eq "of")
|
||
|
{
|
||
|
$components->{$tree} =~ m/^(\d+) *of: *(.+)/;
|
||
|
$min_ok = $1;
|
||
|
$components->{$tree} = $2;
|
||
|
}
|
||
|
#print "op: $operator\n";
|
||
|
@services = split(/ *&|\||\+ /, $components->{$tree});
|
||
|
|
||
|
# check if the requested business process is defined
|
||
|
if ( ! defined $display->{$tree} )
|
||
|
{
|
||
|
&printPageHead("html", "norefresh");
|
||
|
print "<div class=\'statusTitle\' id=\'nbp_error_head\'>" . &get_lang_string("error_bp_not_existing") . "</div>\n";
|
||
|
print "<p id=\'nbp_error_text\'>\n";
|
||
|
print &get_lang_string("error_bp_not_existing_body", $tree) . "\n";
|
||
|
print "</p>\n";
|
||
|
&printPageFoot("html");
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
if ( $output_format eq "html" )
|
||
|
{
|
||
|
# Display tree view in HTML (in every page below top level)
|
||
|
|
||
|
&printPageHead("html");
|
||
|
print " <div id=\"nbp_single_table_box\">\n";
|
||
|
print " <div class=\'statusTitle\'>";
|
||
|
if ($mode eq "act") { print &get_lang_string("status") . ": " . &get_lang_string("details") }
|
||
|
elsif ($mode eq "bi") { print &get_lang_string("bi_head") . ": " . &get_lang_string("details") }
|
||
|
print " " . &get_lang_string("for") . " " . $display->{$tree} . "</div>\n";
|
||
|
print " <table id=\'nbp_table_tree\' class=\'status\'>\n";
|
||
|
print " <tr>\n";
|
||
|
print " <th> </th>\n";
|
||
|
print " <th> </th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("host") . "</th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("service") . "</th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status") . "</th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status_information") . "</th>\n";
|
||
|
print " </tr>\n";
|
||
|
|
||
|
$rowcount=@services;
|
||
|
for ($i=0; $i<@services; $i++)
|
||
|
{
|
||
|
$services[$i] = &cutOffSpaces($services[$i]);
|
||
|
if ($i%2 == 0) { $rowclass = "statusEven" }
|
||
|
else { $rowclass = "statusOdd" }
|
||
|
print " <tr>\n";
|
||
|
if ($i == 0)
|
||
|
{
|
||
|
if ($operator eq "and" or $operator eq "or")
|
||
|
{
|
||
|
print " <td rowspan=\'$rowcount\'><b>$operator</b><sup>*</sup></td>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <td rowspan=\'$rowcount\'><b>min $min_ok</b><sup>*</sup></td>\n";
|
||
|
}
|
||
|
#print " <td rowspan=\"$rowcount\" bgcolor=\"black\" width=\"1\"> </td>\n";
|
||
|
print " <td rowspan=\"$rowcount\" id=\"nbp_curly_brace\"> </td>\n";
|
||
|
}
|
||
|
if ( $services[$i] =~ m/;/ )
|
||
|
{
|
||
|
# this output, if it is a single service
|
||
|
($host, $service) = split(/;/, $services[$i]);
|
||
|
$service_for_url = $service;
|
||
|
$service_for_url =~ s/ /+/;
|
||
|
if ($mode eq "act")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$settings->{'NAGIOS_CGI_URL'}/extinfo.cgi?type=1&host=$host\">$host</a></td>\n";
|
||
|
if ($service eq "Hoststatus")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$settings->{'NAGIOS_CGI_URL'}/extinfo.cgi?type=1&host=$host\">$service</a></td>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$settings->{'NAGIOS_CGI_URL'}/extinfo.cgi?type=2&host=$host&service=$service_for_url\">$service</a></td>\n";
|
||
|
}
|
||
|
}
|
||
|
elsif ($mode eq "bi")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&detail=$detail&tree=$tree&lang=$lang&trafficlight=$trafficlight&disprio=$display_prio&set=" . $cgi_simple->url_encode($host) . "\">$host</a></td>\n";
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?conf=$conf&mode=$mode&sessionid=$sessionid&detail=$detail&tree=$tree&lang=$lang&trafficlight=$trafficlight&disprio=$display_prio&set=" . $cgi_simple->url_encode("$host;$service") ."\">$service</a></td>\n";
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# this output, if it is an aggregated service
|
||
|
print " <td colspan=2 class=\'$rowclass\'><a href=\"$own_url?tree=$services[$i]&trafficlight=$trafficlight&conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&disprio=$display_prio\">$display->{$services[$i]}</a></td>\n";
|
||
|
}
|
||
|
print " <td class=\'miniStatus$hardstates->{$services[$i]}\'>$hardstates->{$services[$i]}</td>\n";
|
||
|
print " <td class=\'$rowclass\'>$statusinfos->{$services[$i]}</td>\n";
|
||
|
print " </tr>\n";
|
||
|
}
|
||
|
print " </table>\n";
|
||
|
print " <div id=\'nbp_hint\'>\n";
|
||
|
if ($operator eq "and")
|
||
|
{
|
||
|
print " <span class=\"nbp_text_small\"><sup>*</sup></span> <span class=\"nbp_text_tiny\">" . &get_lang_string("hint_and") . "</span>\n";
|
||
|
}
|
||
|
elsif ($operator eq "of")
|
||
|
{
|
||
|
print " <span class=\"nbp_text_small\"><sup>*</sup></span> <span class=\"nbp_text_tiny\">" . &get_lang_string("hint_of", $min_ok) . "</span>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <span class=\"nbp_text_small\"><sup>*</sup></span> <span class=\"nbp_text_tiny\">" . &get_lang_string("hint_or") . "</span>\n";
|
||
|
}
|
||
|
print " </div>\n";
|
||
|
print " <div id=\'nbp_button_bar\'>\n";
|
||
|
print " <span id=\'nbp_back_button\'><a href=\"$own_url?conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&trafficlight=$trafficlight&disprio=$display_prio\">[" . &get_lang_string("back_to_top") . "]</a></span>\n";
|
||
|
print " </div>\n";
|
||
|
print " </div>\n";
|
||
|
&printPageFoot("html");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Display tree view in json
|
||
|
# (only one level of hierarchy in the tree of one business process)
|
||
|
|
||
|
&printPageHead("json");
|
||
|
chomp($script_out->{$tree});
|
||
|
my @tmp_array;
|
||
|
|
||
|
# display_prio of the requested bp should be displayed in priority_definitions section of JSON output
|
||
|
$used_priorities[$display_status->{$tree}] = 1;
|
||
|
|
||
|
# print "tree: $tree\n";
|
||
|
# print "displayname: $display->{$tree}\n";
|
||
|
# print "components: $components->{$tree}\n";
|
||
|
# print "op: $operator\n";
|
||
|
# print "min_ok: $min_ok\n" if (defined $min_ok);
|
||
|
# print "external_info: $script_out->{$tree}\n" if (defined $script_out->{$tree});
|
||
|
|
||
|
$json_data{'bp_id'} = $tree;
|
||
|
$json_data{"display_prio"} = $display_status->{$tree};
|
||
|
#if ($display_status->{$tree} != 0)
|
||
|
#{
|
||
|
# $json_data{"display_prio_headline"} = &get_lang_string("priority_" . $display_status->{$tree} . "_headline");
|
||
|
# $json_data{"display_prio_description"} = &get_lang_string("priority_" . $display_status->{$tree} . "_description");
|
||
|
#}
|
||
|
$json_data{"display_name"} = $display->{$tree};
|
||
|
$json_data{"hardstate"} = $hardstates->{$tree};
|
||
|
$json_data{"info_url"} = $info_url->{$tree} if (defined $info_url->{$tree});
|
||
|
$json_data{"external_info"} = $script_out->{$tree} if (defined $script_out->{$tree});
|
||
|
$json_data{"operator"} = $operator;
|
||
|
$json_data{"min_ok"} = $min_ok if (defined $min_ok);
|
||
|
|
||
|
for ($i=0; $i<@services; $i++)
|
||
|
{
|
||
|
my %tmp_hash;
|
||
|
|
||
|
# print "\n";
|
||
|
$services[$i] = &cutOffSpaces($services[$i]);
|
||
|
if ( $services[$i] =~ m/;/ )
|
||
|
{
|
||
|
# this output, if it is a single service
|
||
|
($host, $service) = split(/;/, $services[$i]);
|
||
|
# print "host: $host\n";
|
||
|
# print "service: $service\n";
|
||
|
$tmp_hash{"host"} = $host;
|
||
|
$tmp_hash{"service"} = $service;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# this output, if it is an aggregated service
|
||
|
# print "subprocess: $services[$i]\n";
|
||
|
# print "displayname: $display->{$services[$i]}\n";
|
||
|
# print "external_info: $script_out->{$services[$i]}\n" if (defined $script_out->{$services[$i]});
|
||
|
|
||
|
$tmp_hash{"subprocess"} = $services[$i];
|
||
|
$tmp_hash{"display_prio"} = $display_status->{$services[$i]};
|
||
|
$tmp_hash{"display_name"} = $display->{$services[$i]};
|
||
|
$tmp_hash{"info_url"} = $info_url->{$services[$i]} if (defined $info_url->{$services[$i]});
|
||
|
$tmp_hash{"external_info"} = $script_out->{$services[$i]} if (defined $script_out->{$services[$i]});
|
||
|
|
||
|
# display_prio of this sub process should be displayed in priority_definitions section of JSON output
|
||
|
$used_priorities[$display_status->{$services[$i]}] = 1;
|
||
|
}
|
||
|
# print "hardstate: $hardstates->{$services[$i]}\n";
|
||
|
# print "statusinfo: $statusinfos->{$services[$i]}\n" if (defined $statusinfos->{$services[$i]});
|
||
|
|
||
|
$tmp_hash{"hardstate"} = $hardstates->{$services[$i]};
|
||
|
$tmp_hash{"plugin_output"} = $statusinfos->{$services[$i]} if (defined $statusinfos->{$services[$i]});
|
||
|
|
||
|
push(@tmp_array, \%tmp_hash);
|
||
|
}
|
||
|
|
||
|
$json_data{"components"} = \@tmp_array;
|
||
|
|
||
|
$json{'business_process'} = \%json_data;
|
||
|
$json{'priority_definitions'} = getPriorityDescriptions(@used_priorities);
|
||
|
$json{'json_created'} = $timestamp;
|
||
|
|
||
|
#print "\n\nDEBUG JSON:\n";
|
||
|
$json_coder = JSON::XS->new->ascii->pretty->allow_nonref;
|
||
|
print $json_coder->encode (\%json);
|
||
|
print "\n";
|
||
|
&printPageFoot("json");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Display detail view (plain list without hierarchy)
|
||
|
|
||
|
# check if the requested business process is defined
|
||
|
if ( ! defined $display->{$detail} )
|
||
|
{
|
||
|
&printPageHead("html", "norefresh");
|
||
|
print "<div class=\'statusTitle\' id=\'nbp_error_head\'>" . &get_lang_string("error_bp_not_existing") . "</div>\n";
|
||
|
print "<p id=\'nbp_error_text\'>\n";
|
||
|
print &get_lang_string("error_bp_not_existing_body", $detail) . "\n";
|
||
|
print "</p>\n";
|
||
|
&printPageFoot("html");
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
if ( $output_format eq "html" )
|
||
|
{
|
||
|
# Display detail view in HTML (plain list without hierarchy)
|
||
|
|
||
|
&printPageHead("html");
|
||
|
print " <div id=\"nbp_single_table_box\">\n";
|
||
|
print " <div class=\'statusTitle\'>";
|
||
|
if ($mode eq "act") { print &get_lang_string("status") . ": " . &get_lang_string("details") }
|
||
|
elsif ($mode eq "bi") { print &get_lang_string("bi_head") . ": " . &get_lang_string("details") }
|
||
|
print " " . &get_lang_string("for") . " " . $display->{$detail} . "</div>\n";
|
||
|
print " <table id=\'nbp_table_list\' class=\'status\'>\n";
|
||
|
print " <tr>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("host") . "</th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("service") . "</th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status") . "</th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status_information") . "</th>\n";
|
||
|
print " </tr>\n";
|
||
|
|
||
|
#print "Detail: $detail\n";
|
||
|
@services = sort(&listAllComponentsOf($detail, $components));
|
||
|
|
||
|
#print "<pre>\n";
|
||
|
#printArray(\@services);
|
||
|
#print "</pre>\n";
|
||
|
|
||
|
$prev_host = "";
|
||
|
for ($i=0; $i<@services; $i++)
|
||
|
{
|
||
|
#print "$services[$i] $hardstates{$services[$i]}\n";
|
||
|
($host, $service) = split(/;/, $services[$i]);
|
||
|
$service_for_url = $service;
|
||
|
$service_for_url =~ s/ /+/;
|
||
|
if ($i%2 == 0) { $rowclass = "statusEven" }
|
||
|
else { $rowclass = "statusOdd" }
|
||
|
print " <tr class=\'$rowclass\'>\n";
|
||
|
if ($prev_host eq $host)
|
||
|
{
|
||
|
print " <td class=\'status\'> </td>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ($mode eq "act")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$settings->{'NAGIOS_CGI_URL'}/extinfo.cgi?type=1&host=$host\">$host</a></td>\n";
|
||
|
}
|
||
|
elsif ($mode eq "bi")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&detail=$detail&tree=$tree&trafficlight=$trafficlight&disprio=$display_prio&set=" . $cgi_simple->url_encode($host) . "\">$host</a></td>\n";
|
||
|
}
|
||
|
}
|
||
|
$prev_host = $host;
|
||
|
if ($mode eq "act")
|
||
|
{
|
||
|
if ($service eq "Hoststatus")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$settings->{'NAGIOS_CGI_URL'}/extinfo.cgi?type=1&host=$host\">$service</a></td>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$settings->{'NAGIOS_CGI_URL'}/extinfo.cgi?type=2&host=$host&service=$service_for_url\">$service</a></td>\n";
|
||
|
}
|
||
|
}
|
||
|
elsif ($mode eq "bi")
|
||
|
{
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&detail=$detail&tree=$tree&trafficlight=$trafficlight&disprio=$display_prio&set=" . $cgi_simple->url_encode("$host;$service") . "\">$service</a></td>\n";
|
||
|
}
|
||
|
print " <td class=\'miniStatus$hardstates->{$services[$i]}\'>$hardstates->{$services[$i]}</td>\n";
|
||
|
print " <td class=\'$rowclass\'>$statusinfos->{$services[$i]}</td>\n";
|
||
|
print " </tr>\n";
|
||
|
}
|
||
|
|
||
|
print " </table>\n";
|
||
|
print " <div id=\'nbp_button_bar\'>\n";
|
||
|
print " <span id=\'nbp_back_button\'><a href=\"$own_url?conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&trafficlight=$trafficlight&disprio=$display_prio\">[" . &get_lang_string("back_to_top") . "]</a></span>\n";
|
||
|
print " </div>\n";
|
||
|
print " </div>\n";
|
||
|
&printPageFoot("html");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Display detail view in JSON (plain list without hierarchy)
|
||
|
|
||
|
&printPageHead("json");
|
||
|
my @tmp_array;
|
||
|
#print "Detail: $detail\n";
|
||
|
@services = sort(&listAllComponentsOf($detail, $components));
|
||
|
chomp($script_out->{$detail});
|
||
|
|
||
|
# printArray(\@services);
|
||
|
# print "\n\n";
|
||
|
# print "detail: $detail\n";
|
||
|
# print "displayname: $display->{$detail}\n";
|
||
|
# print "components: $components->{$detail}\n";
|
||
|
# print "external_info: $script_out->{$detail}\n" if (defined $script_out->{$detail});
|
||
|
|
||
|
# display_prio of the requested bp should be displayed in priority_definitions section of JSON output
|
||
|
$used_priorities[$display_status->{$detail}] = 1;
|
||
|
|
||
|
$json_data{'bp_id'} = $detail;
|
||
|
$json_data{"display_prio"} = $display_status->{$detail};
|
||
|
if ($display_status->{$detail} != 0)
|
||
|
{
|
||
|
$json_data{"display_prio_headline"} = &get_lang_string("priority_" . $display_status->{$detail} . "_headline");
|
||
|
$json_data{"display_prio_description"} = &get_lang_string("priority_" . $display_status->{$detail} . "_description");
|
||
|
}
|
||
|
$json_data{"display_name"} = $display->{$detail};
|
||
|
$json_data{"hardstate"} = $hardstates->{$detail};
|
||
|
$json_data{"info_url"} = $info_url->{$detail} if (defined $info_url->{$detail});
|
||
|
$json_data{"external_info"} = $script_out->{$detail} if (defined $script_out->{$detail});
|
||
|
|
||
|
for ($i=0; $i<@services; $i++)
|
||
|
{
|
||
|
my %tmp_hash;
|
||
|
|
||
|
($host, $service) = split(/;/, $services[$i]);
|
||
|
|
||
|
# print "host: $host\n";
|
||
|
# print "service: $service\n";
|
||
|
# print "hardstate: $hardstates->{$services[$i]}\n";
|
||
|
# print "statusinfo: $statusinfos->{$services[$i]}\n";
|
||
|
# print "\n";
|
||
|
|
||
|
if ( $services[$i] =~ m/;/ )
|
||
|
{
|
||
|
# this output, if it is a single service
|
||
|
($host, $service) = split(/;/, $services[$i]);
|
||
|
# print "host: $host\n";
|
||
|
# print "service: $service\n";
|
||
|
$tmp_hash{"host"} = $host;
|
||
|
$tmp_hash{"service"} = $service;
|
||
|
}
|
||
|
# print "hardstate: $hardstates->{$services[$i]}\n";
|
||
|
# print "statusinfo: $statusinfos->{$services[$i]}\n" if (defined $statusinfos->{$services[$i]});
|
||
|
|
||
|
$tmp_hash{"hardstate"} = $hardstates->{$services[$i]};
|
||
|
$tmp_hash{"plugin_output"} = $statusinfos->{$services[$i]} if (defined $statusinfos->{$services[$i]});
|
||
|
|
||
|
push(@tmp_array, \%tmp_hash);
|
||
|
}
|
||
|
|
||
|
$json_data{"components"} = \@tmp_array;
|
||
|
|
||
|
$json{'business_process'} = \%json_data;
|
||
|
$json{'priority_definitions'} = getPriorityDescriptions(@used_priorities);
|
||
|
$json{'json_created'} = $timestamp;
|
||
|
|
||
|
# print "\n\nDEBUG JSON:\n";
|
||
|
$json_coder = JSON::XS->new->ascii->pretty->allow_nonref;
|
||
|
print $json_coder->encode (\%json);
|
||
|
print "\n";
|
||
|
&printPageFoot("json");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
sub printPageHead()
|
||
|
{
|
||
|
# as first parameter "pagetype" we get the string "html" or "json"
|
||
|
# this is used to display errors in HTML even if the requested output type is JSON
|
||
|
#
|
||
|
# as second parameter give "refresh" or "norefresh"
|
||
|
# (defaults to "refresh")
|
||
|
# useful to prevent errorpages from refreshing
|
||
|
my $pagetype = shift || "html";
|
||
|
my $refresh = shift;
|
||
|
$refresh = "refresh" if ($refresh ne "norefresh");
|
||
|
|
||
|
if ($pagetype eq "html")
|
||
|
{
|
||
|
print $query->header;
|
||
|
if ( $trafficlight eq "short")
|
||
|
{
|
||
|
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' . "\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' . "\n";
|
||
|
}
|
||
|
print "<html>\n";
|
||
|
print " <head>\n";
|
||
|
print " <meta http-equiv=\"Content-type\" content=\"text/html;charset=ISO-8859-1\">\n";
|
||
|
if ($mode eq "act")
|
||
|
{
|
||
|
print " <title>" . &get_lang_string("bp_head") . "</title>\n";
|
||
|
}
|
||
|
elsif ($mode eq "bi")
|
||
|
{
|
||
|
print " <title>" . &get_lang_string("bi_head") . "</title>\n";
|
||
|
}
|
||
|
|
||
|
print " <link rel=\'stylesheet\' type=\'text/css\' href=\'$settings->{'NAGIOS_BASE_URL'}/stylesheets/status.css\'>\n";
|
||
|
print " <link rel=\'stylesheet\' type=\'text/css\' href=\'$settings->{'NAGIOSBP_HTML_URL'}/stylesheets/nagios-bp.css\'>\n";
|
||
|
print " <link rel=\'stylesheet\' type=\'text/css\' href=\'$settings->{'NAGIOSBP_HTML_URL'}/stylesheets/user.css\'>\n";
|
||
|
|
||
|
if ($mode eq "act" && $refresh eq "refresh")
|
||
|
{
|
||
|
print " <meta http-equiv=\"refresh\" content=\"60; URL=$own_url?detail=$detail&tree=$tree&lang=$lang&conf=$conf&trafficlight=$trafficlight\">\n";
|
||
|
}
|
||
|
|
||
|
if ($trafficlight eq "short")
|
||
|
{
|
||
|
print " <base target=\"main\">\n";
|
||
|
print " </head>\n";
|
||
|
print " <body class=\'status\' id=\'nbp_body_short\'>\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " </head>\n";
|
||
|
print " <body class=\'status\' id=\'nbp_body_${mode}\'>\n";
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print "Content-Type: application/json\n\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub printPageFoot()
|
||
|
{
|
||
|
# as first parameter "pagetype" we get the string "error" if an error page should be displayed
|
||
|
# this is used to display errors in HTML even if the requested output type is JSON
|
||
|
my $pagetype = shift || "html";
|
||
|
|
||
|
if ( $pagetype eq "html" )
|
||
|
{
|
||
|
if ($trafficlight ne "short")
|
||
|
{
|
||
|
$languages = &getAvaiableLanguages();
|
||
|
print " <div id=\"nbp_foot\">\n";
|
||
|
print " <div id=\'nbp_foot_version\'>\n";
|
||
|
print " " . &get_lang_string("last_updated") . ": $timestamp<br>\n";
|
||
|
print " Nagios Business Process AddOn, " . &get_lang_string("version") . " " . &getVersion . "\n";
|
||
|
print " </div>\n";
|
||
|
print " <div id=\'nbp_foot_language\'>\n";
|
||
|
print " " . &get_lang_string("language") . ":\n";
|
||
|
foreach $i (@$languages)
|
||
|
{
|
||
|
print " <a href=\"$own_url?detail=$detail&tree=$tree&lang=$i&conf=$conf&mode=$mode&trafficlight=$trafficlight&disprio=$display_prio";
|
||
|
# special handling for startpage BI
|
||
|
if ( $new_session != 1)
|
||
|
{
|
||
|
print "&sessionid=$sessionid";
|
||
|
}
|
||
|
print "\">$i</a>\n";
|
||
|
}
|
||
|
print " </div>\n";
|
||
|
print " </div>\n";
|
||
|
}
|
||
|
print " </body>\n";
|
||
|
print "</html>\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub displayPrio()
|
||
|
{
|
||
|
my $prio = shift;
|
||
|
|
||
|
print " <tr>\n";
|
||
|
print " <td colspan=\"5\" class=\'statusTitle\'>" . &get_lang_string("priority_" . $prio . "_headline") . "</td>\n";
|
||
|
print " </tr>\n";
|
||
|
print " <tr>\n";
|
||
|
print " <td colspan=\"5\" class=\"nbp_description\">" . &get_lang_string("priority_" . $prio . "_description") . "</td>\n";
|
||
|
print " </tr>\n";
|
||
|
print " <tr>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("business_process") . "</th>\n";
|
||
|
print " <th class=\'status\'> </th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status") . "</th>\n";
|
||
|
print " <th class=\'status\'> </th>\n";
|
||
|
print " <th class=\'status\'>" . &get_lang_string("status_information") . "</th>\n";
|
||
|
print " </tr>\n";
|
||
|
|
||
|
foreach $key (sort keys %$display)
|
||
|
{
|
||
|
if ($display_status->{$key} == $prio)
|
||
|
{
|
||
|
#print "$key $display->{$key}\n";
|
||
|
$rowcount = ($rowcount + 1)%2;
|
||
|
if ($rowcount == 0) { $rowclass = "statusEven" }
|
||
|
else { $rowclass = "statusOdd" }
|
||
|
print " <tr class=\'$rowclass\'>\n";
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?detail=$key&conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&trafficlight=$trafficlight&disprio=$display_prio\">$display->{$key}</a></td>\n";
|
||
|
print " <td class=\'$rowclass\'><a href=\"$own_url?tree=$key&conf=$conf&mode=$mode&lang=$lang&sessionid=$sessionid&trafficlight=$trafficlight&disprio=$display_prio\"><img class=\"nbp_no_border\" src=\"$settings->{'NAGIOSBP_HTML_URL'}/tree.gif\" height=\"20\" alt=\"" . &get_lang_string("tree_view") . "\" title=\"" . &get_lang_string("tree_view") . "\"></a></td>\n";
|
||
|
print " <td class=\'miniStatus$hardstates->{$key}\'>$hardstates->{$key}</td>\n";
|
||
|
print " <td class=\'$rowclass\'>";
|
||
|
if ($info_url->{$key} ne "")
|
||
|
{
|
||
|
print "<a href=\"$info_url->{$key}\"><img class=\"nbp_no_border\" src=\"$settings->{'NAGIOSBP_HTML_URL'}/info4.gif\" alt=\"" . &get_lang_string("info") . "\" title=\"" . &get_lang_string("info") . "\"></a>";
|
||
|
}
|
||
|
print "</td>\n";
|
||
|
print " <td class=\'$rowclass\'>$script_out->{$key}</td>\n";
|
||
|
print " </tr>\n";
|
||
|
}
|
||
|
}
|
||
|
print " <tr>\n";
|
||
|
print " <td class=\"nbp_central_table_spacer\" colspan=\"5\"></td>\n";
|
||
|
print " </tr>\n";
|
||
|
}
|
||
|
|
||
|
sub loadSession()
|
||
|
{
|
||
|
my $session_file = shift;
|
||
|
$session_file = "$session_dir/$session_file";
|
||
|
|
||
|
if ( ! -f $session_file )
|
||
|
{
|
||
|
&printPageHead("html");
|
||
|
print "<div class=\'statusTitle\' id=\'nbp_error_head\'>" . &get_lang_string("error_not_existing_session_head") . "</div>\n";
|
||
|
print "<p id=\'nbp_error_text\'>\n";
|
||
|
print " " . &get_lang_string("error_not_existing_session_body") . "\n";
|
||
|
print "</p>\n";
|
||
|
print "<div id=\'nbp_button_bar\'>\n";
|
||
|
print " <a href=\"$own_url?conf=$conf&mode=$mode&lang=$lang&trafficlight=$trafficlight&disprio=$display_prio\">[" . &get_lang_string("bi_start_session") . "]</a>\n";
|
||
|
print "</div>\n";
|
||
|
&printPageFoot();
|
||
|
}
|
||
|
|
||
|
open(IN, "<$session_file") or die "unable to read session information from $session_file\n";
|
||
|
while ($in = <IN>)
|
||
|
{
|
||
|
chomp($in);
|
||
|
$in =~ m/^([a-z]+):([^=]+)=(.+)/;
|
||
|
#print "$1 xxx $2 xxx $3 <br>\n";
|
||
|
if ($1 eq "hardstates") { $hardstates->{$2} = $3 };
|
||
|
if ($1 eq "statusinfos") { $statusinfos->{$2} = $3 };
|
||
|
}
|
||
|
close(IN);
|
||
|
}
|
||
|
|
||
|
sub saveSession()
|
||
|
{
|
||
|
my $session_file = shift;
|
||
|
$session_file = "$session_dir/$session_file";
|
||
|
|
||
|
open(OUT, ">$session_file") or die "unable to persist session to $session_file\n";
|
||
|
foreach $key (keys %$hardstates)
|
||
|
{
|
||
|
print OUT "hardstates:$key=$hardstates->{$key}\n";
|
||
|
print OUT "statusinfos:$key=$statusinfos->{$key}\n";
|
||
|
}
|
||
|
close(OUT);
|
||
|
}
|
||
|
|
||
|
sub getPriorityDescriptions()
|
||
|
{
|
||
|
my @requested_prios = @_;
|
||
|
my %prio_def;
|
||
|
|
||
|
for ($prio=1; $prio<=@requested_prios; $prio++)
|
||
|
{
|
||
|
my %tmp_hash;
|
||
|
if (defined $requested_prios[$prio])
|
||
|
{
|
||
|
$tmp_hash{"display_prio_headline"} = &get_lang_string("priority_${prio}_headline");
|
||
|
$tmp_hash{"display_prio_description"} = &get_lang_string("priority_${prio}_description");
|
||
|
$prio_def{$prio} = \%tmp_hash;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(\%prio_def);
|
||
|
}
|