Преобразование формата файла правил статической маршрутизации Linux с использованием Python - PullRequest
0 голосов
/ 02 мая 2018

Я хочу преобразовать правила конфигурации статического маршрута, хранящиеся в / etc / sysconfig / network-scripts / route- interface файл в Linux из этого формата

ADDRESS0=X.X.X.X
NETMASK0=X.X.X.X
GATEWAY0=X.X.X.X
ADDRESS1=X.X.X.X
NETMASK1=X.X.X.X
GATEWAY1=X.X.X.X

до

X.X.X.X/X via X.X.X.X  (i.e) IP/prefix via Gateway
X.X.X.X/X via X.X.X.X

с использованием Python.

Есть ли какая-либо библиотека для этого?

Я пробовал это следующим образом (пока не завершено):

import glob
import fileinput
import os,sys

files = glob.glob('./route-*')
if files:
    for f in files:
        if os.path.isfile(f):
           listoflines = []
           i = 0
           for line in open(f):
               flag = 0
               if line.startswith("ADDRESS" + str(i)):
                   listoflines.append([])
                   listoflines[i].append(line.strip().split("=")[1])
                   flag = 1
               elif line.startswith("NETMASK" + str(i)):
                   netmask = line.strip().split("=")[1]
                   prefix = sum([bin(int(n)).count("1") for n in netmask.split(".")])
                   listoflines[i][0] = listoflines[i][0] + "/" + str(prefix)
                   flag = 2
               elif line.startswith("GATEWAY" + str(i)):
                   listoflines[i][2] = line.split("=")[1]
                   flag = 3
               if flag == 3:
                   listoflines[i][1] = "via"
                   i += 1
           print listoflines

Любой ввод для вышеуказанного кода приветствуется !!

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Решено с помощью ввода от Ракеша следующим образом:

def convertFormat(filename):
    data = open(filename).read()
    flst = open(filename).readlines()
    if data and 'ADDRESS' in data:
        tmp = []
        ip = re.findall("ADDRESS\d+\=(.*)", data)
        nm = re.findall("NETMASK\d+\=(.*)", data)
        gw = re.findall("GATEWAY\d+\=(.*)", data)
        for i, n, g in zip(ip, nm, gw):
            line = "{0}/{1} via {2}\n".format(i, sum([bin(int(x)).count("1") for x in n.split(".")]), g)
            tmp.append(line)
        tmp.extend([l for l in flst if not l.startswith(('ADDRESS', 'NETMASK', 'GATEWAY'))])
        return tmp
0 голосов
/ 02 мая 2018

Использование Regex:

Демо:

import re
s = """ADDRESS0=I1.X.X.X            
NETMASK0=X.X.X.X
GATEWAY0=G1.X.X.X
ADDRESS1=I2.X.X.X
NETMASK1=X.X.X.X
GATEWAY1=G2.X.X.X"""    #--> s represents content from file

ipVals = re.findall("ADDRESS\d+\=(.*)", s, flags=re.IGNORECASE)
gateWayVals = re.findall("GATEWAY\d+\=(.*)", s, flags=re.IGNORECASE)

for i, g in zip(ipVals, gateWayVals):
    stringToWrite = "{0} via {1}".format(i, g)
    print(stringToWrite)      # --> Write back to file

Выход:

I1.X.X.X via G1.X.X.X
I2.X.X.X via G2.X.X.X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...