Category Archives: networking

general networking tag

Cisco ACI 3.0 SAML (or LDAP…or TACACS) and the CiscoAVPair value

Recently I’ve been building my first ACI installation.  We’re doing it on our own and I’m reaching out to TAC and a key friend for help if I get stuck on anything that googling doesn’t solve.  It’s been going pretty well actually and have only run into a few snags (which I will document here in other posts).

Our plan for this first build is to make a few critical things work properly and then blow the whole thing away and rebuild it using as much scripting as possible.  It’s a great way to learn new tech.

One of our final tasks was to get authentication working and our systems team would love to move as many things to SSO/SAML as possible, so that was the thing to implement on the ACI admin pages.  Here’s the problem we’ve had: you need to return a specific value for “CiscoAVPair” and man, it’s hard to find documentation that isn’t all screwed up on the format, because it matters…A LOT.

First off the variable name is “CiscoAVPair” (no quotes).  NOT “ciscoAVpair” or “CiscoAVpair” or “CiscoAvPair”  or “Cisco-avpair” I’ve found documents (yes, from Cisco) with all those different capitalization.

Second thing is the value of the string:

shell:domains=all/admin/

No spaces and make sure to get that slash in at the end.  “all” is the security domain and “admin” is the role.

Nexus 5k, FEX and port-channel

Here’s a great “gotcha” we ran into, maybe google will save somebody else this headache:

Two nexus 5k’s with a vpc-peer link between them.  Each of them was getting a 2k connected with two fex ports.  The first 2k comes up with no problems.  The second 2k says “link not connected.”  Of course we assume that the 2k either has an sfp instead of fex or there’s a physical cable problem.  Nope.

Both 5k’s were using the same port-channel number (in this case 101).  Going into the second 5k and removing port-channel 101 and building port-channel 1101 (keeping the same fex info) causes the interfaces to immediately come up.

Cisco, I understand that there are going to be weird things that come up with new architectures, but this works on 7k’s.  Also, “link not connected” is totally the wrong interface status to show here.  Maybe an err-disabled or something would be much more appropriate.

Nexus 7k VPC peer link mixed modules

Just so everybody knows, when the documentation over at cisco.com says you can’t mix modules for VPC links they only say that you can’t mix F and M series.  What they don’t tell you is that you can’t mix M modules either.  We recently had an M1 series module fail and tried to move one of the port-channel links to an M2 module, the command fails when you try to add the interface to the channel-group.

Why isn’t that in the same document that says you can’t mix F and M series?  I have no idea.  TAC told me that you can mix M modules for regular port-channels, but the VPC peer-link requires that they be the same model.

What do I need for a CCNP?

At least when I took it all you really needed was GNS3 and some books.

There are some great videos out there too.  I don’t often plug pay sites (they’ve given me nothing…promise), but cbtnuggets.com has a guy named Jemery Cioara that is becoming something of a legend in the networking community.  I don’t think I’ve spoken to somebody in the network world who hasn’t seen his CCNA/CCNP series done for cbtnuggets.  I did, they helped a lot with some concept stuff.  Don’t think that only watching the videos will give you everything you need.  There’s still that pesky memorization stuff that they throw on the exams that you can only really get out of a book, but they’re a great start.
As for GNS3 all you really need to use is a 3725 router and add different switch modules (right click on the router when it’s in the topology and Configure > Slots…add serial or switch modules from there).  If you get the correct image for the 3725 you can run all the protocols covered on the exams (even IS-IS and IPv6).

I liked to come up with scenarios that were a bit more real-world based. I mean, when was the last time anybody got onto a new job to find that everything was standardized and perfectly efficient?  So when putting together some of the networks for redistribution exercises or switching networks for STP practice think to yourself “How would a network look if 3 different engineers had different budgets and priorities?”  Then build that.

Pretend there are some old models kicking around that don’t support newer protocols (or just haven’t been upgraded in years).

Pretend that a project was started to migrate to a different IGP, but was never completed because somebody left.

