(Perl) SAN 스위치 장애 체크 (Telnet)
대부분의 네트워크 장비에서는 콘솔로 작업을 할 수 있도록 ssh, telnet 등의 접속을 지원하고 있다. 가장 많이 이용되는 SAN 스위치 중의 하나인 브로케이드(EMC) 의 SAN 스위치에서는 switchstatusshow 명령을 통해서 장비의 상태를 확인할 수 있는데, SwitchState 항목을 체크하면 장비의 전체적인 상태를 알아볼 수 있다. 여기에서는 간단하게 Telnet 으로 접근하여 해당 항목이 HEALTHY 인지 여부에 따라서 정상이 아니면, 담당자에게 문자를 보낼 수 있다록 해보았다.
Strawberry Perl 5.16.2 에서 테스트하였으며, 사용하는 모듈은 모두 기본으로 내장되어 있어서 별도로 설치할 필요없다.
Ruby 에서도 한번 구현해보려고 했는데, 신형 장비(EMC)에는 잘 접속이 되었으나, 구 장비(Brocade)에는 로그인이 제대로 성공하지 못했다.
#!perl # ------------------------------------------------------------------------------ # SAN 스위치 장애 체크 (Telnet) # ------------------------------------------------------------------------------ # (1) SAN 스위치의 Telnet에 연결하여, switchstatusshow 명령의 결과에 따라서 # HEALTHY 가 아니면 장애로 간주하고 담당자에게 문자메시지를 보낸다. # # (2) 하루에 1번 작동한다. # # Perl Version : 5.16.2 # # Normal Status ---------------------------------------------------------------- # SwitchState: HEALTHY # ------------------------------------------------------------------------------ use 5.016; use strict; use warnings; use diagnostics; use Net::Telnet; use DBI; # ------------------------------------------------------------------------------ sub send_sms { my $msg = shift(@_); my $dsn = "DBI:ODBC:Driver={SQL Server};Server=서버주소;Database=데이터베이스이름"; # 아레오 SMS 의 경우 my $sql = "insert arreo_sms ( CMP_MSG_ID, CMP_USR_ID, WRT_DTTM, RCV_PHN_ID, CALLBACK, SND_DTTM, SND_MSG , SND_PHN_ID, RSRVD_ID ) values ('011' + CONVERT(varchar, GETDATE(), 12) + REPLACE(CONVERT(varchar, GETDATE(), 14), ':', '') + SUBSTRING(CONVERT(VARCHAR, RAND(), 109), 3, 2), '00000', CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 8), ':', ''), '01055551234', '01055554321', CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 8), ':', ''), '$msg', 'ADMIN', 'ADMIN' ) "; my $dbh = DBI->connect($dsn, '아이디', '비밀번호') || die $DBI::errstr; $dbh->do($sql); $dbh->disconnect; } # ------------------------------------------------------------------------------ my %devices = ( "SAN_SW1", "172.16.0.21", "SAN_SW2", "172.16.0.22", "SAN_SW3", "172.16.0.23", "SAN_SW4", "172.16.0.24", ); foreach my $device_key (keys %devices) { my $tn = new Net::Telnet (Host => $devices{$device_key}, Timeout => 5, Prompt => '/> /'); $tn->login("아이디", "비밀번호"); my @lines = $tn->cmd("switchstatusshow"); foreach my $line (@lines) { if ($line =~ /SwitchState/) { my $msg = ""; if ($line =~ /HEALTHY/) { $msg = "$device_key : Normal"; # send_sms($msg); } else { $msg = "$device_key : Error"; send_sms($msg); } say $msg; } } $tn->close(); }
댓글
댓글 쓰기