Проблем със създаването на скрипт с двойна логика при смятане на уебсайт онлайн

В момента се опитвам да създам скрипт, който ми позволява да проверявам множество уеб URL адреси, за да видя дали са онлайн и активни. Моята компания има множество сървъри с различни активни среди (Производство, Постановка, Разработка и т.н.) Имам нужда от скрипт, който може да проверява URL адресите на всички среди и да ми казва дали са онлайн или не всяка сутрин, за да мога да изпреварвам играта при справяне с неработещи сървъри или уебсайтове.

Проблемът ми обаче е, че не мога да базирам логиката стриктно на HTTP код, за да считам сайта онлайн или не, някои от нашите уебсайтове може да са онлайн от гледна точка на HTTP, но имат компоненти или уеб части на сайта, които не работят и показват грешка съобщение на страницата.

Имам проблеми с измислянето на скрипт, който може не само да проверява HTTP статуса, но и да сканира страницата и да анализира всички съобщения за грешка и след това да пише на хост въз основа на двете части на логиката, независимо дали сайтът е „Онлайн“ или не "Надолу"

Ето какво имам досега, ще забележите, че не включва нищо относно анализ на ключови думи, тъй като не знам как да го внедря...

#Lower Environments Checklist Automated Script


Write-Host Report generated at (Get-date)

write-host("Lower Environments Status Check");

$msg = ""
$array = get-content C:\LowerEnvChecklist\appurls.txt
$log = "C:\LowerEnvChecklist\lowerenvironmentslog.txt"


write-host("Checking appurls.txt...One moment please.");

("`n---------------------------------------------------------------------------        ") | out-file $log -Append

Get-Date | Out-File $log -Append

("`n***Checking Links***") | out-file $log -Append
("`n") | out-file $log -Append

for ($i=0; $i -lt $array.length; $i++) {
    $HTTP_Status = -1
    $HTTP_Request = [System.Net.WebRequest]::Create($array[$i])
    $HTTP_Request.Timeout =60000 
    $HTTP_Response = $HTTP_Request.GetResponse()
    $HTTP_Status = [int]$HTTP_Response.StatusCode

    If ($HTTP_Status -eq 200) { 
    $msg =  $array[$i] + " is ONLINE!" 
    }
    Else {
    $msg = $array[$i] + " may be DOWN, please check!"
    }
    $HTTP_Response.Close()
    $msg | Out-File $log -Append -width 120
    write-host $msg
}

("`n") | out-file $log -Append
("`n***Lower Environments Checklist Completed***") | out-file $log -Append

write-host("Lower Environments Checklist Completed");

appurls.txt съдържа само вътрешните URL адреси, които трябва да бъдат проверени за информация.

Всяка помощ ще бъде много ценена! Благодаря.


