TTPでパース後の要素が一つだけでもリスト形式にする
こちらの記事で、わからなかった下記について実装方法が分かったので書き残します
パース後の要素が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を使い始めて地味に困っていた課題を解決できました、いろいろな機能があるのでもう少し勉強をしたいと思います。