vbscript чтение интерфейсов коммутатора Cisco

Попытка создать скрипт, который будет отправлять 'sh run | b интерфейс» к коммутатору Cisco. Запишите вывод в массив. Разделите этот массив с помощью vbcr, чтобы каждая строка конфигурации находилась в элементе sep массива.

Я пытался содрать шкуру с кошки многими способами, и до сих пор борюсь.

Логика на английском языке: Отправить команду на устройство Cisco Захват вывода в массив определить ожидаемые строки «Это строки, которые требуются для каждого «интерфейса» коммутатора Сопоставьте имя «интерфейса» и соответствующий номер и запишите его в файл. Проверьте под этим интерфейсом определенные строки в ожидаемом. Если он найдет его, напишите строку & ", YES" Если он не найдет его, напишите строку & ", NO" Продолжайте делать это, пока не найдете больше ' ^интерфейс\s[FG][a-z].+'

Вывод должен выглядеть следующим образом: Interface GigabitEthernet 0/2 spanning-tree portfast, YES

Это пример кода, который терпит неудачу:

'These are the expected line (not being compared in the script below but is my intention to have it compare the matched elements)
Dim vExpectedINT(4)
vExpectedINT(0)  = "spanning-tree portfast"
vExpectedINT(1)  = "switchport access vlan 17"
vExpectedINT(2)  = "switchport mode access"
vExpectedINT(3)  = "ip mtu 1400"    


'objStream.Write "######################################################### " & vbcrlf
'objStream.Write "#                  I N T E R F A C E                    # " & vbcrlf
'objStream.Write "######################################################### " & vbcrlf


nCount = 0
vConfigLines = Split(strResultsINT, vbcr)

Set re = new RegExp
re.Global = False
re.IgnoreCase = True
re.Multiline = False
re.Pattern = "^interface [FG]"

' Regex Ex Definition
Set re2 = new RegExp
re2.Global = False
re2.IgnoreCase = True
re2.Multiline = False
re2.Pattern = "\sspanning-tree\sportfast"

' Regex Ex Definition
Set re3 = new RegExp
re3.Global = False
re3.IgnoreCase = True
re3.Multiline = False
re3.Pattern = "ip\smtu\s1400"

Set re4 = new RegExp
re4.Global = False
re4.IgnoreCase = True
re4.Multiline = False
re4.Pattern = "!"

' Compares the information
x = 1
Do While x <= Ubound(vConfigLines) - 1 do 
    MsgBox chr(34) & strLine & chr(34)
    If re.Test(vConfigLines(x)) Then
        ' Write data to not expected section
        x=x+1
        do
            If ! re4.Test(vConfigLines(x)) Then
                MsgBox vConfigLines(x)
                'objStream.Write vConfigLines(x) & vbcr
                elseif re2.Test(vConfigLines(x)) Then
                MsgBox vConfigLines(x)
                elseif re3.Test(vConfigLines(x)) Then
                MsgBox vConfigLines(x)
            else
                exit do
            end if
            x=x+1
        loop
        end IF
   End If
Loop    

Это пример вывода vConfigLines:

На коммутатор может быть 48+ портов.

interface FastEthernet1/0/1
 switchport access vlan 127
 switchport mode access
 switchport voice vlan 210
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape 0 3 0 0
 priority-queue out 
 mls qos trust cos
 auto qos voip trust 
 spanning-tree portfast
!
interface FastEthernet1/0/2
 switchport access vlan 127
 switchport mode access
 switchport voice vlan 210
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape 0 3 0 0
 priority-queue out 
 mls qos trust cos
 auto qos voip trust 
 spanning-tree portfast
!
interface FastEthernet1/0/3
 switchport access vlan 127
 switchport mode access
 switchport voice vlan 210
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape 0 3 0 0
 priority-queue out 
 mls qos trust cos
 auto qos voip trust 
 spanning-tree portfast

person user1141869    schedule 10.01.2012    source источник


