Как я могу отслеживать URL-адрес, а затем отправлять по электронной почте себе трассировку, если что-то идет не так? - PullRequest
0 голосов
/ 07 мая 2011

Я нашел в Интернете сценарий, который, как я думал, будет делать то, что мне нужно, но я не могу заставить его работать, так как мои навыки в PERL довольно низкие. По сути, мне нужно отслеживать этот URL на apple.com и убедиться, что форма загрузки доступна, а если она недоступна, мне нужно получить электронное письмо о том, что форма недоступна из $ hostname, вот traceroute от этого хоста. Трассировка маршрута важна, потому что Apple использует Akamai и некоторую магию GeoIP для своих загрузок.

Я открыт для того, чтобы сохранить этот скрипт и добавить его или сделать его другим способом. Спасибо, что нашли время посмотреть на это для меня. Я обязательно поделюсь готовым результатом, когда закончу. Я уверен, что этот сценарий будет полезен не только мне. ;)

РЕДАКТИРОВАТЬ 5/8/2011 Я только что обновил скрипт, чтобы отразить мои последние изменения.

#!/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 Ответ

2 голосов
/ 08 мая 2011

Хорошо, вот несколько замечаний:

  1. Всегда используйте:

    use strict; use warnings;

  2. Почему chmod 0777?Ваш файл журнала должен быть исполняемым?

  3. $statusfile не содержит никаких данных.

  4. $traceroute содержит данные трассировки, нозатем данные заменяются пустой строкой.

  5. Если трассировка не выполняется, в первой печати будет open() с неопределенным значением, что вызовет предупреждение в perl.

  6. Ваш второй open() усекает файл журнала.Возможно, намеренно, но стоит упомянуть.

  7. Проверки выполняются довольно свободно.Во-первых, единственная проверка, выполняемая на странице, которая является действительной, состоит в том, что она содержит "Quicktime 7.6.9 for Windows XP".Это может быть на любой странице, даже на странице, сообщающей, что система не работает.Кроме того, $response проверяется на наличие строки «ПРЕДУПРЕЖДЕНИЕ», которая, очевидно, происходит из самого сценария, но проверяется без учета регистра, что просто странно.Таким образом, письмо отправляется не только в случае ошибки, но и в случае появления слова «предупреждение» на странице загрузки.Не очень хороший чек, ИМО.

  8. В тексте $response написано, что администратору отправлено электронное письмо, которого нет.

  9. "/bin/hostname" приложение не используется, к теме письма добавляется только его имя.Если вы хотите, чтобы он использовался, вам нужно использовать обратные галочки, как в случае с traceroute (я бы вам показал, но очевидно, что обратные галочки являются метасимволами в этом текстовом поле;))

Веб-страница, кажется, проходит черезХорошо, я не могу проверить sendmail, так как я нахожусь на машине с Windows, но она выглядит нормально.

Трудно сказать, решает ли это ваши проблемы, так как вы не указываете, какие у вас проблемы.Хотя это довольно грубый сценарий.

...