I know I had a mental block when looking at some scenarios.  I would think to myself “Why in the world would this ever happen?”  It happens.  More often than you’d like.  Most of the people I talk to lately are working on projects to fix what has happened in the past…so there will be some migration plans that look dirty, but are needed because you can’t get to the whole network in one maintenance window.  So, the “why” doesn’t matter anymore, just that it “has.”

Visio drawings 2, playing around

I don’t know about you, but when making some drawings I can get a bit bored.  At least when I’m making the same type of drawing over and over again.  So let’s look at what you can do to increase your skills, make pretty things, and not be bored.

When I’m looking at somebody elses drawing I’m often unimpressed.  Mostly for the reasons I went over in this post.  While I like making pretty drawings I sometimes get bored with making the same look every time.  Every now and then I like to spice it up a bit.  Especially if I’m only presenting things to coworkers and not management.   In these cases it’s hard to get in trouble for doing something kind of fun and goofy, so I like to get a bit out there when I can.

The best way I’ve found to spice it up a bit is to find a neat template and play with it.  Visio Guy (www.visguy.com) has made some great stuff and publishes them on his website.  Here’s an example of what I did with a wire-frame style “Battle Zone” template (linky).

I had to take over a project because somebody left the company.  They did good work and the design was solid and consistent with how things work in the company, he just wasn’t able to stay and complete the project due to circumstances outside his control.  There wasn’t a whole lot for me to do, but I had to familiarize myself with the project and design, so I decided to do the drawing again.  Obviously I’m not going to publish sensitive information, so names and IP’s have been redacted.

Here’s the old one:

previous

Not a bad drawing.  It gets the point across and was easy enough to follow, but I felt I could do it better…

new version

 

Doesn’t that look cool?  Granted, it’s the sort of thing that might get a manager to look at you kind of funny, but all the design had already been presented to change control and management, so this was just to make sure that the design was firm in my head.  This still follows some of my adopted keys to design: rounded corners, bold colors, lines don’t cross when they don’t have to.

To get this done I did have to go away from the template a bit, but I think aesthetically I made it work.

 

MTU, Junos & Cisco, OSPF

Here’s a frustrating thing for people working with multiple hardware vendors: MTU sizing commands don’t match up.

A coworker was having a hard time getting OSPF to come up between a cisco and juniper router, I was going to do a full post on it, but this guy has done it much better than I was going to: http://thenetworksherpa.com/ospf-master-the-mtu-madness/

Basically, it comes down to this: when you change the hardware mtu on cisco stuff IOS automagically configures the IP mtu to the hardware mtu + 24 bytes (18bytes for the ethernet header plus some pad for layer 2 or other goodies).  Juniper doesn’t make that change for you.  So if you change the hardware mtu, you need to set the IP mtu up as well.

 

Why scripting will save you Pt2

continued from Pt1

2) Scripts in Excel, Access, whatever other program you like to use

Looking back I should have done this next task in Access where I get to use sql commands, but everybody has Excel, so this seemed like a better choice should I get hit by a bus or something.

I’m not a professional programmer.  I know I do things that are not necessarily correct or pretty.  I have a tendency to use functions instead of subs because I like to use the return value of the function during debug.   I’m sure I have other bad programming habits that would drive some people crazy, but at the end of the day I can get the job done and make my life easier when the day of a change comes.

Here’s some code that takes a log file, dumps it into a new sheet with a timestamp and then pulls the vlan info I need, Vlan ID, Root Bridge, and any blocking ports into an existing sheet.  It will do this for Cisco IOS switches, CatOS switches, and JunOS switches.

What we’re expecting in the log files is pretty specific here: CatOS “show spantree x” output, IOS “show spanning-tree” output, and Junos “show spanning-tree bridge” and “show spanning-tree interface x” output.   You can tweak this code pretty easily to look for other things…I know I’m holding onto it for future tasks.

 
 ‘this imports a file which must be named with the exact hostname of the device
‘and parses the file displaying the vlans: root bridge and bridge ID
‘and the interfaces: forwarding or blocking per vlan

Sub Main()

Dim RouterId As String
Dim PromptTxt As String
Dim throwaway As Integer
Dim filePath As String
Dim devicetype As String
Dim whileBreaker As Integer
Dim sheetname As String
Dim SheetList(10, 10) As String