person KyloRen    schedule 23.12.2015    source източник
comment
Не мисля, че имате добър въпрос тук, тъй като просто казвате, че не прави това, което искате. Не давате никакви примери за другите тестове, които искате да направите. Освен това мисля, че трябва да имате CSV вход с URL адреси и тестови конфигурации.   -  person Matt    schedule 23.12.2015
comment
Здравей Мат, извинявам се, ако въпросът ми не идва ясно. Прерових интернет за съвети как да кодирам това, което се опитвам да направя, но без зарове, реших, че мога да използвам нечии познания тук, за да видя дали знаят начин не само да проверяват даден уебсайт за неговия код за HTTP отговор, а както и да сканирате страницата за съобщения за грешки и след това да плюете обратно дали сайтът е онлайн или не въз основа на двете части от логиката.   -  person KyloRen    schedule 23.12.2015
comment
Отново това все още е отворено. Какво възнамерявате да търсите, когато става въпрос за съобщения за грешка? Очаквате ли да търсите текст, който казва грешка? Това зависи много от контекста, така че мисля, че ще трябва да предоставите конкретни примери. В момента това е глупава стрелба, която никой не може да кодира, тъй като има твърде много променливи. Ако имаше ключови думи за търсене, можете да ги запазите и евентуално да проверите за тяхното присъствие.   -  person Matt    schedule 23.12.2015
comment
Съобщенията за грешка, които трябва да бъдат включени в логиката, са Възникна грешка Ами сега Не може да се покажат данни на притурката Възникна неочаквана грешка временно недостъпен   -  person KyloRen    schedule 23.12.2015
comment
Добре, това е поне нещо, с което да работим.   -  person Matt    schedule 23.12.2015
comment
Има ли късмет? Бъркам се с опцията „switch -wildcard“, но не съм сигурен дали начинът, по който я настройвам (чрез HTTP отговор), всъщност сканира съдържанието на страницата. for ($i=0; $i -lt $array.length; $i++) { $HTTP_Status = -1 $HTTP_Request = [System.Net.WebRequest]::Create($array[$i]) $HTTP_Request.Timeout =60000 $HTTP_Response = $HTTP_Request.GetResponse() $HTTP_Status = [int]$HTTP_Response.StatusCode If ($HTTP_Status -eq 200) { switch -wildcard ($HTTP_Response.content) { "*An error has occurred* *oops* *JBoss* *401*   -  person KyloRen    schedule 24.12.2015
comment
Трябва също да се отбележи, че надстроих до Powershell v3.0   -  person KyloRen    schedule 24.12.2015
comment
Здравейте, честита нова година! Имате ли успех с този проблем?   -  person KyloRen    schedule 04.01.2016


Отговори (1)


Ето нещо, което поне ще ви даде идея какво да правите. Необходимо е да се уловят данните от уебсайта, за да се анализира. След това изпълняваме заявка за regex срещу това, което е изградено от масив от низове. Тези низове са текстове, които може да се видят на страница, която не работи.

# build a regex query of error strings to match against. 
$errorTexts = "error has occurred","Oops","Unable to display widget data","unexpected error occurred","temporarily unavailable"
$regex = ($errorTexts | ForEach-Object{[regex]::Escape($_)}) -join "|"

# Other preproccessing would go here

# Loop through each element of the array
ForEach($target in $array){
    # Erase results for the next pass in case of error.
    $result, $response, $stream, $page = $null

    # Navigate to the website.
    $result = [System.Net.WebRequest]::Create($target)
    $response = $result.GetResponse()
    $stream = [System.IO.StreamReader]$response.GetResponseStream()
    $page = $stream.ReadToEnd()

    # Determine if the page is truly up based on the information above. 
    If($response.StatusCode -eq 200){
        # While the page might have rendered need to determine there are no errors present
        if($page -notmatch $regex){
            $msg = "$target is online!"
        } else {
            $msg = "$target may be DOWN, please check!"
        }
    } else {
        $msg = "$target may be DOWN, please check!"
    }

    # Log Result
    $msg | Out-File $log -Append -width 120

    # Close the connection
    $response.Close()
}

# Other postproccessing would go here

Исках да покажа как изглежда тук-низ, за ​​да замени някои от вашите out-file повторения. Заглавката на вашия лог файл беше няколко реда от това. Намалих го до един.

@"

---------------------------------------------------------------------------
$(Get-Date)
***Checking Links*** 

"@ | Out-File $log -Append

Също така помислете за CodeReview.SE за критика на работещия код. Има други области, които на теория могат да бъдат подобрени, но са извън обхвата на този въпрос.

person Matt    schedule 05.01.2016
comment
Страхотно! това сработи страхотно, единственият проблем, който имам, е за сайтове, които изискват удостоверяване, те са изброени като може да са ОТЛОЖЕНИ, не знам защо е така, състоянието все още трябва да е 200, някаква идея? Освен това има ли известна команда за автоматично отваряне на лог файла след изпълнение на скрипта? Много благодаря Мат! - person KyloRen; 08.01.2016
comment
@KyloRen Сайтовете за удостоверяване ще бъдат изключени, тъй като върнатият статус ще бъде код 403. Invoke-Item $log за всеки случай. - person Matt; 08.01.2016