#!/usr/bin/perl -- # MonArch - Groundwork Monitor Architect # monarch.cgi # ############################################################################ # Release 2.5 # 7-Apr-2008 ############################################################################ # Author: Scott Parris # # Copyright 2007, 2008 GroundWork Open Source, Inc. (GroundWork) # All rights reserved. This program is free software; you can redistribute # it and/or modify it under the terms of the GNU General Public License # version 2 as published by the Free Software Foundation. # # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # use lib qq(/var/www/monarch/lib); use strict; use CGI; use MonarchForms; use MonarchStorProc; use MonarchDoc; use URI::Escape; $|++; # ############################################################################ # Global Declarations # my $debug = undef; my $query = new CGI; my $top_menu = $query->param('top_menu'); my $view = $query->param('view'); my $user_acct = $query->param('user_acct'); my $session_id = $query->param('CGISESSID'); unless ($session_id) { $session_id = $query->cookie("CGISESSID") } my $cgi_exe = 'monarch_ez.cgi'; my (%auth_add, %auth_modify, %auth_delete, %properties, %authentication, %hidden, %defaults, %profile) = (); my ($nagios_ver, $nagios_bin, $nagios_etc, $monarch_home, $backup_dir, $is_portal, $upload_dir) = undef; my $page_title = 'Monarch EZ'; my $monarch_ver = '1.0 Beta'; my $userid = undef; my $refresh_url = undef; my $body = undef; my @errors = (); my $tab = 1; $hidden{'top_menu'} = $top_menu; $hidden{'view'} = $view; $hidden{'user_acct'} = $user_acct; $hidden{'nocache'} = time; # Some buttons my %add = ('name' => 'add', 'value' => 'Add'); my %save = ('name' => 'save', 'value' => 'Save'); my %delete = ('name' => 'delete', 'value' => 'Delete'); my %select = ('name' => 'select', 'value' => 'Select'); my %cancel = ('name' => 'cancel', 'value' => 'Cancel'); my %close = ('name' => 'close','value' => 'Close'); my %next = ('name' => 'next', 'value' => 'Next >>'); my %back = ('name' => 'back', 'value' => '<< Back'); my %continue = ('name' => 'continue', 'value' => 'Continue'); my %rename = ('name' => 'rename', 'value' => 'Rename'); my %yes = ('name' => 'yes','value' => 'Yes'); my %no = ('name' => 'no','value' => 'No'); my %apply = ('name' => 'apply','value' => 'Apply'); my %upload = ('name' => 'upload', 'value' => 'Upload'); my %refresh = ('name' => 'refresh', 'value' => 'Refresh'); my %select = ('name' => 'select', 'value' => 'Select'); my %discard = ('name' => 'discard', 'value' => 'Discard'); my %textsize = (); $textsize{'short'} = 50; $textsize{'long'} = 75; $textsize{'address'} = 17; sub error_out($) { my $err = shift; $body .= "

$err