‘WS is current worksheet and opens a new sheet at the beginning of the run
‘I might need to move this to the functions that import the files….
Dim WS As Worksheet
Set WS = Sheets.Add
‘get the log file to parse
filePath = Application.GetOpenFilename

‘chop out the routerid from the filepath
‘this assumes that the filename is the router-id
RouterId = GetFilenameFromPath(filePath)
RouterId = Left(RouterId, Len(RouterId) – 4)

‘so the output of a couple of switches changes with the version.  some didn’t have a > others did…quick fix below
If RouterId = “switch3” Or RouterId = “switch4” Then
    RouterId = RouterId & “>”
End If

‘asks for the type of file to parse
whileBreaker = 0
While whileBreaker = 0
     PromptTxt = “Enter device type.  Only CatOS, iOS, and Junos are accepted”
    devicetype = InputBox(PromptTxt)
    If devicetype = “CatOS” Or devicetype = “iOS” Or devicetype = “Junos” Then
        whileBreaker = 1
    End If
Wend
‘Changes current sheet name to reflect the file about to be read in
sheetname = Time()
sheetname = Replace(sheetname, “:”, “-“)
sheetname = RouterId & ” ” & Replace(sheetname, “/”, “-“)
ActiveSheet.Name = sheetname
‘import the file into the new sheet
ImportFile (filePath)

‘Parse the output sheet based on device type
    throwaway = Parselog(sheetname, RouterId, devicetype)

End Sub
 ________________________________________________________________________
Function GetFilenameFromPath(ByVal strPath As String) As String
‘ Returns the rightmost characters of a string upto but not including the rightmost ‘\’
‘ e.g. ‘c:\winnt\win.ini’ returns ‘win.ini’

    If Right$(strPath, 1) <> “\” And Len(strPath) > 0 Then
        GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) – 1)) + Right$(strPath, 1)
    End If

End Function
________________________________________________________________________________________________

Sub ImportFile(Logfilepath As String)
‘takes the file name, reads it into a string, then uses WriteToExcel to line import it into a new sheet

Dim Streng As String
Dim StrFileArray() As String
Dim hFile As Long

hFile = FreeFile

Open Logfilepath For Input As #hFile
    Streng = Input$(LOF(hFile), hFile)
Close #hFile
 StrFileArray = Split(Streng, vbCrLf)
 WriteToExcel (StrFileArray)
 End Sub

____________________________________________________________________________________________________
Function WriteToExcel(StrArray)
‘takes the array output from ImportFile and writes it into the current sheet starting at A1
Dim counter As Integer
Dim cellname As String

For counter = LBound(StrArray) To UBound(StrArray)
    cellname = “A” & (counter + 1)
    Range(cellname).Value = StrArray(counter)
Next counter
End Function
________________________________________________________________________________________________________
Function Parselog(ByVal workingSheetname As String, switchname As String, devicetype As String) As Integer

Dim showVlancells() As String
Dim DRCells() As String
Dim ARTemp(4) As String
Dim BlockingCells() As String
Dim searchString As String
Dim bFound As Boolean ‘Flag
Dim sRange As Range
Dim rowCounter As String
Dim Lastcell As String
Dim throwaway As Integer
Dim sheetname As Worksheet
Dim counter As Integer
Dim rFnd As Range
Dim iArr As Integer ‘ Counter for Array
Dim rFirstAddress ‘ Address of the First Find
Dim x As Integer

‘count how much to search and set sheetname to activesheet
Lastcell = Range(“A65536”).End(xlUp).Row
rowCounter = “A2:A” & Lastcell
Set sheetname = ActiveSheet

