こんにちは!サイオステクノロジーの山田と申します。
約一年ぶりの投稿になりますが、今回はpython言語で”selenium”を利用した監視に挑戦してみました。
これまで”監視”というものは、「必要なプロセスは動している?」or「pingが通る?」という観点で設定してきました。
今回はこれをもっともっとシンプルに、「ユーザは今使えているの?」という点で監視するのが目的です。
これはユーザになりきってログインし、出来なければアラート!という仕組みです。
この記事を読むことで以下のことが出来るようになります。
・Pythonとseleniumの導入
・PythonでChromeを起動
・コマンドラインでChromeインストール
・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 https://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=https://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は
‘https://IPアドレス 又は ドメイン名:8080/share/page’となるので、
弊社では下記を定義しました。
chro = webdriver.Chrome(chrome_options=options) chro.get(''https://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を使ってより良い監視を実現させましょう!