2016-10-31 5 views
-1

Я пытаюсь разобрать конфигурацию 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 - Реальный Cisco Config:

    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,
    • третьего (суб) блок import route,
    • 4-ый (суб) блок export route.

    Так я хочу, чтобы иметь возможность получить все блоки и хранить их в хэш, список, текст или ...

    Так я хочу, чтобы дойти до каждого блока с его блоком и имя верхнего блока, когда мне нужно ,

+1

Я не имею ни малейшего представления о том, что происходит в вашей голове, когда вы писали это – Treycos

+0

После ваших объяснений (что я переработан немного для ясности), 'адрес семьи ipv4 broadcast' должен быть также блок? – Seki

ответ

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); 
    } 
Смежные вопросы