sync_diff() 无法保持排序/顺序

问题描述 投票:0回答:1

最终,我试图区分大括号表示法。类似于 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
    }
python diff f5 ciscoconfparse
1个回答
0
投票

这将接近你想要的......

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
  • 请注意,ciscoconfparse2 具有比原始 ciscoconfparse 更好的 diff 算法;然而,此时它仍然不会为你闭合牙套。
  • 此外,无需重复
    ltm virtual ACME {
    块。 所有这些都可以包含在一个块中
  • 最后,请注意,因为我们使用
    syntax='ios'
    ,所以需要正确的 F5 配置缩进,即使此 F5 配置是用大括号分隔的。
© www.soinside.com 2019 - 2024. All rights reserved.