‘start parsing based on CatOS
‘__________________________________________________CATOS_________________________________________________
If devicetype = “CatOS” Then
    searchString = ” show spantree”
    searchString = switchname & searchString
    ‘look for all instances of “routerid show spantree ” and record those cells
    bFound = FindAll(searchString, sheetname, rowCounter, showVlancells())
    ‘look between values in showVlancells()for designated root cells
    ‘set the counter properly to not error at the end of the sheet
    Erase DRCells()
    For counter = 1 To UBound(showVlancells)
        searchString = “Designated Root    ”
        If counter = UBound(showVlancells) Then
            rowCounter = showVlancells(counter) & “:A” & Lastcell
        Else
            rowCounter = showVlancells(counter) & “:” & showVlancells(counter + 1)
        End If
        ‘start the search for DR
            Set rFnd = Nothing
            Set rFnd = sheetname.Range(rowCounter).Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart)

            ReDim Preserve DRCells(counter)
            If Not rFnd Is Nothing Then
                DRCells(counter) = rFnd.Address
            Else
                DRCells(counter) = ” ”
            End If

    Next counter
    ‘now I have 1:1 arrays with the vlan number and DR…at least I should
    throwaway = MsgBox(“These should match and be one more than the count from the SecureCRT script” & vbCrLf & UBound(showVlancells) & vbCrLf & UBound(DRCells), vbOKOnly)
    ‘now I need to get all the blocking ports
    ReDim BlockingCells(UBound(showVlancells), 4)
    For counter = 1 To UBound(showVlancells)
        searchString = “blocking”
        If counter = UBound(showVlancells) Then
            rowCounter = showVlancells(counter) & “:A” & Lastcell
        Else
            rowCounter = showVlancells(counter) & “:” & showVlancells(counter + 1)
        End If

        bFound = FindBlocking(searchString, sheetname, rowCounter, ARTemp())
        ‘only copy elements that matter
        If ARTemp(1) <> “” Then
        ‘throwaway = MsgBox(ARTemp(1), vbOKOnly)
            For x = 1 To UBound(ARTemp)
                BlockingCells(counter, x) = ARTemp(x)
            Next x
        End If

    Next counter

throwaway = DumpToOutputCat(showVlancells(), DRCells(), BlockingCells(), workingSheetname, switchname)
End If

‘_______________________________________________________IOS _____________________________________________________

If devicetype = “iOS” Then

    searchString = “VLAN0”
    ‘look for all instances of “routerid show spantree ” and record those cells
    bFound = FindAll(searchString, sheetname, rowCounter, showVlancells())
    ‘look between values in showVlancells()for designated root cells
    ‘set the counter properly to not error at the end of the sheet
    Erase DRCells()
    For counter = 1 To UBound(showVlancells)
        searchString = “Root ID ”
        If counter = UBound(showVlancells) Then
            rowCounter = showVlancells(counter) & “:A” & Lastcell
        Else
            rowCounter = showVlancells(counter) & “:” & showVlancells(counter + 1)
        End If
        ‘start the search for DR
            Set rFnd = Nothing
            Set rFnd = sheetname.Range(rowCounter).Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart)

            ReDim Preserve DRCells(counter)
            ‘ios output isn’t formatted friendly for this kind of search so I need to increment the drcells up one
            If Not rFnd Is Nothing Then
                Set rFnd = rFnd.Offset(1, 0)
                DRCells(counter) = rFnd.Address
            Else
                DRCells(counter) = ” ”
            End If

    Next counter
    ‘now I have 1:1 arrays with the vlan number and DR…at least I should
    throwaway = MsgBox(“These should match and be one more than the count from the SecureCRT script” & vbCrLf & UBound(showVlancells) & vbCrLf & UBound(DRCells), vbOKOnly)

    ‘now I need to get all the blocking ports
    ReDim BlockingCells(UBound(showVlancells), 4)
    For counter = 1 To UBound(showVlancells)
        searchString = “BLK”
        If counter = UBound(showVlancells) Then
            rowCounter = showVlancells(counter) & “:A” & Lastcell
        Else
            rowCounter = showVlancells(counter) & “:” & showVlancells(counter + 1)
        End If

        bFound = FindBlocking(searchString, sheetname, rowCounter, ARTemp())
        ‘only copy elements that matter
        If ARTemp(1) <> “” Then
        ‘throwaway = MsgBox(ARTemp(1), vbOKOnly)
            For x = 1 To UBound(ARTemp)
               BlockingCells(counter, x) = ARTemp(x)
            Next x
        End If

    Next counter
