Я работаю над созданием встроенного сетевого устройства (на основе Linux) и столкнулся с необходимостью динамического создания файлов conf-файлов daemon. Таким образом, мне нужно иметь возможность выполнять вычисления сетевых адресов в коде python, который будет создавать файлы conf. Я не программист, поэтому я боюсь, что написал модуль, который не сможет функционировать, как я надеялся, когда устройство начнет поставляться.Python Network/cidr Calculations
Ниже приведено то, что у меня есть до сих пор, оно действительно собрано вместе с тем, что я мог найти на этом сайте и в Google.
Есть ли лучший способ найти сетевой адрес и cidr для сетевого интерфейса? Преобразование сетевой маски в бин-стрит и подсчет 1 кажется довольно неэлегантным.
import socket
import fcntl
import struct
SIOCGIFNETMASK = 0x891b
SIOCGIFADDR = 0x8915
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def _GetIfaceMask(iface):
return struct.unpack('L', fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', iface))[20:24])[0]
def _GetIfaceAddr(iface):
return struct.unpack('L', fcntl.ioctl(s, SIOCGIFADDR, struct.pack('256s', iface[:15]))[20:24])[0]
def GetIfaceNet(iface):
net_addr = _GetIfaceAddr(iface) & _GetIfaceMask(iface)
return socket.inet_ntoa(struct.pack('L', net_addr))
def GetIfaceCidr(iface):
bin_str = bin(_GetIfaceMask(iface))[2:]
cidr = 0
for c in bin_str:
if c == '1': cidr += 1
return cidr
Спасибо за любой вклад, я действительно немного потерял на этом. Если это не место для такого типа отзывов, пожалуйста, дайте мне знать.
Вы пробовали '' netaddr' или ipaddr' модули? – jfs
Ах! Я полагал, что кто-то, должно быть, уже сделал это, спасибо @sebastian – tMC