首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Python读取fortigate配置文件

使用Python读取fortigate配置文件
EN

Stack Overflow用户
提问于 2011-09-26 16:18:00
回答 4查看 5.2K关注 0票数 1

为这个拖了很久的问题道歉。

我正在尝试读入一个配置文件,并获取一个规则列表。我曾尝试使用ConfigParser来做这件事,但它不是一个标准的配置文件。该文件不包含节头和标记。

配置部分a

将某物设置为另一物

配置小节a

将这个设置为那个

下一步

结束配置防火墙策略

编辑76

设置srcintf "There“

将dstintf设置为"Here“

set srcaddr "all“set dstaddr "all”set action accept set schedule "always“

设置服务"TCP_5600“

下一步

编辑77

将srcintf设置为"here“

设置dstintf "there“

将srcaddr设置为"all“

将dstaddr设置为"all“

设置操作accept

将计划设置为“始终”

设置服务"PING“

下一端

因为我不知道如何让ConfigParser工作,所以我想我应该试着遍历这个文件,不幸的是我没有太多的编程技能,所以我被卡住了。我真的觉得我把事情搞得太复杂了。这是我写的代码;

代码语言:javascript
复制
class Parser(object):

    def __init__(self):
        self.config_section = ""
        self.config_header = ""
        self.section_list = []
        self.header_list = []

    def parse_config(self, fields): # Create a new section
        new_list = []
        self.config_section = " ".join(fields)
        new_list.append(self.config_section)

        if self.section_list: # Create a sub section
            self.section_list[-1].append(new_list)
        else: self.section_list.append(new_list)

    def parse_edit(self, line): # Create a new header
        self.config_header = line[0]
        self.header_list.append(self.config_header)

        self.section_list[-1].append(self.header_list)  

    def parse_set(self, line): # Key and values
        key_value = {}

        key = line[0]
        values = line[1:]
        key_value[key] = values

        if self.header_list:
            self.header_list.append(key_value)
        else: self.section_list[-1].append(key_value)

    def parse_next(self, line): # Close the header
        self.config_header = []

    def parse_end(self, line): # Close the section
        self.config_section = []

    def parse_file(self, path):
        with open(path) as f:
            for line in f:

                # Clean up the fields and remove unused lines.            
                fields = line.replace('"', '').strip().split(" ")

                if fields[0] == "set":
                    pass
                elif fields[0] == "end":
                    pass
                elif fields[0] == "edit":
                    pass
                elif fields[0] == "config":
                    pass
                elif fields[0] == "next":
                    pass
                else: continue

                # fetch and call method.
                method = fields[0]
                parse_method = "parse_" + method

                getattr(Parser, parse_method)(self, fields[1:])
                return self.section_list

config = Parser().parse_file('test_config.txt')

print config

我正在寻找的输出类似于以下内容;

[[‘节a',{’东西‘:’到其他东西‘},’子节a',{‘这个’:‘到那个’}],[‘防火墙策略’,'76',{‘srcintf’:‘那里’},{‘dstintf’:‘此处’}{等}{等}]]

这就是我得到的

[‘a节’]

编辑

我已经更改了上面的内容,以反映我目前所处的位置。我仍然在获取我期望的输出时遇到问题。我就是不能把单子写对。

EN

回答 4

Stack Overflow用户

发布于 2011-09-26 16:46:02

代码语言:javascript
复制
 class Parser(object):

     def __init__(self):
         self.my_section = 0
         self.flag_section = False
         # ...

    def parse_config(self, fields):
         self.my_section += 1
         # go on with fields
         # ...
         self.flag_section = True

     def parse_edit(self, line):
         ...

     def parse_set(self, line):
         ...

     def parse_end(self, line):
         ...

     def parse_file(self, path):
         with open(path) as f:
              for line in f:
                  fields = f.strip().split(" ")

                  method = fields[0]
                  # fetch and call method
                  getattr(Parser, "parse_" + method)(self, fields[1:])
票数 1
EN

Stack Overflow用户

发布于 2013-03-13 16:02:12

我将我的答案发布给那些在尝试解析Fortigate配置文件时首先从Google来到这里的人!我根据自己的需要重写了我在这里找到的东西,它工作得很好。

代码语言:javascript
复制
from collections import defaultdict
from pprint import pprint
import sys

f = lambda: defaultdict(f)

def getFromDict(dataDict, mapList):
    return reduce(lambda d, k: d[k], mapList, dataDict)

def setInDict(dataDict, mapList, value):
    getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value    

class Parser(object):

    def __init__(self):
        self.config_header = []
        self.section_dict = defaultdict(f)     

    def parse_config(self, fields): # Create a new section
        self.config_header.append(" ".join(fields))

    def parse_edit(self, line): # Create a new header
        self.config_header.append(line[0])

    def parse_set(self, line): # Key and values
        key = line[0]
        values = " ".join(line[1:])
        headers= self.config_header+[key]
        setInDict(self.section_dict,headers,values)

    def parse_next(self, line): # Close the header
        self.config_header.pop()

    def parse_end(self, line): # Close the section
        self.config_header.pop()

    def parse_file(self, path):          
        with open(path) as f:
            gen_lines = (line.rstrip() for line in f if line.strip())
            for line in gen_lines:
               # pprint(dict(self.section_dict))
                # Clean up the fields and remove unused lines.            
                fields = line.replace('"', '').strip().split(" ")

                valid_fields= ["set","end","edit","config","next"]
                if fields[0] in valid_fields:
                    method = fields[0]
                    # fetch and call method
                    getattr(Parser, "parse_" + method)(self, fields[1:])

        return self.section_dict

config = Parser().parse_file('FGT02_20130308.conf')

print config["system admin"]["admin"]["dashboard-tabs"]["1"]["name"]
print config["firewall address"]["ftp.fr.debian.org"]["type"]
票数 1
EN

Stack Overflow用户

发布于 2011-09-26 16:48:58

我不知道这是否也能帮助你,但它确实对我有帮助:http://wiki.python.org/moin/ConfigParserExamples

祝你玩得开心!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7552364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档