Skip to content

ttp - Indicators#

name description
_exact_ \d+数字をパターンに置き換えずにそのまま
_exact_space_ r(\\ +)パターンに置き換えずにスペース文字をそのままにする
_start_ グループの開始を明示的に示す
_end_ グループの終わりを明示的に示す
_line_ 存在する場合、任意の行にマッチングされます
ignore 指定された位置の文字列を正規表現で置換し、結果をマッチングさせない
_headers_ 固定幅の一行テキストテーブルを解析するための正規表現を動的に形成

_exact_#

data = """
vrf VRF-A
 address-family ipv4 unicast
  maximum prefix 1000 80
 !
 address-family ipv6 unicast
  maximum prefix 300 80
 !
"""

# ipv4 / ipv6 どちらもマッチしてしまう
template = """
<group name="vrfs">
vrf {{ vrf }}
 <group name="ipv4_config">
 address-family ipv4 unicast {{ _start_ }}
  maximum prefix {{ limit }} {{ warning }}
 </group>
</group>
"""

# ipv4 のみにマッチするよう _exact_ を指定
template ="""
<group name="vrfs">
vrf {{ vrf }}
 <group name="ipv4_config">
 address-family ipv4 unicast {{ _start_ }}{{ _exact_ }}
  maximum prefix {{ limit }} {{ warning }}
 !{{ _end_ }}
 </group>
</group>
"""

_exact_space_#

  • 構文: {{ name | _exact_space_ }}
  • デフォルトでは、テンプレート内のすべてのスペース文字は \ + パターンに置き換えられる
  • _exact_space_ が存在する場合、スペース文字は変更されず、そのまま解析に使用される

start#

  • 構文: {{ name | _start_ }}
  • 構文: {{_start_}}
例1
data = """
switch-a#show cdp neighbors detail
-------------------------
Device ID: switch-b
Entry address(es):
  IP address: 131.0.0.1

-------------------------
Device ID: switch-c
Entry address(es):
  IP address: 131.0.0.2
"""

template = """
<group name="cdp_peers">
------------------------- {{ _start_ }}
Device ID: {{ peer_hostname }}
Entry address(es):
  IP address: {{ peer_ip }}
</group>
"""

以下の例では2つの異なる行が、同じグループの開始のインジケーターとして機能する。

例2
data = """
interface Tunnel2422
 description cpe-1
!
interface GigabitEthernet1/1
 description core-1
"""

template = """
<group name="interfaces">
interface Tunnel{{ if_id }}
interface GigabitEthernet{{ if_id | _start_ }}
 description {{ description }}
</group>
"""

_end_#

  • 構文: pattern {{ _end_ }}
  • グループの終わりを明示的に示し、無関係なテキストデータのチェックを排除する場面で使用

_line_#

  • 構文: {{ name | _line_ }}
  • _line_ インジケーターの主な使用例は、他の一致変数と一致しなかったデータを一致させて収集すること。
  • contains関数を使用して結果をフィルター処理できる
  • _line_と一致する最後の行のみを変数に一致するように割り当てる、複数の行を保存する必要がある場合は joinmatches関数を使用
  • _end_ と併用して処理の範囲を絞ることがベター。
data = """
interface Loopback0
 description Router-id-loopback
 ip address 192.168.0.113/24
!
interface Gi0/37
 description CPE_Acces
 switchport port-security
 switchport port-security maximum 5
 switchport port-security mac-address sticky
!
"""

template = """


<group>
interface {{ interface }}
 ip address {{ ip }}/{{ mask }}
 description {{ description }}
 ip vrf {{ vrf }}
 {{ port_security_cfg | _line_ | contains("port-security") | joinmatches }}
! {{ _end_ }}
</group>
"""

ignore#

```py title="例1" data = """ FastEthernet0/0 is up, line protocol is up Hardware is Gt96k FE, address is c201.1d00.0000 (bia c201.1d00.1234) MTU 1500 bytes, BW 100000 Kbit/sec, DLY 1000 usec, FastEthernet0/1 is up, line protocol is up Hardware is Gt96k FE, address is b20a.1e00.8777 (bia c201.1d00.1111) MTU 1500 bytes, BW 100000 Kbit/sec, DLY 1000 usec, """

template = """ {{ interface }} is up, line protocol is up Hardware is Gt96k FE, address is {{ ignore }} (bia {{MAC}}) MTU {{ mtu }} bytes, BW 100000 Kbit/sec, DLY 1000 usec, """

!!! Info 
  以下、意図しないとこでマッチしてしまう例

    ```
    {{ interface }} is up, line protocol is up
    Hardware is Gt96k FE, address is c201.1d00.0000 (bia {{MAC}})
    MTU {{ mtu }} bytes, BW 100000 Kbit/sec, DLY 1000 usec,
    ```


以下の例では 無視するパターンを変数で定義している

```py title="例2"
data = """
FastEthernet0/0 is up, line protocol is up
  Hardware is Gt96k FE, address is c201.1d00.0000 (bia c201.1d00.1234)
  MTU 1500 bytes, BW 100000 Kbit/sec, DLY 1000 usec,
FastEthernet0/1 is up, line protocol is up
  Hardware is Gt96k FE, address is b20a.1e00.8777 (bia c201.1d00.1111)
  MTU 1500 bytes, BW 100000 Kbit/sec, DLY 1000 usec,
"""

template = """
<vars>
pattern_var = "\S+|\d+"
</vars>

<group name="interfaces">
{{ interface }} is up, line protocol is up
  Hardware is Gt96k FE, address is {{ ignore("pattern_var") }} (bia {{MAC}})
  MTU {{ mtu }} bytes, BW 100000 Kbit/sec, DLY 1000 usec,
</group>
"""

_headers_#

  • 構文: head1 head2 ... headN {{ _headers_ }}
  • 構文: head1 head2 ... headN {{ _headers_ | columns(5) }}
  • _headers_は固定幅の1行のテキストテーブルを解析する際に使用
data = """
Port      Name               Status       Vlan       Duplex  Speed Type
Gi0/1     PIT-VDU213         connected    18         a-full  a-100 10/100/1000BaseTX
Gi0/3     PIT-VDU212         notconnect   18           auto   auto 10/100/1000BaseTX
Gi0/4                        connected    18         a-full  a-100 10/100/1000BaseTX
Gi0/5                        notconnect   18           auto   auto 10/100/1000BaseTX
Gi0/15                       connected    trunk        full   1000 1000BaseLX SFP
Gi0/16    pitrs2201 te1/1/4  connected    trunk        full   1000  1000BaseLX SFP
"""

template = """
<group>
Port      Name               Status       Vlan       Duplex  Speed Type   {{ _headers_ }}
</group>
"""