Guest User

Untitled

a guest
Mar 19th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.79 KB | None | 0 0
  1. use strict;
  2. use Getopt::Long;
  3. use LWP::UserAgent;
  4. use HTTP::Request::Common qw(GET POST);
  5. use XML::Simple;
  6. use Data::Dumper;
  7. use Sys::Hostname;
  8. Getopt::Long::Configure('bundling');
  9.  
  10. my ( $oHelp, $oHost, $oUser, $oPw, $oAddress, $oPort, $oWarn, $oCrit );
  11.  
  12. my @warn = ( -1, -1 );
  13. my @crit = ( -1, -1 );
  14. my $state = 'OK';
  15. my $output = '';
  16. my $perfdata = '';
  17. my $percentage;
  18. my @tmp;
  19. my $chr1;
  20. my $chr2;
  21.  
  22. my $userAgent;
  23. my $token;
  24. my $uToken;
  25. # Bridge refers to the telephony server itself.
  26. my $bridgeIp = '';
  27. my $bridgeUser = '';
  28. my $bridgePw = '';
  29. my $hostName = hostname;
  30. my $bridgePort = '80';
  31. # I tried changing the above 80 to 443 but it did not help.
  32. my $bridgeUrl = '';
  33.  
  34. # Exit-Status-Array
  35. my %ERRORS = ( 'UNKNOWN', '-1', 'OK', '0', 'WARNING', '1', 'CRITICAL', '2' );
  36.  
  37. # Parameter handling ###########################################################
  38.  
  39. GetOptions(
  40. "H|host:s" => $oHost,
  41. "U|user:s" => $oUser,
  42. "P|pw:s" => $oPw,
  43. "A|address:s" => $oAddress,
  44. "w|warn:s" => $oWarn,
  45. "c|crit:s" => $oCrit,
  46. "p|port:i" => $oPort,
  47. "h|help" => $oHelp
  48. );
  49.  
  50. if ( $oHelp || !$oUser || !$oHost || !$oPw || !$oAddress ) {
  51. print <<EOU;
  52. Usage: $0 -H <FQDN/IP: string> -A <URL/Address: string> -U <Username: string>
  53. -P <Password: string> [-p <Port: integer>] [-w <audio ports warn: integer>,<video ports warn: integer>]
  54. [-c <audio ports warn: integer>,<video ports warn: integer>]
  55.  
  56.  
  57. Options:
  58.  
  59. -H --host STRING or IPADDRESS
  60. FQDN or IP-Address of the bridge
  61. -A --address STRING
  62. Address to the XML API (e.g. http://<hostname>/Receiver.asp)
  63. -U --user STRING
  64. User name on the bridge
  65. -P --pw STRING
  66. Password of the account on the bridge
  67. -p --port INTEGER
  68. TCP port the API listens on the bridge
  69. -w --warn INT.INT or INT%,INT%
  70. Warning thresholds. Give maximum number or percentage of audio/video ports to be
  71. occupied before warning state occurs.
  72.  
  73. Example:
  74. A value of 50,25 would warn on 51 occupied audio- and/or 26 occupied
  75. A value of 75%,85% would warn if 76% of the total audio- and/or 86% of the total
  76. video ports are in use.
  77. -c --crit INT.INT or INT%,INT%
  78. Critical thresholds. Give maximum number of audio/video ports to be
  79. occupied before critical state occurs.
  80.  
  81. Example:
  82. A value of 60,30 would alert on 61 occupied audio- and/or 31 occupied
  83. video ports.
  84. A value of 85%,95% would alert if 86% of the total audio- and/or 96% of the total
  85. video ports are in use.
  86.  
  87. EOU
  88. exit( $ERRORS{'UNKNOWN'} );
  89. }
  90.  
  91. $bridgeIp = $oHost;
  92. $bridgeUrl = $oAddress;
  93. $bridgeUser = $oUser;
  94. $bridgePw = $oPw;
  95.  
  96. if ($oPort) {
  97. $bridgePort = $oPort;
  98. }
  99.  
  100. if (substr($oWarn, length($oWarn) -1, 1) =~ /%/) {
  101. $percentage = "1";
  102. @tmp = split( ',', $oWarn);
  103. $chr1 = chop($tmp[0]);
  104. $chr2 = chop($tmp[1]);
  105. @warn = @tmp;
  106. }
  107. else {
  108. @warn = split( ',', $oWarn );
  109. }
  110.  
  111. if (substr($oCrit, length($oCrit) -1, 1) =~ /%/) {
  112. $percentage = "1";
  113. @tmp = split( ',', $oCrit);
  114. $chr1 = chop($tmp[0]);
  115. $chr2 = chop($tmp[1]);
  116. @crit = @tmp;
  117. }
  118. else {
  119. @crit = split( ',', $oCrit );
  120. }
  121.  
  122. #if ($oWarn) {
  123. # @warn = split( ',', $oWarn );
  124. #}
  125. #if ($oCrit) {
  126. # @crit = split( ',', $oCrit );
  127. #}
  128.  
  129. # Script start #################################################################
  130.  
  131. connect_bridge() if !$userAgent;
  132.  
  133. my $request =
  134. '<TRANS_RSRC_REPORT><TRANS_COMMON_PARAMS><MCU_TOKEN>'
  135. . $token
  136. . '</MCU_TOKEN>'
  137. . '<MCU_USER_TOKEN>'
  138. . $uToken
  139. . '</MCU_USER_TOKEN><MESSAGE_ID>0</MESSAGE_ID>'
  140. . '</TRANS_COMMON_PARAMS><ACTION><GET_CARMEL_REPORT/></ACTION></TRANS_RSRC_REPORT>';
  141.  
  142. my $responseXml = http_post( $bridgeUrl, $request );
  143. my $oXml = XMLin($responseXml, ForceArray=>['RSRC_REPORT_RMX']);
  144.  
  145. #print( $responseXml . "n" );
  146. # DEBUG: print Dumper($oXml);
  147. #print Dumper($oXml);
  148.  
  149. my $audioPorts;
  150. my $videoPorts;
  151. my $audioPortsHD;
  152. my $videoPortsHD;
  153.  
  154. foreach my $report (
  155. @{
  156. $oXml->{'ACTION'}->{'GET_CARMEL_REPORT'}->{'RSRC_REPORT_RMX_LIST'}
  157. ->{'RSRC_REPORT_RMX'}
  158. }
  159. )
  160. {
  161. if ( $report->{'RSRC_REPORT_ITEM'} eq 'audio' ) {
  162.  
  163. # Possible options:
  164. #$report->{'RSRC_REPORT_ITEM'}->{'RESERVED'}
  165. #$report->{'RSRC_REPORT_ITEM'}->{'OCCUPIED'}
  166. #$report->{'RSRC_REPORT_ITEM'}->{'TOTAL'}
  167. #$report->{'RSRC_REPORT_ITEM'}->{'FREE'}
  168.  
  169. $audioPorts = $report;
  170. }
  171. elsif ( $report->{'RSRC_REPORT_ITEM'} eq 'video' ) {
  172. $videoPorts = $report;
  173. }
  174. }
  175.  
  176. my $videoTypeHD;
  177.  
  178. foreach my $reportHD (
  179. @{
  180. $oXml->{'ACTION'}->{'GET_CARMEL_REPORT'}->{'RSRC_REPORT_RMX_LIST_HD'}
  181. ->{'RSRC_REPORT_RMX'}
  182. }
  183. )
  184. {
  185. if ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'audio' ) {
  186.  
  187. # Possible options:
  188. #$report->{'RSRC_REPORT_ITEM'}->{'RESERVED'}
  189. #$report->{'RSRC_REPORT_ITEM'}->{'OCCUPIED'}
  190. #$report->{'RSRC_REPORT_ITEM'}->{'TOTAL'}
  191. #$report->{'RSRC_REPORT_ITEM'}->{'FREE'}
  192.  
  193. $audioPortsHD = $reportHD;
  194. }
  195. elsif ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'HD1080p60_video' ) {
  196. $videoPortsHD = $reportHD;
  197. }
  198. elsif ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'HD1080p30_video' ) {
  199. $videoPortsHD = $reportHD;
  200. }
  201. elsif ( $reportHD->{'RSRC_REPORT_ITEM'} eq 'HD720p30_video' ) {
  202. $videoPortsHD = $reportHD;
  203. }
  204. }
  205.  
  206. # Audio thresholds
  207.  
  208. if ( $audioPorts ) {
  209. if ( $percentage ) {
  210. if ( $audioPorts->{'TOTAL'} != 0 ) {
  211. if ( $warn[0] != -1 && (( $audioPorts->{'OCCUPIED'} / $audioPorts->{'TOTAL'} ) * 100) > $warn[0] ) {
  212. $state = 'WARNING';
  213. }
  214. }
  215. } elsif ( $warn[0] != -1 && $audioPorts->{'OCCUPIED'} > $warn[0] ) {
  216. $state = 'WARNING';
  217. }
  218.  
  219. if ( $percentage ) {
  220. if ( $audioPorts->{'TOTAL'} != 0 ) {
  221. if ( $crit[0] != -1 && (( $audioPorts->{'OCCUPIED'} / $audioPorts->{'TOTAL'} ) * 100) > $crit[0] ) {
  222. $state = 'WARNING';
  223. }
  224. }
  225. } elsif ( $crit[0] != -1 && $audioPorts->{'OCCUPIED'} > $crit[0] ) {
  226. $state = 'CRITICAL';
  227. }
  228. }
  229.  
  230. # Audio HD Thresholds
  231.  
  232. if ( $audioPortsHD ) {
  233. if ( $percentage ) {
  234. if ( $audioPortsHD->{'TOTAL'} != 0 ) {
  235. if ( $warn[0] != -1 && (( $audioPortsHD->{'OCCUPIED'} / $audioPortsHD->{'TOTAL'} ) * 100) > $warn[0] ) {
  236. $state = 'WARNING';
  237. }
  238. }
  239. } elsif ( $warn[0] != -1 && $audioPortsHD->{'OCCUPIED'} > $warn[0] ) {
  240. $state = 'WARNING';
  241. }
  242.  
  243. if ( $percentage ) {
  244. if ( $audioPortsHD->{'TOTAL'} != 0 ) {
  245. if ( $crit[0] != -1 && (( $audioPortsHD->{'OCCUPIED'} / $audioPortsHD->{'TOTAL'} ) * 100) > $crit[0] ) {
  246. $state = 'WARNING';
  247. }
  248. }
  249. } elsif ( $crit[0] != -1 && $audioPortsHD->{'OCCUPIED'} > $crit[0] ) {
  250. $state = 'CRITICAL';
  251. }
  252. }
  253.  
  254. # Video tresholds
  255. if ( $percentage ) {
  256. if ( $warn[0] != -1 && (( $videoPorts->{'OCCUPIED'} / $videoPorts->{'TOTAL'} ) * 100) > $warn[0] ) {
  257. $state = 'WARNING';
  258. }
  259. } elsif ( $warn[1] != -1 && $videoPorts->{'OCCUPIED'} > $warn[1] ) {
  260. $state = 'WARNING';
  261. }
  262. if ( $percentage ) {
  263. if ( $crit[0] != -1 && (( $videoPorts->{'OCCUPIED'} / $videoPorts->{'TOTAL'} ) * 100) > $crit[0] ) {
  264. $state = 'CRITICAL';
  265. }
  266. } elsif ( $crit[1] != -1 && $videoPorts->{'OCCUPIED'} > $crit[1] ) {
  267. $state = 'CRITICAL';
  268. }
  269.  
  270. # HD Video tresholds
  271. if ( $percentage ) {
  272. if ( $warn[0] != -1 && (( $videoPortsHD->{'OCCUPIED'} / $videoPortsHD->{'TOTAL'} ) * 100) > $warn[0] ) {
  273. $state = 'WARNING';
  274. }
  275. } elsif ( $warn[1] != -1 && $videoPortsHD->{'OCCUPIED'} > $warn[1] ) {
  276. $state = 'WARNING';
  277. }
  278. if ( $percentage ) {
  279. if ( $crit[0] != -1 && (( $videoPortsHD->{'OCCUPIED'} / $videoPortsHD->{'TOTAL'} ) * 100) > $crit[0] ) {
  280. $state = 'CRITICAL';
  281. }
  282. } elsif ( $crit[1] != -1 && $videoPortsHD->{'OCCUPIED'} > $crit[1] ) {
  283. $state = 'CRITICAL';
  284. }
  285.  
  286. if ( $audioPorts ) {
  287. $output =
  288. $state
  289. . ': Audio in use: '
  290. . $audioPorts->{'OCCUPIED'} . '/'
  291. . $audioPorts->{'TOTAL'} . 'SD, '
  292. . $audioPortsHD->{'OCCUPIED'} . '/'
  293. . $audioPortsHD->{'TOTAL'} . 'HD, '
  294. . ' Video in use: '
  295. . $videoPorts->{'OCCUPIED'} . '/'
  296. . $videoPorts->{'TOTAL'} . 'SD, '
  297. . $videoPortsHD->{'OCCUPIED'} . '/'
  298. . $videoPortsHD->{'TOTAL'} . 'HD';
  299.  
  300. $perfdata =
  301. 'audio='
  302. . $warn[0] . ';'
  303. . $crit[0] . ';'
  304. . $audioPorts->{'OCCUPIED'} . ';'
  305. . $audioPorts->{'TOTAL'} . ';'
  306. . $audioPortsHD->{'OCCUPIED'} . ';'
  307. . $audioPortsHD->{'TOTAL'}
  308. . ' video='
  309. . $warn[1] . ';'
  310. . $crit[1] . ';'
  311. . $videoPorts->{'OCCUPIED'} . ';'
  312. . $videoPorts->{'TOTAL'} . ';'
  313. . $videoPortsHD->{'OCCUPIED'} . ';'
  314. . $videoPortsHD->{'TOTAL'};
  315. } else {
  316. $output =
  317. $state
  318. . ': Audio in use: 0/0SD, 0/0HD, '
  319. . ' Video in use: '
  320. . $videoPorts->{'OCCUPIED'} . '/'
  321. . $videoPorts->{'TOTAL'} . 'SD, '
  322. . $videoPortsHD->{'OCCUPIED'} . '/'
  323. . $videoPortsHD->{'TOTAL'} . 'HD';
  324.  
  325. $perfdata =
  326. 'audio='
  327. . $warn[0] . ';'
  328. . $crit[0] . ';0;0;0;0'
  329. . ' video='
  330. . $warn[1] . ';'
  331. . $crit[1] . ';'
  332. . $videoPorts->{'OCCUPIED'} . ';'
  333. . $videoPorts->{'TOTAL'} . ';'
  334. . $videoPortsHD->{'OCCUPIED'} . ';'
  335. . $videoPortsHD->{'TOTAL'};
  336. }
  337.  
  338. print( $output. ' | ' . $perfdata . "n" );
  339. exit( $ERRORS{$state} );
  340.  
  341. # Subs #########################################################################
  342.  
  343. sub login_bridge {
  344. my $request =
  345. '<TRANS_MCU><TRANS_COMMON_PARAMS><MCU_TOKEN>-1</MCU_TOKEN>'
  346. . '<MCU_USER_TOKEN>-1</MCU_USER_TOKEN></TRANS_COMMON_PARAMS><ACTION><LOGIN>'
  347. . '<MCU_IP><IP>'
  348. . $bridgeIp . '</IP>'
  349. . '<LISTEN_PORT>'
  350. . $bridgePort
  351. . '</LISTEN_PORT>'
  352. . '</MCU_IP><USER_NAME>'
  353. . $bridgeUser
  354. . '</USER_NAME>'
  355. . '<PASSWORD>'
  356. . $bridgePw
  357. . '</PASSWORD>'
  358. . '<STATION_NAME>'
  359. . $hostName
  360. . '</STATION_NAME>'
  361. . '</LOGIN></ACTION></TRANS_MCU>';
  362.  
  363. my $responseXml = http_post( $bridgeUrl, $request );
  364. my $xml = XMLin($responseXml);
  365.  
  366. # DEBUG: print Dumper($xml);
  367.  
  368. my $token = 0;
  369. my $uToken = 0;
  370. if ( $xml->{'RETURN_STATUS'}->{'ID'} == 0 ) {
  371. $token = $xml->{'ACTION'}->{'LOGIN'}->{'MCU_TOKEN'};
  372. $uToken = $xml->{'ACTION'}->{'LOGIN'}->{'MCU_USER_TOKEN'};
  373. }
  374.  
  375. return ( $token, $uToken );
  376. }
  377.  
  378. sub connect_bridge {
  379. $userAgent = LWP::UserAgent->new( agent => 'VCMgmtLib', keep_alive => 1 );
  380.  
  381. ( $token, $uToken ) = login_bridge();
  382.  
  383. if ( $token == 0 || $uToken == 0 ) {
  384.  
  385. # Login failed
  386. print("UNKNOWN: Login failed!n");
  387. exit( $ERRORS{'UNKNOWN'} );
  388. }
  389. }
  390.  
  391. sub http_post {
  392. my ( $url, $content ) = @_;
  393.  
  394. my $req = POST $bridgeUrl,
  395. Content_Type => 'application/x-www-form-urlencoded',
  396. Content => $content;
  397.  
  398. my $response = $userAgent->request($req);
  399.  
  400. print $response->error_as_HTML unless $response->is_success;
  401.  
  402. return $response->content;
  403. }
  404.  
  405. sub connect_bridge {
  406. $userAgent = LWP::UserAgent->new( agent => 'VCMgmtLib', keep_alive => 1 );
  407. ssl_opts => {
  408. SSL_ca_path => '/etc/ssl/certs',
  409. verify_hostname => 0,
  410. }
  411.  
  412. if ( $token == 0 || $uToken == 0 ) {
  413. }
  414. }
  415.  
  416. Can't use global @_ in "my" at /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl line 390, near "= @_"
  417. Global symbol "$content" requires explicit package name at /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl line 394.
  418. syntax error at /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl line 401, near "}"
  419. Execution of /usr/lib64/nagios/plugins/check_rmx_ports_ssl.pl aborted due to compilation errors.
Add Comment
Please, Sign In to add comment