"; } sub notifications() { my $notify = $query->param('notification'); if ($notify) { my %val = ('value' => 1); if ($notify eq 'off') { $val{'value'} = 0 } my $result = StorProc->update_obj('setup','name','enable_notifications',\%val); if ($result =~ /^Error/) { push @errors, $result } } else { $notify = 'off'; my %notify = StorProc->fetch_one('setup','name','enable_notifications'); if ($notify{'value'}) { $notify = 'on' } } my $page = Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top("Enable Notifications",'','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } my @ops = ('on','off'); $page .= Forms->list_box_submit('Notifications:','notification',\@ops,$notify); $hidden{'update_main'} = 1; $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%close); return $page; } sub apply_profile($) { my $hosts_ref = $_[0]; my @hosts = @{$hosts_ref}; my $apply_services = $query->param('apply_services'); my %where = ('hostprofile_id' => $profile{'hostprofile_id'}); my @profiles = StorProc->fetch_list_where('profile_host_profile_service','serviceprofile_id',\%where); foreach my $hid (@hosts) { my $result = StorProc->delete_all('host_parent','host_id',$hid); if ($result =~ /^Error/) { push @errors, $result } my %w = ('hostprofile_id' => $profile{'hostprofile_id'}); my @parents = StorProc->fetch_list_where('profile_parent','host_id',\%w); foreach my $pid (@parents) { my @vals = ($hid,$pid); my $result = StorProc->insert_obj('host_parent',\@vals); if ($result =~ /^Error/) { push @errors, $result } } unless ($query->param('hostgroups')) { if ($profile{'apply_hostgroups'}) { my $result = StorProc->delete_all('hostgroup_host','host_id',$hid); if ($result =~ /^Error/) { push @errors, $result } my %w = ('hostprofile_id' => $profile{'hostprofile_id'}); my @hostgroups = StorProc->fetch_list_where('profile_hostgroup','hostgroup_id',\%w); foreach my $hgid (@hostgroups) { my @vals = ($hgid,$hid); my $result = StorProc->insert_obj('hostgroup_host',\@vals); if ($result =~ /^Error/) { push @errors, $result } } } } my %w = ('host_id' => $hid); my $result = StorProc->delete_one_where('contactgroup_host',\%w); if ($result =~ /^Error/) { push @errors, $result } %w = ('hostprofile_id' => $profile{'hostprofile_id'}); my @contactgroups = StorProc->fetch_list_where('contactgroup_host_profile','contactgroup_id',\%w); foreach my $cgid (@contactgroups) { my @vals = ($cgid,$hid); my $result = StorProc->insert_obj('contactgroup_host',\@vals); if ($result =~ /^Error/) { push @errors, $result } } my $result = StorProc->delete_all('serviceprofile_host','host_id',$hid); if ($result =~ /^Error/) { push @errors, $result } foreach my $spid (@profiles) { my %w = ('host_id' => $hid,'serviceprofile_id' => $spid); my %p = StorProc->fetch_one_where('serviceprofile_host',\%w); unless ($p{'host_id'}) { my @vals = ($spid,$hid); my $result = StorProc->insert_obj('serviceprofile_host',\@vals); if ($result =~ /^Error/) { push @errors, $result } } } } if ($profile{'apply_escalations'}) { my %vals = ('host_escalation_id' => $profile{'host_escalation_id'}); my $result = StorProc->update_obj('hosts','hostprofile_id',$profile{'hostprofile_id'},\%vals); if ($result =~ /^Error/) { push @errors, $result } %vals = ('service_escalation_id' => $profile{'service_escalation_id'}); $result = StorProc->update_obj('hosts','hostprofile_id',$profile{'hostprofile_id'},\%vals); if ($result =~ /^Error/) { push @errors, $result } } my %vals = ('hosttemplate_id' => $profile{'host_template_id'}); my $result = StorProc->update_obj('hosts','hostprofile_id',$profile{'hostprofile_id'},\%vals); if ($result =~ /^Error/) { push @errors, $result } my @errs = StorProc->host_profile_apply($profile{'hostprofile_id'},\@hosts); if (@errs) { push (@errors,@errs) } my %vals = ('hostextinfo_id' => $profile{'host_extinfo_id'}); my $result = StorProc->update_obj('hosts','hostprofile_id',$profile{'hostprofile_id'},\%vals); if ($result =~ /^Error/) { push @errors, $result } my ($cnt, $err) = StorProc->service_profile_apply(\@profiles,'replace',\@hosts); if ($err) { push (@errors, @{$err}) } my %w = ('hostprofile_id' => $profile{'hostprofile_id'}); my @hosts = StorProc->fetch_list_where('hosts','host_id',\%w); my @externals = StorProc->fetch_list_where('external_host_profile','external_id',\%w); foreach my $hid (@hosts) { my $result = StorProc->delete_all('external_host','host_id',$hid); if ($result =~ /^Error/) { push @errors, $result } foreach my $ext (@externals) { my %e = StorProc->fetch_one('externals','external_id',$ext); my @vals = ($ext,$hid,$e{'display'}); $result = StorProc->insert_obj('external_host',\@vals); if ($result =~ /^Error/) { push @errors, $result } } } } # ################################################## # Search # sub search() { my $detail = Forms->header($page_title,$session_id,$view); $detail .= Forms->form_top('Search Hosts','','1'); $detail .= Forms->search($session_id,'ez'); $hidden{'update_main'} = '1'; $hidden{'view'} = 'search'; $detail .= Forms->hidden(\%hidden); $detail .= Forms->form_bottom_buttons(); use CGI::Ajax; my $url = Forms->get_ajax_url(); my $pjx = new CGI::Ajax( 'get_hosts' => $url ); $pjx->js_encode_function('escape'); return $pjx->build_html($query,$detail); } # ################################################## # Hosts # sub hosts() { my $page = undef; my $name = $query->param('name'); $name =~ s/^\s+|\s+$//; my $alias = $query->param('alias'); my $address = $query->param('address'); my @hostgroups = $query->param('hostgroups'); my $profile = $query->param('host_profile'); my $required = undef; my $got_form = 0; $hidden{'view'} = $view; $hidden{'update_main'} = 1; unless ($profile) { $profile = $defaults{'profile'} } my %host = StorProc->fetch_one('hosts','name',$name); %profile = StorProc->fetch_one('profiles_host','name',$profile); if ($query->param('add')) { if ($name && $alias && $address) { if ($host{'name'}) { push @errors, "Host $name already exixts"; } else { my @values = ('',$name,$alias,$address,'',$profile{'host_template_id'},'',$profile{'hostprofile_id'},'','','',''); my $id = StorProc->insert_obj_id('hosts',\@values,'host_id'); if ($id =~ /error/i) { push @errors, $id; } else { my %hostgroup_name = StorProc->get_table_objects('hostgroups'); foreach my $hostgroup (@hostgroups) { my @vals = ($hostgroup_name{$hostgroup},$id); my $result = StorProc->insert_obj('hostgroup_host',\@vals); if ($result =~ /error/i) { push @errors, $result } } } my @hosts = ($id); apply_profile(\@hosts); unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Host','','1'); my @message = ("$name."); $page .= Forms->form_message('Added:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } } else { $required = 1; push @errors, "Missing required fields."; } } elsif ($query->param('save')) { if ($alias && $address) { my %values = ('alias' => $alias,'address' => $address,'hostprofile_id' => $profile{'hostprofile_id'}); my $result = StorProc->update_obj('hosts','name',$name,\%values); if ($result =~ /error/i) { push @errors, $result; } else { my $result = StorProc->delete_all('hostgroup_host','hostgroup_id',$host{'hostgroup_id'}); if ($result =~ /error/i) { push @errors, $result; } else { my $result = StorProc->delete_all('hostgroup_host','host_id',$host{'host_id'}); foreach my $hostgroup (@hostgroups) { my %h = StorProc->fetch_one('hostgroups','name',$hostgroup); my @vals = ($h{'hostgroup_id'},$host{'host_id'}); my $result = StorProc->insert_obj('hostgroup_host',\@vals); if ($result =~ /error/i) { push @errors, $result } } my @hosts = ($host{'host_id'}); apply_profile(\@hosts); unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Host'); my @message = ("$name."); $page .= Forms->form_message('Saved:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } } } else { $required = 1; push @errors, "Missing required fields."; } } elsif ($query->param('delete')) { $hidden{'delete'} = 1; $hidden{'name'} = $name; if ($query->param('yes')) { my $result = StorProc->delete_all('hosts','name',$name); if ($result =~ /error/i) { push @errors, $result; delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,$view,'','1','1'); $page .= Forms->form_top('Host','','1'); my @message = ("$name."); $page .= Forms->form_message('Removed:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } elsif ($query->param('no')) { delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Host'); my $message = "Are you sure you want to remove host $name?"; $page .= Forms->form_doc($message); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%yes,\%no,$tab++); $got_form = 1; } } unless ($got_form) { my @props = ('alias','members'); my %docs = Doc->ez_host(); my %notify = StorProc->fetch_one('setup','name','enable_notifications'); $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Host",'onsubmit="selIt();"','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } if ($query->param('new')) { $page .= Forms->text_box('Name:','name',$name,$textsize{'alias'},$required,$docs{'name'},'',''); $hidden{'new'} = 1; } else { $page .= Forms->display_hidden('Name:','name',$host{'name'}); } unless ($alias) { $alias = $host{'alias'} } $page .= Forms->text_box('Alias (long name):','alias',$alias,$textsize{'long'},$required,$docs{'alias'},'',''); unless ($address) { $address = $host{'address'} } $page .= Forms->text_box('Address:','address',$address,$textsize{'address'},$required,$docs{'address'},'',''); $page .= Forms->wizard_doc('Host Groups',$docs{'hostgroups'}); unless (@hostgroups) { @hostgroups = StorProc->get_hostgroup_host($name); } my @nonmembers = StorProc->fetch_list('hostgroups','name'); $page .= Forms->members('Host groups:','hostgroups',\@hostgroups,\@nonmembers,'','',$docs{'hostgroups'}); my %profiles = StorProc->get_table_objects('profiles_host'); my @profiles = (); foreach my $p (sort { lc($a) cmp lc($b) } keys %profiles) { push @profiles, $p; } unless ($profile) { my %p = StorProc->fetch_one('profiles_host','hostprofile_id',$host{'hostprofile_id'}); $profile = $p{'name'}; } my %profiles_detail = StorProc->get_profiles(); $page .= Forms->form_profiles($defaults{'host_profile'},$profile,\@profiles,\%profiles_detail,$docs{'profile'}); $page .= Forms->hidden(\%hidden); if ($query->param('new')) { $page .= Forms->form_bottom_buttons(\%add,\%cancel); } else { $page .= Forms->form_bottom_buttons(\%save,\%delete,\%cancel); } } return $page; } # ################################################## # Import # sub import() { my $page = undef; my $step = $query->param('step'); my $file = $query->param('file'); $hidden{'view'} = $view; $hidden{'update_main'} = 1; if ($query->param('back')) { if ($step eq 'schema') { $step = 'upload'; unlink $file; } elsif ($step eq 'process') { $step = 'schema'; } } elsif ($query->param('next')) { if ($step eq 'upload') { $file = StorProc->upload($upload_dir,$file); if ($file =~ /Error/) { push @errors, $file; } else { $step = 'schema'; } } elsif ($step eq 'schema') { $step = 'process'; } } $hidden{'file'} = $file; $hidden{'step'} = $step; my %doc = Doc->import_wizard(); if ($step eq 'schema') { $page .= Forms->header($page_title,$session_id,$view); my $field_sep = $query->param('field_sep'); my $delimiter = $query->param('delimiter'); my $other_delimiter = $query->param('other_delimiter'); if ($other_delimiter) { $delimiter = $other_delimiter } $page .= Forms->form_top('Import Host Wizard','','1'); my %file_data = StorProc->parse_file($file,$delimiter); if ($file_data{'error'}) { push @errors, $file_data{'error'} } if (@errors) { $page .= Forms->form_errors(\@errors) } my @values = split(/$delimiter/, $file_data{'line_1'}); if ($delimiter eq 'tab') { @values = split(/\t/, $file_data{'line_1'}) } my @delimiters = (',','tab',':',';'); $page .= Forms->wizard_doc($doc{'step_2_title'},$doc{'step_2'}); $page .= Forms->list_box('File delimiter:','delimiter',\@delimiters,$delimiter); $page .= Forms->text_box('Other file delimiter:','other_delimiter',$other_delimiter,'2'); $page .= Forms->display_hidden('Line 1:','',$file_data{'line_1'}); my $i = 0; my @columns = ('name','address','alias','os','profile','other'); foreach my $val (@values) { $page .= Forms->list_box("$val:","field_$i",\@columns,"$columns[$i]"); $i++; } $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%back,\%next,\%refresh,\%cancel); } elsif ($step eq 'process') { my $delimiter = $query->param('delimiter'); my $profile = $query->param('host_profile'); $hidden{'process_set'} = 1; my ($sort, $ascdesc) = undef; foreach my $s ($query->param) { if ($s =~ /^sort_(\S+)_(\S+)/) { $sort = $1; $ascdesc = $2; } } if ($sort eq 'name') { $sort = 0 } my $other_delimiter = $query->param('other_delimiter'); if ($other_delimiter) { $delimiter = $other_delimiter } $hidden{'delimiter'} = $delimiter; my @unsorted_hosts = process_hosts(); my %fields = (); foreach my $field ($query->param) { if ($field =~ /field_(\d+)/) { my $value = $query->param($field); $fields{$value} = $1; $hidden{$field} = $value; } } my $field_sep = $query->param('field_sep'); my %file_data = StorProc->parse_file($file,$delimiter,$fields{'name'}); delete $file_data{'line_1'}; unless (@unsorted_hosts || $query->param('process_set')) { foreach my $host (keys %file_data) { my @values = split(/$delimiter/, $file_data{$host}); if ($delimiter eq 'tab') { @values = split(/\t/, $file_data{$host}) } push @unsorted_hosts, $values[$fields{'name'}]; } } if ($file_data{'error'}) { push @errors, $file_data{'error'} } my %exists = StorProc->get_table_objects('hosts'); my %profiles = StorProc->get_table_objects('profiles_host'); $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Import Host Wizard','','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } $page .= Forms->wizard_doc($doc{'step_3_title'},$doc{'step_3'}); $page .= Forms->form_process_hosts(\@unsorted_hosts,\%file_data,$delimiter,\%fields,\%exists,\%profiles,$defaults{'host_profile'},$sort,$ascdesc); my @profiles = (); foreach my $p (sort { lc($a) cmp lc($b) } keys %profiles) { push @profiles, $p; } unless ($profile) { $profile = $defaults{'host_profile'} } my %profiles_detail = StorProc->get_profiles(); $page .= Forms->form_profiles($defaults{'host_profile'},$profile,\@profiles,\%profiles_detail,$doc{'profile'}); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%back,\%add,\%discard,\%close); } else { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top_file('Import Host Wizard','','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } my @delimiters = (',','tab',':',';'); $page .= Forms->wizard_doc($doc{'step_1_title'},$doc{'step_1'}); $page .= Forms->list_box('File delimiter:','delimiter',\@delimiters,','); $page .= Forms->text_box('Other file delimiter:','other_delimiter','','2'); $page .= Forms->form_file(); $hidden{'step'} = 'upload'; $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%next,\%cancel); } return $page; } # ################################################## # Process hosts # sub process_hosts() { my %hosts = (); my @unsorted_hosts = (); my @unprocessed_hosts = $query->param('host'); my @checked_hosts = $query->param('host_checked'); foreach my $host (@checked_hosts) { $hosts{$host} = 1; } if ($query->param('add')) { my %exists = StorProc->get_table_objects('hosts'); my @hosts = (); foreach my $host (@checked_hosts) { my $got_host = 0; $host =~ s/^\s+|\s+$//; foreach my $hname (keys %exists) { if ($hname =~ /^$host$/i) { push @hosts, $exists{$hname}; $got_host = 1; } } unless ($got_host) { my $profile = $query->param("profile_$host"); if ($profile =~ /---/) { $profile = $query->param('host_profile') } %profile = StorProc->fetch_one('profiles_host','name',$profile); my $alias = $query->param("alias_$host"); my $address = $query->param("address_$host"); my $os = $query->param("os_$host"); my @values = ('',$host,$alias,$address,$os,$profile{'host_template_id'},'',$profile{'hostprofile_id'},'','','',''); my $id = StorProc->insert_obj_id('hosts',\@values,'host_id'); if ($id =~ /error/) { push @errors, $id} push @hosts, $id; } } apply_profile(\@hosts); } foreach my $host (@unprocessed_hosts) { if ($query->param('discard') || $query->param('add')) { unless ($hosts{$host}) { push @unsorted_hosts, $host } } else { push @unsorted_hosts, $host; } } return @unsorted_hosts; } # ################################################## # Discover # sub discover() { my $page = undef; my $step = $query->param('step'); my $file = $query->param('file'); $hidden{'view'} = $view; $hidden{'update_main'} = 1; my $oct1 = $query->param('oct1'); my $oct2 = $query->param('oct2'); my $oct3 = $query->param('oct3'); my $oct4 = $query->param('oct4'); my $oct5 = $query->param('oct5'); $hidden{'oct1'} = $oct1; $hidden{'oct2'} = $oct2; $hidden{'oct3'} = $oct3; $hidden{'oct4'} = $oct4; $hidden{'oct5'} = $oct5; my @addresses = (); my $elements = 0; if ($query->param('back')) { if ($step eq 'get_hosts') { $step = ''; unlink $file; } elsif ($step eq 'process') { $step = ''; } } elsif ($query->param('next')) { if ($step eq 'subnet') { if ($oct1 =~ /\d+/ && $oct2 =~ /\d+/ && $oct3 =~ /\d+/ && $oct4 =~ /\d+|\*/) { my $valid_oct = 1; unless ($oct1 <= 255) { $valid_oct = 0 } unless ($oct2 <= 255) { $valid_oct = 0 } unless ($oct3 <= 255) { $valid_oct = 0 } if ($oct5 > 0) { unless ($oct4 <= 255) { $valid_oct = 0 } unless ($oct5 <= 255) { $valid_oct = 0 } if ($valid_oct) { if ($oct4 < $oct5) { for (my $i = $oct4;$i <= $oct5;$i++) { push @addresses, "$oct1.$oct2.$oct3.$i"; $elements++; $step = 'get_hosts'; } } else { push @errors, "Invalid address range."; } } else { push @errors, "Invalid address $oct1.$oct2.$oct3.- valid octet ranges 0-255"; } } else { if ($valid_oct) { if ($oct4 eq '*') { for (my $i = 1;$i < 255;$i++) { push @addresses, "$oct1.$oct2.$oct3.$i"; $elements++; $step = 'get_hosts'; } } elsif ($oct4) { if ($oct4 > 0 && $oct4 < 255) { push @addresses, "$oct1.$oct2.$oct3.$oct4"; $elements++; $step = 'get_hosts'; } else { push @errors, "Invalid address $oct1.$oct2.$oct3.$oct4 valid octet ranges 0-255. Valid range for last octet 1-254."; } } } else { push @errors, "Invalid address $oct1.$oct2.$oct3.- valid octet ranges 0-255"; } } my $now = time; $file = "monarch_discover_$now.tmp"; $hidden{'file'} = $file; } else { push @errors, "Missing or invalid address $oct1.$oct2.$oct3.$oct4 - valid octet ranges 0-255"; } } elsif ($step eq 'get_hosts') { $step = 'process'; } } $hidden{'file'} = $file; $hidden{'step'} = $step; my %doc = Doc->discover_wizard(); if ($step eq 'get_hosts') { my $now = time; $file = "$upload_dir/monarch_import_$now.tmp"; $page .= Forms->header($page_title,$session_id,$view,'','','1','1'); use CGI::Ajax; my $url = Forms->get_scan_url(); my $pjx = new CGI::Ajax( 'get_host' => $url ); $page .= Forms->form_top('Discover Host Wizard','','1'); $page .= Forms->wizard_doc($doc{'step_2_title'},$doc{'step_2'}); $page .= Forms->scan(\@addresses,$elements,$file,$monarch_home); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%back,\%next,\%cancel); $page = $pjx->build_html($query,$page); } elsif ($step eq 'process') { my $profile = $query->param('host_profile'); $hidden{'process_set'} = 1; my ($sort, $ascdesc) = undef; foreach my $s ($query->param) { if ($s =~ /^sort_(\S+)_(\S+)/) { $sort = $1; $ascdesc = $2; } } if ($sort eq 'name') { $sort = 0 } my @unsorted_hosts = process_hosts(); my %fields = (); $fields{'name'} = '0'; $fields{'alias'} = '1'; $fields{'address'} = '2'; $fields{'os'} = '3'; $fields{'profile'} = '4'; $fields{'other'} = '5'; my %file_data = StorProc->parse_file($file,',','0'); delete $file_data{'line_1'}; unless (@unsorted_hosts || $query->param('process_set')) { foreach my $host (keys %file_data) { my @values = split(/,/, $file_data{$host}); push @unsorted_hosts, $values[$fields{'name'}]; } } if ($file_data{'error'}) { push @errors, $file_data{'error'} } my %exists = StorProc->get_table_objects('hosts'); my %profiles = StorProc->get_table_objects('profiles_host'); my $cookie = $query->cookie(CGISESSID => $session_id); print $query->header( -cookie=>$cookie ); $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Discover Host Wizard','','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } $page .= Forms->wizard_doc($doc{'step_3_title'},$doc{'step_3'}); $page .= Forms->form_process_hosts(\@unsorted_hosts,\%file_data,',',\%fields,\%exists,\%profiles,$defaults{'host_profile'},$sort,$ascdesc); my @profiles = (); foreach my $p (sort { lc($a) cmp lc($b) } keys %profiles) { push @profiles, $p; } unless ($profile) { $profile = $defaults{'host_profile'} } my %profiles_detail = StorProc->get_profiles(); $page .= Forms->form_profiles($defaults{'host_profile'},$profile,\@profiles,\%profiles_detail,$doc{'profile'}); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%back,\%add,\%discard,\%close); } else { $hidden{'step'} = 'subnet'; my $cookie = $query->cookie(CGISESSID => $session_id); print $query->header( -cookie=>$cookie ); $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Discover Host Wizard",'','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } $page .= Forms->wizard_doc($doc{'step_1_title'},$doc{'step_1'}); $page .= Forms->form_discover($hidden{'oct1'},$hidden{'oct2'},$hidden{'oct3'},$hidden{'oct4'},$hidden{'oct5'}); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%next,\%cancel); } return $page; } # ################################################## # Hostgroups # sub hostgroups() { my $page = undef; my $name = $query->param('name'); $name =~ s/^\s+|\s+$//; my $alias = $query->param('alias'); my @hosts = $query->param('hosts'); my $required = undef; my $got_form = 0; $hidden{'view'} = $view; $hidden{'update_main'} = 1; my %hostgroup = StorProc->fetch_one('hostgroups','name',$name); if ($query->param('add')) { if ($name && $alias) { if ($hostgroup{'name'}) { push @errors, "Hostgroup $name already exixts"; } else { my @values = ('',$name,$alias,'','','','',''); my $id = StorProc->insert_obj_id('hostgroups',\@values,'hostgroup_id'); if ($id =~ /error/i) { push @errors, $id; } else { foreach my $host (@hosts) { my %h = StorProc->fetch_one('hosts','name',$host); my @vals = ($id,$h{'host_id'}); my $result = StorProc->insert_obj('hostgroup_host',\@vals); if ($result =~ /error/i) { push @errors, $result } } } unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Host group','','1'); my @message = ("$name."); $page .= Forms->form_message('Added:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } } else { $required = 1; push @errors, "Missing required fields."; } } elsif ($query->param('save')) { if ($alias) { my %values = ('alias' => $alias); my $result = StorProc->update_obj('hostgroups','name',$name,\%values); if ($result =~ /error/i) { push @errors, $result; } else { my $result = StorProc->delete_all('hostgroup_host','hostgroup_id',$hostgroup{'hostgroup_id'}); if ($result =~ /error/i) { push @errors, $result; } else { foreach my $host (@hosts) { my %h = StorProc->fetch_one('hosts','name',$host); my @vals = ($hostgroup{'hostgroup_id'},$h{'host_id'}); my $result = StorProc->insert_obj('hostgroup_host',\@vals); if ($result =~ /error/i) { push @errors, $result } } unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Host group'); my @message = ("$name."); $page .= Forms->form_message('Saved:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } } } } elsif ($query->param('delete')) { $hidden{'delete'} = 1; $hidden{'name'} = $name; if ($query->param('yes')) { my $result = StorProc->delete_all('hostgroups','name',$name); if ($result =~ /error/i) { push @errors, $result; delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,$view,'','1','1'); $page .= Forms->form_top('Host group','','1'); my @message = ("$name."); $page .= Forms->form_message('Removed:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } elsif ($query->param('no')) { delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Host group'); my $message = "Are you sure you want to remove hostgroup $name?"; $page .= Forms->form_doc($message); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%yes,\%no,$tab++); $got_form = 1; } } unless ($got_form) { my @props = ('alias','members'); my %docs = Doc->properties_doc('hostgroups',\@props); my %notify = StorProc->fetch_one('setup','name','enable_notifications'); $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Host group",'onsubmit="selIt();"','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } if ($query->param('new')) { $page .= Forms->text_box('Name:','name',$name,$textsize{'alias'},$required,$docs{'name'},'',''); $hidden{'new'} = 1; } else { $page .= Forms->display_hidden('Name:','name',$hostgroup{'name'}); } unless ($alias) { $alias = $hostgroup{'alias'} } $page .= Forms->text_box('Alias (long name):','alias',$alias,$textsize{'long'},$required,$docs{'alias'},'',''); unless (@hosts) { @hosts = StorProc->get_host_hostgroup($name); } my @nonmembers = StorProc->fetch_list('hosts','name'); $page .= Forms->members('Hosts:','hosts',\@hosts,\@nonmembers,'','',$docs{'members'}); $page .= Forms->hidden(\%hidden); if ($query->param('new')) { $page .= Forms->form_bottom_buttons(\%add,\%cancel); } else { $page .= Forms->form_bottom_buttons(\%save,\%delete,\%cancel); } } return $page; } # ################################################## # Profiles # sub profiles() { my $page = undef; my $got_form = 0; my $required = undef; my $name = $query->param('name'); %profile = StorProc->fetch_one('profiles_host','name',$name); my @hostnames = $query->param('hosts'); $hidden{'view'} = $view; $hidden{'update_main'} = 1; if ($query->param('save')) { my @hosts = (); my %host_name = StorProc->get_table_objects('hosts'); my %w = ('hostprofile_id' => $profile{'hostprofile_id'}); my %u = ('hostprofile_id' => ''); my $result = StorProc->update_obj_where('hosts',\%u,\%w); if ($result =~ /^Error/) { push @errors, $result } foreach my $host (@hostnames) { my %vals = ('hostprofile_id' => $profile{'hostprofile_id'}); my $result = StorProc->update_obj('hosts','name',$host,\%vals); push @hosts, $host_name{$host}; if ($result =~ /error/i) { push @errors, $result } } apply_profile(\@hosts); unless (@errors) { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Hostgroup",'onsubmit="selIt();"','1'); my @message = ("Host profile $name applied to hosts."); $page .= Forms->form_message('Updated:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } unless ($got_form) { my $doc = undef; $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Host Profile",'onsubmit="selIt();"','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } $page .= Forms->display_hidden('Name:','name',$profile{'name'}); my @profiles = ($name); my %profiles_detail = StorProc->get_profiles(); $page .= Forms->display_hidden('Description:','desc',$profiles_detail{$name}{'description'}); delete $profiles_detail{$name}{'description'}; if ($profiles_detail{$name}{'hostgroups'}[0]) { $doc = "Applied to hosts:\n"; foreach my $hg (sort { $a <=> $b } @{$profiles_detail{$name}{'hostgroups'}}) { $doc .= "  $hg,"; } chop $doc; $page .= Forms->wizard_doc('Host Groups',$doc); } delete $profiles_detail{$name}{'hostgroups'}; $doc = "Applied to hosts:

