Я думаю можно как-то так.
1) Циклы
2) Классы
3) Выполнение и перехват процессов ОС
4) форматирование вывода - тут ещё нужно подумать над выравниванием
to do
1) сейчас реализован разовый запуск и проверка по списку, в идеале чтобы висел непрерывно
from configparser import ConfigParser
from enum import IntEnum
import subprocess
from datetime import datetime
import colorama
from colorama import Fore, Style
class Status(IntEnum):
UP = 1
DOWN = 2
class PingStatus(IntEnum):
success = 0
failed = 2
class Camera:
def __init__(self, pos: int, name: str, area: str, ip: str, mac: str):
self.pos = pos
self.name = name
self.area = area
self.ip = ip
self.mac = mac
self.status = None
self.dt = None
def __repr__(self):
return "|".join([str(x).ljust(15) for x in vars(self).values()])
def check_status(self):
result = subprocess.call('ping %s -n 2' % self.ip, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
if result == PingStatus.success:
self.status = "\033[4m\033[37m\033[42m{}\033[0m".format(Status.UP.name)
elif result == PingStatus.failed:
self.status = "\033[4m\033[37m\033[41m{}\033[0m".format(Status.DOWN.name)
else:
self.status = "\033[4m\033[37m\033[41m{}\033[0m".format(Status.DOWN.name)
self.dt = datetime.now().strftime("%Y.%m.%d %H:%M")
if __name__ == "__main__":
colorama.init()
print(Fore.YELLOW + 'IP CCTV monitoring system')
print(Style.RESET_ALL)
config = ConfigParser()
config.read('config.ini')
cams = {config[x]['name']: Camera(pos=int(config[x]['pos']), name=config[x]['name'], area=config[x]['area'],
mac=config[x]['mac'], ip=config[x]['Ip'])
for x in config.sections() if x.startswith('cam')}
for cam in cams.values():
cam.check_status()
print(cam)