throwaway = DumpToOutputiOS(showVlancells(), DRCells(), BlockingCells(), workingSheetname, switchname)

End If
‘______________________________________________________Junos Section__________________________________________
If devicetype = “Junos” Then
    searchString = “STP bridge parameters for VLAN ”
    ‘look for all instances of “STP bridge parameters for VLAN ” and record those cells
    bFound = FindAll(searchString, sheetname, rowCounter, showVlancells())
    ‘look between values in showVlancells()for designated root cells
    ‘set the counter properly to not error at the end of the sheet
    Erase DRCells()
    For counter = 1 To UBound(showVlancells)
        searchString = ”  Root ID”
        If counter = UBound(showVlancells) Then
            rowCounter = showVlancells(counter) & “:A” & Lastcell
        Else
            rowCounter = showVlancells(counter) & “:” & showVlancells(counter + 1)
        End If
       ‘start the search for DR
            Set rFnd = Nothing
            Set rFnd = sheetname.Range(rowCounter).Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart)

            ReDim Preserve DRCells(counter)
            If Not rFnd Is Nothing Then
                DRCells(counter) = rFnd.Address
            Else
                DRCells(counter) = ” ”
            End If

    Next counter
throwaway = MsgBox(“These should match and be one more than the count from the SecureCRT script” & vbCrLf & UBound(showVlancells) & vbCrLf & UBound(DRCells), vbOKOnly)

‘    ‘now I have 1:1 arrays with the vlan number and DR…at least I should

‘instead of returning the cells that contain the string I just want a pop-up to tell me that something is blocking
‘because I’ll have to manually figure out why it’s blocking anyway

searchString = “BLK”
Set rFnd = Nothing
Set rFnd = sheetname.Range(rowCounter).Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart)
If Not rFnd Is Nothing Then
    throwaway = MsgBox(“Something is blocking in cell: ” & rFnd.Address, vbOKOnly)
End If

throwaway = DumpToOutputJunos(showVlancells(), DRCells(), BlockingCells(), workingSheetname, switchname)

End If

End Function
______________________________________________________________________________________________________________
Function FindAll(ByVal searchString As String, ByRef sheetname As Worksheet, ByRef rowCounter As String, ByRef showVlancells() As String) As Boolean

‘ ————————————————————————————————————–
‘ FindAll – To find all instances of the1 given string and return the row numbers.
‘ If there are not any matches the function will return false
‘ ————————————————————————————————————–

‘On Error GoTo Err_Trap

Dim rFnd As Range ‘ Range Object
Dim iArr As Integer ‘ Counter for Array
Dim rFirstAddress ‘ Address of the First Find
Dim throwaway As Integer
Dim tossstring As String

‘ —————–
‘ Clear the Array
‘ —————–
Erase showVlancells

Set rFnd = sheetname.Range(rowCounter).Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart)
If Not rFnd Is Nothing Then
    rFirstAddress = rFnd.Address
    Do Until rFnd Is Nothing
        iArr = iArr + 1
        ReDim Preserve showVlancells(iArr)
        showVlancells(iArr) = rFnd.Address ‘ rFnd.Row ‘ Store the Row where the text is found
        Set rFnd = sheetname.Range(rowCounter).FindNext(rFnd)
        If rFnd.Address = rFirstAddress Then Exit Do ‘ Do not allow wrapped search
    Loop

FindAll = True
Else
‘ ———————-
‘ No Value is Found
‘ ———————-
FindAll = False
End If

‘ ———————–
‘ Error Handling
‘ ———————–
Err_Trap:
If Err <> 0 Then
MsgBox Err.Number & ” ” & Err.Description, vbInformation, “Find All”

Err.Clear
FindAll = False
Exit Function
End If
End Function
____________________________________________________________________________________________________________
Function FindBlocking(ByVal searchString As String, ByRef sheetname As Worksheet, ByRef rowCounter As String, ByRef ARTemp() As String) As Boolean

