Mon coin de toile - A piece of Web

Parsing Fortigate configuration in Python

Posted at — Mar 10, 2014
Parsing Fortigate configuration in Python

Had to parse some Fortinet configuration in python so here is my solution:

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[])     def parse_set(self, line): # Key and values         key = line[]         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[] in validfields:                     method = fields[]                     # 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”][“”][“type”]