문법
기본 형태
•
기본 구분자
◦
{{ … }} : 변수나 표현식의 결과를 출력하는 구분자(delimeter)
◦
{% … %} : if문이나 for문 같은 제어문을 할당하는 구분자 - 파이썬 소스코드 (delimeter)
•
기타 문법
◦
{% raw %} ... {% endraw %} : Escape - 템플릿 형태 동일한 텍스트를 출력하고자 할 때
{{ '{{' }} : 따옴표(‘ ’)로도 가능
◦
{%- ... %}, {%+ ... %}, {% ... -%} ... : '+'가 붙은 쪽은 공백을 유지 시키고 '-'가 붙은 쪽은 공백을 제거
반복문 (for ~ in …)
•
구조
{% for <개별요소> in <리스트> %} # 리스트 길이만큼 실행
<실행코드>
{% endfor %} # 종료시
Python
복사
•
템플릿 엔진이 제공하는 변수 목록
변 수 | 설 명 |
loop.index | for 구분이 반복된 횟수(1부터 세기 시작) |
loop.index0 | for 구문이 반복된 횟수(0부터 세기 시작) |
loop.first | 반복이 처음일 경우 True, 아닐 경우 False |
loop.last | 마지막 반복일 경우 True, 아닐 경우 False |
loop.length | 전체 반복 횟수 |
loop.cycle | loop.cycle()에서 안에 넣는 인자를 순서대로 전달.
loop.cycle('1', '2', '3') 처럼 사용하면 반복문이 돌 때마다 순서대로 '1', '2', '3' 을 출력. |
•
continue
{%continue%}
•
break
{%break%}
제어문(if)
•
구조
{% if <조건> %}
<실행코드>
{% elif <조건> %}
<실행코드>
{% else %}
<실행코드>
{% endif %}
Python
복사
•
인라인 구조
{% <실행코드> if <조건> else <거짓일때 실행코드> %}
Python
복사
형변환
{{ 데이터 | 변환할 자료형 }}
{{ number | int }}
필터
FortiSOAR 필터
fromIRI (IRI로 개체 로드)
IRI를 확인하고 거기에 있는 개체를 반환 (== ID(IRI)로 개체를 로드하는 것과 유사)
•
예시 형태
◦
{{ '/api/3/events/8' | fromIRI }}{{ vars.event.alert_iri | fromIRI }} : fromIRI에 대한 값
◦
{{ (vars.person_iri | fromIRI).name }} : 필드 반환
◦
{{ ((vars.event.alert |fromIRI).owner| fromIRI).name }} : 재귀
◦
{{ ('/api/3/alerts/<alert_IRI>?$relationships=true' | fromIRI).indicators }} : 실행중인 레코드에 대한 관계 데이터 검색
toDict (String to Dictionary)
•
액세스를 위해 String to Dictionary를 시도
{{ (request.data.incident_string | toDict).id }}
xml_to_dict (XML String to Dictionary)
•
액세스를 위해 XML String to Dictionary를 시도
{{ '<?xml version="1.0" ?><person><name>john</name><age>20</age></person>' | xml_to_dict }}
extract_artifacts (String to IOC)
•
주어진 String에서 IOC 목록을 구문 분석하고 추출
{{ 'abc.com 192.168.42.23' | extract_artifacts }}
parse_cef (CEF String to Dictionary)
•
주어진 CEF String을 구문 분석하고 CEF 문자열을 Dictionary로 변환
{{ 'some string containing cef' | parse_cef }}
readfile
•
FortiSOAR 에 다운로드된 파일의 내용 가져오기
{{ vars.result | readfile }}
ip_range
•
IP Address가 지정된 범위에 있는지 확인
{{ vars.ip | ip_range('198.162.0.0/24') }}
counter
•
항목 Array에서 각 항목의 발생 횟수 결과값: {”String”: number}
{{ data| counter }}
리스트 최소/최대 필터
min
•
숫자 리스트에서 최소값
{{ list | min }}
max
•
숫자 리스트에서 최대값
{{ list | max }}
리스트&집합 필터
unique
•
고유 SET
{{ list1 | unique }}
union()
•
두 리스트의 합집합
{{ list1 | union(list2) }}
intersect()
•
두 리스트의 교집합
{{ list1 | intersect(list2) }}
difference()
•
두 리스트의 차집합
{{ list1 | difference(list2) }}
symmetric_difference()
•
두 리스트의 대칭차 (= XOR)
{{ list1 | symmetric_difference(list2) }}
난수 필터 (random)
•
리스트에서의 임의 항목
{{ list | random }}
•
0부터 N까지
{{ N | random}}
•
0에서 N까지 k단위로
{{ N | random(step=k)}}
•
i에서 N까지 k단위로
{{ N | random(start=i, step=k)}}
{{ N | random(i, k)}}
•
seed에서 난수 생성기 초기화
{{ N | random(seed=inventory_hostname) }}
리스트 셔플 필터 (shuffle)
•
기존 리스트를 무작위로 지정하여 호출
{{ ['a','b','c'] | shuffle }}
IP 주소 필터
ipaddr
•
문자열이 유효한 IP 주소인지 테스트
{{ myvar | ipaddr }}
ipv4/ipv6
•
특정 IP 프로토콜 버전의 IP 주소
{{ myvar | ipv4 }}
{{ myvar | ipv6 }}
ipaddr('address')
•
IP 주소에서 특정 정보를 추출
{{ '192.0.2.1/24' | ipaddr('address') }}
•
IP 주소 목록을 필터링
test_list = ['192.24.2.1', 'host.fqdn', '::1', '192.168.32.0/24', 'fe80::100/10', True, '', '42540766412265424405338506004571095040/64']
# {{ test_list | ipaddr }}
['192.24.2.1', '::1', '192.168.32.0/24', 'fe80::100/10', '2001:db8:32c:faad::/64']
# {{ test_list | ipv4 }}
['192.24.2.1', '192.168.32.0/24']
# {{ test_list | ipv6 }}
['::1', 'fe80::100/10', '2001:db8:32c:faad::/64']
Python
복사
ipaddr('host')
•
IP 주소 목록에서 호스트 IP 주소
# {{ test_list | ipaddr('host') }}
['192.24.2.1/32', '::1/128', 'fe80::100/10']
Plain Text
복사
ipaddr('public')
•
IP 주소 목록에서 공용 IP 주소
# {{ test_list | ipaddr('public') }}
['192.24.2.1', '2001:db8:32c:faad::/64']
Plain Text
복사
ipaddr('private')
•
IP 주소 목록에서 개인 IP 주소
# {{ test_list | ipaddr('private') }}
['192.168.32.0/24', 'fe80::100/10']
Plain Text
복사
ipaddr('192.0.0.0/8')
•
쿼리로 사용되는 네트워크 범위
# {{ test_list | ipaddr('192.0.0.0/8') }}
['192.24.2.1', '192.168.32.0/24']
Plain Text
복사
해싱 필터
hash('sha1')
•
문자열의 sha1 해시
{{ 'test1' | hash('sha1') }}
hash('md5')
•
문자열의 md5 해시
{{ 'test1' | hash('md5') }}
checksum
•
문자열 체크섬
{{ 'test2' | checksum }}
hash('[ETC]')
•
기타 해시(플랫폼에 따라 다름)
{{ 'test2' | hash('blowfish') }}
password_hash('sha512')
•
sha512 비밀번호 해시(임의 솔트)
{{ 'passwordsaresecret' | password_hash('sha512') }}
password_hash('sha256', 'mysecretsalt') :
•
특정 솔트를 사용하여 sha256 비밀번호 해시
{{ 'secretpassword' | password_hash('sha256', 'mysecretsalt') }}
정규식 필터
regex_search
•
정규식 문자열 검색
# search for "foo" in "foobar"
{{ 'foobar' | regex_search('(foo)') }}
Python
복사
regex_findall
•
정규식 일치 항목을 모두 검색
# Return a list of all IPv4 addresses in the string
{{ 'Some DNS servers are 8.8.8.8 and 8.8.4.4' | regex_findall('\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b') }}
Python
복사
regex_replace
•
문자열의 텍스트를 정규식 변환
# convert "ansible" to "able"
{{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }}
# convert "foobar" to "bar"
{{ 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }}
# convert "localhost:80" to "localhost, 80" using named groups
{{ 'localhost:80' | regex_replace('^(?P<host>.+):(?P<port>\\d+)$', '\\g<host>, \\g<port>') }}
# convert "localhost:80" to "localhost"
{{ 'localhost:80' | regex_replace(':80') }}
Python
복사
regex_escape
•
정규식 내에서 특수 문자 Escape
# convert '^f.*o(.*)$' to '\^f\.\*o\(\.\*\)\$'
{{ '^f.*o(.*)$' | regex_escape() }}
Plain Text
복사
유용한 필터
quote
•
셸 사용에 대한 인용문을 추가하려면 다음을 수행하세요.
{{ string_value | quote }}
ternary()
•
true에 하나의 값 사용하고 false에 다른 값 사용
{{ (name == "John") | ternary('Mr','Ms') }}
join()
•
목록을 문자열로 연결하려면:
{{ list | join(" ") }}
basename
•
/etc/asdf/foo.txt의 foo.txt와 같이 파일 경로의 마지막 얻기
{{ path | basename }}
win_basename
•
Windows 스타일 파일 경로의 마지막 얻기
{{ path | win_basename }}
win_splitdrive
Windows 드라이브 문자를 파일 경로의 나머지 부분과 분리하려면 다음을 수행하십시오.
{{ path | win_splitdrive }}
•
first : Windows 드라이브 문자
{{ path |win_splitdrive| first }}
•
last : 드라이브 문자 없이 나머지 경로
{{ path |win_splitdrive| last }}
dirname
•
경로에서 디렉터리 이름 가져오기
{{ path | dirname }}
win_dirname
•
Windows 경로에서의 디렉터리 이름 가져오기
{{ path | win_dirname }}
expanduser
•
물결표(~) 문자가 포함된 경로 확장
{{ path | expanduser }}
realpath
•
링크의 실제 경로 가져오기
{{ path | realpath }}
•
시작점에서 링크의 상대 경로 가져오기
{{ path | relpath('/etc') }}
splitext
•
경로 또는 파일 이름의 루트 및 확장자 가져오기
# with path == 'nginx.conf' the return would be ('nginx', '.conf')
{{ path | splitext }}
b64decode / b64encode
•
Base64로 인코딩된 문자열 사용
{{ encoded | b64decode }}
{{ decoded | b64encode }}
to_uuid
•
문자열에서 UUID 생성
{{ hostname | to_uuid }}
to_datetime
•
문자열에서의 날짜 객체 가져오기
# get amount of seconds between two dates, default date format is %Y-%m-%d %H:%M:%S but you can pass your own one
{{ (("2016-08-14 20:00:12" | to_datetime) - ("2015-12-25"|to_datetime('%Y-%m-%d'))).seconds }}
Python
복사
필터 목록
표현식
시간 작업 (Arrow)
타임스탬프
•
기본
{{ arrow.get('2013-05-30 12:30:45', 'YYYY-MM-DD HH:mm:ss') }}
•
현재 시간을 시대로 변환하고 10000 곱하기
{{ arrow.utcnow().timestamp*1000 |int| abs }}
•
날짜를 시대 시간으로 변환
{{ arrow.Arrow(2017, 3, 30).timestamp }}
다른시간대로 변환
•
날짜와 시간을 다른 시간대/형식으로 변환
{{ arrow.get( % VARIABLE % ).to('% TIME ZONE ACRONYM %').format('% FORMAT STRING%') }}
Python
복사
•
동부 표준시 형식으로 변환하는 예
{{arrow.get(vars.input.records[0].dateOfCompromise).to('EST').format('YYYY-MM-DD HH:mm:ss ZZ')}}
Python
복사