返回文章列表

Nagios 網站登入登出可用性檢查指令碼實作

本文介紹如何使用 Python 撰寫 Nagios 檢查指令碼,監控網站登入登出功能的可用性。指令碼利用 urllib2 模擬使用者登入登出操作,BeautifulSoup 解析 HTML 內容驗證結果,並根據設定的閾值傳回 Nagios 狀態碼,實作網站服務品質的自動化監控。

網站監控 Python

隨著網路服務的普及,網站的可用性監控變得越來越重要。確保使用者能夠順利登入和登出系統是網站正常執行的關鍵指標之一。本文將探討如何利用 Python 和 Nagios 監控系統,實作網站登入登出功能的自動化檢查。此方法模擬真實使用者行為,透過傳送 HTTP 請求和解析 HTML 回應,驗證登入登出流程的正確性,並結合 Nagios 的告警機制,及時發現並處理潛在的網站問題。透過 urllib2 模組管理 HTTP 請求和 Cookie,BeautifulSoup 解析 HTML 內容,並根據預設的警告和嚴重閾值判斷網站的回應速度,確保網站服務的穩定性和可靠性。

網站可用性檢查指令碼在 Nagios 中的應用

Nagios 主機與服務定義

在進行網站可用性檢查之前,我們需要在 Nagios 中定義主機和服務。以下是一個範例組態,如列表 8-3 所示。

列表 8-3. Nagios 主機和服務定義

define host {
    name                    template-website-host
    use                     generic-host
    register                0
    max_check_attempts      5
    contacts                nagiosadmin
    parents                 localhost
    check_command           check-host-alive
}

define host {
    use                     template-website-host
    host_name               news.bbc.co.uk
    address                 news.bbc.co.uk
    notes                   BBC News UK
}

define hostgroup {
    hostgroup_name          InternetWebsites
    alias                   Internet Websites
    members                 news.bbc.co.uk
}

define service {
    use                     generic-service
    hostgroup_name          InternetWebsites
    service_description     SiteNavigation
    check_command           check_website_navigation!1.5!2.5
}

define servicegroup {
    servicegroup_name       InternetWeb
    alias                   Internet Websites
    members                 news.bbc.co.uk,SiteNavigation
}

這些定義指定了如何檢查主機和服務的可用性,並將相關的主機和服務分組以便於管理。

檢查指令碼狀態

當 Nagios 完成對所有定義的服務的重新檢查後,導航到服務檢查畫面,我們應該會看到類別似於圖 8-3 的結果。

模擬使用者登入過程

接下來,我們將實作使用者登入動作的檢查。以 www.telegraph.co.uk/ 為例,該網站允許使用者參與不同的促銷活動並訂閱郵件列表和電子郵件通知。顯然,這些選項需要允許使用者向網站識別自己。

登入表單分析

當使用者點選位於網頁右上角的登入連結時,將被重新導向到登入頁面。該頁面包含一個網頁表單,具有兩個欄位:一個用於使用者電子郵件地址,另一個用於密碼。列表 8-4 顯示了網頁原始碼中的表單定義。

列表 8-4. telegraph.co.uk 登入表單

<form id="user" class="basicForm" action="./login.htm" method="post">
    <label for="email" >Email address</label>
    <input id="email" name="email" type="text" value=""/>
    <label for="password" >Password</label>
    <input id="password" name="password" type="password" value="" autocomplete="off"/>
    <div class="cl"></div>
    <a href="forgotpassword.htm" class="noLabel">Forgotten password?</a><br/>
    <a href="http://www.telegraph.co.uk/topics/about-us/3489870/Contact-us.html" class="noLabel">Need help?</a>
    <div class="bottomButtons">
        <input type="submit" value="Log in" />
    </div>
    <div class="cl"></div>
    <p class="noLabel">Or<a href="registration.htm">register now</a> if you do not have a Telegraph.co.uk profile</p>
</form>

HTTP 請求方法:POST 與 GET

當我們填寫值並點選提交按鈕時,網頁瀏覽器會將值編碼並組合成一個字串,然後將該資訊作為 HTTP POST 請求傳送。HTTP 方法通常在表單定義中指定,如我們的範例所示,目前設定為 POST。

使用 urllib2 模擬 POST 請求

要實作相同的結果,我們首先需要封裝要提交的資料。不幸的是,urllib2 並未提供此功能,因此我們必須使用 urllib 方法對表單資料進行編碼。

網站通常使用 HTTP Cookie 管理使用者會話。HTTP Cookie 是一種協定訊息欄位,包含在從網頁瀏覽器應用程式傳送到網頁伺服器的通訊訊息中。HTTP 協定本質上是無狀態的,HTTP 請求不攜帶任何有助於識別請求傳送者的資訊。然而,追蹤使用者活動對於網路購物服務或任何需要提供個人化結果的服務至關重要。這種活動被稱為「維護網頁會話」。使用 HTTP Cookie 是維持此會話的方法之一。

當網頁伺服器接收到請求時,它會將初始回應傳送回網頁瀏覽器。與其他 HTTP 標頭欄位一起,它會插入 Cookie 欄位。網頁客戶端反過來將 Cookie 儲存在其內部資料函式庫中。當它發出另一個請求時,它會掃描資料函式庫中屬於相同網域且具有匹配路徑屬性的 Cookie。然後,網頁客戶端在其後續請求中包含所有匹配的 Cookie。現在,網頁伺服器接收到的請求被「標記」了 Cookie,因此知道這些請求是同一「對話」的一部分,或者換句話說,屬於同一個網頁會話。

程式碼實作與解析

以下是一個範例程式碼,用於模擬使用者登入過程:

import urllib.parse
import urllib.request

