dorl@vms3.macc.wisc.edu (Michael (NMI) Dorl) (02/19/88)
I recently needed something to summarize the output from the RBMS
program. Here is the result.
Does anyone else have any similar tools to make RBMS more usefull?
dorl@vms.macc.wsic.edu
dorl@wiscmacc.bitnet
**** LOGIN.COM
$ Set Command Summary ! define summary command
$ RBMS :== $NMS_RBMS$BCP ! define rbms command
**** SUMMARY.COM
$RBMS
use active bridges
show known lines counters to "line.stats"
$Summary
**** SUMMARY.CLD
Define Verb Summary
Image "Dsk$user3:[Comm_Fac.RBMS]Summary.Exe"
Qualifier All
Qualifier Record
Qualifier History
**** SUMMARY.FOR
C Program Summary
C
C Command Syntax
C
C Summary[/All][/[No[Record]]
C
C Default is /Record
C
C Description
C
C Program to grunge through the LINE.STATS file created by
C the following RBMS commands:
C
C USE ACTIVE BRIDGES
C SHOW KNOWN LINES COUNTERS TO "LINE.STATS"
C
C Produces a report summarizing LAN Bridge 100 traffic and
C errors. Information printed includes the following for each
C interface on the LAN-100.
C
C Receive Frames received
C F/S Frames received per second
C % Filtered % of received frames not forwarded
C % Bad % frames received bad
C
C A single letter is printed after the % Bad column if any
C of the following conditions are present:
C
C L Life time exceeded
C P Invalid protocol
C C Collision SQE error
C F No forwarding entry
C E % Bad > 0.05
C
C If the /ALL qualifier is present, the report includes
C the total counts from the LAN 100, otherwise the report
C includes counts from the LAN-100 minus counts from the
C HISTORY.STATS file.
C
C HISTORY.STATS is updated unless the /NORECORD qualifier
C is specified.
C
C Author
C
C Michael Dorl
C MACC
C University of Wisconsin
C 1210 W. Dayton St.
C Madison, WI 53706
C dorl@vms.macc.wisc.edu
C dorl@wiscmacc.bitnet
C
C Revision History
C
C 10 Feb 1987 Original
C
Implicit None
C External definitions
Integer CLI$Present
External CLI$_Negated
C Structure definitions
Structure /Bridge_Def/
Union
Map
Character *20 Name
Integer *4 Seconds(2)
Integer *4 Invalid_Protocol(2)
Integer *4 Filtered_Frames(2)
Integer *4 Bad_Frames(2)
Integer *4 Life_Time_Exceeded(2)
Integer *4 No_Forwarding(2)
Integer *4 Forwarding_Transitions(2)
Integer *4 Collision_SQE_Error(2)
Integer *4 Frames_Transmitted(2)
Integer *4 Frames_Received(2)
Integer *4 Bridge_Received(2)
Integer *4 Bridge_Transmitted(2)
Integer *4 Frames_Transmitted_Lost(2)
Integer *4 Frames_Received_Lost(2)
EndMap
Map
Character *132 All
EndMap
EndUnion
End Structure ! Bridge_Def
C Local variables
Record /Bridge_Def/ Bridge(100), H_Bridge
Integer *4 I
Character *132 Image
Integer *4 Line
Character *1 Line_Err(2)
Real *4 PC_Bad_Frames(2)
Real *4 PC_Filtered(2)
Integer *4 PPS_Received(2)
Logical Qual_All
Logical Qual_Record
Integer *4 Status
Integer *4 X
Integer *4 Z
C Begin Summary
C Get command line and parse
If (CLI$Present('RECORD') .ne. %Loc(CLI$_Negated)) Then
Qual_Record = .true.
Else
Qual_Record = .false.
EndIf
If (CLI$Present('ALL')) Then
Qual_All = .true.
Else
Qual_All = .false.
EndIf
C Open file LINE.STATS
Open
$ (Unit = 10,
$ File = 'LINE.STATS',
$ Status = 'OLD'
$ )
C Open History file
Open
$ (Unit = 11,
$ File = 'HISTORY.STATS',
$ Status = 'OLD',
$ Organization = 'Indexed',
$ Form = 'Formatted',
$ CarriageControl = 'None',
$ Access = 'Keyed',
$ IOStat = Status
$ )
If (Status .ne. 0) Then
Open
$ (Unit = 11,
$ File = 'History.Stats',
$ Status = 'New',
$ Organization = 'Indexed',
$ Recl = 132,
$ Access = 'Keyed',
$ Key = (1:20:Character),
$ Form = 'Formatted',
$ CarriageControl = 'None',
$ IOStat = Status
$ )
If (Status .ne. 0) Then
Print '(A,I)',
$ ' Error creating file History.Stats, Status = ', Status
Stop
EndIf
EndIf
C No bridges so far
X = 0
C Read through the RBMS output file
Status = 0
Do While (Status .eq. 0)
Read (10,'(A)',IOStat = Status) Image
If (Status .eq. 0) Then
If (Image(1:9) .eq. 'Line coun') Then
Read (Image(24:24),'(I1)') Line
Else If (Image(1:9) .eq. 'Bridge ') Then
If (Line .eq. 1) Then
X = X + 1
Read (Image,'(9x,A19)') Bridge(X).Name
Z = Index (Bridge(X).Name,',')
If (Z .ne. 0) Then
Bridge(X).Name(Z:20) = ' '
EndIf
EndIf
Else
If (X .ne. 0) Then
If (Image(1:9) .eq. 'Bridge se') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Seconds(Line)
Else If (Image(1:9) .eq. 'Invalid p') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Invalid_Protocol(Line)
Else If (Image(1:9) .eq. 'Filtered ') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Filtered_Frames(Line)
Else If (Image(1:9) .eq. 'Bad frame') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Bad_Frames(Line)
Else If (Image(1:9) .eq. 'Lifetime ') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Life_Time_Exceeded(Line)
Else If (Image(1:9) .eq. 'No forwar') Then
Read (Image,'(40x,I12)')
$ Bridge(X).No_Forwarding(Line)
Else If (Image(1:9) .eq. 'Forwardin') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Forwarding_Transitions(Line)
Else If (Image(1:9) .eq. 'Collision') Then
Read (Image,'(40x,I12)')
$ Bridge(X).Collision_SQE_Error(Line)
Else If (Image(1:9) .eq. 'Frames: ') Then
Read (Image,'(14x,I25,7x,I25)')
$ Bridge(X).Frames_Transmitted(Line),
$ Bridge(X).Frames_Received(Line)
Else If (Image(1:9) .eq. 'Bridge fr') Then
Read (Image,'(14x,I25,7x,I25)')
$ Bridge(X).Bridge_Transmitted(Line),
$ Bridge(X).Bridge_Received(Line)
Else If (Image(1:9) .eq. 'Frames lo') Then
Read (Image,'(14x,I25,7x,I25)')
$ Bridge(X).Frames_Transmitted_Lost(Line),
$ Bridge(X).Frames_Received_Lost(Line)
EndIf
EndIf ! (X .ne. 0)
EndIf ! (Image(1:9) .eq. 'Line coun') Then
End If ! (Status)
End Do
C Now produce report
C Print Headings
Print '(19x,A,2x,A)',
$ '---- Line 1 --> Line 2 ---- ',
$ '---- Line 2 --> Line 1 ---- '
Print '(31x,A,A,16x,A,A)',
$ ' %',
$ ' %',
$ ' %',
$ ' %'
Print '(x,20A)',
$ 'Bridge ',
$ ' Receive',
$ ' F/S',
$ ' Filter',
$ ' Bad',
$ ' ',
$ ' Receive',
$ ' F/S',
$ ' Filter',
$ ' Bad'
Print '(x)'
C Produce report for each bridge
Do Z = 1,X
C Read the history entry for the bridge
Read (11,'(A)',IOStat = Status, KeyEq = Bridge(Z).Name)
$ H_Bridge.All
If (Qual_All .or. (Status .ne. 0)) Then
Do I = 1,132
H_Bridge.All(I:I) = Char(0)
End Do
EndIf
C Calculate stats to be be printed for this bridge
Do I = 1,2
PC_Filtered(I) =
$ 100.0 * (Bridge(Z).Filtered_Frames(I) -
$ H_Bridge.Filtered_Frames(I))
$ /
$ (Bridge(Z).Frames_Received(I) -
$ H_Bridge.Frames_Received(I))
PC_Bad_Frames(I) =
$ 100.0 * (Bridge(Z).Bad_Frames(I) -
$ H_Bridge.Bad_Frames(I))
$ /
$ (Bridge(Z).Frames_Received(I) -
$ H_Bridge.Frames_Received(I))
PPS_Received(I) =
$ (Bridge(Z).Frames_Received(I) -
$ H_Bridge.Frames_Received(I))
$ /
$ (Bridge(Z).Seconds(I) -
$ H_Bridge.Seconds(I))
Line_Err(I) = ' '
If ((Bridge(Z).Life_Time_Exceeded(I) -
$ H_Bridge.Life_Time_Exceeded(I)
$ ) .ne. 0) Then
Line_Err(I) = 'L'
Else If ((Bridge(Z).Invalid_Protocol(I) -
$ H_Bridge.Invalid_Protocol(I)
$ ) .ne. 0) Then
Line_Err(I) = 'P'
Else If ((Bridge(Z).Collision_SQE_Error(I) -
$ H_Bridge.Collision_SQE_Error(I)
$ ) .ne. 0) Then
Line_Err(I) = 'C'
Else If ((Bridge(Z).No_Forwarding(I) -
$ H_Bridge.No_Forwarding(I)
$ ) .ne. 0) Then
Line_Err(I) = 'F'
Else If (PC_Bad_Frames(I) .gt. 0.05) Then
Line_Err(I) = 'E'
EndIf
EndDo
Print '(x,A,2(i10,i5,f7.2,F7.2,A))',
$ Bridge(Z).Name(1:15),
$ (Bridge(Z).Frames_Received(I) -
$ H_Bridge.Frames_Received(I) ,
$ PPS_Received(I),
$ PC_Filtered(I),
$ PC_Bad_Frames(I),
$ Line_Err(I),
$ I = 1,2
$ )
If (Qual_Record) Then
If (Status .eq. 0) Then
ReWrite (11,'(A)',IOStat = Status) Bridge(Z).All
Else
Write (11,'(A)',IOStat = Status) Bridge(Z).All
EndIf
EndIf
If (Status .ne. 0) Then
Print '(A,I)', ' Error updating History.Stats, Status = ',
$ Status
EndIf
End Do
End ! Summary