본문 바로가기

네트워크/FW(UTM)

axgate-1300 utm | Dashboard cgi request 출력값을 json으로 파싱하기

반응형

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"
    }
  ]
}
반응형