Telegram message listener를 이용한 nginx start & stop
- 정각 알림용으로 메시지를 받고있는 Telegram bot을 이용해 메시지를 보내면 code-server에 사용중인 Nginx 서비스를 시작하고 중지되게 해봤습니다.
- code-server를 혼자 사용중이라 안쓸 때 보안상 닫고 싶은데 좀 더 편한 방법일까 싶어 작성해봤네요. (Update: Mar 31, 2021)
환경 구성
- OS: CentOS 7 (on Oracle cloud VM)
- Code-server: 3.9.0-amd64.rpm
- Nginx: 1.16.1
- Python: v3.6.8
- Linux shell, cron and pyTelegramBotAPI
1. Test Telegram bot listener
;Telegram bot 생성은 생략했습니다. 다음에 기회가되면 남길께요.
USER1@SVR1 ~]$ sudo pip install pyTelegramBotAPI
import telebot
TOKEN = '1234567890:AHC4Roy_cgiiQWjiX8Pl_rZY61_DAnMlMbc'
def listener(messages):
for m in messages:
chat_id = str(m.chat.id)
user_id = m.chat.username
if m.content_type == 'text':
text = m.text
if text == 'start nginx':
print(user_id + '(' + chat_id + ') : ', 'Yes, Start Nginx')
elif text == 'stop nginx':
print(user_id + '(' + chat_id + ') : ', 'Yes, Stop Nginx')
elif text == 'restart nginx':
print(user_id + '(' + chat_id + ') : ', 'Yes, Restart Nginx')
else:
print(user_id + '(' + chat_id + ') : ', text)
bot = telebot.TeleBot(TOKEN)
bot.set_update_listener(listener)
bot.polling()
bot.polling(none_stop=False, interval=0, timeout=20)
# Upon calling this function, TeleBot starts polling the Telegram servers for new messages.
# - none_stop: True/False (default False) - Don't stop polling when receiving an error from the Telegram servers
# - interval: True/False (default False) - The interval between polling requests
# Note: Editing this parameter harms the bot's response time
# - timeout: integer (default 20) - Timeout in seconds for long polling.
# Ref. https://pypi.org/project/pyTelegramBotAPI/
; 메신저 bot에게 메시지를 보내면…
; 조건에 따라 print 합니다.
USER1@SVR1 ~]$ python3 TelegramBot_msgListener-test.py
helloman(12341234) : Yes, Start Nginx
helloman(12341234) : Yes, Stop Nginx
helloman(12341234) : Yes, Restart Nginx
helloman(12341234) : hello?
helloman(12341234) : 안녕하세요?
2. Nginx start & stop with TelegramBot
; 아래 Python code를 실행하고 Telegram bot에게 메시지를 보내면 조건문에 맞게 동작합니다.
import telebot, os
TOKEN = '1234567890:AHC4Roy_cgiiQWjiX8Pl_rZY61_DAnMlMbc'
def listener(messages):
for m in messages:
chat_id = str(m.chat.id)
user_id = m.chat.username
if m.content_type == 'text':
text = m.text
if text == 'start nginx':
bot.send_message(chat_id, text='OK! start Nginx')
os.system('sudo systemctl start nginx.service')
elif text == 'stop nginx':
bot.send_message(chat_id, text='OK! stop Nginx')
os.system('sudo systemctl stop nginx.service')
elif text == 'restart nginx':
bot.send_message(chat_id, text='OK! restart Nginx')
os.system('sudo systemctl restart nginx.service')
else:
bot.send_message(chat_id, text='Hmm... interesting.')
bot = telebot.TeleBot(TOKEN)
bot.set_update_listener(listener)
bot.polling()
bot.polling(none_stop=False, interval=0, timeout=20)
; 호기심에 구글링 후 만들어봤는데 이제 편하게 누워서도 code-server에 접근 못하도록 nginx를 내릴 수 있겠네요^^