ช่วงอาทิตย์ที่ผ่านมาผมได้ลางานทำโปรเจ็กยาวๆ (วันที่ 29-31 มีนาคม) มาเตรียมตัวสอบโปรเจ็กในวัน April Fool Day (เศร้าาาาา)
อนึ่งผมเป็นสมาชิกของห้องวิจัย Software and Application Interest Group Comunity (SAIG) ของภาควิศวกรรมคอมพิวเตอร์ สถาบันเทคโนโลยีพระจอมเกล้าเจ้าคุณทหารลาดกระบัง (KMITL) ทีนี้เวลาเตรียมตัวมันก็จะมีช่วงพักบ้างอะไรบ้าง ผมก็เลยอยากที่จะทำอะไรสักอย่างให้เรารู้สถานะของเครื่อง Server ที่เป็นของแลปที่สถาบัน โดยระบบที่ทำขึ้นมาผมจะคำนึงถึงระบบ network ของสถาบันด้วย

ตัวระบบ network ของสถาบันอะครับ ถ้าคนภายในจะออก Internet จะต้องทำการ Authenticate ก่อน ซึ่ง Session นึงนาน 8 ชม.(ซึ่งส่วนมากมันก็จะเน่าตายไปซะก่อน 8 ขม.) โดยปัญหาที่เราเจอจะเป็น

  • Session ที่ทำการ Authenticate ไว้ มันหลุด (เน็ตของเครื่อง Server อยู่วงเดียวกับ Router ที่ใช้กระจาย Wifi ในแลป)
  • เครื่องดับ
  • ข้อดี (รึเปล่า) ถ้า Allow Port ไว้ เราสามารถเข้ามาจากข้างนอกได้ (แม้จะไม่ได้ Authen อินเทอร์เน็ตไว้)
  • เวลาเครื่องดับเราไม่ค่อยรู้ครับ จะรู้คือตอนที่มีคนมาใช้เครื่อง

ทีนี้เลยไปลองดูใน IFTTT ว่าเอ มันมีวิธีที่จะ Monitor ได้ง่ายๆไหม เพราะเห็นว่า IFTTT ส่งข้อความทางไลน์ได้ จะได้ไม่ต้องเสียเวลาโค้ด ก็ไปเจอ applets นี้ครับ

ก็ได้เห็นว่าเขาได้มีการใช้การดูว่าเมื่อมี Email จาก Uptimerobot ส่งเข้ามาใน Gmail ก็ให้ทำการส่ง Notification เลยไปทำการดู Service ที่เค้าใช้ว่ามันฟรีไหม เลยไปดูเจ้า Uptimerobot ซึ่งใช้งานฟรีได้ แบบจำกัดฟีเจอร์นิดหน่อย ซึ่งไม่ใช่ปัญหาใหญ่กับเรา

ตัว Uptimerobot นั้นแบบที่ฟรีจะมีข้อกำหนดว่า

  • จำกัด 50 Monitor/user
  • เวลาที่ Bot จะยิง URL ขั้นต่ำทุก 5 นาที (จ่ายเงิน อัพเกรดเป็นทุกๆ 1 นาที)

แน่นอนเราใช้แบบฟรี 5555

ทีนี้ผมเลยจะสร้างหน้า API ง่ายขึ้นมาเพื่อให้ Uptime Robot เรียก ผมเลยหาวิธีทำ API ให้ง่ายที่สุดด้วยการไปใช้ FlaskAPI มาใช้ทำหน้า API ง่ายๆ
ลง FlaskAPI และ markdown ผ่าน pip ได้เลยครับ

pip install Flask-API
pip install markdown       # Markdown support for the browsable API.

ตัวโค้ด web app ของเราหน้าตาแบบนี้ (ก็อปๆมากจาก Document ของ FlaskAPI)

from flask_api import FlaskAPI, status, exceptions
import socket, subprocess

app = FlaskAPI(__name__)

@app.route('/monitor',methods=['GET'])
def monitor():
    return {'test_naja': 'eiei'}

แล้วก็รัน server ด้วยคำสั่ง

export FLASK_APP=/home/ubuntu/Project/monitorapi/main.py
/home/ubuntu/.virtualenvs/monitorapi/bin/python -m flask run --host=0.0.0.0 > /var/log/flask_access.log 2>&1 &

ผมใช้ virtualenv ช่วยในเรื่อง python environment นะครับ เลยเรียก python ของ virtualenv ที่เราสร้างมา
เอาจริงคือผมรัน web app แบบท่าปกติไม่ได้เลยต้องใช้ท่านี้ครับ
แล้วให้ทำการเขียน log ไปลงไว้ที่

/var/log/flask_access.log

ทีนี้ก็จะเข้าหน้า /monitor ไม่ได้ครับ เพราะไม่ได้ forward port 5000 (flask ใช้พอร์ทนี้เป็น default ครับ) ที่เร้าท์เตอร์ ก็ไปจัดการตาม FW ของเราท์เตอร์ที่ใช้เลยครับ
พอเข้า host:5000/monitor ก็จะเจอหน้าตาแบบนี้

แล้วผมก็เขียน bash script ไว้แล้วนำไปใส่ใน /etc/rc.local ให้มันรันขึ้นมาทุกครั้งที่เปิดเครื่อง หรือ รีสตาร์ทเครื่อง ครับ ใน bash script ก็มีคำสั่งตามนี้ครับ(เหมือนกับที่ใช้รันก่อนหน้า)

