def read_firewall_xml(self, path=None): config = {} if path is None: path = self.firewall_xml_file if not os.path.exists(path) or os.path.getsize(path) == 0: raise KaresansuiIpTablesException("no such file: %s" % path) document = XMLParse(path) table_num = XMLXpathNum(document, '/firewall/table') for tbl in range(1, table_num + 1): table_name = XMLXpath(document, '/firewall/table[%i]/@name' % (tbl, )) if table_name is None: table_name = 'filter' chain = {} chain_num = XMLXpathNum(document, '/firewall/table[%i]/chain' % (tbl, )) for chn in range(1, chain_num + 1): chain_name = XMLXpath( document, '/firewall/table[%i]/chain[%i]/@name' % ( tbl, chn, )) chain_policy = XMLXpath( document, '/firewall/table[%i]/chain[%i]/@policy' % ( tbl, chn, )) rule = [] rule_num = XMLXpathNum( document, '/firewall/table[%i]/chain[%i]/rule' % ( tbl, chn, )) for rl in range(1, rule_num + 1): rule_id = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/@id' % ( tbl, chn, rl, )) target = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/target/text()' % ( tbl, chn, rl, )) if target is None: target = '' else: target = target.strip() protocol = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/protocol/text()' % ( tbl, chn, rl, )) if protocol is None: protocol = '' else: protocol = protocol.strip() if protocol == "50": protocol = "esp" if protocol == "51": protocol = "ah" source = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/source/text()' % ( tbl, chn, rl, )) if source is None: source = '' else: source = source.strip() destination = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/destination/text()' % ( tbl, chn, rl, )) if destination is None: destination = '' else: destination = destination.strip() sport = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/source-port/text()' % ( tbl, chn, rl, )) if sport is None: sport = '' else: sport = sport.strip() dport = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/destination-port/text()' % ( tbl, chn, rl, )) if dport is None: dport = '' else: dport = dport.strip() inif = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/in-interface/text()' % ( tbl, chn, rl, )) if inif is None: inif = '' else: inif = inif.strip() outif = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/out-interface/text()' % ( tbl, chn, rl, )) if outif is None: outif = '' else: outif = outif.strip() option = XMLXpath( document, '/firewall/table[%i]/chain[%i]/rule[%i]/option/text()' % ( tbl, chn, rl, )) if option is None: option = '' else: option = option.strip() rule_info = { "id": rule_id, "target": target, "protocol": protocol, "source": source, "destination": destination, "source-port": sport, "destination-port": dport, "in-interface": inif, "out-interface": outif, "option": option, } rule.append(rule_info) chain_info = { "policy": chain_policy, "rule": rule, } chain[chain_name] = chain_info config[table_name] = chain return config
def read_firewall_xml(self,path=None): config = {} if path is None: path = self.firewall_xml_file if not os.path.exists(path) or os.path.getsize(path) == 0: raise KaresansuiIpTablesException("no such file: %s" % path) document = XMLParse(path) table_num = XMLXpathNum(document,'/firewall/table') for tbl in range(1, table_num + 1): table_name = XMLXpath(document,'/firewall/table[%i]/@name' % (tbl,)) if table_name is None: table_name = 'filter' chain = {} chain_num = XMLXpathNum(document,'/firewall/table[%i]/chain' % (tbl,)) for chn in range(1, chain_num + 1): chain_name = XMLXpath(document,'/firewall/table[%i]/chain[%i]/@name' % (tbl,chn,)) chain_policy = XMLXpath(document,'/firewall/table[%i]/chain[%i]/@policy' % (tbl,chn,)) rule = [] rule_num = XMLXpathNum(document,'/firewall/table[%i]/chain[%i]/rule' % (tbl,chn,)) for rl in range(1, rule_num + 1): rule_id = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/@id' % (tbl,chn,rl,)) target = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/target/text()' % (tbl,chn,rl,)) if target is None: target = '' else: target = target.strip() protocol = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/protocol/text()' % (tbl,chn,rl,)) if protocol is None: protocol = '' else: protocol = protocol.strip() if protocol == "50": protocol = "esp" if protocol == "51": protocol = "ah" source = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/source/text()' % (tbl,chn,rl,)) if source is None: source = '' else: source = source.strip() destination = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/destination/text()' % (tbl,chn,rl,)) if destination is None: destination = '' else: destination = destination.strip() sport = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/source-port/text()' % (tbl,chn,rl,)) if sport is None: sport = '' else: sport = sport.strip() dport = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/destination-port/text()' % (tbl,chn,rl,)) if dport is None: dport = '' else: dport = dport.strip() inif = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/in-interface/text()' % (tbl,chn,rl,)) if inif is None: inif = '' else: inif = inif.strip() outif = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/out-interface/text()' % (tbl,chn,rl,)) if outif is None: outif = '' else: outif = outif.strip() option = XMLXpath(document,'/firewall/table[%i]/chain[%i]/rule[%i]/option/text()' % (tbl,chn,rl,)) if option is None: option = '' else: option = option.strip() rule_info = {"id": rule_id, "target": target, "protocol": protocol, "source": source, "destination": destination, "source-port": sport, "destination-port": dport, "in-interface": inif, "out-interface": outif, "option": option, } rule.append(rule_info) chain_info = {"policy": chain_policy, "rule": rule, } chain[chain_name] = chain_info config[table_name] = chain return config