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>
"""