[CLI Tip]: обзор running config

в 11:23, , рубрики: regexp, WING5, Беспроводные технологии, Регулярные выражения, Сетевые технологии, метки: , ,

Часто получаешь в руки железку, нужно оценить, как она наконфигурена. При этом, размер running config может быть огромным (скажем, полный дамп конфига контроллера из моей лабы в данном примере 21KB ~=29 страниц). Для первого взгляда хочется увидеть, какие секции конфига присутствуют. В качестве примера взята платформа Motorola Solutions WING5 (WLAN), но, в принципе будет работать на любой железке, где конструкция "| include" поддерживает regexp (Cisco, Motorola WING4, другие IOS-подобные интерфейсы).

Пишем:

RFS-ADSP>sh run | include ^\w

Получаем:

version 2.1
ip access-list BROADCAST-MULTICAST-CONTROL
ip access-list fw-acl-full
ip access-list fw-acl-limited
ip access-list fw-acl-verylimited
mac access-list 12-block-mint
mac access-list PERMIT-ARP-AND-IPv4
mac access-list l2-block-mint
firewall-policy default
firewall-policy lab-fw-wips
role-policy lab-rolepol
mint-policy global-default
wlan-qos-policy default
radio-qos-policy default
aaa-policy lab-aaapol
captive-portal lab-hotspot
wlan ADSP-TRG
wlan team6-eap
wlan team6-hotspot
wlan team6-psk1
wlan team6-psk2
smart-rf-policy lab-smartrf
wips-policy lab-wips-basic
advanced-wips-policy lab-wips-adv
auto-provisioning-policy lab-autopolicy
radius-group radgroup-fullusers
radius-group radgrp-hotspot
radius-user-pool-policy lab-radpool
radius-server-policy lab-radius
dhcp-server-policy ADSPLAB
dhcp-server-policy RFS2
management-policy default
management-policy lab-mgmt
l2tpv3 policy default
profile rfs4000 default-rfs4000
profile rfs4000 lab-rfs4000
profile ap71xx lab-7131
profile ap650 default-ap650
profile ap650 lab-ap650
profile ap6521 lab-6521
profile ap621 lab-621
rf-domain default
rf-domain lab-rfdomain
rfs4000 5C-0E-8B-1B-9B-44
ap650 5C-0E-8B-98-C5-44
ap6521 5C-0E-8B-E8-31-68
ap621 5C-0E-8B-97-C2-48
ap621 5C-0E-8B-97-DA-AA
end

Для платформы WING5 эта команда весьма актуальна, т.к. контроллер держит мастер-конфигурацию для всей сети (а это могут быть сотни, если не тысячи секций для профилей/политик/устройств/сервисов и даже других контроллеров) — копаться в полном дампе running config нереально. &#x3CIMHO&#x3EВообще, о том насколько круто реализована структура и синхронизация конфига в WING5 (распределенная сеть), и том, какие плюшки есть в CLI для массового конфигурирования/администрирования и траблшутинга можно писать отдельный цикл статей (типа запуска централизованного сбора пакетов со всех точек удаленного сайта командой в одну строчку). Возвращаться к сетям третьего поколения теперь вообще не хочется. &#x3C/IMHO&#x3E

Для железок с «отдельно стоящим» конфигом (свитчи, роутеры) команда может показать все ACL'ы, route maps, VPNы и проч секции конфига, что тоже удобно.

Разбор regexp (на всякий случай, гуру могут пропускать)

show run… |include &#x3Cregexp&#x3E показывает только строки, в которых встречается regexp.

Структура конфига (вывода «чистого» show run) выглядит так (обратите внимание на отступы):

! <заголовок>
<версия>
!
<секция X>
 <команда>
 <команда>
 ..
!
<секция Y>
 <команда>
 <команда>
 ..
!
...
!
<конец>

Нам нужны только заголовки секций — строки без отступов. Соответственно, нужны все строки, начинающиеся не с пробела. Но еще есть комментации и разделители секций в виде восклицательных знаков — они нам тоже не нужны. Получается, regexp должен выглядеть как «строки, начинающиеся не с пробела или восклицательного знака».
Воспользуемся конструкцией '[&#x3CXYZ&#x3E]', которая совпадает с любым символом, заключенным в квадратные скобки. [! ] даст нам «пробел или воскл знак», [^! ] даст нам «не пробел и не воскл знак». Добавим '^&#x3CX&#x3E' («строка начинается с X»): ^[^! ] = «строка начинается с любого символа кроме пробела или восклицательного знака».
Однако, зная, что название секции всегда буква — можно упростить regexp и сэкономитиь себе несколько секунд топтания по клаве: ^\w. 'w' обозначает «любая буква» (заглавная и строчная), еще один бекслэш нужен для экранирования бекслэша в 'w' — получаем 'w'. Добавляем «начало строки» — '^\w'. Получается «покажи мне строки, которые начинаются с буквы».

P.S. Две страницы текста для описания одной строчки… o_O Как считаете, можно было без потерь обойтись одной-двумя строками?

Автор: apcsb

* - обязательные к заполнению поля