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 valid_fields: 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”][“ftp.fr.debian.org”][“type”]