Perl에서 더 좋은 모듈을 발견하지는 못해서, 일일이 파일 사이즈를 모두 더해서 폴더 사이즈를 구하였다. 그래서 시간이 좀 걸린다.

첫번째 방법
use v5.10;
use strict;
use warnings;

use File::Find;

sub get_folder_size {
    my ($dst_folder) = @_;
    my $folder_size = 0;
    find( sub { $folder_size += -f $_ ? -s _ : 0 }, $dst_folder );

    return $folder_size;
}

say "Folder Size : ".get_folder_size("C:\\");


두번째 방법

# ------------------------------------------------------------------------------
# 필요한 모듈 : cpanm -n File::Find::Object 
# ------------------------------------------------------------------------------
use v5.10;
use strict;
use warnings;

use File::Find::Object;

sub get_folder_size {
    my ($dst_folder) = @_;
    my $folder_size = 0;

    my $tree = File::Find::Object->new({}, ($dst_folder));
    while(my $file = $tree->next()) {
        next unless -e $file; # 존재하지 않으면 다음
        next unless -f $file; # 일반파일이 아니면 다음
        next unless -r $file; # 
        next unless -R $file; # 
        $folder_size += -s $file;
    }

    return $folder_size;
}

say "Folder Size : ".get_folder_size("C:\\");


http://mojoexample.herokuapp.com/ 에 Mojolicious 의 아주 좋은 샘플을 만들어 놓았지만, 2년전에 만들어져서 최신 버전에서 실행하려면 약간의 문제를 일으킵니다. 이를 조금 수정해서 제대로 돌아가게 해보았습니다.

Install MojoExample
$ cpanm -n Mojolicious Modern::Perl DBIx::Class DateTime DateTime::Format::SQLite Time::Duration File::Slurp SQL::Translator
$ git clone https://github.com/tempire/MojoExample.git /opt/project/project_name


바로 실행하면 에러가 발생하며, script/mojo_full의 마지막 줄을 아래와 같이 수정해주어야 합니다

...

# Mojolicious::Commands->start; # 2012년 버전에는 존재하였으나, 지금(2014년)은 사라짐.
Mojolicious::Commands->start_app('MojoFull');

start.sh 생성
# nohup morbo -m production -l http://*:8080 script/mojo_full &
morbo -m development -l http://*:8080 script/mojo_full

실행
$ ./start.sh

이제 입맛대로 고쳐서 원하는 사이트를 만들어봅시다. ^^


히다찌 스토리지에서는 상태점검을 위해서 웹인터페이스를 제공하고 있다. 해당 웹페이지의 메뉴에서 Warning Information 에서 문제가 있으면 로그가 표시되는데, 여기에 아무것도 없으면 장애가 없는 것이고, 뭔가 하나라도 있으면 장애가 있다는 것이다.

해당 페이지의 첫번째 TEXTAREA 태그의 내용을 확인하며 되며, 이를 위해서 WWW::Mechanize 모듈을 사용하였다. 그리고, 장애 발견시 담당자에게 문자를 보내도록 하였다.

Strawberry Perl 5.16.2 에서 테스트하였으며, 사용하는 모듈은 모두 기본으로 내장되어 있어서 별도로 설치할 필요없다.

#!perl
# ------------------------------------------------------------------------------
# (1) 히다찌 스토리지의 웹관리화면의 경고창을 조회하여 Warning Information 항목에 
#     내용이 있으면 장애로 간주하고 담당자에게 문자메시지를 보낸다.
#
# (2) 하루에 2번 작동한다.
#
# Perl Version : 5.16.2
# ------------------------------------------------------------------------------
use 5.016;
use strict;
use warnings;
use diagnostics;

use DBI;
use WWW::Mechanize;
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
sub send_sms {
    my $msg = shift(@_);

    my $dsn = "DBI:ODBC:Driver={SQL Server};Server=서버주소;Database=데이터베이스이름";

    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), ':', ''), 
               '받는사람전화번호',
               '보내는사람전화번호',
               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;
}
# ------------------------------------------------------------------------------


# ------------------------------------------------------------------------------
# Start
# ------------------------------------------------------------------------------
my %devices = ( "HITACHI_STORAGE1", "http://172.16.0.21/cgiShowMsgInf/ShowMsgInf.cgi/CLK/inf_msg",
                "HITACHI_STORAGE2", "http://172.16.0.22/cgiShowMsgInf/ShowMsgInf.cgi/CLK/inf_msg" );

foreach my $device_key (keys %devices) {
    my $mech = WWW::Mechanize->new();
    $mech->get( $devices{$device_key} );
    my @customer_text_inputs = $mech->find_all_inputs( type => 'textarea' );
    my $msg = "";
    if ($customer_text_inputs[0]->value eq "\n") {
        $msg = "Hitachi Storage $device_key : Normal";
        # send_sms($msg);
    } else {
        $msg = "Hitachi Storage $device_key : Error";
        send_sms($msg);
    }
    say $msg;
}


대부분의 네트워크 장비에서는 콘솔로 작업을 할 수 있도록 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();
}



+ Recent posts