#!/bin/bash
export FLASK_APP=/home/ubuntu/Project/monitorapi/main.py
/home/ubuntu/.virtualenvs/monitorapi/bin/python -m flask run --host=0.0.0.0 > /var/log/flask_access.log 2>&1 &

ทีนี้เราก็จะไปสร้าง Monitor ที่ Uptimerobot กันครับ

ในที่นี้ผมใช้ HTTP(S) นะครับ

อย่าลืมคลิกให้มันแจ้งเตือนทาง Email ด้วยนะครับ เดียวเราเอาไปใช้ต่อ ใน IFTTT ของเรา

จากนั้นเราจะได้ Monitor ที่เราสร้างขึ้นมาที่ Dashboard แล้วครับ เช็คทุกๆ 5 นาที ถ้ามันไม่เจอหน้าเว็บก็หมายความว่า เครื่องดับ ไม่ก็ process flask เราตายครับ ทดลองเองได้ด้วยการลองปิดหน้า API เราไปเลย สักพักเมลล์จะเข้ามาฮะ

 

ต่อมาเราก็จะมาสร้าง Applets ที่ IFTTT

อันนี้ผมสร้างไว้แล้วนะครับเอาเอาไปใช้ได้เลย หรือจะแก้ไขให้เหมาะกับตัวเองก็ได้ครับ

คร่าวๆคือ เราจะสร้าง Trigger ใน Gmail ว่าเมื่อมี Email มาจาก [email protected] ซึ่งเป็น email ของ uptimerobot ที่ส่งมาหาเรา แล้วให้ส่งข้อความแจ้งเตือนไปที่ Line แชท ที่เราต้องการ (ต้องไป add บัญชี ของ Gmail และ Line ของเรากับ IFTTT ด้วย)

เลือกกลุ่มแชท แก้ Message และ ใส่รูปตามที่เราต้องการเลยครับ ง่ายมากๆ

แล้วไปแอ็ดบอท Line Notify เข้าไปที่ Group ที่เราต้องการด้วยนะครับ

พอเวลามี Message มาก็จะประมาณนี้

ทีนี้ผมก็จะเพิ่มให้มีการ Monitor Network ด้วยครับ ด้วยการไปแก้ API ให้มีการรัน command บน server เพื่อเช็คสถานะว่าสามารถต่ออินเทอร์เน็ตได้ไหม (ปกติถ้าเครื่องต่อเน็ตไม่ได้ เราก็เรียก API ได้ครับ)

API ผมจะหน้าตาประมาณนี้

from flask_api import FlaskAPI, status, exceptions
import socket, subprocess

app = FlaskAPI(__name__)

@app.route('/monitor',methods=['GET'])
def monitor():
    return {'connected': subprocess.check_output("netcheck", shell=True).strip('\n')}

ก็มีการให้เรียก command บน os แล้วเอา output ออกมา ในที่นี้ command netcheck จะ return แค่ Online กับ Offline ที่ติด “\n” มาด้วยเลยทำการตัดออกด้วย .strip เวลาเราเรียกหน้า API จะได้ตามรูป

แล้วก็ไปสร้าง Monitor ให้มันจับ Keyword เอาครับ ตั้งให้ Alert ถ้ามันไม่เจอ Keyword

ก็คร่าวๆก็จะมีประมาณนี้ครับ ทำได้รวดเร็ว แต่ก็ยังเจอปัญหาบ้าง ในขณะที่ผมเขียนบล็อกนี้ผมได้ SSH เข้าไปที่เซิฟเวอร์ด้วย โปรเซส ของ API Run ปกติ แต่เข้าหน้า API ไม่ได้ เพราะโค้ดอาจจะยังไม่ดีพอ หรือ เป็นปัญหาของ Flask เลยต้องสั่งรันใหม่

ในการแจ้งเตือนทาง Line ยังมี Delay นิดหน่อยนะครับ อันนี้ไม่ได้ซีเรียสมากครับ ทำเล่นๆ สาเหตุที่ใช้ไลน์ เพราะว่ากลุ่มแช็ทของคนในห้องแลปหลักๆเราจะใช้ Facebook Chat กับ Line ครับ

ขอบคุณที่เข้ามาอ่านครับ สวัสดี~~ หวังว่าจะมีประโยชน์สำหรับทุกท่านครับ

Join the Conversation

5 Comments

  1. ขอปรึกษาการใช้ uptimerobot.com ถ้าจะเช็คสถานะคอมพิวเตอร์ โดย ping ด้วย ip ภายในเน็ตเวริก์ของเราเอง มีวิธีทำไหมคับ
    ขอบคุณมาก

  2. หาไม่เจออ่ะครับ applet ที่ทำไว้แล้ว

    1. น่าจะเพราะ service Gmail โดนเอาออกไปจากฝั่ง if ของ iFTTT ครับ ตอนนี้ที่มีอีกอันที่ผมเจอ เป็น https://ifttt.com/applets/140859p-uptimerobot ใช้ rss feed แต่อันนี้ผมยังไม่ได้ลองต่อดูนะครับ
      ขอโทษที่ตอบช้ามากๆครับ ไม่ค่อยได้เช็คบล็อคเท่าไรเลย

    1. เดียวคุยในนี้ก็ได้ครับ ขอโทษด้วยนะครับ ไม่ค่อยได้เช็คบล็อคเลยครับ

Leave a comment

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: