Показ конфигурации секции при настройке роутера Cisco

Cisco
Для использования примера нужно сохранить на флешку маршрутизатора Cisco 2 скрипта и создать соответствующие алиасы. Скрипты позволяют просматривать конфигурацию одной настраиваемой в данный момент секции, что очень удобно. Например:
router(config)#interface fa 0/1
router(config-if)#config

Building configuration...
Current configuration : 94 bytes
!
interface FastEthernet0/1
 ip address 192.168.0.1 255.255.255.0
 duplex auto
 speed auto
end

router(config-if)#router bgp 65000
router(config-router)#config
router bgp 65000
 no synchronization
 bgp log-neighbor-changes
 network 192.168.0.1 mask 255.255.255.255
 no auto-summary

Настройка


1. Сохраните скрипты на flash или disk0. Рекомендуется создать папку, в которой вы будете хранить EEM Tcl политики.
2. Настройте EEM Tcl политики (предполагается, что скрипты были сохранены в flash:/tcl):
event manager directory user policy "flash:/script"
event manager policy routerconfig.tcl type user
event manager policy routerparser.tcl type user

3. Настроим алиасы:
alias router config do event manager run routerconfig.tcl
alias interface config do event manager run routerconfig.tcl

Тексты скриптов

routerparser.tcl
::cisco::eem::event_register_cli sync yes occurs 1 pattern "^interface (.*)$|^router (.*)$"

namespace import ::cisco::eem::*
namespace import ::cisco::lib::*

array set evtData [event_reqinfo]
set _cli_msg $evtData(msg)

#
# INTERFACE CONFIGURATION COMMAND
# remember interface which is being configured
#
if { [ regexp -nocase {^interface (\S+)} $_cli_msg ignore intf] } {
  appl_reqinfo key "cmd"
  appl_setinfo key "cmd" data "show running interface $intf"
  exit 1
}

#
# ROUTER CONFIGURATION COMMAND
# remember routing protocol being configured
#
if { [ regexp -nocase {^router (.*)$} $_cli_msg ignore rtr] } {
  appl_reqinfo key "cmd"
  set rtr [string trim $rtr]
  appl_setinfo key "cmd" data "show running | section router $rtr"
  exit 1
} 

routerconfig.tcl
::cisco::eem::event_register_none

namespace import ::cisco::eem::*
namespace import ::cisco::lib::*

set cmda [appl_reqinfo key "cmd"]

if { [ lindex $cmda 0 ] == "data" } {
  set cmd [ lindex $cmda 1 ]
  appl_setinfo key "cmd" data $cmd
}

if {[catch {cli_open} result]} {
  puts stderr "%CLICONFIG-3-EXEC: CLI OPEN failed ($result)"
  exit 0
}

array set cfd $result

if {[catch {cli_exec $cfd(fd) "enable"} result]} {
  puts stderr "%CLICONFIG-3-EXEC: Cannot execute 'enable' command ($result)"
  exit 0
}

if {[catch {cli_exec $cfd(fd) $cmd} result]} {
  puts stderr "%CLICONFIG-3-EXEC: Cannot execute $cmd ($result)"
  exit 0
}

puts $result
catch {cli_close $cfd(fd) $cfd(tty_id)}
exit 0

5 комментариев

avatar
Этот конфиг работает только, если интерфейс уже был создан.
Если создать интерфейс и сразу набрать config, то выдается сообщение

ME3400(config)#no int vl 700
ME3400(config)#int vl 700
ME3400(config-if)#config

% Incomplete command.

ME3400#

ME3400(config-if)#exit
ME3400(config)#int vl 700
ME3400(config-if)#config

Building configuration…

Current configuration: 40 bytes
!
interface Vlan700
no ip address
end

ME3400#
avatar
хотя если делать так, то все отлично работает
ME3400(config-if)#no int vl 700
ME3400(config)#int vlan700
ME3400(config-if)#config

Building configuration…

Current configuration: 40 bytes
!
interface Vlan700
no ip address
end

ME3400#

Т.е разница в том, что в первом случае я ставлю пробел между vlan и 700, а во втором случае нет, но если интерфейс был создан заранее, то показывает конфиг как с пробелом, так и без.
avatar
если добавить в скрипт routerparser.tcl строчку
puts $intf, то будет следующий результат

ME3400(config)#no int vl 700
ME3400(config)#int vl 700
vl

ME3400(config-if)#int vl 700
Vlan700

т.е если интерфейс не создан, то при создании парсится только vl, а номер нет.
avatar
И еще алиас надо добавить, чтобы показывало конфиг на подинтерфейсах.

alias subinterface config do event manager run routerconfig.tcl
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.