/
Igor.Agf
/
Promitey-DHCP-Core
Обзор
Документация
Войти
/
Igor.Agf
/
Promitey-DHCP-Core
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
api/utils.py
60 строк
2 KB
Igor.Agf
Добавлено функция просмотра выданных IP
01 июн 2026, 22:12
01 июн 2026, 22:12
63dfb4d
Код
Авторство
О чём код?
import re from datetime import datetime def parse_dhcp_leases(content): """ Парсит содержимое dhcpd.leases и возвращает список словарей. """ leases = [] pattern = re.compile( r'lease\s+([\d\.]+)\s+\{\s*' r'(?:starts \d+ ([\d/]+\s[\d:]+);\s*)?' r'(?:ends \d+ ([\d/]+\s[\d:]+);\s*)?' r'(?:tstp \d+ [\d/]+\s[\d:]+;\s*)?' r'(?:tsfp \d+ [\d/]+\s[\d:]+;\s*)?' r'(?:atsfp \d+ [\d/]+\s[\d:]+;\s*)?' r'(?:cltt \d+ ([\d/]+\s[\d:]+);\s*)?' r'(?:binding state (active|free|expired|released|abandoned|backup);\s*)?' r'(?:next binding state [\w]+;\s*)?' r'(?:rewind binding state [\w]+;\s*)?' r'(?:hardware ethernet ([\da-f:]+);\s*)?' r'(?:uid [\w\$]+;\s*)?' r'(?:client-hostname "([^"]+)";\s*)?' r'\}', re.IGNORECASE ) for match in pattern.finditer(content): ip = match.group(1) starts = match.group(2) ends = match.group(3) cltt = match.group(4) # time of last transaction state = match.group(5) or 'unknown' mac = match.group(6) hostname = match.group(7) lease = { 'ip': ip, 'mac': mac.upper() if mac else None, 'hostname': hostname, 'starts': parse_isotime(starts) if starts else None, 'ends': parse_isotime(ends) if ends else None, 'cltt': parse_isotime(cltt) if cltt else None, 'state': state.lower(), 'active': state.lower() == 'active', } leases.append(lease) # Сортируем по IP leases.sort(key=lambda x: [int(i) for i in x['ip'].split('.')]) return leases def parse_isotime(s): """Преобразует строку вида '2024/04/05 12:34:56' в ISO формат.""" try: dt = datetime.strptime(s.strip(), '%Y/%m/%d %H:%M:%S') return dt.isoformat() except: return s