First commit

This commit is contained in:
2023-01-10 15:40:35 +02:00
commit 052d29fdea
4 changed files with 215 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.venv
.vscode
__pycache__
*.session
*.env

77
main.py Normal file
View File

@@ -0,0 +1,77 @@
#############################################
#
# 1. Check Permissions.
# 2. IP address validation.
# 3. Notify detect change.add()
# 4. Add disable handler
#############################################
from os import getenv
import re
from telethon import TelegramClient, events, custom
from telethon.tl.custom.button import Button
from telethon.tl.custom.message import Message
from datetime import datetime, timedelta, time
import asyncio
from pinger import Pinger
from dotenv import load_dotenv
IP_ADDRESS_REGEX = '^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)){4}$'
def main():
load_dotenv()
pinger = Pinger()
client = TelegramClient("pinger", getenv("API_ID"), getenv("API_HASH"))
async def send_telegram_message(result):
# print(result)
await client.send_message(383724428, str(result))
async def check_pings():
await pinger.start(send_telegram_message)
@client.on(events.NewMessage(pattern="/start"))
async def start(event:Message):
if event.is_private:
await event.respond("שלום")
# @client.on(events.NewMessage(pattern="/help"))
# async def help(event:Message):
# asyncio.create_task(help_message(event))
@client.on(events.NewMessage(pattern="/enable"))
async def enable(event:Message):
if event.is_private:
asyncio.create_task(check_pings())
await event.reply("Enable")
@client.on(events.NewMessage(pattern="/disable"))
async def disable(event:Message):
if event.is_private:
await pinger.stop()
await event.reply("Stopping...")
@client.on(events.NewMessage(pattern="/add_ip"))
async def add_ip(event:Message):
if event.is_private:
ip = event.raw_text.split(" ")[1]
if re.search(ip):
await pinger.add_new_ip(event.raw_text.split(" ")[1])
@client.on(events.NewMessage(pattern="/del_ip"))
async def del_ip(event:Message):
if event.is_private:
await pinger.del_ip(event.raw_text.split(" ")[1])
client.start(bot_token=f'{getenv("BOT_TOKEN")}')
print("Client was started!")
client.loop.create_task(check_pings())
client.run_until_disconnected()
if __name__ == "__main__":
main()

78
pinger.py Normal file
View File

@@ -0,0 +1,78 @@
import asyncio
class Pinger():
def __init__(self):
self.enabled = False
self.ips_list = []
self.ips_running_list = []
async def add_new_ip(self, ip):
self.ips_list.append(ip)
async def del_ip(self, ip):
self.ips_list.remove(ip)
async def start(self, fn):
self.enabled = True
asyncio.create_task(self.ping_all(fn))
async def stop(self):
self.enabled = False
while len(self.ips_running_list) > 0:
await asyncio.sleep(0)
async def notify_ping(self, ip, fn):
success = False
cmd = f"ping -c 1 -W 5 -q {ip}"
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
stdout, stderr = await proc.communicate()
# print(f'[{cmd!r} exited with {proc.returncode}]')
if stdout:
output = f'[stdout]\n{stdout.decode()}'
success = bool(int((output.split(",")[1].strip()[0])))
# if stderr:
# print(f'[stderr]\n{stderr.decode()}')
await fn(str({"ip" : ip, "success": success}))
return ip
async def ping_all(self, fn):
def on_done(task_ip: asyncio.Task):
ip = task_ip.result()
self.ips_running_list.remove(ip)
while self.enabled:
for ip in self.ips_list:
if ip not in self.ips_running_list:
task = asyncio.create_task(self.notify_ping(ip, fn))
self.ips_running_list.append(ip)
task.add_done_callback(on_done)
else:
await asyncio.sleep(0)
await asyncio.sleep(0)
async def output_print(result):
print(result)
async def main():
p = Pinger()
await p.add_new_ip("192.168.14.121")
await p.add_new_ip("8.8.8.8")
await p.start(output_print)
await asyncio.sleep(20)
await p.stop()
print("Finished!")
if __name__ == "__main__":
asyncio.run(main())

55
text.py Normal file
View File

@@ -0,0 +1,55 @@
import asyncio
import time
async def say_after(delay, what):
print(1)
await asyncio.sleep(delay)
print(what)
async def say_after2(delay, what):
print(2)
await asyncio.sleep(delay)
print(what)
async def say_after3(delay, what):
print(3)
await asyncio.sleep(delay)
print(what)
async def main():
l = []
await say_after3(3, "delay1")
task1 = asyncio.create_task(
say_after(1, 'hello'))
task2 = asyncio.create_task(
say_after2(2, 'world'))
l.append(task1)
l.append(task2)
task1.add_done_callback(l.remove)
task2.add_done_callback(l.remove)
await say_after3(3, "delay2")
print(f"started at {time.strftime('%X')}")
# Wait until both tasks are completed (should take
# around 2 seconds.)
# await task1
# await task2
while len(l) != 0:
print("wait...")
await asyncio.sleep(1)
print(f"finished at {time.strftime('%X')}")
if __name__ == "__main__":
asyncio.run(main())