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を使ってより良い監視を実現させましょう!

Be the first to comment

コメント投稿

Your email address will not be published.


*