Python with seleniumで監視設定!

こんにちは!サイオステクノロジーの山田と申します。

約一年ぶりの投稿になりますが、今回はpython言語で”selenium”を利用した監視に挑戦してみました。

selenium

これまで”監視”というものは、「必要なプロセスは動している?」or「pingが通る?」という観点で設定してきました。

今回はこれをもっともっとシンプルに、「ユーザは今使えているの?」という点で監視するのが目的です。

これはユーザになりきってログインし、出来なければアラート!という仕組みです。

この記事を読むことで以下のことが出来るようになります。

・Pythonとseleniumの導入

・PythonでChromeを起動

・コマンドラインでChromeインストール

・seleniumの自動ログイン処理のやり方

・処理結果に応じたアラート送信のやり方

 

それでは監視機能の設計を始めてみましょう!

 ●構成図

selenium構成図

・監視元サーバについて

ディストリビューション:SUSE Linux Enterprise Server 12 Glibc:2.22

※ChromeブラウザをLinuxに入れる場合、Glibc2.18以上である必要がございます。

2017/07時点で、Rhel・centosではyumから取得可能なものはGlibc2.17までですので、

これらを利用する場合は、ソースから取得を検討ください。

 

・監視先サーバについて

AlfrescoというオープンソースのECM(エンタープライズコンテンツ管理)を導入したAzureサーバです。

(弊社でも絶賛活躍中です!) Alfrescoに興味がある方は以下を参照

https://www.alfresco.com/jp/Alfresco%E3%82%92%E8%A9%A6%E3%81%99

 ●「python」「pip」「selenium」をインストール

pythonについては大体のディストリビューションに初めから入ってますので、基本的には不要です。

2系・3系どちらでもOKです。

「python」

コマンド:zypper install python 
(RHEL系の場合はyum install python)
「pip」

curl -kL https://bootstrap.pypa.io/get-pip.py | python
「selenium」

pip install selenium

 ●「Chrome」をインストール

普段ブラウザをインストールは容易なのですが、コマンドラインからとなると、 少し難しいです・・。

コマンド:
zypper ar http://dl.google.com/linux/chrome/rpm/stable/x86_64 Google-Chrome

コマンド:
zypper ref コマンド:wget https://dl.google.com/linux/linux_signing_key.pub

コマンド:
sudo rpm --import linux_signing_key.pub

コマンド:
sudo zypper in google-chrome-stable

 

ちなみにRHEL系の場合は、”/etc/yum.repos.d/chrome.repo”に以下の内容を記載した後に、

yum install google-chrome-stable を実行する必要がございます。

[google-chrome]

name=google-chrome

baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch

enabled=1

gpgcheck=1

gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

 ●「chromedriver」をインストール

seleniumで呼び出す、Chromeを起動するための機能です。

コマンド:
wget https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip

ダウンロードしましたら、解凍しスクリプトと同じディレクトリに配備します。

コマンド:
unzip chromedriver_linux64.zip

 

 ●監視スクリプトを作成します。

コマンド:
vi Alfresco_kanshi.py
"""

Alfresco_kanshi_script

"""

from selenium import webdriver from selenium.webdriver.chrome.options import Options

import smtplib

from email.mime.text import

MIMEText from_address = '送信元のメールアドレスを入力します。'

to_address = '送信先のメールアドレスを入力します。'

options = Options()

options.add_argument('--headless')

options.add_argument('--disable-gpu')

chro = webdriver.Chrome(chrome_options=options)

chro.get('ログインするページのURLを入力します。')

username = "ログインに使用するユーザー名を定義します。"

password = "ログインに使用するパスワードを定義します。"

try:

        login_username = chro.find_element_by_id("ユーザー名を入力するform名を入力します。") 
        login_username.send_keys(username) 

        login_password = chro.find_element_by_id("パスワードを入力するform名を入力します。")
        login_password.send_keys(password)

        login_password.send_keys('\n')

        count = chro.page_source.encode('utf-8').count('正常にログインできた場合に表示される要素を入力します')

        if count > 0:
                msg = MIMEText('This is the body of the message.'.encode('utf-8'))

        else:
                msg = MIMEText('This is the Error message.'.encode('utf-8'))

except: 
        msg = MIMEText('This is the Error message.'.encode('utf-8'))

