Add function subnets

This commit is contained in:
Marsh232
2022-10-04 23:51:24 +03:00
parent fb79d2a5f2
commit 0213aed56e
2 changed files with 99 additions and 34 deletions
+91 -34
View File
@@ -9,21 +9,29 @@ import logging
from aiogram import Bot, Dispatcher, types from aiogram import Bot, Dispatcher, types
from aiogram.types import ChatType, ParseMode, KeyboardButton, ReplyKeyboardMarkup from aiogram.types import ChatType, ParseMode, KeyboardButton, ReplyKeyboardMarkup
from aiogram.utils import executor from aiogram.utils import executor
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from utils import Config
from utils import Config, FSMachine, FSMContext
storage = MemoryStorage()
config = Config("config.json") config = Config("config.json")
log = logging.getLogger("Bot") log = logging.getLogger("Bot")
bot = Bot(token=config.token) bot = Bot(token=config.token)
dp = Dispatcher(bot) dp = Dispatcher(bot, storage=storage)
network_button = KeyboardButton('🧮Сеть🧮')
subnet_button = KeyboardButton('🕸Подсети🕸')
cancel_button = KeyboardButton('❌Отмена❌')
more_button = KeyboardButton('📝Прочее📝')
network_button = KeyboardButton('Сеть')
subnet_button = KeyboardButton('Подсети')
start_buttons = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=False) start_buttons = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=False)
start_buttons.row(network_button, subnet_button) start_buttons.row(network_button, subnet_button)
start_buttons.add(more_button).add(cancel_button)
def calc_subnet(_ip): def calc_net(_ip):
splt = _ip.split('/') # Разделяет вводимый ip на часть с маской, и без splt = _ip.split('/') # Разделяет вводимый ip на часть с маской, и без
if len(splt) == 1: if len(splt) == 1:
splt.append("24") splt.append("24")
@@ -52,40 +60,59 @@ def calc_subnet(_ip):
return dict_out return dict_out
def subnets(ip, prefix): #def calc_subnets(ip, prefix):
subnet = ipaddress.ip_network(ip, strict=False) # subnet = ipaddress.ip_network(ip, strict=False)
list_subnet = list(subnet.subnets(new_prefix=int(prefix))) # list_subnet = list(subnet.subnets(new_prefix=int(prefix)))
subnet1 = ipaddress.ip_network(str(list_subnet[1]), strict=False) # subnet1 = ipaddress.ip_network(str(list_subnet[1]), strict=False)
#
print('\nМаска:', subnet1.netmask, '=', prefix) # print('\nМаска:', subnet1.netmask, '=', prefix)
print() # print()
#
for i in list_subnet: # for i in list_subnet:
subnet2 = ipaddress.ip_network(i, strict=False) # subnet2 = ipaddress.ip_network(i, strict=False)
print('Network:', subnet2) # print('Network:', subnet2)
print('Broadcast:', subnet2.broadcast_address) # print('Broadcast:', subnet2.broadcast_address)
print('HostMin:', subnet2[1]) # print('HostMin:', subnet2[1])
print('HostMax:', subnet2[-2]) # print('HostMax:', subnet2[-2])
print('Hosts:', len(list((subnet2.hosts())))) # print('Hosts:', len(list((subnet2.hosts()))))
@dp.message_handler(commands=["start"], chat_type=ChatType.PRIVATE) @dp.message_handler(commands=["start"], state=None, chat_type=ChatType.PRIVATE)
async def start(msg: types.Message): async def start(msg: types.Message):
log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'")
await msg.reply(f"Привет, дорогой мой {msg.from_user.username}", reply_markup=start_buttons) await msg.reply(f"Привет {msg.from_user.username}😀, я IP Bot🤖, я могу посчитать🧮 ip и не только.", reply_markup=start_buttons)
@dp.message_handler(lambda msg: msg.text.lower().startswith('сеть')) @dp.message_handler(lambda msg: msg.text.lower().startswith('❌отмена❌'), state="*")
async def calcnet(msg: types.Message): #@dp.message_handler(Text(equals='отмена', ignore_case=True), state="*")
async def cancel_handler(msg: types.Message, state: FSMContext):
current_state = await state.get_state()
if current_state is None:
return
await state.finish()
await msg.reply('Ок🥸')
@dp.message_handler(lambda msg: msg.text.lower().startswith('📝прочее📝'))
async def more_handler(msg: types.Message, state: FSMContext):
await msg.reply(f"📄Все идеи и предложения писать -> @ilassik📄\n"
f"💸Донаты -> www.donationalerts.com/r/ilassik💸",
parse_mode=ParseMode.MARKDOWN,
reply_markup=start_buttons)
@dp.message_handler(lambda msg: msg.text.lower().startswith('🧮сеть🧮'))
async def calcnet(msg: types.Message, state: FSMContext):
log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'")
await msg.reply("Введи ip") await FSMachine.network.set()
await msg.reply("Введите ip")
@dp.message_handler(regexp=r"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}(|\/\d{0,2})$", chat_type=ChatType.PRIVATE) @dp.message_handler(state=FSMachine.network, chat_type=ChatType.PRIVATE)
async def calcnet1(msg): async def calcnet1(msg: types.Message, state: FSMContext):
log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'")
text = msg.text text = msg.text
c = calc_subnet(text) c = calc_net(text)
await msg.reply(f"Вводимые данные: `{c['addr']}`\n" await msg.reply(f"Вводимые данные: `{c['addr']}`\n"
f"Маска: `{c['mask']}`\n" f"Маска: `{c['mask']}`\n"
f"Сеть: `{c['net']}`\n" f"Сеть: `{c['net']}`\n"
@@ -96,19 +123,49 @@ async def calcnet1(msg):
f"Номер в сети: `{c['num']}`", f"Номер в сети: `{c['num']}`",
parse_mode=ParseMode.MARKDOWN, parse_mode=ParseMode.MARKDOWN,
reply_markup=start_buttons) reply_markup=start_buttons)
await state.finish()
@dp.message_handler(lambda msg: msg.text.lower().startswith('подсети')) @dp.message_handler(lambda msg: msg.text.lower().startswith('🕸подсети🕸'))
async def calcsub(msg: types.Message): async def calcsub(msg: types.Message, state: FSMContext):
log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'")
await FSMachine.subnetwork.set()
await msg.reply("**Введите ip с увеличенной маской**"
"**Пример -> 10.10.10.10/24 26**")
@dp.message_handler(state=FSMachine.subnetwork, chat_type=ChatType.PRIVATE)
async def calcsub1(msg: types.Message, state: FSMContext):
log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") log.info(f"New message from {msg.from_user.id}(@{msg.from_user.username}) in {msg.chat.id}: '{msg.text}'")
text = msg.text text = msg.text
splt = text.split(" ") splt = text.split(" ")
if len(splt) > 1: if len(splt) > 1:
ip = splt[1] try:
await msg.reply("Не готова") ip = splt[0]
prefix = splt[1]
subnet = ipaddress.ip_network(ip, strict=False)
list_subnet = list(subnet.subnets(new_prefix=int(prefix)))
subnet1 = ipaddress.ip_network(str(list_subnet[1]), strict=False)
await msg.reply(f"Маска: {subnet1.netmask} = {prefix}")
for i in list_subnet:
subnet2 = ipaddress.ip_network(i, strict=False)
await msg.reply(f"Network: `{subnet2}`\n"
f"Broadcast: `{subnet2.broadcast_address}`\n"
f"HostMin: `{subnet2[1]}`\n"
f"HostMax: `{subnet2[-2]}`\n"
f"Hosts: `{len(list((subnet2.hosts())))}`",
parse_mode=ParseMode.MARKDOWN,
reply_markup=start_buttons)
await state.finish()
except IndexError:
await msg.reply("**😡Вы ввели неправильно**😡\n"
"**🤓Попробуйте ещё раз🤓**",
parse_mode=ParseMode.MARKDOWN)
else: else:
await msg.reply("**Командна введена не правильно**\n" await msg.reply("**😡ВЫ ввели неправильно**😡\n"
"Пример выполнения команды: `/calcsub 192.168.0.1/24 26`", "🤓Пример ввода: ` 192.168.0.1/24 26`🤓",
parse_mode=ParseMode.MARKDOWN) parse_mode=ParseMode.MARKDOWN)
+8
View File
@@ -6,6 +6,9 @@ import logging
import json import json
import os import os
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)-29s - %(levelname)-5s - %(message)s") logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)-29s - %(levelname)-5s - %(message)s")
@@ -53,3 +56,8 @@ class Cache:
self.log.debug("Cannot found cache file at %s. Creating file..." % self.cache_file) self.log.debug("Cannot found cache file at %s. Creating file..." % self.cache_file)
with open(self.cache_file, 'x', encoding='utf-8') as f: with open(self.cache_file, 'x', encoding='utf-8') as f:
json.dump(self.raw_cache, f) json.dump(self.raw_cache, f)
class FSMachine(StatesGroup):
network = State()
subnetwork = State()