반응형
axgate-1300 을 모니터링 하기 위한 방법으로, 제공하는 Web GUI Dashboard에서 exec.cgi request를 json으로 파싱하여 사용하고자 한다.
Dashborad 에서 주기적으로 업데이트하는 지표의 request는 아래와 같다.
http://<axgate ipaddr>/restrict/exec.cgi
이때 POST 로 cmd 파라미터 값에 의해 response 값을 출력한다.
제공되는 cmd 파리미터 값은 아래와 같다.
who
show running-config config sync
show running-config config full-sync
show ha profile
show system info
show security signature status
show utm info
show resource info
show ha pro
show security zone info
show topn-list
....
이중 'show utm info','show resource info','show system info' 만 호출하여 모니터링에 사용하고자 한다.
- show utm info : utm 관련 지표의 packet count로 firewall, ips, anti-ddos, anti-spam, sslvpn, ipsec 등이 있다.
- show resource info : CPU, Memory, Storage, Traffic 등 기본적인 지표를 출력한다.
- show system info : 장비의 CPU, Memory, Version 등의 기본적인 스펙과 Uptime, PDU 상태, 온도, Fan 상태등의 지표를 출력한다.
스크립트
#!/usr/bin/python3
import sys
import time
import datetime
import json
import os
import subprocess
import re
## 호출할 cmd 파라미터 정의
show_lists = ['show utm info','show resource info','show system info']
## 로그인 session cookie
def login(cookie,username,password,baseurl,cmd_wget):
cmd = "{a} --save-cookies={b} -4 --keep-session-cookies -O - -S --post-data='username={c}&password={d}&desc=web' {e}/login.cgi 2> /dev/null".format(a=cmd_wget, b=cookie, c=username, d=password, e=baseurl)
try:
subprocess.check_output(cmd, shell=True, universal_newlines=True)
return('OK')
except:
return('FAIL')
## 실제 값 호출
def get_value(command,home,cookie,baseurl,cmd_wget):
cmd2 = "{a} -4 --load-cookies={b} -O '{c}/{d}' --post-data='cmd={f}' '{e}/restrict/exec.cgi' 2> /dev/null".format(a=cmd_wget, b=cookie, c=home, d=command.replace(" ","_"), e=baseurl, f=command)
try:
subprocess.check_output(cmd2, shell=True, universal_newlines=True)
return('OK')
except:
return('FAIL')
## 'show utm info','show resource info' 값을 json으로 파싱
def json_parse(filename,home):
data = {}
cnt = 0
head_cnt = 0
head_sub = ''
sub = []
sess_sub = {}
filename = filename.replace(" ","_")
fp = open(home+'/'+filename, 'r')
lines = fp.read().split('\n')
for i in lines:
head = re.search('^\[.*\]$', i)
if head != None:
data[i] = []
head_sub = i.replace(" ","_")
head_cnt = 1
continue
if head_cnt == 1:
sub = i.split()
head_cnt = 0
continue
if i and cnt > 0 and len(i) > 2:
val = i.split()
append_data = {}
if val[0] == 'current':
data['[Session]'] = []
sess_val = i.split(':')
sess_sub[sess_val[0].replace(" ","_")] = sess_val[1]
continue
for k in range(0,len(sub)):
a = sub[k]
append_data[a] = val[k]
data[head_sub].append(append_data)
cnt += 1
if filename == 'show_utm_info':
data['[Session]'].append(sess_sub)
test = json.dumps(data)
filename = filename.replace(" ","_")
fp = open(home+'/'+filename+'_json', 'w')
fp.write(test)
## 'show system info' 값을 json으로 파싱
def system_info_json_parse(filename,home):
head_sub = ''
data = {}
filename = filename.replace(" ","_")
fp = open(home+'/'+filename, 'r')
lines = fp.read().split('\n')
for i in lines:
head = re.search('^\[.*\]$', i)
if head != None:
head_sub = i.replace(" ","_")
data[head_sub] = [{}]
continue
if i and len(i) > 2:
val = i.split(':')
data[head_sub][0][val[0].replace(" ","")] = val[1].lstrip()
continue
test = json.dumps(data)
filename = filename.replace(" ","_")
fp = open(home+'/'+filename+'_json', 'w')
fp.write(test)
## 변수 정의
# 파일로 저장할 local 경로
home = '/opt/axgate_show'
# cookie를 저장할 파일
cookie = '/opt/axgate_show/cookie.txt'
# axgate 로그인 계정
username = '****'
password = '****'
# axgate 주소
baseurl = 'http://<axgate ipaddr>'
# wget 경로
cmd_wget = "/usr/bin/wget"
for show_list in show_lists:
print('Download[' + show_list + '] : ' + get_value(show_list,home,cookie,baseurl,cmd_wget))
if show_list == 'show system info':
try:
system_info_json_parse(show_list,home)
print('Json Parse[' + show_list + ']: ' + 'OK')
except:
print('Json Parse[' + show_list + ']: ' + 'FAIL')
try:
login_result = login(cookie,username,password,baseurl,cmd_wget)
print('Login : ' + login_result)
print('Download[' + show_list + '] : ' + get_value(show_list,home,cookie,baseurl,cmd_wget))
system_info_json_parse(show_list,home)
except:
print(show_list + ' : ALL FAIL')
else:
try:
json_parse(show_list,home)
print('Json Parse[' + show_list + ']: ' + 'OK')
except:
print('Json Parse[' + show_list + ']: ' + 'FAIL')
try:
login_result = login(cookie,username,password,baseurl,cmd_wget)
print('Login : ' + login_result)
print('Download[' + show_list + '] : ' + get_value(show_list,home,cookie,baseurl,cmd_wget))
json_parse(show_list,home)
except:
print(show_list + ' : ALL FAIL')
결과
show system info
[CPU]
Model: Intel(R) Atom(TM) CPU C2518 @ 1.74GHz
Clock: 1.74 GHz
Cores: 4
[Memory]
Total: 4194304 KB
[Version]
Vendor: AxGate
Product: AxGate
Board: AXGATE-1300
Serial: ****
OS: aos v2.1-x86(2.5-r31413)
[Hostname]
Hostname: ****
[Uptime]
Boot: 2020-04-08 08:24:05 KST
Uptime: 930 02:53:50
LastRebootReason: reboot
[Power Supply]
unit1: OK
[Temperature]
System: +47.0 C
CPU: +54.5 C
[Fan]
Chassis: OK
show system info json
{
"[CPU]": [
{
"Model": "Intel(R) Atom(TM) CPU C2518 @ 1.74GHz",
"Clock": "1.74 GHz",
"Cores": "4"
}
],
"[Memory]": [
{
"Total": "4194304 KB"
}
],
"[Version]": [
{
"Vendor": "AxGate",
"Product": "AxGate",
"Board": "AXGATE-1300",
"Serial": "****",
"OS": "aos v2.1-x86(2.5-r31413)"
}
],
"[Hostname]": [
{
"Hostname": "****"
}
],
"[Uptime]": [
{
"Boot": "2020-04-08 08",
"Uptime": "930 02",
"LastRebootReason": "reboot"
}
],
"[Power_Supply]": [
{
"unit1": "OK"
}
],
"[Temperature]": [
{
"System": "+47.0 C",
"CPU": "+54.5 C"
}
],
"[Fan]": [
{
"Chassis": "OK"
}
]
}
반응형
'네트워크 > FW(UTM)' 카테고리의 다른 글
[FortiGate] HA 구성(failback 최소화) (0) | 2023.03.14 |
---|---|
[FortiGate] elasticsearch를 이용한 로그 수집 (0) | 2022.12.16 |
[FortiGate] 외부 syslog 서버로 로그 보내기 (0) | 2022.12.15 |
Juniper SSG140 snmp 설정 (0) | 2022.04.21 |
포트게이트(fortigate) FG-3000D CLI에서 패킷 덤프 뜨는 방법 (0) | 2021.03.18 |