Customizing Output of the show interfaces terse Command
By default, the layout of the
show interfaces tersecommand looks like this:user@host> show interfaces terseInterface Admin Link Proto Local Remotedsc up upfxp0 up upfxp0.0 up up inet 192.168.71.246/21fxp1 up upfxp1.0 up up inet 10.0.0.4/8inet6 fe80::200:ff:fe00:4/64fec0::10:0:0:4/64tnp 4gre up upipip up uplo0 up uplo0.0 up up inet 127.0.0.1 --> 0/0lo0.16385 up up inetinet6 fe80::2a0:a5ff:fe12:2f04lsi up upmtun up uppimd up uppime up uptap up upIn JUNOS XML, the output fields are represented as follows:
user@host>show interfaces terse | display xml<rpc-reply xmlns:junos="http://xml.juniper.net/junos/7.6I0/junos"><interface-information xmlns="http://xml.juniper.net/junos/7.6I0/junos-interface" junos:style="terse"><physical-interface><name>dsc</name><admin-status>up</admin-status><oper-status>up</oper-status></physical-interface><physical-interface><name>fxp0</name><admin-status>up</admin-status><oper-status>up</oper-status><logical-interface><name>fxp0.0</name><admin-status>up</admin-status><oper-status>up</oper-status>...(Output truncated)The following script customizes the output of the
show interfaces tersecommand.1 <?xml version="1.0" standalone="yes"?>2 <xsl:stylesheet version="1.0"3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"4 xmlns:junos="http://xml.juniper.net/junos/*/junos"5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0">7 <xsl:import href="../import/junos.xsl"/>8 <xsl:variable name="arguments">9 <argument>10 <name>interface</name>11 <description>Name of interface to display</description>12 </argument>13 <argument>14 <name>protocol</name>15 <description>Protocol to display (inet, inet6)</description>16 </argument>17 </xsl:variable>18 <xsl:param name="interface"/>19 <xsl:param name="protocol"/>20 <xsl:template match="/">21 <op-script-results>22 <xsl:variable name="rpc">23 <get-interface-information>24 <terse/>25 <xsl:if test="$interface">26 <interface-name>27 <xsl:value-of select="$interface"/>28 </interface-name>29 </xsl:if>30 </get-interface-information>31 </xsl:variable>32 <xsl:variable name="out" select="jcs:invoke($rpc)"/>33 <interface-information junos:style="terse">34 <xsl:choose>35 <xsl:when test="$protocol='inet' or $protocol='inet6' or $protocol='mpls' or $protocol='tnp'">36 <xsl:for-each select="$out/physical-interface/ logical-interface[address-family/address-family-name = $protocol]">37 <xsl:call-template name="intf"/>38 </xsl:for-each>39 </xsl:when>40 <xsl:when test="$protocol">41 <xnm:error>42 <message>43 <xsl:text>invalid protocol: </xsl:text>44 <xsl:value-of select="$protocol"/>45 </message>46 </xnm:error>47 </xsl:when>48 <xsl:otherwise>49 <xsl:for-each select="$out/physical-interface/logical-interface">50 <xsl:call-template name="intf"/>51 </xsl:for-each>52 </xsl:otherwise>53 </xsl:choose>54 </interface-information>55 </op-script-results>56 </xsl:template>57 <xsl:template name="intf">58 <xsl:variable name="status">59 <xsl:choose>60 <xsl:when test="admin-status='up' and oper-status='up'">61 <xsl:text> </xsl:text>62 </xsl:when>63 <xsl:when test="admin-status='down'">64 <xsl:text>offline</xsl:text>65 </xsl:when>66 <xsl:when test="oper-status='down' and ../admin-status='down'">67 <xsl:text>p-offline</xsl:text>68 </xsl:when>69 <xsl:when test="oper-status='down' and ../oper-status='down'">70 <xsl:text>p-down</xsl:text>71 </xsl:when>72 <xsl:when test="oper-status='down'">73 <xsl:text>down</xsl:text>74 </xsl:when>75 <xsl:otherwise>76 <xsl:value-of select="concat(oper-status, '/', admin-status)"/>77 </xsl:otherwise>78 </xsl:choose>79 </xsl:variable>80 <xsl:variable name="desc">81 <xsl:choose>82 <xsl:when test="description">83 <xsl:value-of select="description"/>84 </xsl:when>85 <xsl:when test="../description">86 <xsl:value-of select="../description"/>87 </xsl:when>88 </xsl:choose>89 </xsl:variable>90 <logical-interface>91 <name><xsl:value-of select="name"/></name>92 <xsl:if test="string-length($desc)">93 <admin-status><xsl:value-of select="$desc"/></admin-status>94 </xsl:if>95 <admin-status><xsl:value-of select="$status"/></admin-status>96 <xsl:choose>97 <xsl:when test="$protocol">98 <xsl:copy-of select="address-family[address-family-name = $protocol]"/>99 </xsl:when>100 <xsl:otherwise>101 <xsl:copy-of select="address-family"/>102 </xsl:otherwise>103 </xsl:choose>104 </logical-interface>105 </xsl:template>106 </xsl:stylesheet>Line-by-Line Explanation of the Script
Lines 1 through 7, Line 20, and Lines 105 and 106 are the boilerplate that you include in every op script. For more information, see Boilerplate for Op Scripts.
1 <?xml version="1.0" standalone="yes"?>2 <xsl:stylesheet version="1.0"3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"4 xmlns:junos="http://xml.juniper.net/junos/*/junos"5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0">7 <xsl:import href="../import/junos.xsl"/>20 <xsl:template match="/">105 </xsl:template>106 </xsl:stylesheet>Lines 8 through 17 declare a variable called
arguments, containing two arguments to the script:interfaceandprotocol. This variable declaration causesinterfaceandprotocolto appear in the command-line interface (CLI) as available arguments to the script.8 <xsl:variable name="arguments">9 <argument>10 <name>interface</name>11 <description>Name of interface to display</description>12 </argument>13 <argument>14 <name>protocol</name>15 <description>Protocol to display (inet, inet6)</description>16 </argument>17 </xsl:variable>Lines 18 and 19 declare two parameters to the script, corresponding to the arguments created in Lines 8 through 17. The parameter names must exactly match the argument names.
18 <xsl:param name="interface"/>19 <xsl:param name="protocol"/>Lines 20 through 31 declare a variable named
rpc. Theshow interfaces tersecommand is assigned to therpcvariable. If you include theinterfaceargument when you execute the script, the value of the argument (the interface name) is passed into the script.20 <xsl:template match="/">21 <op-script-results>22 <xsl:variable name="rpc">23 <get-interface-information>24 <terse/>25 <xsl:if test="$interface">26 <interface-name>27 <xsl:value-of select="$interface"/>28 </interface-name>29 </xsl:if>30 </get-interface-information>31 </xsl:variable>Line 32 declares a variable named
outand applies to it the execution of therpcvariable (show interfaces tersecommand).32 <xsl:variable name="out" select="jcs:invoke($rpc)"/>Line 33 specifies that the output level of the
show interfacescommand being modified isterse(as opposed toextensive,detail, and so on).33 <interface-information junos:style="terse">Lines 34 through 39 specify that if you include the
protocolargument when you execute the script and if the protocol value that you specify isinet,inet6,mpls, ortnp, theintftemplate is applied to each instance of that protocol type in the output.34 <xsl:choose>35 <xsl:when test="$protocol='inet' or $protocol='inet6' or $protocol='mpls' or $protocol='tnp'">36 <xsl:for-each select="$out/physical-interface/ logical-interface[address-family/address-family-name = $protocol]">37 <xsl:call-template name="intf"/>38 </xsl:for-each>39 </xsl:when>Lines 40 through 47 specify that if you include the
protocolargument when you execute the script and if the protocol value that you specify is something other thaninet,inet6,mpls, ortnp, an error message is emitted.40 <xsl:when test="$protocol">41 <xnm:error>42 <message>43 <xsl:text>invalid protocol: </xsl:text>44 <xsl:value-of select="$protocol"/>45 </message>46 </xnm:error>47 </xsl:when>Lines 48 through 52 specify that if you do not include the
protocolargument when you execute the script, theintftemplate is applied to each logical interface in the output.48 <xsl:otherwise>49 <xsl:for-each select="$out/physical-interface/logical-interface">50 <xsl:call-template name="intf"/>51 </xsl:for-each>52 </xsl:otherwise>Lines 53 through 56 are closing tags.
53 </xsl:choose>54 </interface-information>55 </op-script-results>56 </xsl:template>Line 57 opens the
intftemplate. This template customizes the output of theshow interfaces tersecommand.57 <xsl:template name="intf">Lines 58 through 79 declare a variable called
status, the purpose of which is to specify how the interface status is reported. An<xsl:choose>instruction populates the variable by considering all the possible states. As always in XSLT, the first <xsl:when>instruction that evaluates as TRUE is executed, and the remainder are ignored. Each<xsl:when>instruction is explained separately.58 <xsl:variable name="status">59 <xsl:choose>Lines 60 through 62 specify that if
admin-statusisupandoper-statusisup, no output is generated. In this case, thestatusvariable remains empty.60 <xsl:when test="admin-status='up' and oper-status='up'">61 <xsl:text> </xsl:text>62 </xsl:when>Lines 63 through 65 specify that if
admin-statusisdown, thestatusvariable contains the textoffline.63 <xsl:when test="admin-status='down'">64 <xsl:text>offline</xsl:text>65 </xsl:when>Lines 66 through 68 specify that if
oper-statusisdownand the physical interfaceadmin-statusisdown, thestatusvariable contains the textp-offline. (../selects the physical interface.)66 <xsl:when test="oper-status='down' and ../admin-status='down'">67 <xsl:text>p-offline</xsl:text>68 </xsl:when>Lines 69 through 71 specify that if
oper-statusisdownand the physical interfaceoper-statusisdown, thestatusvariable contains the textp-down. (../selects the physical interface.)69 <xsl:when test="oper-status='down' and ../oper-status='down'">70 <xsl:text>p-down</xsl:text>71 </xsl:when>Lines 72 through 74 specify that if
oper-statusisdown, thestatusvariable contains the textdown.72 <xsl:when test="oper-status='down'">73 <xsl:text>down</xsl:text>74 </xsl:when>Lines 75 through 77 specify that if none of the test cases are true, the
statusvariable containsoper-statusandadmin-statusconcatenated with a slash as a separator.75 <xsl:otherwise>76 <xsl:value-of select="concat(oper-status, '/', admin-status)"/>77 </xsl:otherwise>Lines 78 through 79 are closing tags.
78 </xsl:choose>79 </xsl:variable>Lines 80 through 89 define a variable called
desc. An<xsl:choose>instruction populates the variable by selecting the most specific interface description available. If a logical interface description is included in the configuration, it is used to populate thedescvariable. If not, the physical interface description is used. If no physical interface description is included in the configuration, the variable remains empty. As always in XSLT, the first <xsl:when>instruction that evaluates as TRUE is executed, and the remainder are ignored.80 <xsl:variable name="desc">81 <xsl:choose>82 <xsl:when test="description">83 <xsl:value-of select="description"/>84 </xsl:when>85 <xsl:when test="../description">86 <xsl:value-of select="../description"/>87 </xsl:when>88 </xsl:choose>89 </xsl:variable>The remainder of the script specifies how the operational mode output is displayed.
Lines 90 through 91 specify that the logical interface name is displayed first in the output.
90 <logical-interface>91 <name><xsl:value-of select="name"/></name>Lines 92 through 94 test whether the
descvariable has a nonzero number of characters. If the number of characters is more than zero, the interface description is displayed in the standard location of theadmin-statusfield. (In standard output, theadmin-statusfield is displayed on the second line.)92 <xsl:if test="string-length($desc)">93 <admin-status><xsl:value-of select="$desc"/></admin-status>94 </xsl:if>Line 95 specifies that the interface status as defined in the
statusvariable is displayed next.95 <admin-status><xsl:value-of select="$status"/></admin-status>Lines 96 through 103 specify that if you include the
protocolargument when you execute the script, only interfaces with that protocol configured are displayed. If you do not include theprotocolargument, all interfaces are displayed.96 <xsl:choose>97 <xsl:when test="$protocol">98 <xsl:copy-of select="address-family[address-family-name = $protocol]"/>99 </xsl:when>100 <xsl:otherwise>101 <xsl:copy-of select="address-family"/>102 </xsl:otherwise>103 </xsl:choose>Lines 104 through 106 are closing tags.
104 </logical-interface>105 </xsl:template>106 </xsl:stylesheet>Testing ex-interface.xsl
To test the example in this section, perform the following steps:
- From Customizing Output of the show interfaces terse Command, copy the Extensible Stylesheet Language Transformations (XSLT) script into a text file, and name the file ex-interface.xsl. Copy the ex-interface.xsl file to the
/var/db/scripts/opdirectory on your routing platform.- Include the file ex-interface.xsl statement at the
[edit system scripts op]hierarchy level:[edit system scripts op]file ex-interface.xsl;- Issue the
commit and-quitcommand.- When you issue
show interfaces tersecommand, the standard output looks like this:show interfaces terse (Standard Output)
user@host> show interfaces terseInterface Admin Link Proto Local Remotedsc up upfxp0 up upfxp0.0 up up inet 192.168.71.246/21fxp1 up upfxp1.0 up up inet 10.0.0.4/8inet6 fe80::200:ff:fe00:4/64fec0::10:0:0:4/64tnp 4gre up upipip up uplo0 up uplo0.0 up up inet 127.0.0.1 --> 0/0lo0.16385 up up inetinet6 fe80::2a0:a5ff:fe12:2f04lsi up upmtun up uppimd up uppime up uptap up upop ex-interface
(No Arguments)When you issue theop ex-interfacecommand, the customized output looks like this:user@host> op ex-interfaceInterface Admin Link Proto Local Remotefxp0.0 This is the Ethernet Management interface.inet 192.168.71.246/21fxp1.0 inet 10.0.0.4/8inet6 fe80::200:ff:fe00:4/64fec0::10:0:0:4/64tnp 4lo0.0 inet 127.0.0.1 --> 0/0lo0.16385 inetinet6 fe80::2a0:a5ff:fe12:2f04-->Display Available Arguments
user@host> op ex-interface ?Possible completions:<[Enter]> Execute this command<name> Argument nameinterface Name of interface to displayprotocol Protocol to display (inet, inet6)| Pipe through a commandop ex-interface interface
(interface Argument)user@host> op ex-interface interface fxp0Interface Admin Link Proto Local Remotefxp0.0 This is the Ethernet Management interface.inet 192.168.71.246/21op ex-interface interface
(protocol Argument)user@host> op ex-interface protocol inetInterface Admin Link Proto Local Remotefxp0.0 This is the Ethernet Management interface.inet 192.168.71.246/21fxp1.0 inet 10.0.0.4/8lo0.0 inet 127.0.0.1 --> 0/0lo0.16385 inet