Was this page helpful?

遠端監測 Asterisk SIP 服務

    遠端監測 Asterisk 的 SIP 服務是否正常運行。

    此篇所運用的方法,不是只以監測 SIP Port 開啟與否來判斷服務是否正常運行,而是模擬 SIP User-Agent 向主機發送一個 SIP 封包,並以回應狀況來判斷主機服務的運作狀況,此監測法會比 port 的監測還來的更準確。

    *所有原始碼來自 O'REILLY VoIP HACKS 一書。

    以 CentOS Linux 為例,請先安裝 Perl 模組 Time::HiRes。

    安裝 Perl module

    #>perl -MPCAN -eshell

    cpan>install Time::HiRes

    新增 sip_ping.pl

    註:此原始碼我做了小修改,使其可探測非 port 5060 的 SIP主機。

    #!/usr/bin/perl
    # modify by alang 2009-12-06
    #
    use IO::Socket;
    use POSIX 'strftime';
    use Time::HiRes qw(gettimeofday tv_interval);
    use Getopt::Long;
    use strict;
    
    my $USAGE = "Usage: sip_ping.pl [-v] [-t] [-s <src_host>]
    [-p <src_port>] <hostname:port>";
    
    my $RECV_TIMEOUT =5; # Timeout (second)
    
    my $sock = IO::Socket::INET->new(Proto => 'udp',
                                     LocalPort => '6655',
                                     ReuseAddr => 1 )
       or die "Could not make socket: [email protected]";
    
    # Options
    my ($verbose, $host, $my_ip, $my_port, $time);
    GetOptions("verbose|v" => \$verbose,
               "source-ip|s=s" => \$my_ip,
               "source-port|p=n" => \$my_port,
               "time|t" => \$time) or die "Invalid options:\n\n$USAGE\n";
    
    # where to ping
    my $host_ip;
    my $host_port;
    my $dst_port;
    my $host = shift(@ARGV) or die $USAGE;
    my ( $host_ip, $host_port ) = split( ':', $host );
    my $dst_addr = inet_aton($host_ip) or die "Could not find host: $host";
    my $dst_ip = inet_ntoa($dst_addr);
    if ( !$host_port ){
      $dst_port = "5060";
    } else {
      $dst_port = $host_port;
    }
    my $portaddr = sockaddr_in($dst_port, $dst_addr);
    
    # Who are we
    $my_ip = "127.0.0.1" unless defined($my_ip);
    $my_port = "6655" unless defined($my_port);
    
    #
    my $callid = ""; $callid .= ('0'..'9', "a".."f")[int(rand(16))] for 1 .. 32;
    my $date = strftime('%a, $e %B %Y %I:%M:%S %Z', localtime());
    
    #
    my $branch = "z9hG4bK" . time();
    
    my $packet = qq(OPTIONS sip:$dst_ip SIP/2.0
    Via: SIP/2.0/UDP $my_ip:$my_port;branch=$branch
    From: <sip:ping\@$my_ip>
    To: <sip:$host>
    Contact: <sip:ping\@$my_ip>
    Call-ID: $callid\@$my_ip
    CSeq: 102 OPTIONS
    User-Agent: sip_ping.pl
    Date: $date
    Allow: ACK, CANCEL
    Content-Length: 0
    
    );
    
    # send the packet
    print "Sending: \n\n$packet\n" if $verbose;
    send($sock, $packet, 0, $portaddr) == length($packet)
        or die "cannot send to $host: $!";
    my $send_time = [gettimeofday()]; # start the stopwatch
    my $elapsed;
    
    # get the response
    eval
    {
       local $SIG{ALRM} = sub { die "alarm time out" };
       alarm $RECV_TIMEOUT;
       $portaddr = recv($sock, $packet, 1500, 0) or die "couldn't receive: $!";
       $elapsed = tv_interval($send_time); # stop the stopwatch
       alarm 0;
       1;
    } or die([email protected]);
    
    # print the output
    if ($verbose) {
       printf("After (\%0.2f ms), host said: \n\n\%s\n", $elapsed*1000, $packet);
    }
    elsif ($time) {
       printf("%0.2f\n", $elapsed*1000);
    }
    else {
       printf("$host is alive\n");
    }
    
    #EOF

     

    使用方法

    // 檢測 SIP 運作狀態
    #>perl sip_ping.pl <SIP主機位址>

    // 檢測 SIP 回應速度 (Latency)
    #>perl sip_ping.pl <SIP主機位址:Port> -t

    延伸應用
    • 結合 MSN 發送,可以使主機出現異常時發送 MSN 訊息。
    • 結合 Email to SMS,可以使主機出現異常時發送簡訊至手機。
    • 結合 RRDTools 繪圖工具,可以製作 SIP 回應速度的統計表。

      

    Was this page helpful?
    標籤 (Edit tags)
    • No tags
    查看第9個(總9個)評論: 查看所有
    請問我有使用你的sip_ping.pl,當我下perl sip_ping.pl 22.22.22.22,他會出現"alarm time out at sip_ping.pl line 79.",請問我是哪裡沒有修改到,"$my_ip = "127.0.0.1" unless defined($my_ip);"這個需要修改嗎?謝謝!
    發佈時間 10:42, 15 Nov 2013 ()
    Yanny,
    那行不用改
    發佈時間 21:15, 15 Nov 2013 ()
    不好意思,那想請問一下,通常出現這種錯誤,會是什麼問題?
    謝謝!
    發佈時間 16:23, 18 Nov 2013 ()
    試試這個
    sip_ping.pl iptel.org
    發佈時間 09:03, 19 Nov 2013 ()
    非常不好意思 ,我這樣試還是得到"alarm time out at sip_ping.pl line 79"這個訊息,因為我是整個從你的範例抄下來,沒有修改任何東西,是不是有什麼我沒注意到的,真的不好意思打擾你了.
    發佈時間 09:56, 19 Nov 2013 ()
    請問網路有通?
    發佈時間 18:03, 20 Nov 2013 ()
    網路是有通的,可以Ping到外面,不過telnet sip port會被拒絕,正是正常的嗎?
    發佈時間 09:56, 21 Nov 2013 ()
    不正常
    發佈時間 10:27, 21 Nov 2013 ()
    了解,那我再查查看,為什麼會這樣,謝謝你這幾天的解答!
    發佈時間 14:31, 22 Nov 2013 ()
    查看第9個(總9個)評論: 查看所有
    您必須 登入 才能發佈評論。
    Powered by MindTouch Core