Ответы (1)


Столкнувшись с трудной и сложной задачей, просто следуйте этим правилам:

Divide the task in independently solvable subproblems
  getting the info from Cisco
  processing the resulting file
    gather interesting info
    output

Concentrate on the difficult subtask(s)
  processing the resulting file

Solve a simplified but generalized version of (each) subtask using handmade data
for easy testing
  You have items and are interested in whether they (don't) have given properties

Данные для игры:

Item 0 (both props)
 prop_a
 prop_b
!
Item 1 (just b)
 prop_b
!
Item 2 (a only)
 prop_a
!
Item 3 (none)
!
Item 4 (irrelevant prop)
 prop_c
!
Item 5 (Richy)
 prop_c
 prop_b
 prop_a
!
Item 6 (Junky)
 junk

 prop_b
 whatever

!
#Item 7 (Nasty)
# prop_a_like_but_not_prop_a
# prop_b
#!

Keep it simple
  don't do more than absolutely necessary
  don't use variables/components you can do without

Итак, начнем:

Вы должны иметь дело с текстовым файлом (строками). Так что не делайте больше, чем

  Dim tsIn : Set tsIn = goFS.OpenTextFile("..\data\TheProblem.txt")
  Dim sLine
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
      End If
  Loop
  tsIn.Close

90% кода, использующего Split на .ReadAll, просто толстые. Да, это Do Until tsIn.AtEndOfStream, а не Do While tsIn.AtEndOfStream = False. Нет Set tsIn = Nothing, пожалуйста.

Данные организованы в блоки (Элемент n ...!), поэтому убедитесь, что вы распознаете части и знаете, что делать при их поиске:

  Dim tsIn : Set tsIn = goFS.OpenTextFile("..\data\TheProblem.txt")
  Dim sItem  : sItem    = "Item"
  Dim sEnd   : sEnd     = "!"
  Dim sLine
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
         Select Case True
           Case 1 = Instr(sLine, sItem)
             WScript.Echo "Begin, note item (name)"
           Case 1 = Instr(sLine, sEnd)
             WScript.Echo "End, output info"
             WScript.Echo "----------"
           Case Else
             WScript.Echo "Middle, gather info"
         End Select
      End If
  Loop
  tsIn.Close

выход:

Begin, note item (name)
Middle, gather info
Middle, gather info
End, output info
----------
Begin, note item (name)
Middle, gather info
End, output info
----------
...

Для каждого элемента вывод должен быть:

name, property, yes|no

Самый простой способ сделать это

WScript.Echo Join(aData, ", ")

Объединение лучше, чем конкатенация, особенно если вы хотите установить/манипулировать частями независимо друг от друга и/или предварительно установить некоторые из них в начале.

  Dim aData  : aData    = Array( _
      Array( "Item?", "prop_a", "NO") _
    , Array( "Item?", "prop_b", "NO") _
  )
  Dim sLine, aTmp, nIdx
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
         Select Case True
           Case 1 = Instr(sLine, sItem)
             aTmp = aData
             For nIdx = 0 To UBound(aTmp)
                 aTmp(nIdx)(0) = sLine
             Next
           Case 1 = Instr(sLine, sEnd)
             For nIdx = 0 To UBound(aTmp)
                 WScript.Echo Join(aTmp(nIdx), ", ")
             Next
             WScript.Echo "----------"
           Case Else
             WScript.Echo "Middle, gather info"
         End Select
      End If
  Loop
  tsIn.Close

Выход

...
Item 3 (none), prop_a, NO
Item 3 (none), prop_b, NO
...

показывает, что при установке разумных значений по умолчанию (НЕТ) эта версия скрипта корректно работает с элементами, не имеющими ни одного интересного свойства.

Итак, давайте займемся средней частью/Case Else:

   Case Else
     For nIdx = 0 To UBound(aTmp)
         If 1 = Instr(sLine, aTmp(nIdx)(1)) Then
            aTmp(nIdx)(2) = "YES"
            Exit For
         End If
     Next

вывод сейчас:

Item 0 (both props), prop_a, YES
Item 0 (both props), prop_b, YES
----------
Item 1 (just b), prop_a, NO
Item 1 (just b), prop_b, YES
----------
Item 2 (a only), prop_a, YES
Item 2 (a only), prop_b, NO
----------
Item 3 (none), prop_a, NO
Item 3 (none), prop_b, NO
----------
Item 4 (irrelevant prop), prop_a, NO
Item 4 (irrelevant prop), prop_b, NO
----------
Item 5 (Richy), prop_a, YES
Item 5 (Richy), prop_b, YES
----------
Item 6 (Junky), prop_a, NO
Item 6 (Junky), prop_b, YES
----------

А как же Настя:

#Item 7 (Nasty)
# prop_a_like_but_not_prop_a
# prop_b
#!

Простой Instr() завершится ошибкой, если одно имя свойства является префиксом другого. Чтобы доказать, что начинать с простого, а потом усложнять — хорошая стратегия:

  Dim sFSpec : sFSpec   = "..\data\TheProblem.txt"
  WScript.Echo goFS.OpenTextFile(sFSpec).ReadAll
  Dim tsIn   : Set tsIn = goFS.OpenTextFile(sFSpec)
  Dim sItem  : sItem    = "Item"
  Dim sEnd   : sEnd     = "!"
  Dim aData  : aData    = Array( _
      Array( "Item?", "prop_a", "NO") _
    , Array( "Item?", "prop_b", "NO") _
  )
  Dim aRe    : aRe      = Array(New RegExp, New RegExp)
  Dim nIdx
  For nIdx = 0 To UBound(aRe)
      aRe(nIdx).Pattern = "^" & aData(nIdx)(1) & "$"
  Next
  Dim sLine, aTmp
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
         Select Case True
           Case 1 = Instr(sLine, sItem)
             aTmp = aData
             For nIdx = 0 To UBound(aTmp)
                 aTmp(nIdx)(0) = sLine
             Next
           Case 1 = Instr(sLine, sEnd)
             For nIdx = 0 To UBound(aTmp)
                 WScript.Echo Join(aTmp(nIdx), ", ")
             Next
             WScript.Echo "----------"
           Case Else
             For nIdx = 0 To UBound(aTmp)
                 If aRe(nIdx).Test(sLine) Then
                    aTmp(nIdx)(2) = "YES"
                    Exit For
                 End If
             Next
         End Select
      End If
  Loop
  tsIn.Close

выход:

Item 0 (both props)
 prop_a
 prop_b
!
Item 1 (just b)
 prop_b
!
Item 2 (a only)
 prop_a
!
Item 3 (none)
!
Item 4 (irrelevant prop)
 prop_c
!
Item 5 (Richy)
 prop_c
 prop_b
 prop_a
!
Item 6 (Junky)
 junk

 prop_b
 whatever

!
Item 7 (Nasty)
 prop_a_like_but_not_prop_a
 prop_b
!

Item 0 (both props), prop_a, YES
Item 0 (both props), prop_b, YES
----------
Item 1 (just b), prop_a, NO
Item 1 (just b), prop_b, YES
----------
Item 2 (a only), prop_a, YES
Item 2 (a only), prop_b, NO
----------
Item 3 (none), prop_a, NO
Item 3 (none), prop_b, NO
----------
Item 4 (irrelevant prop), prop_a, NO
Item 4 (irrelevant prop), prop_b, NO
----------
Item 5 (Richy), prop_a, YES
Item 5 (Richy), prop_b, YES
----------
Item 6 (Junky), prop_a, NO
Item 6 (Junky), prop_b, YES
----------
Item 7 (Nasty), prop_a, NO
Item 7 (Nasty), prop_b, YES
----------
person Ekkehard.Horner    schedule 11.01.2012