‘ ————————————————————————————————————–
‘ FindAll – To find all instances of the1 given string and return the row numbers.
‘ If there are not any matches the function will return false
‘ ————————————————————————————————————–

‘On Error GoTo Err_Trap

Dim rFnd As Range ‘ Range Object
Dim iArr As Integer ‘ Counter for Array
Dim rFirstAddress ‘ Address of the First Find
Dim throwaway As Integer
Dim tossstring As String

‘ —————–
‘ Clear the Array
‘ —————–
Erase ARTemp

Set rFnd = sheetname.Range(rowCounter).Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart)
If Not rFnd Is Nothing Then
    rFirstAddress = rFnd.Address
    Do Until rFnd Is Nothing
        iArr = iArr + 1
‘        ReDim Preserve ARTemp(iArr)  ‘this may need to come back later
        ARTemp(iArr) = rFnd.Address ‘ rFnd.Row ‘ Store the Row where the text is found
        Set rFnd = sheetname.Range(rowCounter).FindNext(rFnd)
        If rFnd.Address = rFirstAddress Then Exit Do ‘ Do not allow wrapped search
    Loop

FindBlocking = True
Else
‘ ———————-
‘ No Value is Found
‘ ———————-
FindBlocking = False
End If

‘ ———————–
‘ Error Handling
‘ ———————–
Err_Trap:
If Err <> 0 Then
MsgBox Err.Number & ” ” & Err.Description, vbInformation, “Find All”

Err.Clear
FindBlocking = False
Exit Function
End If
End Function

Function DumpToOutputCat(vlan() As String, DR() As String, Blocking() As String, sheetname As String, switchname As String)

‘Dim workingRow As Integer
‘Dim wokingCol As String
Dim workcounter As Integer
Dim Lastcell As Integer
Dim cRange As String
Dim throwaway As Integer
Dim vlanNumber() As String
Dim vlanid As String
Dim drID As String
Dim drNumber() As String
Dim blockint() As String
Dim x
Dim blockcellId() As String
Dim blockId As String

‘need to make Output the working sheet
Sheets(“Output”).Select

‘find the end of the sheet
Lastcell = Range(“A65536”).End(xlUp).Row

‘dump the output of vlans

For workcounter = 1 To UBound(vlan)
    ‘write the vlan ID’s
    cRange = “B” & Lastcell + workcounter
    vlanNumber() = Split(Sheets(sheetname).Range(vlan(workcounter)).Value, ” “)
    vlanid = vlanNumber(UBound(vlanNumber))
    Range(cRange).Value = vlanid
    ‘write the switch name
    cRange = “A” & Lastcell + workcounter
    Range(cRange).Value = switchname
    ‘write the DR
    cRange = “C” & Lastcell + workcounter
    Erase drNumber
    drID = ” ”

        If DR(workcounter) <> ” ” Then
            drNumber() = Split(Sheets(sheetname).Range(DR(workcounter)).Value, ” “)
            drID = drNumber(UBound(drNumber))
        End If

    Range(cRange).Value = drID
    ‘now you need to write the blocking ports….
    cRange = “D” & Lastcell + workcounter
    Erase blockcellId
    For x = 1 To UBound(Blocking, 2)
        ReDim Preserve blockcellId(x)
        If Blocking(workcounter, x) <> “” Then
            blockcellId(x) = Sheets(sheetname).Range(Blocking(workcounter, x)).Value
            blockint = Split(blockcellId(x), ” “)
            blockcellId(x) = blockint(1)
        End If
    Next x
    blockId = Join(blockcellId, ” “)
    Range(cRange).Value = blockId

Next workcounter

End Function
_______________________________________________________________________________________________________________
Function DumpToOutputJunos(vlan() As String, DR() As String, Blocking() As String, sheetname As String, switchname As String)

‘Dim workingRow As Integer
‘Dim wokingCol As String
Dim workcounter As Integer
Dim Lastcell As Integer
Dim cRange As String
Dim throwaway As Integer
Dim vlanNumber() As String
Dim vlanid As String
Dim drID As String
Dim drNumber() As String
Dim blockint() As String
Dim x
Dim blockcellId() As String
Dim blockId As String

