AzPyCoder
@AzPyCoder
Начинающий Python кодер ...

Как узнать количество секций в config.ini заданных пользователем?

Доброго времени суток Уважаемые кодеры,
Я только начинаю свой путь в познании этого языка, ну и как все новички решил взяться сразу за свою идею. Помаленьку продвигаюсь но утром проснувшись понял что сделал ошибку. Начал искать решение но не нашел (( Сорри за лирическое отступление ....

Суть вопроса:
Есть консольная программка на Python3 :
618cb6d4b90c1812662544.png
которая должна пинговать (не реализованно) заданные пользователем в config.ini сетевые узлы (камеры) и выводить их доступность (UP / DOWN) в консоли. Если пользователь ввел 100 секций по заданному шаблону в конфиге а в программе прописанно все 10 то как быть? Как проверить и запустить программу в соответствии с количеством секций? Может как то можно не писать их в коде Python по отдельности?
config.ini
[cam1]
pos=1
name=cam1
area=1-st floor
ip=10.0.1.23
mac=00:1A:C2:7B:00:47

[cam2]
pos=2
name=cam2
area=2-nd floor
ip=10.0.1.24
mac=00:4A:C2:7B:10:42

[cam3]
pos=3
name=cam3
area=3-rd floor
ip=10.0.1.25
mac=00:43:C2:7B:F0:13

Написал 3 секции для примера. В моем конфиге их на данный момент 9 секций.

И сама программка:
import os
import sys
import configparser  # импортируем библиотеку для чтения INI файлов
import colorama # импортируем библиотеку для добавления цвета
from colorama import Fore, Back, Style
colorama.init()

config = configparser.ConfigParser()  # создаём объекта парсера
config.read("config.ini")  # читаем конфиг

print()
print(Fore.YELLOW + 'IP CCTV monitoring system')
print(Style.RESET_ALL)

# 1-ая строчка мониторинга
cam1a = config["cam1"]["pos"]
cam1b = config["cam1"]["name"]
cam1c = config["cam1"]["area"]
cam1d = config["cam1"]["ip"]
cam1e = config["cam1"]["mac"]
cam1f = True
cam1g = "16:25"

# 2-ая строчка мониторинга
cam2a = config["cam2"]["pos"]
cam2b = config["cam2"]["name"]
cam2c = config["cam2"]["area"]
cam2d = config["cam2"]["ip"]
cam2e = config["cam2"]["mac"]
cam2f = True
cam2g = "16:25"

# 3-ья строчка мониторинга
cam3a = config["cam3"]["pos"]
cam3b = config["cam3"]["name"]
cam3c = config["cam3"]["area"]
cam3d = config["cam3"]["ip"]
cam3e = config["cam3"]["mac"]
cam3f = False
cam3g = "16:25"

# 4-ая строчка мониторинга
cam4a = config["cam4"]["pos"]
cam4b = config["cam4"]["name"]
cam4c = config["cam4"]["area"]
cam4d = config["cam4"]["ip"]
cam4e = config["cam4"]["mac"]
cam4f = True
cam4g = "16:25"

# 5-ая строчка мониторинга
cam5a = config["cam5"]["pos"]
cam5b = config["cam5"]["name"]
cam5c = config["cam5"]["area"]
cam5d = config["cam5"]["ip"]
cam5e = config["cam5"]["mac"]
cam5f = True
cam5g = "16:25"

# 6-ая строчка мониторинга
cam6a = config["cam6"]["pos"]
cam6b = config["cam6"]["name"]
cam6c = config["cam6"]["area"]
cam6d = config["cam6"]["ip"]
cam6e = config["cam6"]["mac"]
cam6f = True
cam6g = "16:25"

# 7-ая строчка мониторинга
cam7a = config["cam7"]["pos"]
cam7b = config["cam7"]["name"]
cam7c = config["cam7"]["area"]
cam7d = config["cam7"]["ip"]
cam7e = config["cam7"]["mac"]
cam7f = True
cam7g = "16:25"

# 8-ая строчка мониторинга
cam8a = config["cam8"]["pos"]
cam8b = config["cam8"]["name"]
cam8c = config["cam8"]["area"]
cam8d = config["cam8"]["ip"]
cam8e = config["cam8"]["mac"]
cam8f = True
cam8g = "16:25"

# 9-ая строчка мониторинга
cam9a = config["cam9"]["pos"]
cam9b = config["cam9"]["name"]
cam9c = config["cam9"]["area"]
cam9d = config["cam9"]["ip"]
cam9e = config["cam9"]["mac"]
cam9f = True
cam9g = "16:25"

# Условие проверки статуса первой строчки
if cam1f:
    cam1f = "\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam1f == False:
    cam1f = "\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam1a, cam1b, cam1c, cam1d, cam1e, cam1f, cam1g, sep=" | ")

# Условие проверки статуса второй строчки
if cam2f:
    cam2f = "\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam2f == False:
    cam2f = "\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam2a, cam2b, cam2c, cam2d, cam2e, cam2f, cam2g, sep=" | ")

# Условие проверки статуса третьей строчки
if cam3f == True:
    cam3f = "\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam3f == False:
    cam3f = "\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam3a, cam3b, cam3c, cam3d, cam3e, cam3f, cam3g, sep=" | ")

# Условие проверки статуса четвертой строчки
if cam4f:
    cam4f = "\033[4m\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam4f == False:
    cam4f = "\033[4m\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam4a, cam4b, cam4c, cam4d, cam4e, cam4f, cam4g, sep=" | ")

# Условие проверки статуса пятой строчки
if cam5f:
    cam5f = "\033[4m\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam5f == False:
    cam5f = "\033[4m\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam5a, cam5b, cam5c, cam5d, cam5e, cam5f, cam5g, sep=" | ")

# Условие проверки статуса шестой строчки
if cam6f:
    cam6f = "\033[4m\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam6f == False:
    cam6f = "\033[4m\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam6a, cam6b, cam6c, cam6d, cam6e, cam6f, cam6g, sep=" | ")

# Условие проверки статуса седьмой строчки
if cam7f:
    cam7f = "\033[4m\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam7f == False:
    cam7f = "\033[4m\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam7a, cam7b, cam7c, cam7d, cam7e, cam7f, cam7g, sep=" | ")

# Условие проверки статуса восьмой строчки
if cam8f:
    cam8f = "\033[4m\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam8f == False:
    cam8f = "\033[4m\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam8a, cam8b, cam8c, cam8d, cam8e, cam8f, cam8g, sep=" | ")

# Условие проверки статуса девятой строчки
if cam9f:
    cam9f = "\033[4m\033[37m\033[42m{}\033[0m".format(' UP ')
elif cam9f == False:
    cam9f = "\033[4m\033[37m\033[41m{}\033[0m".format('DOWN')

print(cam9a, cam9b, cam9c, cam9d, cam9e, cam9f, cam9g, sep=" | ")

input() # Работа программы до нажатия какой либо клавиши
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
Учим основы питона про словари и списки, учим циклы и используем

import configparser
from datetime import time
from pprint import pprint

config = configparser.ConfigParser()  # создаём объекта парсера
config.read("conf.ini")  # читаем конфиг
my_config_parser_dict = {s: dict(config.items(s)) for s in config.sections()}

for block in my_config_parser_dict.values():
    block['bool'] = True
    block['time'] = time(15, 20)
    print(*block.values(), sep='|')

print()
pprint(my_config_parser_dict)


вывод

1|cam1|1-st floor|10.0.1.23|00:1A:C2:7B:00:47|True|15:20:00
2|cam2|2-nd floor|10.0.1.24|00:4A:C2:7B:10:42|True|15:20:00
3|cam3|3-rd floor|10.0.1.25|00:43:C2:7B:F0:13|True|15:20:00

{'cam1': {'area': '1-st floor',
          'bool': True,
          'ip': '10.0.1.23',
          'mac': '00:1A:C2:7B:00:47',
          'name': 'cam1',
          'pos': '1',
          'time': datetime.time(15, 20)},
 'cam2': {'area': '2-nd floor',
          'bool': True,
          'ip': '10.0.1.24',
          'mac': '00:4A:C2:7B:10:42',
          'name': 'cam2',
          'pos': '2',
          'time': datetime.time(15, 20)},
 'cam3': {'area': '3-rd floor',
          'bool': True,
          'ip': '10.0.1.25',
          'mac': '00:43:C2:7B:F0:13',
          'name': 'cam3',
          'pos': '3',
          'time': datetime.time(15, 20)}}

Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Изучите циклы.
Ответ написан
shabelski89
@shabelski89
engineer
Я думаю можно как-то так.
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)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы