Skip to content

ttp - Functions#

Python 組み込み関数の使用#

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

template = """
<group name="interfaces">
interface {{ interface | upper }}
 description {{ description | split('-') }}
</group>
"""

macro#

  • {{ name | macro(macro_name) }}
  • macro_name: 一致結果を渡すマクロ関数の名前

Warning

マクロはPython exec関数を使用して、制限を課すことなくコードペイロードを解析します。 したがって、システム上で任意のコードを実行するために使用できるマクロが定義されている可能性があるため、信頼できないソースからテンプレートを実行するのは危険です。

data = """
interface Vlan123
 description Desks vlan
 ip address 192.168.123.1 255.255.255.0
!
interface GigabitEthernet1/1
 description to core-1
!
interface Vlan222
 description Phones vlan
 ip address 192.168.222.1 255.255.255.0
!
interface Loopback0
 description Routing ID loopback
!
"""

template = """
<macro>
def check_if_svi(data):
    if "Vlan" in data:
        return data, {"is_svi": True}
    else:
       return data, {"is_svi": False}

def check_if_loop(data):
    if "Loopback" in data:
        return data, {"is_loop": True}
    else:
       return data, {"is_loop": False}
</macro>

<macro>
def description_mod(data):
    # To revert words order in descripotion
    words_list = data.split(" ")
    words_list_reversed = list(reversed(words_list))
    words_reversed = " ".join(words_list_reversed)
    return words_reversed
</macro>

<group name="interfaces_macro">
interface {{ interface | macro("check_if_svi") | macro("check_if_loop") }}
 description {{ description | ORPHRASE | macro("description_mod")}}
 ip address {{ ip }} {{ mask }}
</group>
"""

chain#

  • {{ name | chain(variable_name) }}
  • マッチした結果に複数の関数を適用したい場面で使用
data = """
interface GigabitEthernet3/3
 switchport trunk allowed vlan add 138,166-173
 switchport trunk allowed vlan add 400,401,410
"""

template = """
<vars>
vlans = "unrange(rangechar='-', joinchar=',') | split(',') | join(':') | joinmatches(':')"
</vars>

<group name="interfaces">
interface {{ interface }}
 switchport trunk allowed vlan add {{ trunk_vlans | chain('vlans') }}
</group>
"""

unrange#

  • {{ name | unrange('rangechar', 'joinchar') }}
  • rangechar: 範囲を示す文字
  • joinchar: 範囲アイテムの結合に使用される文字
  • 一致結果に整数範囲が含まれている場合、この関数を使用してその範囲を特定の値に拡張できる
  • たとえば、範囲が100〜105の場合、その結果をこの関数に渡すと、結果「101,102,103,104,105」が生成される
data = """
interface GigabitEthernet3/3
 switchport trunk allowed vlan add 138,166,170-173
"""

template = """
interface {{ interface }}
 switchport trunk allowed vlan add {{ trunk_vlans | unrange(rangechar='-', joinchar=',') }}
"""

replaceall#

  • 構文: {{ name | replaceall('value1', 'value2', ..., 'valueN') }}
  • value: 一致して置き換える文字列。
空の値に設定した場合
data = """
interface GigabitEthernet3/3
interface GigEthernet5/7
interface GeEthernet1/5
"""

template = """
interface {{ interface | replaceall('Ethernet') }}
"""
新しく値を設定した場合
data = """
interface GigabitEthernet3/3
interface GigEthernet5/7
interface GeEthernet1/5
"""

template = """
interface {{ interface | replaceall('Ge', 'GigabitEthernet', 'GigEth', 'Ethernet') }}
"""

resuball#

  • {{ name | resuball('value1', 'value2', ..., 'valueN') }}
  • value: 一致して置き換える文字列。テンプレート変数名を参照できます。
data = """
interface GigabitEthernet3/3
interface TenGigabitEthernet3/3
"""

template = """
<vars load="python">
intf_replace = {
                'Ge': ['^GigabitEthernet'],
                'Te': ['^TenGigabitEthernet']
                }
</vars>

<group name="ifs">
interface {{ interface | resuball('intf_replace') }}
<group>
"""

record#

  • { name | record(var_name) }}
  • name: 一致結果を記録するために使用するテンプレート変数名

【説明】

  • レコードの一致結果は、指定された名前のテンプレート変数として記録される
  • その記録された変数は、マクロ内の _ttp_ ディクショナリから設定または取得するなどの他の関数内で参照できる
  • 変数は2つのスコープで記録されます。

    1. 入力ごとのスコープ
      • この特定の入力を解析するすべてのグループは、記録された変数にアクセスできます。
      • _ttp_["parser_object"].vars 辞書に保存されている変数
    2. グローバルスコープ
    3. 任意のテンプレートの任意のグループから利用可能な変数。
    4. _ttp_["global_vars"] 辞書に保存されている変数