\n"; foreach my $sp (sort keys %{$profiles_detail{$name}}) { $doc .= "  $sp:   $profiles_detail{$name}{$sp}
\n"; } if ($doc) { $page .= Forms->wizard_doc('Service Profiles',$doc) } unless (@hostnames) { my %w = ('hostprofile_id' => $profile{'hostprofile_id'}); @hostnames = StorProc->fetch_list_where('hosts','name',\%w); } my @nonmembers = StorProc->fetch_list('hosts','name'); $page .= Forms->members('Hosts:','hosts',\@hostnames,\@nonmembers,'','',''); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%save,\%cancel); } return $page; } # ################################################## # Time periods # sub timeperiods() { my $page = undef; my $name = $query->param('name'); $name =~ s/^\s+|\s+$//; my $alias = $query->param('alias'); my %days = (); $days{'monday'} = $query->param('monday'); $days{'tuesday'} = $query->param('tuesday'); $days{'wednesday'} = $query->param('wednesday'); $days{'thursday'} = $query->param('thursday'); $days{'friday'} = $query->param('friday'); $days{'saturday'} = $query->param('saturday'); $days{'sunday'} = $query->param('sunday'); my @wdays = ('sunday','monday','tuesday','wednesday','thursday','friday','saturday'); my $required = undef; my $got_form = 0; $hidden{'view'} = $view; $hidden{'update_main'} = 1; my %timeperiod = StorProc->fetch_one('time_periods','name',$name); my $data = "\n"; if ($query->param('add') || $query->param('save')) { foreach my $day (@wdays) { if ($days{$day}) { $data .= qq( ); } } } $data .= "\n"; if ($query->param('add')) { if ($name && $alias) { if ($timeperiod{'name'}) { push @errors, "Time period $name already exixts"; } else { my @values = ('',$name,$alias,$data,''); my $id = StorProc->insert_obj('time_periods',\@values); if ($id =~ /error/i) { push @errors, $id } unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Time Period','','1'); my @message = ("$name."); $page .= Forms->form_message('Added:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } } else { $required = 1; push @errors, "Missing required fields."; } } elsif ($query->param('save')) { if ($alias) { my %values = ('alias' => $alias,'data' => $data); my $result = StorProc->update_obj('time_periods','name',$name,\%values); if ($result =~ /error/i) { push @errors, $result } unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Time Period'); my @message = ("$name."); $page .= Forms->form_message('Saved:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } else { push @errors, "Missing required field."; $required = 1; } } elsif ($query->param('delete')) { $hidden{'delete'} = 1; $hidden{'name'} = $name; if ($query->param('yes')) { my $result = StorProc->delete_all('time_periods','name',$name); if ($result =~ /error/i) { push @errors, $result; delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,'notifications','','1','1'); $page .= Forms->form_top('Time Period','','1'); my @message = ("$name."); $page .= Forms->form_message('Removed:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } elsif ($query->param('no')) { delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Time Period'); my $message = "Are you sure you want to remove hostgroup $name?"; $page .= Forms->form_doc($message); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%yes,\%no,$tab++); $got_form = 1; } } unless ($got_form) { my @props = ('alias','sunday'); my %docs = Doc->properties_doc('time_periods',\@props); my %notify = StorProc->fetch_one('setup','name','enable_notifications'); $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Time Period",'onsubmit="selIt();"','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } if ($query->param('new')) { $page .= Forms->text_box('Name:','name',$name,$textsize{'alias'},$required,$docs{'name'},'',''); $hidden{'new'} = 1; } else { $page .= Forms->display_hidden('Name:','name',$timeperiod{'name'}); } unless ($alias) { $alias = $timeperiod{'alias'}; foreach my $day (keys %days) { $days{$day} = $timeperiod{$day} } } $page .= Forms->text_box('Alias (long name):','alias',$alias,$textsize{'long'},$required,$docs{'alias'},'',''); foreach my $day (@wdays) { $page .= Forms->text_box("\u$day:",$day,$days{$day},$textsize{'long'},'',$docs{$day},'',''); } $page .= Forms->hidden(\%hidden); if ($query->param('new')) { $page .= Forms->form_bottom_buttons(\%add,\%cancel); } else { $page .= Forms->form_bottom_buttons(\%save,\%delete,\%cancel); } } return $page; } sub contacts() { my $page = undef; my $name = $query->param('name'); $name =~ s/^\s+|\s+$//; my $alias = $query->param('alias'); my $email = $query->param('email'); my $pager = $query->param('pager'); my $notification = $query->param('notification'); my $required = undef; my $got_form = 0; $hidden{'view'} = $view; $hidden{'update_main'} = 1; my %contact = StorProc->fetch_one('contacts','name',$name); my %contact_overrides = StorProc->fetch_one('contact_overrides','contact_id',$contact{'contact_id'}); my %template = StorProc->fetch_one('contact_templates','name',$defaults{'contact_template'}); my $data = "\n\n"; if ($query->param('add')) { if ($name && $alias && $notification) { if ($contact{'name'}) { push @errors, "Contact $name already exixts"; } else { my @values = ('',$name,$alias,$email,$pager,$template{'contacttemplate_id'},'1',''); my $id = StorProc->insert_obj_id('contacts',\@values,'contact_id'); if ($id =~ /error/i) { push @errors, $id; } else { my %n = StorProc->fetch_one('time_periods','name',$notification); unless ($template{'host_notification_period'} eq $n{'timeperiod_id'}) { my @values = ($id,$n{'timeperiod_id'},$n{'timeperiod_id'},$data); my $result = StorProc->insert_obj('contact_overrides',\@values); if ($result =~ /error/i) { push @errors, $result } } } unless (@errors) { $page .= Forms->header($page_title,$session_id,'notifications','','1','1'); $page .= Forms->form_top('Contact','','1'); my @message = ("$name."); $page .= Forms->form_message('Added:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } } else { push @errors, "Missing required fields."; $required = 1; } } elsif ($query->param('save')) { if ($alias && $notification) { my %values = ('alias' => $alias,'email' => $email,'pager' => $pager); my $result = StorProc->update_obj('contacts','name',$name,\%values); if ($result =~ /error/i) { push @errors, $result } my %n = StorProc->fetch_one('time_periods','name',$notification); unless ($template{'host_notification_period'} eq $n{'timeperiod_id'}) { if ($contact_overrides{'contact_id'}) { my %values = ('host_notification_period' => $n{'timeperiod_id'},'service_notification_period' => $n{'timeperiod_id'},'data' => $data); my $result = StorProc->update_obj('contact_overrides','contact_id',$contact{'contact_id'},\%values); if ($result =~ /error/i) { push @errors, $result } } else { my @values = ($contact{'contact_id'},$n{'timeperiod_id'},$n{'timeperiod_id'},$data); my $result = StorProc->insert_obj('contact_overrides',\@values); if ($result =~ /error/i) { push @errors, $result } } } unless (@errors) { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Contact'); my @message = ("$name."); $page .= Forms->form_message('Saved:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } else { push @errors, "Missing required fields."; $required = 1; } } elsif ($query->param('delete')) { $hidden{'delete'} = 1; $hidden{'name'} = $name; if ($query->param('yes')) { my $result = StorProc->delete_all('contacts','name',$name); if ($result =~ /error/i) { push @errors, $result; delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,'notifications','','1','1'); $page .= Forms->form_top('Contact','','1'); my @message = ("$name."); $page .= Forms->form_message('Removed:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $got_form = 1; } } elsif ($query->param('no')) { delete $hidden{'delete'}; } else { $page .= Forms->header($page_title,$session_id,$view,'','','1'); $page .= Forms->form_top('Contact'); my $message = "Are you sure you want to remove contact $name?"; $page .= Forms->form_doc($message); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%yes,\%no,$tab++); $got_form = 1; } } unless ($got_form) { my @props = ('alias','email','pager','notification'); my %docs = Doc->properties_doc('contacts',\@props); my %notify = StorProc->fetch_one('setup','name','enable_notifications'); $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Contact",'onsubmit="selIt();"','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } if ($query->param('new')) { $page .= Forms->text_box('Name:','name',$name,$textsize{'alias'},$required,$docs{'name'},'',''); $hidden{'new'} = 1; } else { $page .= Forms->display_hidden('Name:','name',$contact{'name'}); } unless ($alias) { $alias = $contact{'alias'} } unless ($email) { $email = $contact{'email'} } unless ($pager) { $pager = $contact{'pager'} } unless ($notification) { my %n = StorProc->fetch_one('time_periods','timeperiod_id',$contact_overrides{'host_notification_period'}); $notification = $n{'name'}; unless ($notification) { my %n = StorProc->fetch_one('time_periods','timeperiod_id',$template{'host_notification_period'}); $notification = $n{'name'}; } } $page .= Forms->text_box('Alias (long name):','alias',$alias,$textsize{'long'},$required,$docs{'alias'},'',''); my @timeperiods = StorProc->fetch_list('time_periods','name'); $page .= Forms->list_box('Notification period:','notification',\@timeperiods,$notification,$required,$docs{'notification'}); $page .= Forms->text_box('Email:','email',$email,$textsize{'short'},'',$docs{'email'},'',''); $page .= Forms->text_box('Pager:','pager',$pager,$textsize{'short'},'',$docs{'pager'},'',''); $page .= Forms->hidden(\%hidden); if ($query->param('new')) { $page .= Forms->form_bottom_buttons(\%add,\%cancel); } else { $page .= Forms->form_bottom_buttons(\%save,\%delete,\%cancel); } } return $page; } sub pre_flight_test() { my $page = undef; my @results = (); $hidden{'view'} = $view; $hidden{'update_main'} = 1; use MonarchFile; my %property_list = StorProc->property_list(); my %nagios = StorProc->fetch_one('setup','name','nagios_etc'); my %monarch_home = StorProc->fetch_one('setup','name','monarch_home'); my $workspace = $monarch_home{'value'}.'/workspace'; my %nagios_cfg = StorProc->fetch_one('setup','name','log_file'); my %nagios_cgi = StorProc->fetch_one('setup','name','default_user_name'); if ($nagios_cfg{'value'} && $nagios_cgi{'type'}) { if ($query->param('refreshed')) { use MonarchFile; my ($files, $errors) = Files->build_files($user_acct,'','preflight','',$nagios_ver,$nagios_etc,"$monarch_home/workspace",''); my @errors = @{$errors}; my @files = @{$files}; unless ($errors[0]) { @results = StorProc->pre_flight_check($nagios_bin,$monarch_home); } $page .= Forms->header($page_title,$session_id,$top_menu); $page .= Forms->form_top('Nagios Pre Flight Test',''); if (@errors) { $page .= Forms->form_message("Error(s) building file(s):",\@errors ,'error') } $page .= Forms->form_message("Results:",\@results ,'row1'); $hidden{'obj'} = undef; $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } else { my $now = time; $refresh_url = "?update_main=1&nocache=$now&refreshed=1"; foreach my $name (keys %hidden) { $refresh_url .= qq(&$name=$hidden{$name}); } $page .= Forms->header($page_title,$session_id,$view,$refresh_url,'','1'); $page .= Forms->form_top('Nagios Pre Flight Test','','1'); $page .= Forms->form_doc('Running pre-flight check...'); my $now = time; $page .= Forms->form_bottom_buttons(); } } else { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top('Nagios Pre Flight Test','','1'); unless ($nagios_cfg{'value'}) { push @errors, 'Nagios main configuration has not been defined.','Use Control->Nagios main configuration to load an existing file or set defaults.'; } unless ($nagios_cgi{'type'}) { push @errors, 'Nagios CGI configuration has not been defined.','Use Control->Nagios CGI configuration to load an existing file or set defaults.'; } $page .= Forms->form_message("Error(s):",\@errors ,'error'); $hidden{'obj'} = undef; $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } return $page; } sub commit() { my $page = undef; my @results = (); $hidden{'view'} = $view; $hidden{'update_main'} = 1; my @results = (); my %abort = ('name' => 'abort','value' => 'Abort'); my %backup = ('name' => 'backup','value' => 'Backup'); my %commit = ('name' => 'commit','value' => 'Commit'); use MonarchFile; my %property_list = StorProc->property_list(); my %nagios = StorProc->fetch_one('setup','name','nagios_etc'); my %monarch_home = StorProc->fetch_one('setup','name','monarch_home'); my $workspace = $monarch_home{'value'}.'/workspace'; my %nagios_cfg = StorProc->fetch_one('setup','name','log_file'); my %nagios_cgi = StorProc->fetch_one('setup','name','default_user_name'); if ($query->param('backup')) { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top('Commit','','1'); my ($backup, $errs) = StorProc->backup($nagios{'value'},$backup_dir); push (@errors, @{$errs}); if (@errors) { my @message = ("Problem(s) Backing up files and/or database to $backup."); push (@message, @errors); $page .= Forms->form_message("Backup error(s):",\@message ,'error'); } else { my @message = ("Files backed up to $backup."); $page .= Forms->form_message("Backup complete:",\@message,''); } $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%abort,\%commit,$tab++); } elsif ($query->param('abort')) { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top('Nagios Commit','','1'); $hidden{'obj'} = undef; $page .= Forms->hidden(\%hidden); my @message = ("Commit aborted."); $page .= Forms->form_message("Action Canceled:",\@message ,''); $page .= Forms->form_bottom_buttons(\%continue,$tab++); $hidden{'obj'} = undef; } elsif ($query->param('commit')) { if ($query->param('refreshed')) { use MonarchFile; $page .= Forms->header($page_title,$session_id,$top_menu); my ($files, $errors) = Files->build_files($user_acct,'','1','',$nagios_ver,$nagios_etc,"$monarch_home/workspace",''); my @errors = @{$errors}; my @files = @{$files}; if (@errors) { $page .= Forms->form_top('Commit Errors','',''); $page .= Forms->form_errors(\@errors); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } else { @results = StorProc->pre_flight_check($nagios_bin,$monarch_home); my $res_str = pop @results; push @results, $res_str; unless ($res_str =~ /Things look okay/) { push @errors, "Make the necessary corrections and run pre flight check"; } if (@errors) { $page .= Forms->form_top('Commit Errors','',''); $page .= Forms->form_errors(\@errors); $page .= Forms->form_message("Results:",\@results ,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } else { my ($files, $errors) = Files->build_files($user_acct,'','','',$nagios_ver,$nagios_etc,$nagios_etc,''); my @errors = @{$errors}; my @files = @{$files}; if (@errors) { $page .= Forms->form_top('Commit Errors','',''); $page .= Forms->form_errors(\@errors); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } else { my @commit = StorProc->commit($monarch_home); push (@results, @commit); $page .= Forms->form_top('Nagios Commit',''); $page .= Forms->form_message("Results:",\@results ,'row1'); $hidden{'obj'} = undef; $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } } } } else { my $now = time; $refresh_url = "?nocache=$now&refreshed=1&commit=1"; foreach my $name (keys %hidden) { $refresh_url .= qq(&$name=$hidden{$name}); } $page .= Forms->header($page_title,$session_id,$view,$refresh_url,'','1'); $page .= Forms->form_top('Commit to Nagios','','1'); $page .= Forms->form_doc('Running commit...'); my $now = time; $refresh_url = "?update_main=1&nocache=$now&refreshed=1&commit=1"; $page .= Forms->form_bottom_buttons(); } } elsif ($nagios_cfg{'value'} && $nagios_cgi{'type'}) { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top('Nagios Commit','','1'); $page .= Forms->hidden(\%hidden); my @message = ("Are you sure you want to overwrite your active Nagios configuration and restart Nagios?"); push @message, ("Should you choose to continue it is strongly recommended that you first select the backup option."); $page .= Forms->form_message("Nagios commit:",\@message ,''); $page .= Forms->form_bottom_buttons(\%abort,\%backup,\%commit,$tab++); } else { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top('Nagios Commit','','1'); unless ($nagios_cfg{'value'}) { push @errors, 'Nagios main configuration has not been defined.','Use Control->Nagios main configuration to load an existing file or set defaults.'; } unless ($nagios_cgi{'type'}) { push @errors, 'Nagios CGI configuration has not been defined.','Use Control->Nagios CGI configuration to load an existing file or set defaults.'; } $page .= Forms->form_message("Error(s):",\@errors ,'error'); $hidden{'obj'} = undef; $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue,$tab++); } return $page; } sub setup() { my $page = undef; my $required = undef; my $got_form = 0; $hidden{'view'} = $view; $hidden{'update_main'} = 1; if ($query->param('save')) { my @proplist = ('host_profile','contactgroup','contact_template'); foreach my $prop (@proplist) { unless ($query->param($prop)) { push @errors, "Required: $prop"; $required = 1 } } unless (@errors) { foreach my $prop (@proplist) { my %value = ('value' => $query->param($prop)); my %where = ('type' => 'monarch_ez','name' => $prop); my $result = StorProc->update_obj_where('setup',\%value,\%where); if ($result =~ /error/i) { push @errors, $result } } unless (@errors) { $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Configuration Defaults",'','1'); my @message = ("Changes accepted."); $page .= Forms->form_message('Saved:',\@message,'row1'); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%continue); $got_form = 1; } } } unless ($got_form) { my %docs = Doc->ez_defaults(); $page .= Forms->header($page_title,$session_id,$view); $page .= Forms->form_top("Configuration Defaults",'','1'); if (@errors) { $page .= Forms->form_errors(\@errors) } my @profiles = StorProc->fetch_list('profiles_host','name'); $page .= Forms->list_box('Host profile:','host_profile',\@profiles,$defaults{'host_profile'},$required,$docs{'profile'}); my @contactgroups = StorProc->fetch_list('contactgroups','name'); $page .= Forms->list_box('Contact group:','contactgroup',\@contactgroups,$defaults{'contactgroup'},$required,$docs{'contactgroup'}); my @contact_templates = StorProc->fetch_list('contact_templates','name'); $page .= Forms->list_box('Contact template:','contact_template',\@contact_templates,$defaults{'contact_template'},$required,$docs{'contact_template'}); $page .= Forms->hidden(\%hidden); $page .= Forms->form_bottom_buttons(\%save,\%cancel); } return $page; } sub get_configs() { my %where = ('type' => 'config'); my %objects = StorProc->fetch_list_hash_array('setup',\%where); if (-e '/usr/local/groundwork/config/db.properties') { $is_portal = 1 } $nagios_ver = $objects{'nagios_version'}[2]; $nagios_bin = $objects{'nagios_bin'}[2]; $nagios_etc = $objects{'nagios_etc'}[2]; $monarch_home = $objects{'monarch_home'}[2]; $backup_dir = $objects{'backup_dir'}[2]; $upload_dir = $objects{'upload_dir'}[2]; } my $auth = StorProc->dbconnect(); if ($auth == 1) { $user_acct = 'super_user'; } get_configs(); my $login = 0; if ($session_id) { ($user_acct, $userid) = StorProc->get_session($session_id); unless ($userid) { if ($is_portal) { $user_acct = $ENV{'REMOTE_USER'}; ($userid, $session_id) = StorProc->set_gwm_session($user_acct); } else { $login = 1; print "Content-type: text/html \n\n"; print Forms->login_redirect; ($userid, $session_id) = undef; } } } elsif (-e "/usr/local/groundwork/config/db.properties") { $user_acct = $ENV{'REMOTE_USER'}; ($userid, $session_id) = StorProc->set_gwm_session($user_acct); } else { $login = 1; print Forms->login($page_title); ($userid, $session_id) = undef; } unless ($login) { if ($view eq 'discover') { if ($query->param('close') || $query->param('cancel')) { my $cookie = $query->cookie(CGISESSID => $session_id); print $query->header( -cookie=>$cookie ); } } elsif ($view eq 'search') { # Do nothing session string stored in form } else { my $cookie = $query->cookie(CGISESSID => $session_id); print $query->header( -cookie=>$cookie ); } if ($query->param('update_top')) { my @top_menus = ('hosts','host_groups','profiles','notifications','commit','setup'); unless ($is_portal) { print Forms->top_frame($user_acct,$top_menu,\@top_menus,$auth,$monarch_ver,'1',\%auth_add); } } elsif ($query->param('update_main')) { %defaults = StorProc->ez_defaults(); foreach my $key (keys %defaults) { if ($defaults{$key} eq 'not_defined') { unless ($query->param('host_profile') && $query->param('contactgroup') && $query->param('contact_template')) { push @errors, "One or more default values are not defined. All defaults must be set before using this application."; $view = 'setup'; last; } } } if ($query->param('continue') || $query->param('cancel') || $query->param('close')) { if ($view eq 'discover' || $view eq 'import') { my $file = $query->param('file'); if (-e $file) { unlink $file or print "$! $file" } } $body .= Forms->header($page_title,$session_id,$view); } elsif ($view eq 'hosts') { $body .= hosts(); } elsif ($view eq 'import') { $body .= import(); } elsif ($view eq 'discover') { $body .= discover(); } elsif ($view eq 'host_groups') { $body .= hostgroups(); } elsif ($view eq 'profiles') { $body .= profiles(); } elsif ($view eq 'search') { $body .= search(); } elsif ($view eq 'contacts') { $body .= contacts(); } elsif ($view eq 'time_periods') { $body .= timeperiods(); } elsif ($view eq 'notifications') { $body .= notifications(); } elsif ($view eq 'pre_flight_test') { $body .= pre_flight_test(); } elsif ($view eq 'commit') { $body .= commit(); } elsif ($view eq 'setup') { $body .= setup(); } else { $body .= Forms->header($page_title,$session_id,$view); } print $body; print Forms->footer(); } else { unless ($top_menu) { $top_menu = 'hosts' } print Forms->frame($session_id,$top_menu,$is_portal,'1'); } } my $result = StorProc->dbdisconnect();