解析Cisco路由器配置块

时间:2016-10-31 13:24:09

标签: java parsing cisco

我正在尝试解析cisco配置。它具有如下所示的缩进结构。有很多像这样的街区。有些街区可能会更长。 !符号表示上面缩进的结尾。我如何解析块下的块和子块?

  • Ex1:

    XXXXXXXXXXX
    XXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX                \          
      XXXXXXXXXXXX    \              |         
        XXXXXX         | sub-block   | block
        XXXXXX         |             |         
      !               /              |         
    !                               /        
    XXXXXXXXXXXXX
    XXXXXXXXXXXXX
    XXXXXXXXXXXX
    XXXXXX
    
  • Ex2:

    XXXXXXXXXXX
    XXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX               \       
        XXXXXXXXXXXX  \             |      
            XXXXXX     | sub-block  | block
            XXXXXX     |            |      
        !             /             |      
        XXXXXXXXXXXX  \             |       
            XXXXXX     | sub-block  |
        !             /             |
    !                              /
    XXXXXXXXXXXXX
    XXXXXXXXXXXXX
    XXXXXXXXXXXX
    XXXXXX
    
  • Ex3 - 真实的思科配置:

    vrf myvrfvir
      address-family ipv4 broadcast
        import route
          10:10
        !
        export route
          20:20
        !
      !
    !
    interface Eth6/3/9/4.10
      description vlan10
      mtu 1500
      dot1q vlan 10
    !
    .
    .
    .
    

    共有4个街区:

    • 第一个块名称为vrf myvrfvir
    • 第二个块名称为interface GigabitEth0/3/5/3.10
    • 第3个(子)块是import route
    • 第4个(子)块是export route

    所以我希望能够获取所有块并将它们存储在哈希,列表,文本或......中。

    所以我想在需要的时候用它的块和上块名称来到达每个块。

1 个答案:

答案 0 :(得分:2)

最简单的方法是将块数据存储在地图中:

class Block {
    private Map<String, String> data;
    private Block parent;
    private List<Block> children;
}

此外,您可以创建另一个适合您需求的数据结构/解决您手头的任务。

然后,只需逐行读取文件,通过跟踪您拥有的缩进数来检测是否需要新块,并填充上面的数据结构。

快速而肮脏的样本(免责声明:我没有运行此代码,只是为了让您入门,您应该添加验证,将其拆分为多个功能等等,以便它干净,正确,好读()

    try (BufferedReader bufferedReader = new BufferedReader(reader)) {
        Block block = new Block();
        String line, previousIndents = "";
        while (null != (line = bufferedReader.readLine()) {
            Matcher m = Pattern.compile("^(\\s+)").matcher(line);
            if (m.find()) {
                String indents = m.group(1);
                if (previousIndents.equals(indents)) {
                     // update current block
                } else if (indents.length() > previousIndents.length()) {
                     // start a new block
                     Block newBlock = new Block();
                     newBlock.setParent(block);
                     block.getChildren().add(newBlock);

                     block = newBlock;
                } else {
                     // current block finished, return to parent
                     block = block.getParent();
                }

                previousIndents = indents;
            }
        } 
    }
    catch (IOException ioEx) {
        throw new ParseException(ioEx);
    }