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

В настоящее время я пытаюсь создать сценарий, который позволяет мне проверять несколько веб-адресов, чтобы увидеть, находятся ли они в сети и активны. В моей компании есть несколько серверов с различными активными средами (производство, подготовка, разработка и т. д.). Мне нужен скрипт, который может проверять 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)


Вот кое-что, чтобы хотя бы дать вам представление о том, что делать. Необходимо захватить данные веб-сайта, чтобы проанализировать его. Затем мы запускаем запрос регулярного выражения к тому, который построен из массива строк. Эти строки представляют собой тексты, которые можно увидеть на неработающей странице.

# 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