finally: 
        msg['Subject'] = 'Mail sending test.'
        msg['From'] = from_address
        msg['To'] = to_address
        s = smtplib.SMTP() s.connect() s.sendmail( msg['From'], msg['To'], msg.as_string() )
        s.close()
        chro.quit()

●以下はスクリプトの解説になります。

・ここでは、”selenium” 及び “メール送信”に必要な機能をインポートしています。

from selenium import webdriver 

from selenium.webdriver.chrome.options import Options 

import smtplib 

from email.mime.text import MIMEText

・ここは見た通りなのですが、”送り元” と “送り先”のメールアドレスを定義します。

(ここを適当に定義すると迷惑メール扱いとなりますので、メール中継等を行い、 利用可能なアドレスをご利用ください)

from_address = '送信元のメールアドレスを入力します。'
 to_address = '送信先のメールアドレスを入力します。'

・ここではChromeをHeadlessモードで動かすための、オプション設定を行っています。

options = Options()

options.add_argument('--headless')

options.add_argument('--disable-gpu')

・ここではログインするURLを定義します。

Alfrescoの場合、URLは

‘http://IPアドレス 又は ドメイン名:8080/share/page’となるので、

弊社では下記を定義しました。

chro = webdriver.Chrome(chrome_options=options)
chro.get(''http://IPアドレス:8080/share/page'')

・ここはそのままなのですが、ログインに使用する”ユーザ名” と “パスワード”を定義します。

username = "ログインに使用するユーザー名を定義します。"
password = "ログインに使用するパスワードを定義します。"

・ここからは実際にログインを行います。

“login_username” 及び”login_password”は手間なのですが、実際の環境に合わせて設定願います。

(弊社Alfrescoの場合は、以下の設定になりました。)

try: login_username = chro.find_element_by_id("page_x002e_components_x002e_slingshot-login_x0023_default-username")

login_username.send_keys(username)

login_password = chro.find_element_by_id("page_x002e_components_x002e_slingshot-login_x0023_default-password")

login_password.send_keys(password)

login_password.send_keys('\n')

・ここでログイン試行後の結果確認を行います。

“count()”ではログイン後に表示されるページ要素を入力します。

⇒弊社Alfrescoの場合、”<div class=”title”>My Activities</div>”という、ダッシュボードタイトルが画面上に存在するかをキーとして設定しています。

ログイン画面内にてエラーが生じた場合、この要素は表示されませんので、 このタイトル要素の存在有無を障害確認に用います。

そのためここは、ログイン時のみに表示される要素を確実に設定してください。

 

もしメール本文を変更する場合には、”MIMEText”の中身を変更ください。

count = chro.page_source.encode('utf-8').count('<div class="title">My Activities</div>')

if count > 0: 
        msg = MIMEText('This is the body of the message.'.encode('utf-8'))

else:
        msg = MIMEText('This is the Error message.'.encode('utf-8'))

・”expect”はそもそもログイン画面が開けないなどでエラーとなった場合に備え、 メッセージを変数に入れます。

except:
        msg = MIMEText('This is the Error message.'.encode('utf-8'))

 

・”finally”ではメール送信を定義します。 msg[‘Subject’] はメールタイトルになりますので、

任意の値に変更し、その他は以下のまま変更せずご利用ください。

finally:

        msg['Subject'] = 'Mail sending test.'

        msg['From'] = from_address

        msg['To'] = to_address s = smtplib.SMTP() s.connect() s.sendmail( msg['From'], msg['To'], msg.as_string() )

        s.close()

        chro.quit()

 ●スクリプトの実行権限を付与します。

コマンド:

chmod +x Alfresco_kanshi.py

 

 ●スクリプトの自動実行を定義します。

コマンド:

vi /etc.crontab ※下記は5分ごとに監視を実行する場合の定義です。(こちらの値はお好みに変更願います。)

*/5 * * * * root export PATH=$PATH:/usr/local/bin/;python /usr/local/bin/Alfresco_kanshi.py

下記コマンドでcronの変更を反映します。

コマンド:systemctl restart cron

 

⇒設定完了です!!

 

ここまで設定が完了すると、

タイトル: 「Mail sending test.」から

正常な場合には、 This is the body of the message.

エラーの場合には、 This is the Error message

という内容で、監視メールが来るようになります!

 

細かいメッセージ等は環境に合わせて頂くことになりますが、

seleniumを使ってより良い監視を実現させましょう!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*