说我有一个应用程序,它通过在命令行上执行各种命令来配置(我的应用程序是FRR路由套件,但问题是一般的)。我列出了所有可能命令的所有可能排列(frr应用程序有一个debug命令,它打印出所有可能命令的排列)。该列表如下所示:
`
bgp bestpath med confed
bgp bestpath med missing-as-worst confed
bgp bestpath med missing-as-worst
bgp log-neighbor-changes
bgp default ipv4-unicast
bgp default local-preference (0-4294967295)
bgp default show-hostname
bgp default subgroup-pkt-queue-max (20-100)
bgp network import-check
bgp route-reflector allow-outbound-policy
bgp listen limit (1-5000)
bgp listen range A.B.C.D/M peer-group WORD
bgp listen range X:X::X:X/M peer-group WORD
bgp dampening (1-45) (1-20000) (1-20000) (1-255)
bgp dampening (1-45)
bgp dampening
update-delay (0-3600)
update-delay (0-3600) (1-3600)
write-quanta (1-10000)
coalesce-time (0-4294967295)
timers bgp (0-65535) (0-65535)
neighbor A.B.C.D remote-as (1-4294967295)
neighbor A.B.C.D remote-as internal
neighbor A.B.C.D remote-as external
neighbor A.B.C.D local-as (1-4294967295)
neighbor A.B.C.D local-as (1-4294967295) no-prepend
neighbor A.B.C.D local-as (1-4294967295) no-prepend replace-as
neighbor A.B.C.D solo
neighbor A.B.C.D password LINE
neighbor A.B.C.D peer-group WORD
neighbor A.B.C.D passive
neighbor A.B.C.D shutdown
neighbor A.B.C.D shutdown message MSG...
neighbor A.B.C.D shutdown message MSG
`
实际列表要长得多,但正如您所看到的那样,命令包含"文字关键字"例如" bgp"或" bestpath"它包含变量(通常用大写字母表示,例如" A.B.C.D / M") - 变量实际上意味着可以有一个命名元素列表(例如邻居列表)。
所以基本上这个命令列表给了我一个配置模式,我可以用它来验证给定的配置是否有效。现在我想将这个面向命令的定义转换为结构化定义(XML或JSON)。
我想请某人指出我正确的方向如何处理这个问题 - 实际上我宁愿使用一些现有工具而不是黑客攻击我自己的解析器。