最终,我试图区分大括号表示法。类似于 Junos 中的“显示 | 比较”输出。不幸的是,将语法设置为“junos”不会在输出中保留大括号。但是,将其设置为“ios”即可。当 F5 代码上的语法设置为“ios”时,它似乎已经完成了大部分工作,但是,它仍然抱怨某些不应该存在的部分存在差异。
from ciscoconfparse import CiscoConfParse
BASELINE = """ltm virtual ACME {
destination 192.168.1.191:http
ip-protocol tcp
mask 255.255.255.255
pool pool1
profiles {
http { }
tcp { }
}
rules {
MOBILE
}
source 0.0.0.0/0
source-address-translation {
type automap
}
translate-address enabled
translate-port enabled
vs-index 17
}""".splitlines()
REQUIRED = """ltm virtual ACME {
destination 192.168.2.191:http
ip-protocol tcp
mask 255.255.255.255
pool pool2
profiles {
http { }
tcp { }
}
rules {
BLAH
}
source 0.0.0.0/0
source-address-translation {
type automap
}
translate-address enabled
translate-port enabled
vs-index 17
}""".splitlines()
parse = CiscoConfParse(BASELINE, syntax='ios')
print('\n'.join(parse.sync_diff(REQUIRED, '')))
产生这个:
ltm virtual ACME {
no }
no rules {
no destination 192.168.1.191:http
no pool pool1
no MOBILE
ltm virtual ACME {
destination 192.168.2.191:http
pool pool2
rules {
BLAH
}
注意输出中的第二行和第三行。
no }
no rules {
我认为顺序与所需的代码不同,因此它会引发“差异”。有没有办法确保排序保持到位?
预期输出:
ltm virtual ACME {
no destination 192.168.1.191:http
no pool pool1
rules {
no MOBILE
}
ltm virtual ACME {
destination 192.168.2.191:http
pool pool2
rules {
BLAH
}
这将接近你想要的......
import os
from ciscoconfparse2 import CiscoConfParse, Diff
BASELINE = """ltm virtual ACME {
destination 192.168.1.191:http
ip-protocol tcp
mask 255.255.255.255
pool pool1
profiles {
http { }
tcp { }
}
rules {
MOBILE
}
source 0.0.0.0/0
source-address-translation {
type automap
}
translate-address enabled
translate-port enabled
vs-index 17
}""".splitlines()
REQUIRED = """ltm virtual ACME {
destination 192.168.2.191:http
ip-protocol tcp
mask 255.255.255.255
pool pool2
profiles {
http { }
tcp { }
}
rules {
BLAH
}
source 0.0.0.0/0
source-address-translation {
type automap
}
translate-address enabled
translate-port enabled
vs-index 17
}""".splitlines()
baseline = CiscoConfParse(BASELINE, syntax='ios').get_text()
required = CiscoConfParse(REQUIRED, syntax='ios').get_text()
diff = Diff(baseline, required)
print(os.linesep.join(diff.get_diff()))
产生:
ltm virtual ACME {
no destination 192.168.1.191:http
no pool pool1
destination 192.168.2.191:http
pool pool2
rules {
no MOBILE
BLAH
ltm virtual ACME {
块。 所有这些都可以包含在一个块中syntax='ios'
,所以需要正确的 F5 配置缩进,即使此 F5 配置是用大括号分隔的。