Как я создавал файл конфигурации DHCP из таблицы Excel при помощи Python

от автора

Я решил поставить DHCP сервер на Linux, но была небольшая проблема, у нас не было текущего DHCP сервера (все ip были статическими), карты сети, списка ip и mac адресов. Я сканировал сеть получил список mac и ip, распечатал и мы с коллегой пошли записывать фамилии тех, у кого эти mac адреса. Потом я внес все это в таблицу excel (таблица 1).

Таблица 1

Кабинет

Имя ПК

ФИО

IP

MAC

1

1-1

Иванов
Иван
Иванович

192.168.0.10

00:00:00:00:00:00

Полгода спустя я все-таки решил заняться установкой DHCP сервера. Для резервирования ip надо было прописать это все в config. Но из-за того, что в таблице было примерно 75 строк с mac, ip, фамилиями, было как-то лень прописывать это все вручную и я решил создать python скрипт, который сам все это сделает.

Пример файла dhcp.conf:

host Lastname { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.0.1; }
  • Lastname — Фамилия пользователя.

  • hardware ethernet — MAC адрес.

  • fixed-address — ip адрес для резервирования.

Текущая таблица не подходила из-за того, что ФИО в ней полно. Я создал новую таблицу (таблица 2) и переписал фамилии на латиницу.

Таблица 2

name

mac

ip

Ivanov

00:00:00:00:00:00

192.168.0.10

Далее я начал писать скрипт на python, получилось 3 варианта скрипта.

Библиотеки xlrd и pandas 1строчку в таблице excel не включают в список считая ее оглавлением столбцов.


Вариант 1

Хотел использовать библиотеку pandas но она не завелась и решил использовать списки. Для того что бы заключить все строки в скобки воспользовался инструментом excel. С протяжкой формулы.

="'"&A1&"'," - для столбца name ="'"&B1&"'," - для столбца mac ="'"&C1&"'," - для столбца ip

Получилось так (таблица 3).

Таблица 3

name

mac

ip

‘Ivanov’

’00:00:00:00:00:00′,

‘192.168.0.10’

Далее внес это все в списки и просто пробегался циклом.

mac=['00:00:00:00:00:00', ...] ip=['192.168.0.10', ...] name=['Ivanov', ...]  def write():     with open("dhcp.conf", 'w') as f:         for i,j,k in zip(Config.name, Config.mac, Config.ip):             f.write(f"host {i}" + " {\n\thardware ethernet" + f" {j};" + "\n\tfixed-address " + f"{k};" + "\n}\n\n")  if __name__ == '__main__':     write()

Создаем 3 списка:

  • mac — для mac адресов

  • ip -для ip адресов

  • name — для фамилий пользователей

mac=['00:00:00:00:00:00', ...] ip=['192.168.0.10', ...] name=['Ivanov', ...]

Создаем функцию:

def write():

Открываем файл dhcp.conf в режиме записи:

with open("dhcp.conf", 'w') as f:

Проходимся циклом по спискам. zip — функция берёт на вход несколько списков и создаёт из них список (кортеж):

for i,j,k in zip(Config.name, Config.mac, Config.ip):

Записываем в файл:

f.write(f"host {i}" + " {\n\thardware ethernet" + f" {j};" + "\n\tfixed-address " + f"{k};" + "\n}\n\n")

Вызываем функцию:

if __name__ == '__main__':     write()

Вариант 2

Пользовался таблицей 2 и библиотекой xlrd.

Библиотека не поддерживает xlsx формат поэтому пришлось сохранить файл в формат xls.

import xlrd  def write():     loc = (r"C:\path\to\file\filename.xls")     sheet = xlrd.open_workbook(loc).sheet_by_index(0)     with open("dhcp.conf", 'w') as f:         for i in range(sheet.nrows):             f.write(f"host {sheet.cell_value(i, 0)}" + " {\n\thardware ethernet" + f" {sheet.cell_value(i,1)};" + "\n\tfixed-address " + f"{sheet.cell_value(i,2)};" + "\n}\n\n")              if __name__ == '__main__':     write()

Импортируем библиотеку для возможности ее использования:

import xlrd

Объявляем функцию:

def write():

Открываем excel и лист с индексом 0:

loc = (r"C:\path\to\file\filename.xls") sheet = xlrd.open_workbook(loc).sheet_by_index(0)

Данный фрагмент можно записать во так:

sheet = xlrd.open_workbook(r"C:\path\to\file\filename.xls").sheet_by_index(0)

Открываем файл на запись:

with open("dhcp.conf", 'w') as f:

Пробегаемся циклом по количеству строк. Где ‘sheet.nrows’ показывает количество строк:

 for i in range(sheet.nrows):

Записываем в файл. sheet.cell_value(i, 0) — считываем значение с поля где i — строка, 0 — столбец:

f.write(f"host {sheet.cell_value(i, 0)}" + " {\n\thardware ethernet" + f" {sheet.cell_value(i,1)};" + "\n\tfixed-address " + f"{sheet.cell_value(i,2)};" + "\n}\n\

Вызываем функцию:

if __name__ == '__main__':     write()

Вариант 3

Пользовался таблицей 2 и библиотекой pandas.

import pandas as pd  def write():     excel = pd.read_excel(r'C:\path\to\file\filename.xlsx')     with open("dhcp.conf", 'w') as f:         for i, j, k in zip(excel["Name"].tolist(), excel["MAC"].tolist(), excel["IP"].tolist()):              f.write(f"host {i}" + " {\n\thardware ethernet" + f" {j};" + "\n\tfixed-address " + f"{k};" + "\n}\n\n")      if __name__ == '__main__':     write()

Подключаем библиотеку. as — создание псевдонима:

import pandas as pd

Создаем функцию:

def write():

Считываем данные из excel:

excel = pd.read_excel(r'C:\path\to\file\filename.xlsx')

Открываем файл для чтения:

with open("dhcp.conf", 'w') as f:

Пробегаемся циклом по спискам:

for i, j, k in zip(excel["Name"].tolist(), excel["MAC"].tolist(), excel["IP"].tolist()):

Выбираем столбцы, у которого название ‘Name’, ‘mac’, ‘ip’. Создаем из них список:

excel["Name"].tolist(), excel["MAC"].tolist(), excel["IP"].tolist

Что бы посмотреть, как pandas видит оглавление excel используется следующая строчка:

print (excel.columns.ravel())

Записываем в файл:

f.write(f"host {i}" + " {\n\thardware ethernet" + f" {j};" + "\n\tfixed-address " + f"{k};" + "\n}\n\n

Вызываем функцию:

if __name__ == '__main__':     write()

Вывод всех вариантов скриптов в dhcp.conf:

host Ivanov { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.0.10; }

Надеюсь, кому-нибудь это будет полезно.

PS: это моя первая статья


ссылка на оригинал статьи https://habr.com/ru/post/682558/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *