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


ความคิดเห็น

  1. ping.py Error IndentationError: unindent does not match any outer indentation level

    command = ["ping", "-n", "1", "-w", "100", ip ]

    แก้ไขยังไงครับ

    ตอบลบ

แสดงความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

แจ้งเตือนเข้าไลน์กลุ่ม ผ่าน Line notify เมื่อมีคน login เข้า server ของเราผ่าน SSH (linux) หรือ remote desktop เข้ามา (windows server)

การทำ cloud iot ด้วย thingsboard ไว้ใช้เองครับ

การประยุกต์ใช้ line notify ในการแจ้งปัญหาการใช้งาน สำหรับ php