Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use Getopt::Long;
- use LWP::UserAgent;
- use HTTP::Request::Common qw(GET POST);
- use XML::Simple;
- use Data::Dumper;
- use Sys::Hostname;
- Getopt::Long::Configure('bundling');
- my ( $oHelp, $oHost, $oUser, $oPw, $oAddress, $oPort, $oWarn, $oCrit );
- my @warn = ( -1, -1 );
- my @crit = ( -1, -1 );
- my $state = 'OK';
- my $output = '';
- my $perfdata = '';
- my $percentage;
- my @tmp;
- my $chr1;
- my $chr2;
- my $userAgent;
- my $token;
- my $uToken;
- # Bridge refers to the telephony server itself.
- my $bridgeIp = '';
- my $bridgeUser = '';
- my $bridgePw = '';
- my $hostName = hostname;
- my $bridgePort = '80';
- # I tried changing the above 80 to 443 but it did not help.
- my $bridgeUrl = '';
- # Exit-Status-Array
- my %ERRORS = ( 'UNKNOWN', '-1', 'OK', '0', 'WARNING', '1', 'CRITICAL', '2' );
- # Parameter handling ###########################################################
- GetOptions(
- "H|host:s" => $oHost,
- "U|user:s" => $oUser,
- "P|pw:s" => $oPw,
- "A|address:s" => $oAddress,
- "w|warn:s" => $oWarn,
- "c|crit:s" => $oCrit,
- "p|port:i" => $oPort,
- "h|help" => $oHelp
- );
- if ( $oHelp || !$oUser || !$oHost || !$oPw || !$oAddress ) {
- print <<EOU;
- Usage: $0 -H <FQDN/IP: string> -A <URL/Address: string> -U <Username: string>
- -P <Password: string> [-p <Port: integer>] [-w <audio ports warn: integer>,<video ports warn: integer>]
- [-c <audio ports warn: integer>,<video ports warn: integer>]
- Options:
- -H --host STRING or IPADDRESS
- FQDN or IP-Address of the bridge
- -A --address STRING
- Address to the XML API (e.g. http://<hostname>/Receiver.asp)
- -U --user STRING
- User name on the bridge
- -P --pw STRING
- Password of the account on the bridge
- -p --port INTEGER
- TCP port the API listens on the bridge
- -w --warn INT.INT or INT%,INT%
- Warning thresholds. Give maximum number or percentage of audio/video ports to be
- occupied before warning state occurs.
- Example:
- A value of 50,25 would warn on 51 occupied audio- and/or 26 occupied
- A value of 75%,85% would warn if 76% of the total audio- and/or 86% of the total
- video ports are in use.
- -c --crit INT.INT or INT%,INT%
- Critical thresholds. Give maximum number of audio/video ports to be
- occupied before critical state occurs.
- Example:
- A value of 60,30 would alert on 61 occupied audio- and/or 31 occupied
- video ports.
- A value of 85%,95% would alert if 86% of the total audio- and/or 96% of the total
- video ports are in use.
- EOU
- exit( $ERRORS{'UNKNOWN'} );
- }
- $bridgeIp = $oHost;
- $bridgeUrl = $oAddress;
- $bridgeUser = $oUser;
- $bridgePw = $oPw;
- if ($oPort) {
- $bridgePort = $oPort;
- }
- if (substr($oWarn, length($oWarn) -1, 1) =~ /%/) {
- $percentage = "1";
- @tmp = split( ',', $oWarn);
- $chr1 = chop($tmp[0]);
- $chr2 = chop($tmp[1]);
- @warn = @tmp;
- }
- else {
- @warn = split( ',', $oWarn );
- }
- if (substr($oCrit, length($oCrit) -1, 1) =~ /%/) {
- $percentage = "1";
- @tmp = split( ',', $oCrit);
- $chr1 = chop($tmp[0]);
- $chr2 = chop($tmp[1]);
- @crit = @tmp;
- }
- else {
- @crit = split( ',', $oCrit );
- }
- #if ($oWarn) {
- # @warn = split( ',', $oWarn );
- #}
- #if ($oCrit) {
- # @crit = split( ',', $oCrit );
- #}
- # Script start #################################################################
- connect_bridge() if !$userAgent;
- my $request =
- '<TRANS_RSRC_REPORT><TRANS_COMMON_PARAMS><MCU_TOKEN>'
- . $token
- . '</MCU_TOKEN>'
- . '<MCU_USER_TOKEN>'
- . $uToken
- . '</MCU_USER_TOKEN><MESSAGE_ID>0</MESSAGE_ID>'
- . '</TRANS_COMMON_PARAMS><ACTION><GET_CARMEL_REPORT/></ACTION></TRANS_RSRC_REPORT>';
- my $responseXml = http_post( $bridgeUrl, $request );
- my $oXml = XMLin($responseXml, ForceArray=>['RSRC_REPORT_RMX']);
- #print( $responseXml . "n" );
- # DEBUG: print Dumper($oXml);
- #print Dumper($oXml);
- my $audioPorts;
- my $videoPorts;
- my $audioPortsHD;
- my $videoPortsHD;
- foreach my $report (
- @{
- $oXml->{'ACTION'}->{'GET_CARMEL_REPORT'}->{'RSRC_REPORT_RMX_LIST'}
- ->{'RSRC_REPORT_RMX'}
- }
- )
- {
- if ( $report->{'RSRC_REPORT_ITEM'} eq 'audio' ) {
- # Possible options:
- #$report->{'RSRC_REPORT_ITEM'}->{'RESERVED'}
- #$report->{'RSRC_REPORT_ITEM'}->{'OCCUPIED'}
- #$report->{'RSRC_REPORT_ITEM'}->{'TOTAL'}
- #$report->{'RSRC_REPORT_ITEM'}->{'FREE'}
- $audioPorts = $report;
- }
- elsif ( $report->{'RSRC_REPORT_ITEM'} eq 'video' ) {
- $videoPorts = $report;
- }
- }
- my $videoTypeHD;
- foreach my $reportHD (
- @{
- $oXml->{'ACTION'}->{'GET_CARMEL_REPORT'}->{'RSRC_REPORT_RMX_LIST_HD'}
- ->{'RSRC_REPORT_RMX'}
- }
- )
- {
- if ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'audio' ) {
- # Possible options:
- #$report->{'RSRC_REPORT_ITEM'}->{'RESERVED'}
- #$report->{'RSRC_REPORT_ITEM'}->{'OCCUPIED'}
- #$report->{'RSRC_REPORT_ITEM'}->{'TOTAL'}
- #$report->{'RSRC_REPORT_ITEM'}->{'FREE'}
- $audioPortsHD = $reportHD;
- }
- elsif ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'HD1080p60_video' ) {
- $videoPortsHD = $reportHD;
- }
- elsif ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'HD1080p30_video' ) {
- $videoPortsHD = $reportHD;
- }
- elsif ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'HD720p30_video' ) {
- $videoPortsHD = $reportHD;
- }
- }
- # Audio thresholds
- if ( $audioPorts ) {
- if ( $percentage ) {
- if ( $audioPorts->{'TOTAL'} != 0 ) {
- if ( $warn[0] != -1 && (( $audioPorts->{'OCCUPIED'} / $audioPorts->{'TOTAL'} ) * 100) > $warn[0] ) {
- $state = 'WARNING';
- }
- }
- } elsif ( $warn[0] != -1 && $audioPorts->{'OCCUPIED'} > $warn[0] ) {
- $state = 'WARNING';
- }
- if ( $percentage ) {
- if ( $audioPorts->{'TOTAL'} != 0 ) {
- if ( $crit[0] != -1 && (( $audioPorts->{'OCCUPIED'} / $audioPorts->{'TOTAL'} ) * 100) > $crit[0] ) {
- $state = 'WARNING';
- }
- }
- } elsif ( $crit[0] != -1 && $audioPorts->{'OCCUPIED'} > $crit[0] ) {
- $state = 'CRITICAL';
- }
- }
- # Audio HD Thresholds
- if ( $audioPortsHD ) {
- if ( $percentage ) {
- if ( $audioPortsHD->{'TOTAL'} != 0 ) {
- if ( $warn[0] != -1 && (( $audioPortsHD->{'OCCUPIED'} / $audioPortsHD->{'TOTAL'} ) * 100) > $warn[0] ) {
- $state = 'WARNING';
- }
- }
- } elsif ( $warn[0] != -1 && $audioPortsHD->{'OCCUPIED'} > $warn[0] ) {
- $state = 'WARNING';
- }
- if ( $percentage ) {
- if ( $audioPortsHD->{'TOTAL'} != 0 ) {
- if ( $crit[0] != -1 && (( $audioPortsHD->{'OCCUPIED'} / $audioPortsHD->{'TOTAL'} ) * 100) > $crit[0] ) {
- $state = 'WARNING';
- }
- }
- } elsif ( $crit[0] != -1 && $audioPortsHD->{'OCCUPIED'} > $crit[0] ) {
- $state = 'CRITICAL';
- }
- }
- # Video tresholds
- if ( $percentage ) {
- if ( $warn[0] != -1 && (( $videoPorts->{'OCCUPIED'} / $videoPorts->{'TOTAL'} ) * 100) > $warn[0] ) {
- $state = 'WARNING';
- }
- } elsif ( $warn[1] != -1 && $videoPorts->{'OCCUPIED'} > $warn[1] ) {
- $state = 'WARNING';
- }
- if ( $percentage ) {
- if ( $crit[0] != -1 && (( $videoPorts->{'OCCUPIED'} / $videoPorts->{'TOTAL'} ) * 100) > $crit[0] ) {
- $state = 'CRITICAL';
- }
- } elsif ( $crit[1] != -1 && $videoPorts->{'OCCUPIED'} > $crit[1] ) {
- $state = 'CRITICAL';
- }
- # HD Video tresholds
- if ( $percentage ) {
- if ( $warn[0] != -1 && (( $videoPortsHD->{'OCCUPIED'} / $videoPortsHD->{'TOTAL'} ) * 100) > $warn[0] ) {
- $state = 'WARNING';
- }
- } elsif ( $warn[1] != -1 && $videoPortsHD->{'OCCUPIED'} > $warn[1] ) {
- $state = 'WARNING';
- }
- if ( $percentage ) {
- if ( $crit[0] != -1 && (( $videoPortsHD->{'OCCUPIED'} / $videoPortsHD->{'TOTAL'} ) * 100) > $crit[0] ) {
- $state = 'CRITICAL';
- }
- } elsif ( $crit[1] != -1 && $videoPortsHD->{'OCCUPIED'} > $crit[1] ) {
- $state = 'CRITICAL';
- }
- if ( $audioPorts ) {
- $output =
- $state
- . ': Audio in use: '
- . $audioPorts->{'OCCUPIED'} . '/'
- . $audioPorts->{'TOTAL'} . 'SD, '
- . $audioPortsHD->{'OCCUPIED'} . '/'
- . $audioPortsHD->{'TOTAL'} . 'HD, '
- . ' Video in use: '
- . $videoPorts->{'OCCUPIED'} . '/'
- . $videoPorts->{'TOTAL'} . 'SD, '
- . $videoPortsHD->{'OCCUPIED'} . '/'
- . $videoPortsHD->{'TOTAL'} . 'HD';
- $perfdata =
- 'audio='
- . $warn[0] . ';'
- . $crit[0] . ';'
- . $audioPorts->{'OCCUPIED'} . ';'
- . $audioPorts->{'TOTAL'} . ';'
- . $audioPortsHD->{'OCCUPIED'} . ';'
- . $audioPortsHD->{'TOTAL'}
- . ' video='
- . $warn[1] . ';'
- . $crit[1] . ';'
- . $videoPorts->{'OCCUPIED'} . ';'
- . $videoPorts->{'TOTAL'} . ';'
- . $videoPortsHD->{'OCCUPIED'} . ';'
- . $videoPortsHD->{'TOTAL'};
- } else {
- $output =
- $state
- . ': Audio in use: 0/0SD, 0/0HD, '
- . ' Video in use: '
- . $videoPorts->{'OCCUPIED'} . '/'
- . $videoPorts->{'TOTAL'} . 'SD, '
- . $videoPortsHD->{'OCCUPIED'} . '/'
- . $videoPortsHD->{'TOTAL'} . 'HD';
- $perfdata =
- 'audio='
- . $warn[0] . ';'
- . $crit[0] . ';0;0;0;0'
- . ' video='
- . $warn[1] . ';'
- . $crit[1] . ';'
- . $videoPorts->{'OCCUPIED'} . ';'
- . $videoPorts->{'TOTAL'} . ';'
- . $videoPortsHD->{'OCCUPIED'} . ';'
- . $videoPortsHD->{'TOTAL'};
- }
- print( $output. ' | ' . $perfdata . "n" );
- exit( $ERRORS{$state} );
- # Subs #########################################################################
- sub login_bridge {
- my $request =
- '<TRANS_MCU><TRANS_COMMON_PARAMS><MCU_TOKEN>-1</MCU_TOKEN>'
- . '<MCU_USER_TOKEN>-1</MCU_USER_TOKEN></TRANS_COMMON_PARAMS><ACTION><LOGIN>'
- . '<MCU_IP><IP>'
- . $bridgeIp . '</IP>'
- . '<LISTEN_PORT>'
- . $bridgePort
- . '</LISTEN_PORT>'
- . '</MCU_IP><USER_NAME>'
- . $bridgeUser
- . '</USER_NAME>'
- . '<PASSWORD>'
- . $bridgePw
- . '</PASSWORD>'
- . '<STATION_NAME>'
- . $hostName
- . '</STATION_NAME>'
- . '</LOGIN></ACTION></TRANS_MCU>';
- my $responseXml = http_post( $bridgeUrl, $request );
- my $xml = XMLin($responseXml);
- # DEBUG: print Dumper($xml);
- my $token = 0;
- my $uToken = 0;
- if ( $xml->{'RETURN_STATUS'}->{'ID'} == 0 ) {
- $token = $xml->{'ACTION'}->{'LOGIN'}->{'MCU_TOKEN'};
- $uToken = $xml->{'ACTION'}->{'LOGIN'}->{'MCU_USER_TOKEN'};
- }
- return ( $token, $uToken );
- }
- sub connect_bridge {
- $userAgent = LWP::UserAgent->new( agent => 'VCMgmtLib', keep_alive => 1 );
- ( $token, $uToken ) = login_bridge();
- if ( $token == 0 || $uToken == 0 ) {
- # Login failed
- print("UNKNOWN: Login failed!n");
- exit( $ERRORS{'UNKNOWN'} );
- }
- }
- sub http_post {
- my ( $url, $content ) = @_;
- my $req = POST $bridgeUrl,
- Content_Type => 'application/x-www-form-urlencoded',
- Content => $content;
- my $response = $userAgent->request($req);
- print $response->error_as_HTML unless $response->is_success;
- return $response->content;
- }
- sub connect_bridge {
- $userAgent = LWP::UserAgent->new( agent => 'VCMgmtLib', keep_alive => 1 );
- ssl_opts => {
- SSL_ca_path => '/etc/ssl/certs',
- verify_hostname => 0,
- }
- if ( $token == 0 || $uToken == 0 ) {
- }
- }
- Can't use global @_ in "my" at /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl line 390, near "= @_"
- Global symbol "$content" requires explicit package name at /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl line 394.
- syntax error at /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl line 401, near "}"
- Execution of /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl aborted due to compilation errors.
Add Comment
Please, Sign In to add comment