126 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from threading import Thread
 | |
| from telegram import Bot, error
 | |
| from asics import ASICs
 | |
| from time import sleep
 | |
| from mysql.connector import connect, Error
 | |
| from macros import *
 | |
| import os, json, asyncio
 | |
| 
 | |
| 
 | |
| class TGThread(Thread):
 | |
| 	conn = None
 | |
| 	bot = None
 | |
| 	asics = {}
 | |
| 
 | |
| 
 | |
| 	def __init__(self, event, event2):
 | |
| 		super(TGThread, self).__init__()
 | |
| 		self.event = event
 | |
| 		self.event2 = event2
 | |
| 
 | |
| 
 | |
| 	async def sendmsg(self, msg):
 | |
| 		return await self.bot.send_message(CONF.get('telegram', 'channel'), msg, 'MarkdownV2')
 | |
| 
 | |
| 
 | |
| 	async def check(self):
 | |
| 		msg = []
 | |
| 
 | |
| 		for i in self.asics.keys():
 | |
| 			self.asics[i]['tooff'] -= 1
 | |
| 
 | |
| 		with self.conn.cursor(dictionary=True) as c:
 | |
| 			c.execute(f"SELECT * FROM `laststate`")
 | |
| 
 | |
| 			for i in c.fetchall():
 | |
| 				if not i['mac'] in self.asics.keys():
 | |
| 					self.asics[i['mac']] = {}
 | |
| 					self.asics[i['mac']]['alert'] = 0
 | |
| 
 | |
| 					msg.append(f"🟢 {i['location']} \| ASIC \"*{ASICs(i['type']).name}*\" `{i['ip']}` online\!")
 | |
| 
 | |
| 				self.asics[i['mac']]['tooff']  = 3
 | |
| 				self.asics[i['mac']]['status'] = i['status']
 | |
| 
 | |
| 				if i['status'] == 'crit':
 | |
| 					if CONF.get('telegram', 'crit-notify') and self.asics[i['mac']]['alert'] < 2:
 | |
| 						msg.append(f"🔴 {i['location']} \| ASIC \"*{ASICs(i['type']).name}*\" `{i['ip']}` crit status\!")
 | |
| 					self.asics[i['mac']]['alert'] = 2
 | |
| 				elif i['status'] == 'warn':
 | |
| 					if CONF.get('telegram', 'warn-notify') and self.asics[i['mac']]['alert'] < 1:
 | |
| 						msg.append(f"🟡 {i['location']} \| ASIC \"*{ASICs(i['type']).name}*\" `{i['ip']}` warn status\!")
 | |
| 					self.asics[i['mac']]['alert'] = 1
 | |
| 				elif i['status'] == 'ok':
 | |
| 					if CONF.get('telegram', 'normal-notify') and self.asics[i['mac']]['alert'] != 0:
 | |
| 						msg.append(f"🟢 {i['location']} \| ASIC \"*{ASICs(i['type']).name}*\" `{i['ip']}` normal status\!")
 | |
| 					self.asics[i['mac']]['alert'] = 0
 | |
| 
 | |
| 				if self.asics[i['mac']]['tooff'] <= 0:
 | |
| 					msg.append(f"🔴 {i['location']} \| ASIC \"*{ASICs(i['type']).name}*\" `{i['ip']}` offline\!")
 | |
| 					del self.asics[i['mac']]
 | |
| 
 | |
| 		if len(msg) > 0:
 | |
| 			await self.sendmsg('\n'.join(msg))
 | |
| 
 | |
| 
 | |
| 	async def runbot(self):
 | |
| 		try:
 | |
| 			res = await self.sendmsg('🟢 *Notify server online\!*')
 | |
| 			INFO(f"Telegram channel ID: {res['chat']['id']}")
 | |
| 
 | |
| 			while 1:
 | |
| 				if self.event.is_set():
 | |
| 					SUCC('Telegram stopped!')
 | |
| 					await self.sendmsg('🟡 Updating software\! Recommend check all running instances.')
 | |
| 					break
 | |
| 
 | |
| 				await self.check()
 | |
| 				await asyncio.sleep(15)
 | |
| 
 | |
| 		except error.Forbidden as e:
 | |
| 			WARN(str(e))
 | |
| 		except error.TimedOut as e:
 | |
| 			WARN(str(e))
 | |
| 		except Exception as e:
 | |
| 			CRIT(str(e))
 | |
| #			os._exit(1)
 | |
| 
 | |
| 
 | |
| 	async def stopalert(self):
 | |
| 		while 1:
 | |
| 			if self.event2.is_set():
 | |
| 				await self.sendmsg('🔴 *Notify server offline\!*')
 | |
| 
 | |
| 			await asyncio.sleep(0.5)
 | |
| 
 | |
| 
 | |
| 	async def main(self):
 | |
| 		await asyncio.gather(self.stopalert(), self.runbot())
 | |
| 
 | |
| 
 | |
| 	def run(self):
 | |
| 		try:
 | |
| 			if CONF.get('telegram', 'enable'):
 | |
| 				SUCC('Telegram started!')
 | |
| 
 | |
| 				self.conn = connect(
 | |
| 					host=CONF.get('db', 'host'),
 | |
| 					user=CONF.get('db', 'user'),
 | |
| 					password=CONF.get('db', 'password'),
 | |
| 					database=CONF.get('db', 'name'))
 | |
| 				self.conn.autocommit = True
 | |
| 
 | |
| 				self.bot = Bot(CONF.get('telegram', 'token'))
 | |
| 
 | |
| 				asyncio.run(self.main())
 | |
| 			else:
 | |
| 				while 1:
 | |
| 					if self.event.is_set():
 | |
| 						SUCC('Telegram stopped!')
 | |
| 						break
 | |
| 
 | |
| 					sleep(5)
 | |
| 		except Exception as e:
 | |
| 			CRIT(str(e))
 | |
| 			os._exit(1)
 |