‘need to make Output the working sheet
Sheets(“Output”).Select

‘find the end of the sheet
Lastcell = Range(“A65536”).End(xlUp).Row

‘dump the output of vlans

For workcounter = 1 To UBound(vlan)
    ‘write the vlan ID’s
    cRange = “B” & Lastcell + workcounter
    vlanNumber() = Split(Sheets(sheetname).Range(vlan(workcounter)).Value, ” “)
    vlanid = vlanNumber(UBound(vlanNumber))
    Range(cRange).Value = vlanid
    ‘write the switch name
    cRange = “A” & Lastcell + workcounter
    Range(cRange).Value = switchname
    ‘write the DR
    cRange = “C” & Lastcell + workcounter
    Erase drNumber
    drID = ” ”

        If DR(workcounter) <> ” ” Then
            drNumber() = Split(Sheets(sheetname).Range(DR(workcounter)).Value, ” “)
            drID = drNumber(UBound(drNumber))
        End If

    Range(cRange).Value = drID
    ‘now you need to write the blocking ports….
    cRange = “D” & Lastcell + workcounter
    Erase blockcellId

Next workcounter

End Function
___________________________________________________________________________________________________________
Function DumpToOutputiOS(vlan() As String, DR() As String, Blocking() As String, sheetname As String, switchname As String)

‘Dim workingRow As Integer
‘Dim wokingCol As String
Dim workcounter As Integer
Dim Lastcell As Integer
Dim cRange As String
Dim throwaway As Integer
Dim vlanNumber() As String
Dim vlanid As String
Dim drID As String
Dim drNumber() As String
Dim blockint() As String
Dim x
Dim blockcellId() As String
Dim blockId As String

‘need to make Output the working sheet
Sheets(“Output”).Select

‘find the end of the sheet
Lastcell = Range(“A65536”).End(xlUp).Row

‘dump the output of vlans

For workcounter = 1 To UBound(vlan)
    ‘write the vlan ID’s
    cRange = “B” & Lastcell + workcounter
    vlanNumber() = Split(Sheets(sheetname).Range(vlan(workcounter)).Value, ” “)
    vlanid = vlanNumber(UBound(vlanNumber))
    Range(cRange).Value = vlanid
    ‘write the switch name
    cRange = “A” & Lastcell + workcounter
    Range(cRange).Value = switchname
    ‘write the DR
    cRange = “C” & Lastcell + workcounter
    Erase drNumber
    drID = ” ”

        If DR(workcounter) <> ” ” Then
            drNumber() = Split(Sheets(sheetname).Range(DR(workcounter)).Value, ” “)
            drID = drNumber(UBound(drNumber))
        End If

    Range(cRange).Value = drID
    ‘now you need to write the blocking ports….
    cRange = “D” & Lastcell + workcounter
    Erase blockcellId
    For x = 1 To UBound(Blocking, 2)
        ReDim Preserve blockcellId(x)
        If Blocking(workcounter, x) <> “” Then
            blockcellId(x) = Sheets(sheetname).Range(Blocking(workcounter, x)).Value
            blockint = Split(blockcellId(x), ” “)
            blockcellId(x) = blockint(0)

        End If
    Next x
    blockId = Join(blockcellId, ” “)
    Range(cRange).Value = blockId

Next workcounter

End Function

Why scripting will save you PT1

In a previous post I talked about documentation and planning for a change, but what can we do to really shorten the time it takes to implement and verify a change?

Scripting.

If we script things out ahead of time we don’t have to use our valuable time during a change window to type things out.  Plus we get to check, double-check, test, and debug all ahead of time to make sure things go how we want them to.

Here are a couple of scripts I’ve used lately to help me get info that I need quickly and format it so that it’s easier to look at.

1) Scripts in SecureCRT.

If you don’t own SecureCRT go buy it.  You can try to get everything done in putty, but a good terminal program will take you to a new level.

You can use several different scripting languages to help you out here.  You can do simple things like have it type commands for you, or complex things like read outputs and make decisions based on what comes out on the terminal.  It’s great for data entry type tasks that are horribly repetitive  but sill need to get done.

