うさラボ

お勉強と備忘録

TTPでパース後の要素が一つだけでもリスト形式にする

usage-automate.hatenablog.com

こちらの記事で、わからなかった下記について実装方法が分かったので書き残します

パース後の要素が2個以上ある場合は自動的にリストになるようです。
要素が1個の場合リストにならないため、パース後に呼び出す際に注意が必要です。

前回のおさらい

作成したテンプレートがこちら

<group name="dynamic_nat">
{{ protocol }} {{ inside_global_ip }}:{{ inside_global_port }} {{ inside_local_ip }}:{{ inside_local_port }} {{ outside_local_ip }}:{{ outside_local_port }} {{ outside_global_ip }}:{{ outside_global_port }}
</group>

<group name="static_nat">
{{ protocol }} {{ inside_global_ip | re("(\S+)(?!.*:)") }} {{ inside_local_ip | re("(\S+)(?!.*:)") }} {{ outside_local_ip | re("(\S+)(?!.*:)") }} {{ outside_global_ip | re("(\S+)(?!.*:)") }}
</group>

たとえばパース後の要素が一つしかできないインプットで実行すると

Pro Inside global      Inside local       Outside local      Outside global
tcp 10.9.0.0:51776     10.1.0.2:51776     10.2.0.2:21        10.2.0.2:21
--- 10.9.0.0     10.1.0.2     ---        ---

アウトプットは辞書になります。

        "dynamic_nat": {
            "inside_global_ip": "10.9.0.0",
            "inside_global_port": "51776",
            "inside_local_ip": "10.1.0.2",
            "inside_local_port": "51776",
            "outside_global_ip": "10.2.0.2",
            "outside_global_port": "21",
            "outside_local_ip": "10.2.0.2",
            "outside_local_port": "21",
            "protocol": "tcp"
        },
        "static_nat": {
            "inside_global_ip": "10.9.0.0",
            "inside_local_ip": "10.1.0.2",
            "outside_global_ip": "---",
            "outside_local_ip": "---",
            "protocol": "---"
        }

パース後の要素が複数個になるインプットで実行すると

Pro Inside global      Inside local       Outside local      Outside global
tcp 10.9.0.0:51776     10.1.0.2:51776     10.2.0.2:21        10.2.0.2:21
tcp 10.9.0.0:51778     10.1.0.2:51778     10.2.0.2:21        10.2.0.2:21
--- 10.9.0.0     10.1.0.2     ---        ---

アウトプットは自動的にリストになります。

        "dynamic_nat": [
            {
                "inside_global_ip": "10.9.0.0",
                "inside_global_port": "51776",
                "inside_local_ip": "10.1.0.2",
                "inside_local_port": "51776",
                "outside_global_ip": "10.2.0.2",
                "outside_global_port": "21",
                "outside_local_ip": "10.2.0.2",
                "outside_local_port": "21",
                "protocol": "tcp"
            },
            {
                "inside_global_ip": "10.9.0.0",
                "inside_global_port": "51778",
                "inside_local_ip": "10.1.0.2",
                "inside_local_port": "51778",
                "outside_global_ip": "10.2.0.2",
                "outside_global_port": "21",
                "outside_local_ip": "10.2.0.2",
                "outside_local_port": "21",
                "protocol": "tcp"
            }
        ],
        "static_nat": {
            "inside_global_ip": "10.9.0.0",
            "inside_local_ip": "10.1.0.2",
            "outside_global_ip": "---",
            "outside_local_ip": "---",
            "protocol": "---"
        }
    }

せっかく構造化したのに、要素が一つの時と複数の時で呼び出し方が変わってしまうと厄介です

要素一個
static_nat.inside_global_ip

要素複数個
static_nat[0].isndie_global_ip

解決方法

テンプレートの<group name="dynamic_nat">*を追加する

<group name="dynamic_nat*">

<group name="dynamic_nat*">
{{ protocol }} {{ inside_global_ip }}:{{ inside_global_port }} {{ inside_local_ip }}:{{ inside_local_port }} {{ outside_local_ip }}:{{ outside_local_port }} {{ outside_global_ip }}:{{ outside_global_port }}
</group>

<group name="static_nat">
{{ protocol }} {{ inside_global_ip | re("(\S+)(?!.*:)") }} {{ inside_local_ip | re("(\S+)(?!.*:)") }} {{ outside_local_ip | re("(\S+)(?!.*:)") }} {{ outside_global_ip | re("(\S+)(?!.*:)") }}
</group>

dynamic_natのほうだけ*を付けました。

これで、パース後の要素が一つのみのインプットで試してみます。

Pro Inside global      Inside local       Outside local      Outside global
tcp 10.9.0.0:51776     10.1.0.2:51776     10.2.0.2:21        10.2.0.2:21
--- 10.9.0.0     10.1.0.2     ---        ---

要素が一つだけですが、*を付けたdynamic_natのほうはリストになりました。

        "dynamic_nat": [
            {
                "inside_global_ip": "10.9.0.0",
                "inside_global_port": "51776",
                "inside_local_ip": "10.1.0.2",
                "inside_local_port": "51776",
                "outside_global_ip": "10.2.0.2",
                "outside_global_port": "21",
                "outside_local_ip": "10.2.0.2",
                "outside_local_port": "21",
                "protocol": "tcp"
            }
        ],
        "static_nat": {
            "inside_global_ip": "10.9.0.0",
            "inside_local_ip": "10.1.0.2",
            "outside_global_ip": "---",
            "outside_local_ip": "---",
            "protocol": "---"
        }
    }

まとめ

TTPを使い始めて地味に困っていた課題を解決できました、いろいろな機能があるのでもう少し勉強をしたいと思います。