Python ตรวจสอบสถานะเครื่อง server เก็บข้อมูลลง mysql แจ้งเตือนผ่าน Line เมื่อ Server Down และต่อ chat bot ได้
หลักการทำงาน
code นี้ จะไปทำการตรวจสอบสถานะของ server ด้วยการ ping หาก server down ก็จะเก็บข้อมูลเฉพาะ server down พร้อมวันที่และเวลา ลงในฐานข้อมูล mysql พร้อมทั้งแจ้งเตือนผ่านทาง Line และทำหน้าจอแสดงผล server down แบบ realtime โดยรายชื่อ server ที่ทำการ ping จะอยู่ใน file text ต่างหาก บหากต้องการแก้ไข หรือเพิ่ม ก็แก้รายชื่อได้ที่ file text นี้ โดยไม่ต้องไปยุ่งกับ code python
สรุปความสามารถ
1.ตรวจสอบสถานะของ server โดยอ่านค่า ip ที่ต้องการตรวจสอบ ผ่าน text ไฟล์ โดยสามารถเพิ่มหรือลดได้โดยไม่่ต้องไปแก้ที่ code หลัก
2.จัดเก็บข้อมูลของ server ที่ down พร้อมวัน เวลา ลงในฐานข้อมูล Mysql และเก็บไว้ที่ cloud thingspeak เพื่อเป็นที่สำรอง
3.แจ้งเตือนผ่านทาง Line เมื่อ server down
สร้าง database mysql กันก่อนครับ
database ชื่อ server_status
table ชื่อ server_down
////////////////////////////////////////
CREATE DATABASE /*!32312 IF NOT EXISTS*/`server_status` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `server_status`;
/*Table structure for table `server_down` */
DROP TABLE IF EXISTS `server_down`;
CREATE TABLE `server_down` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`ip` varchar(15) NOT NULL,
`date_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
///////////////////////////
1. install python
windows
linux
2. install python library
pip install mysql-python
หากไม่ได้ ใช้ pip install mysqlclient==1.3.4
สำหรับบน windows หากติดตั้ง library mysql-python ไม่ได้ ก็ให้ไปโหลดไฟล์มาติดตั้งต่างหาก ได้เลยครับ mysql-python for windows http://www.codegood.com/archives/129
config environment my computer-> properties-> advance-> environment-> path
add C:\Python27;C:\Python27\Scripts
3.code python
3.1 hosts.txt
///////////////////////////////////////////
192.168.1.1
www.google.com
www.hotmail.com
192.168.1.233
192.168.1.56
192.168.1.77
/////////////////////////////////////
3.2 ping.py
///////////////////////////////
import sys
import os
import platform
import subprocess
import MySQLdb
import time
import datetime
import requests
import httplib, urllib
key = 'H4245ZQXGEUP9CTC' # Thingspeak channel to update
headers = {"Content-typZZe": "application/x-www-form-urlencoded","Accept": "text/plain"}
conn = MySQLdb.connect(host= "localhost",
user="root",
passwd="password",
db="server_status")
def notify(msg):
req = requests.get("http://xxx.xxx.xxx.xxx/line_server.php?message="+str(msg))
def getIps( fileName , osName ) :
oFile = open( fileName , "r" )
lines = oFile.readlines()
oFile.close()
ips = []
for line in lines :
line = line.strip()
if osName == "Linux" :
line = line.strip()
ips.append( line )
return ips
def isServerUp( ip , osName ) :
if osName == "window" :
#command = ["ping", "-n", "1", "-l", "1", "-w", "100", ip ]
command = ["ping", "-n", "1", "-w", "100", ip ]
else :
#command = ["ping", "-n", "1", "-l", "1", "-s", "1", "-W", "1", ip ]
command = ["ping", "-n", "1", "-w", "100", ip ]
ping = subprocess.Popen( command , stdout = subprocess.PIPE,stderr = subprocess.PIPE )
out, error = ping.communicate()
print out
print error
if(out.find("100% loss") != -1):
return False
return True
def PingServer( ips , osName ) :
for ip in ips :
if not isServerUp( ip , osName ):
notify(str(ip));
x = conn.cursor()
x.execute("""INSERT into server_down(ip) values(%s)""",(ip))
conn.commit()
conn.close()
params = urllib.urlencode({'key': 'H4245ZQXGEUP9CTC', 'field1': ip})
f = urllib.urlopen("https://api.thingspeak.com/update", data=params)
osName = platform.system()
scriptDir = sys.path[0]
fileName = os.path.join( scriptDir, 'hosts.txt')
ips = getIps( fileName , osName )
# MAIN routine
PingServer( ips , osName )
/////////////////////////////////////////
3.3 code php สำหรับการแจ้งเตือน
////////////////////////
line_server.php
<?php
$message = $_REQUEST['message'];
$message = $message." Down ";
$chOne = curl_init();
curl_setopt( $chOne, CURLOPT_URL, "https://notify-api.line.me/api/notify");
// SSL USE
curl_setopt( $chOne, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt( $chOne, CURLOPT_SSL_VERIFYPEER, 0);
//POST
curl_setopt( $chOne, CURLOPT_POST, 1);
// Message
curl_setopt( $chOne, CURLOPT_POSTFIELDS, $message);
//ถ้าต้องการใส่รุป ให้ใส่ 2 parameter imageThumbnail และimageFullsize
curl_setopt( $chOne, CURLOPT_POSTFIELDS, "message=$message");
// follow redirects
curl_setopt( $chOne, CURLOPT_FOLLOWLOCATION, 1);
//ADD header array
$headers = array( 'Content-type: application/x-www-form-urlencoded', 'Authorization: Bearer ไลน์ token', );
curl_setopt($chOne, CURLOPT_HTTPHEADER, $headers);
//RETURN
curl_setopt( $chOne, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec( $chOne );
//Check error
if(curl_error($chOne)) { echo 'error:' . curl_error($chOne); }
else { $result_ = json_decode($result, true);
echo "status : ".$result_['status']; echo "message : ". $result_['message']; }
//Close connect
curl_close( $chOne );
?>
////////////////////
ข้อสังเกตุ ตรง if(out.find("100% loss") != -1): ให้ตรวจสอบก่อนน่ะครับว่า ค่าตอบกลับมาเป็นอะไร 100% loss หรือ 100% packet loss
สำหรับการนำไปใช้งาน
บน linux ก็ไปกำหนด crontab ครับ ว่าจะให้ทำงานตอนไหนบ้าง
บน windows ก็ตั้งค่า task scheduler
****** สามารถนำไปต่อยอดกับ chat bot abdul ได้ เนื่องจากเราเก็บข้อมูลไว้บน thingspeak ด้วย
สามารถทำได้ดังนี้
ที่ thingspeak -> tabl api import /export ให้ copy url มาใส่ใน abdul
https://api.thingspeak.com/channels/3xxxx3/fields/1.json?timezone=Asia/Bangkok
ทดสอบดูค่าที่ได้ ผ่านทาง postman
ทดสอบผ่านทาง chat bot
ping.py Error IndentationError: unindent does not match any outer indentation level
ตอบลบcommand = ["ping", "-n", "1", "-w", "100", ip ]
แก้ไขยังไงครับ