2013-03-11

(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();
}

댓글 없음:

댓글 쓰기