diff --git a/apps/toshiba/storemate/sql/mode/cashregisterstatus.pm b/apps/toshiba/storemate/sql/mode/cashregisterstatus.pm new file mode 100644 index 000000000..a4ce9aac7 --- /dev/null +++ b/apps/toshiba/storemate/sql/mode/cashregisterstatus.pm @@ -0,0 +1,295 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::toshiba::storemate::sql::mode::cashregisterstatus; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_global_output' }, + { name => 'state', type => 0, cb_prefix_output => 'prefix_state_output' }, + { name => 'merchandise', type => 0, cb_prefix_output => 'prefix_merchandise_output' }, + { name => 'transaction', type => 0, cb_prefix_output => 'prefix_transaction_output' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'total', set => { + key_values => [ { name => 'total' } ], + output_template => 'total : %s', + perfdatas => [ + { label => 'total', value => 'total_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'online', set => { + key_values => [ { name => 'online' } ], + output_template => 'online : %s', + perfdatas => [ + { label => 'online', value => 'online_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'offline', set => { + key_values => [ { name => 'offline' } ], + output_template => 'offline : %s', + perfdatas => [ + { label => 'offline', value => 'offline_absolute', template => '%s', + min => 0 }, + ], + } + }, + ]; + + $self->{maps_counters}->{state} = [ + { label => 'state-unknown', set => { + key_values => [ { name => 'unknown' } ], + output_template => 'unknown : %s', + perfdatas => [ + { label => 'state_unknown', value => 'unknown_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'state-signoff', set => { + key_values => [ { name => 'signoff' } ], + output_template => 'signed off : %s', + perfdatas => [ + { label => 'state_signoff', value => 'signoff_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'state-signon', set => { + key_values => [ { name => 'signon' } ], + output_template => 'signed on : %s', + perfdatas => [ + { label => 'state_signon', value => 'signon_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'state-closed', set => { + key_values => [ { name => 'closed' } ], + output_template => 'closed : %s', + perfdatas => [ + { label => 'state_closed', value => 'closed_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'state-paused', set => { + key_values => [ { name => 'paused' } ], + output_template => 'paused : %s', + perfdatas => [ + { label => 'state_paused', value => 'paused_absolute', template => '%s', + min => 0 }, + ], + } + }, + ]; + + $self->{maps_counters}->{merchandise} = [ + { label => 'merchandise-rep-unknown', set => { + key_values => [ { name => 'unknown' } ], + output_template => 'unknown : %s', + perfdatas => [ + { label => 'merchandise_rep_unknown', value => 'unknown_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'merchandise-rep-ok', set => { + key_values => [ { name => 'ok' } ], + output_template => 'ok : %s', + perfdatas => [ + { label => 'merchandise_rep_ok', value => 'ok_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'merchandise-rep-suspended', set => { + key_values => [ { name => 'suspended' } ], + output_template => 'suspended : %s', + perfdatas => [ + { label => 'merchandise_rep_suspended', value => 'suspended_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'merchandise-rep-error', set => { + key_values => [ { name => 'error' } ], + output_template => 'error : %s', + perfdatas => [ + { label => 'merchandise_rep_error', value => 'error_absolute', template => '%s', + min => 0 }, + ], + } + }, + ]; + + $self->{maps_counters}->{transaction} = [ + { label => 'transaction-rep-unknown', set => { + key_values => [ { name => 'unknown' } ], + output_template => 'unknown : %s', + perfdatas => [ + { label => 'transaction_rep_unknown', value => 'unknown_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'transaction-rep-ok', set => { + key_values => [ { name => 'ok' } ], + output_template => 'ok : %s', + perfdatas => [ + { label => 'transaction_rep_ok', value => 'ok_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'transaction-rep-suspended', set => { + key_values => [ { name => 'suspended' } ], + output_template => 'suspended : %s', + perfdatas => [ + { label => 'transaction_rep_suspended', value => 'suspended_absolute', template => '%s', + min => 0 }, + ], + } + }, + { label => 'transaction-rep-error', set => { + key_values => [ { name => 'error' } ], + output_template => 'error : %s', + perfdatas => [ + { label => 'transaction_rep_error', value => 'error_absolute', template => '%s', + min => 0 }, + ], + } + }, + ]; +} + +sub prefix_global_output { + my ($self, %options) = @_; + + return "Cash Registers "; +} + +sub prefix_state_output { + my ($self, %options) = @_; + + return "State "; +} + +sub prefix_merchandise_output { + my ($self, %options) = @_; + + return "Merchandise replication "; +} + +sub prefix_transaction_output { + my ($self, %options) = @_; + + return "Transaction replication "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "database:s" => { name => 'database', default => 'Framework' }, + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{sql} = $options{sql}; + $self->{sql}->connect(); + $self->{sql}->query(query => "SELECT WORKSTATION_ID, ONLINE, FO_STATE, MERCHANDISE_REPLICATION, TRANSACTION_REPLICATION + FROM " . $self->{option_results}->{database} . ".dbo.WORKSTATION_STATUS"); + + $self->{global} = { total => 0, online => 0, offline => 0 }; + $self->{state} = { unknown => 0, signoff => 0, signon => 0, closed => 0, paused => 0 }; + $self->{merchandise} = { unknown => 0, ok => 0, suspended => 0, error => 0 }; + $self->{transaction} = { unknown => 0, ok => 0, suspended => 0, error => 0 }; + + my %map_status = (0 => 'offline', 1 => 'online'); + my %map_state = (0 => 'unknown', 1 => 'signoff', 2 => 'signon', 3 => 'closed', 4 => 'paused'); + my %map_merch_rep_status = (0 => 'unknown', 1 => 'ok', 2 => 'suspended', 3 => 'error'); + my %map_trans_rep_status = (0 => 'unknown', 1 => 'ok', 2 => 'suspended', 3 => 'error'); + + while (my $row = $self->{sql}->fetchrow_hashref()) { + $self->{global}->{total}++; + $self->{global}->{$map_status{$row->{ONLINE}}}++ + if (defined($map_status{$row->{ONLINE}})); + $self->{state}->{$map_state{$row->{FO_STATE}}}++ + if (defined($map_state{$row->{FO_STATE}})); + $self->{merchandise}->{$map_merch_rep_status{$row->{MERCHANDISE_REPLICATION}}}++ + if (defined($map_merch_rep_status{$row->{MERCHANDISE_REPLICATION}})); + $self->{transaction}->{$map_trans_rep_status{$row->{TRANSACTION_REPLICATION}}}++ + if (defined($map_trans_rep_status{$row->{TRANSACTION_REPLICATION}})); + } +} + +1; + +__END__ + +=head1 MODE + +Check the cash register status + +=over 8 + +=item B<--database> + +Database name (default: 'Framework'). + +=item B<--warning-*> + +Threshold warning. +Can be: 'online, offline, state-unknown, state-signoff, state-signon, state-closed, state-paused, +merchandise-rep-unknown, merchandise-rep-ok, merchandise-rep-suspended, merchandise-rep-error, +transaction-rep-unknown, transaction-rep-ok, transaction-rep-suspended, transaction-rep-error'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'online, offline, state-unknown, state-signoff, state-signon, state-closed, state-paused, +merchandise-rep-unknown, merchandise-rep-ok, merchandise-rep-suspended, merchandise-rep-error, +transaction-rep-unknown, transaction-rep-ok, transaction-rep-suspended, transaction-rep-error'. + +=back + +=cut + diff --git a/apps/toshiba/storemate/sql/mode/maintenanceplan.pm b/apps/toshiba/storemate/sql/mode/maintenanceplan.pm new file mode 100644 index 000000000..9046b7a60 --- /dev/null +++ b/apps/toshiba/storemate/sql/mode/maintenanceplan.pm @@ -0,0 +1,214 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::toshiba::storemate::sql::mode::maintenanceplan; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::misc; +use centreon::plugins::statefile; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("alarm [workstation: %s] [text: %s] %s", $self->{result_values}->{workstation_id}, + $self->{result_values}->{description}, $self->{result_values}->{generation_time}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{description} = $options{new_datas}->{$self->{instance} . '_description'}; + $self->{result_values}->{workstation_id} = $options{new_datas}->{$self->{instance} . '_workstation_id'}; + $self->{result_values}->{since} = $options{new_datas}->{$self->{instance} . '_since'}; + $self->{result_values}->{generation_time} = $options{new_datas}->{$self->{instance} . '_generation_time'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'alarms', type => 2, message_multiple => '0 problem(s) detected', display_counter_problem => { label => 'alerts', min => 0 }, + group => [ { name => 'alarm', skipped_code => { -11 => 1 } } ] + } + ]; + + $self->{maps_counters}->{alarm} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'description' }, { name => 'workstation_id' }, { name => 'since' }, { name => 'generation_time' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "database:s" => { name => 'database', default => 'Framework' }, + "warning-status:s" => { name => 'warning_status', default => '' }, + "critical-status:s" => { name => 'critical_status', default => '1 == 1' }, + "memory" => { name => 'memory' }, + "timezone:s" => { name => 'timezone' }, + }); + + centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'DateTime', + error_msg => "Cannot load module 'DateTime'."); + $self->{statefile_cache} = centreon::plugins::statefile->new(%options); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); + if (defined($self->{option_results}->{memory})) { + $self->{statefile_cache}->check_options(%options); + } + + $self->{option_results}->{timezone} = 'GMT' if (!defined($self->{option_results}->{timezone}) || $self->{option_results}->{timezone} eq ''); +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{sql} = $options{sql}; + $self->{sql}->connect(); + $self->{sql}->query(query => "SELECT CONVERT(varchar, LOGDATE, 120) as LOGDATE, WORKSTATION_ID, USER_ID, DESCRIPTION, DESCRIPTION_PARAMETERS + FROM " . $self->{option_results}->{database} . ".dbo.log + WHERE (TYPE <> 1) AND (DESCRIPTION_PARAMETERS LIKE N'\%FO\%') AND (TASKNAME = 'FOCleanup')"); + $self->{alarms}->{global} = { alarm => {} }; + my $last_time; + if (defined($self->{option_results}->{memory})) { + $self->{statefile_cache}->read(statefile => 'cache_toshiba_storemate_' . $self->{mode} . '_' . $self->{sql}->get_unique_id4save()); + $last_time = $self->{statefile_cache}->get(name => 'last_time'); + } + + my ($i, $current_time) = (1, time()); + while (my $row = $self->{sql}->fetchrow_hashref()) { + # date form: 2017-09-22 01:01:08.133 + $row->{LOGDATE} =~ /^(\d+)-(\d+)-(\d+)\s+(\d+)[:\/](\d+)[:\/](\d+)/; + + my $dt = DateTime->new(year => $1, month => $2, day => $3, hour => $4, minute => $5, second => $6, + time_zone => $self->{option_results}->{timezone}); + + next if (defined($self->{option_results}->{memory}) && defined($last_time) && $last_time > $dt->epoch); + + my $diff_time = $current_time - $dt->epoch; + + $self->{alarms}->{global}->{alarm}->{$i} = { + description => $row->{DESCRIPTION}, + workstation_id => $row->{WORKSTATION_ID}, + since => $diff_time, generation_time => centreon::plugins::misc::change_seconds(value => $diff_time) + }; + $i++; + } + + if (defined($self->{option_results}->{memory})) { + $self->{statefile_cache}->write(data => { last_time => $current_time }); + } +} + +1; + +__END__ + +=head1 MODE + +Check the maintenance plan error logs. + +=over 8 + +=item B<--database> + +Database name (default: 'Framework'). + +=item B<--warning-status> + +Set warning threshold for status (Default: '') +Can used special variables like: %{description}, %{workstation_id}, %{since} + +=item B<--critical-status> + +Set critical threshold for status (Default: '1 == 1'. We match all errors). +Can used special variables like: %{description}, %{workstation_id}, %{since} + +=item B<--timezone> + +Timezone of time options. Default is 'GMT'. + +=item B<--memory> + +Only check new alarms. + +=back + +=cut +