This is an example of a script I put together to go through and enter a show command for a list of vlans on a CatOS switch.  It’s sloppy from a code perspective, but it was fast and gets the job done.  (I’m working in VBScript in this case)
#$Language=”VBScript”
#$Interface=”1.0″
Sub Main
Dim counter
‘generic counter variable
Dim Arraysize
Dim RouterID
arr_VlanSet = Array(“1”, “2”, …keep listing your vlans here)
‘sloppy way to populate the vlanset…you can pull this from another file or whatever, but that’s more effort
‘than I wanted to put into this simple script
‘Creates a linear array for holding list of vlans
Arraysize = UBound(arr_VlanSet)
counter = MsgBox(Arraysize, vbOKOnly)
RouterID = “hostname of device goes here”
crt.Screen.Synchronous = True
For counter = 0 To Arraysize

crt.Screen.Send “show spantree ” & arr_vlanset(counter) & vbCr
if crt.screen.WaitForString(“–More”, 1) then
crt.Screen.Send ” ”
end if
if crt.screen.WaitForString(“–More”, 1) then
crt.Screen.Send ” ”
end if
if crt.screen.WaitForString(“–More”, 1) then
crt.Screen.Send ” ”
end if

crt.Screen.Send ” ” & vbCr

crt.screen.WaitForString(RouterID)

Next
End Sub
Remember, these are supposed to save you time on the day, so you don’t need to be elegant in the code.  This goes through my list of vlans, put in the command, waits to see if a space needs to be entered (it does this 3 times) and then goes on to the next command.  If you have longer output than 3 screens it’ll wait for you to put in a keystroke manually instead of just going and missing a command.

 

More in PT2

 

Junos, olive, GNS3…should be easy, right? Pt5

Now, you remember that ISO image we made all the way at the beginning?  Well, now we actually use it.

From the command prompt “qemu -L . -m 256 -boot c -hda j.img -cdrom ..\jinstall.iso”

 

That’ll launch qemu again and mount the image for installation.  Login when prompted

olive38

Let’s clear some room to work with:

olive39

Mount the cdrom “mount /cdrom”

Create a temp directory for Junos “mkdir /var/tmp/j/”

Change to the new directory “cd /var/tmp/j/”

And make sure you’re actually there “pwd”

Extract the Junos files “tar zxvf /cdrom/jinstall-10.1r1.8-domestic-olive.tgz”

olive40olive41

 

Make pkgtools directory “mkdir pkgtools”

Go into pkgtools directory “cd pkgtools”

Verify that you’re in the right spot “pwd”

Extract pkgtools “tar zxfv ../pkgtools.tgz”

olive42

Go to Bin directory “cd bin”

Copy true file “cp /usr/bin/true ./checkpic”

Back up one level “cd ..” (there’s a space in there)

Zip the file again “tar zcvf ../pkgtools.tgz *”

olive43

Back up one level “cd ..”

Remove pkgtools directory “rm –rf pkgtools”

Rezip to Junos “tar zcvf ../junos.tgz *

olive44

Install Junos “pkg_add –f /var/tmp/junos.tgz”

olive45

Here’s where you end up:

olive46

“init 6” then ctrl + alt + 2 “q” to kill it

Now we’ve got a working image.  Time for the GNS3 part.  Open up GNS3 and go to Edit > Preferences > Qemu.  Change the working directory, path, and img path.

olive47

Go the Junos tab and add your image…make sure to save it

olive48

You should now be able to drag Juniper routers into your topologies.

 

A few things I’ve found:

1)  Connect your links before starting the router, they don’t like changing things once they’re running

2)  They take a long time to boot.  Yeah, it sucks, but at least they work

3)  These images don’t do everything.  You may be able to put in a command and it seems to take, but the feature doesn’t work.  Kind of a pain…

4)  Make sure to save the nvrams and harddisks of your devices in your projects.  With Junos stuff make sure to save while the device is running.

5)  Important: hit crtl+alt to free your mouse from a qemu window should you accidently click in there.

 

Have fun!