如果出现问题,如何监控URL然后通过电子邮件发送自己的traceroute?

时间:2011-05-07 19:23:56

标签: perl curl wget ping traceroute

我在网上发现了一个脚本,我认为它会做我需要的,但我不能让它工作,因为我的PERL技能非常低。基本上,我需要在apple.com上监控这个URL并确保下载表格可用,如果它不可用,我需要收到一封电子邮件,说明该表格不能来自$ hostname,这里是来自该主机的traceroute。 traceroute很重要,因为Apple使用Akamai和一些GeoIP魔法进行下载。

我愿意保留这个脚本并添加它或以另一种方式执行它。感谢您花时间为我看这个。我完成后,我一定会分享完成的结果。我很确定这个脚本不仅仅对我自己有用。 ;)

编辑 2011年5月8日 我刚刚更新了脚本以反映我最近的更改。

#!/usr/bin/perl
use strict; use warnings;

# local hostname
my $hostname = `/bin/hostname`;

# setup array of servers/websites to check
my @sitestocheck = ('swdlp.apple.com');

# the relative url of the website response script in each site
my $responseprogram = "/cgi-bin/WebObjects/SoftwareDownloadApp.woa/wa/getProductData?localang=en_us&grp_code=quicktime&returnURL=http://www.apple.com/quicktime/download";

# path to the log file with the response data
my $statusdir = "./tmp";

# mail feature
my $mailprog ='/usr/sbin/sendmail';
my $adminmail = 'root@localhost';
my $frommail = 'root@$hostname';

###############################################################
# End Configuration                                           #
###############################################################
# main program
use Crypt::SSLeay;
use LWP::UserAgent;

# now check each url in your array
foreach my $sitetocheck (@sitestocheck)
{
    my $ua = new LWP::UserAgent;
    my $req = new HTTP::Request 'GET',"https://$sitetocheck$responseprogram";
    my $res = $ua->request($req);
    if ($res->is_success) 
    {
        if ($res->content =~ m/Quicktime/i)
        {
             my $response = "SERVER OK:$sitetocheck:".$res->content;}
        else
        {
            my $response = "Our apologies but there was an unexpected error with the application. This problem has been noted, and an email has been sent to the administrators. Please check back in a few hours to try the download again. ";
        }
    }
    else
    {
        my $timestamp = localtime;
        my $response = "WARNING! $hostname UNABLE TO CONNECT TO $sitetocheck at $timestamp";
        my $traceroute = `/usr/sbin/traceroute $sitetocheck`;
    }
    # write server status to the main log file
    open(FILE,">>$statusdir/statuslog.txt");
    flock(FILE, 2);
    print FILE "$response\n$traceroute\n\n";
    flock(FILE, 8);

    # write to a current status file for each server or website
    # being monitored
    open(FILE,">$statusdir/$sitetocheck");
    flock(FILE, 2);
    print FILE $response;
    flock(FILE, 8);
}

# if there is an error mail the administrator
if (my $response =~ m/apologies/i)
{
    open( MAIL, "|$mailprog -t" );
    print MAIL "Subject: $hostname unable to connect to $sitetocheck\n";
    print MAIL "From: $frommail\n";
    print MAIL "To: $adminmail\n";
    print MAIL "Reply-to: $frommail\n\n";
    print MAIL "$response\n$traceroute";
    print MAIL "\n\n";
    close MAIL;
}

1 个答案:

答案 0 :(得分:2)

好的,这里有一些观察:

  1. 始终使用:

    use strict; use warnings;

  2. 为什么chmod 0777?您的日志文件是否需要可执行?

  3. $statusfile不包含任何数据。

  4. $traceroute包含traceroute数据,但数据将替换为空字符串。

  5. 如果没有运行traceroute,您将在第一个open()中打印一个未定义值的打印件,这将在perl中发出警告。

  6. 您的第二个open()会截断日志文件。也许是有意的,但也值得一提。

  7. 执行的检查相当松散。首先,在页面上执行的唯一有效检查是它包含"Quicktime 7.6.9 for Windows XP"。这可能是在任何页面上,甚至是一个说系统已关闭的页面。此外,检查$response字符串“WARNING”,这显然来自脚本本身,但是检查不区分大小写,这很奇怪。因此,不仅在出现错误时发送邮件,而且如果下载页面上的任何位置出现“警告”字样。不是一个非常好的支票,IMO。

  8. $response文字表示已向管理员发送了一封电子邮件,但尚未发送给该管理员。

  9. "/bin/hostname"未使用该应用程序,只将其名称添加到电子邮件的主题中。如果你想使用它,你需要像traceroute一样使用反引号(我会告诉你,但显然反引号是这个文本域中的元字符;)

  10. 网页似乎没问题,因为我在Windows机器上,所以无法测试sendmail,但看起来还不错。

    很难说这是否可以解决您的问题,因为您没有说明您的问题。不过,这是一个相当粗略的剧本。