Warning

レコード結果は相互にオーバーライドします。 つまり、複数の一致変数レコード結果が同じテンプレート変数にある場合、 後で一致した一致変数は前の一致結果をオーバーライドします。

<input load="text" name="in1">
myswitch1#show run int
interface Vlan778
 ip vrf forwarding VRF_NAME_1
 ip address 2002:fd37::91/124
!
</input>

<input load="text" name="in2">
myswitch2#show run int
interface Vlan779
 description some description input2
!
interface Vlan780
 switchport port-security mac 4
!
</input>

<group name="interfaces" input="in1">
interface {{ interface }}
 ip address {{ ip }}/{{ mask }}
 ip vrf forwarding {{ vrf | record("VRF") }}
 switchport port-security mac {{ sec_mac }}
</group>

<group name="interfaces" input="in2">
interface {{ interface }}
 description {{ description | ORPHRASE | record("my_description") }}
 switchport port-security mac {{ sec_mac }}
 {{ my_vrf | set("VRF") }}
 {{ my_descript | set("my_description") }}
</group>

let#

  • {{ variable | let(var_name, value) }}
  • {{ variable | let(value) }}
  • value: 変数に割り当てられる値を含む文字列

  • 提供された値を var_name という名前の変数に静的に割り当てます。

  • 単一の引数が指定された場合、その引数は値と見なされ、一致結果を置き換える変数に一致するように割り当てられます。
<input load="text">
interface Loopback0
 description Management
 ip address 192.168.0.113/24
!
</input>

<group name="interfaces">
interface {{ interface }}
 description {{ description | let("description_undefined") }}
 ip address {{ ip | contains("24") | let("netmask", "255.255.255.0") }}
</group>
結果
[
    [
        {
            "interfaces": {
                "description": "description_undefined",
                "interface": "Loopback0",
                "ip": "192.168.0.113/24",
                "netmask": "255.255.255.0"
            }
        }
    ]
]

set#

  • {{ name | set('var_set_value') }}
  • var_set_value: 変数の値として設定する文字列。テンプレート変数の名前にすることができる

「var_set_value」を変数の一致に割り当てることができます。 「var_set_value」はテンプレート変数名への参照と見なされます。 「var_set_value」のテンプレート変数が見つからない場合は、「var_set_value」自体が変数の一致に割り当てられます。

set関数を使用して、前にテキストを付けずにset関数を使用すると、一致結果に任意のキーと値のペアを導入することもできます。

例1
data = """
interface GigabitEthernet3/4
 switchport mode access
 switchport trunk encapsulation dot1q
 switchport mode trunk
 switchport nonegotiate
 shutdown
!
interface GigabitEthernet3/7
 switchport mode access
 switchport mode trunk
 switchport nonegotiate
!
"""

template = """
<vars>
mys_set_var = "my_set_value"
</vars>

<group name="interfacesset">
interface {{ interface }}
 switchport mode access {{ mode_access | set("True") }}
 switchport trunk encapsulation dot1q {{ encap | set("dot1q") }}
 switchport mode trunk {{ mode | set("Trunk") }} {{ vlans | set("all_vlans") }}
 shutdown {{ disabled | set("True") }} {{ test_var | set("mys_set_var") }}
!{{ _end_ }}
</group>
"""
例1
data ="""
interface Vlan777
  description Management
  ip address 192.168.0.1/24
  vrf MGMT
!
"""

template ="""
<vars>
my_var = "L2VC"
</vars>

<group>
interface {{ interface }}
  description {{ description }}
  ip address {{ ip }}/{{ mask }}
  vrf {{ vrf }}
  {{ interface_role | set("Uplink") }}
  {{ provider | set("my_var") }}
!{{_end_}}
</group>
"""

Condition functions#

exclude_re#

  • {{ name | exclude_re('pattern') }}
  • 一致した値に特定の文字列パターンが含まれているかどうかを評価するために使用
  • 含まれている場合はFalseを返し、含まれていない場合はTrueを返す

exclude#

  • {{ name | exclude('pattern') }}
  • 一致した値に指定された文字列パターンが含まれているかどうかを評価する
  • 含まれている場合はFalseを返し、含まれていない場合はTrueを返す

equal#

  • {{ name | equal('value') }}
  • 一致した値が指定された値と等しいかどうかを評価し、等しい場合はTrueを返し、そうでない場合はFalseを返す。