# 定義登入表單資料
data = {
    'email': '[email protected]',
    'password': 'your_password'
}

# 對表單資料進行編碼
encoded_data = urllib.parse.urlencode(data).encode('utf-8')

# 傳送 POST 請求
req = urllib.request.Request('https://www.telegraph.co.uk/login.htm', data=encoded_data)
response = urllib.request.urlopen(req)

# 列印回應內容
print(response.read().decode('utf-8'))

內容解密:

  1. 匯入必要的模組:我們匯入了 urllib.parseurllib.request 模組,分別用於對表單資料進行編碼和傳送 HTTP 請求。
  2. 定義登入表單資料:我們定義了一個字典 data,包含了要提交的電子郵件地址和密碼。
  3. 對表單資料進行編碼:使用 urllib.parse.urlencode() 方法對 data 字典進行編碼,並將結果轉換為位元組串。
  4. 傳送 POST 請求:我們建立了一個 urllib.request.Request 物件,指定了請求 URL 和編碼後的表單資料。然後,使用 urllib.request.urlopen() 方法傳送請求並取得回應。
  5. 列印回應內容:最後,我們列印了伺服器傳回的回應內容。

這個範例示範瞭如何使用 Python 的 urllib 模組模擬使用者登入過程,並處理 HTTP Cookie 以維持會話。

網站可用性檢查指令碼:Nagios 整合實作

在現代網站管理中,確保使用者能夠順暢登入和登出系統是至關重要的功能。本文將介紹如何使用 Python 編寫一個 Nagios 相容的指令碼,以檢查特定網站的登入和登出功能是否正常。

使用 urllib2BeautifulSoup 進行網頁操作

要實作網站的登入和登出檢查,我們需要藉助 urllib2 模組來處理 HTTP 請求和 cookie 管理,並使用 BeautifulSoup 解析 HTML 回應內容。

登入操作的實作

首先,我們需要建立一個自訂的 opener 物件,以便處理 cookie:

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)
data = urllib.urlencode({'email': '使用者帳號', 'password': '使用者密碼'})
result = opener.open('https://auth.telegraph.co.uk/sam-ui/login.htm', data)
html_logon = result.read()
soup_logon = BeautifulSoup(html_logon)

驗證登入結果

登入後,我們會檢查傳回的 HTML 標題和重定向 URL 是否符合預期:

def validate_logon(title, redirect_url):
    result = True
    if title.find('My Account') == -1:
        result = False
    if redirect_url != 'https://auth.telegraph.co.uk/customer-portal/myaccount/index.html':
        result = False
    return result

登出操作的實作

接著,我們執行登出操作並驗證結果:

result = opener.open('https://auth.telegraph.co.uk/sam-ui/logoff.htm')
html_logoff = result.read()
soup_logoff = BeautifulSoup(html_logoff)

驗證登出結果

def validate_logoff(title, redirect_url):
    result = True
    if title.find('My Account') != -1:
        result = False
    if redirect_url != 'http://www.telegraph.co.uk/':
        result = False
    return result

Nagios 檢查指令碼完整實作

結合上述步驟,我們可以撰寫出完整的 Nagios 檢查指令碼:

#!/usr/bin/env python
import sys
import urllib2, urllib
import time
from BeautifulSoup import BeautifulSoup
from optparse import OptionParser

NAGIOS_OK = 0
NAGIOS_WARNING = 1
NAGIOS_CRITICAL = 2

WEBSITE_LOGON = 'https://auth.telegraph.co.uk/sam-ui/login.htm'
WEBSITE_LOGOFF = 'https://auth.telegraph.co.uk/sam-ui/logoff.htm'
WEBSITE_USER = '使用者帳號'
WEBSITE_PASS = '使用者密碼'

def test_logon_logoff():
    # 省略實作細節,請參考前述步驟
    pass

def main():
    parser = OptionParser()
    parser.add_option('-w', dest='time_warn', default=3.8, help="警告閾值(秒),預設:%default")
    parser.add_option('-c', dest='time_crit', default=5.8, help="嚴重閾值(秒),預設:%default")
    (options, args) = parser.parse_args()
    
    start = time.time()
    code, message = test_logon_logoff()
    elapsed = time.time() - start
    
    if code != 0:
        print message
        sys.exit(code)
    else:
        if elapsed < float(options.time_warn):
            print "OK: 成功執行 %s 操作,耗時 %f 秒" % (message, elapsed)
            sys.exit(NAGIOS_OK)

內容解密:

  1. 檢查指令碼結構:該指令碼主要分為兩個部分:test_logon_logoff 函式負責執行登入和登出操作,並驗證結果;main 函式處理命令列引數並呼叫檢查函式。
  2. 命令列引數處理:使用 OptionParser 解析 -w-c 引數,分別代表警告和嚴重閾值,用於控制檢查的超時判斷。
  3. 效能檢查:指令碼記錄檢查操作的執行時間,並根據設定的閾值傳回對應的 Nagios 狀態碼。
  4. 狀態碼定義:指令碼使用 NAGIOS_OKNAGIOS_WARNINGNAGIOS_CRITICAL 分別代表正常、警告和嚴重狀態。
  5. 錯誤處理:在檢查過程中,若發生任何例外,指令碼將傳回 NAGIOS_CRITICAL 狀態,並輸出錯誤訊息。

結語

本文介紹瞭如何使用 Python 和相關函式庫實作一個 Nagios 相容的網站登入/登出檢查指令碼。此指令碼不僅能夠檢查網站的可用性,還能驗證特定功能的正確性,是監控網站服務品質的重要工具。透過此類別自動化檢查,可以及時發現並修復網站問題,確保使用者經驗的穩定性。