File: /volume1/@appstore/DNSServer/userDataCollector/synouserdata_dnsserver
#!/usr/bin/python2
# Copyright (c) 2000-2017 Synology Inc. All rights reserved.
# -*- coding: utf-8 -*-
import sys
import json
from subprocess import check_output
def execWebAPI(api, version, method, **kwargs):
cmd = ["/usr/syno/bin/synowebapi", "--exec"]
cmd.append("api=" + api)
cmd.append("version=" + str(version))
cmd.append("method=" + method)
for key, val in kwargs.items():
cmd.append('{0}={1}'.format(key, json.dumps(val)))
try:
with open('/dev/null', 'w') as null_fp:
raw_resp = check_output(cmd, stderr=null_fp)
return json.loads(raw_resp)
except Exception as e:
return False
def get_recur_condition_num():
num = 0
try:
kwargs = {
'service': 'recursion',
'name': 'resolve'
}
j_data = execWebAPI('SYNO.DNSServer.Condition', 1, 'list', **kwargs)
num = j_data['data']['total']
except Exception as e:
num = -1
return num
def get_view_num():
num = 0
try:
kwargs = {
'start': 0,
'limit': -1
}
j_data = execWebAPI('SYNO.DNSServer.View', 1, 'list', **kwargs)
num = j_data['data']['total']
except Exception as e:
num = -1
return num
def get_key_num():
num = 0
try:
kwargs = {
'start': 0,
'limit': -1
}
j_data = execWebAPI('SYNO.DNSServer.Key', 1, 'list', **kwargs)
num = j_data['data']['total']
except Exception as e:
num = -1
return num
class ZoneWebAPI(object):
def __init__(self):
num = 0
try:
zones = execWebAPI('SYNO.DNSServer.Zone', 1, 'list')['data']
except Exception as e:
zones = {
'total': -1,
'items': []
}
self.__zone_total = zones['total']
self.__zone_items = zones['items']
@property
def total(self):
return self.__zone_total
def __count_zones(self):
master_zone_list = []
slave_zone_list = []
forward_zone_list = []
try:
for item in self.__zone_items:
enable = item['zone_enable']
if item['zone_type'] == 'master':
rr = ZoneRecordWebAPI(item['zone_name'], item['domain_name'])
zone_info = {
'rr_num': rr.total,
'enable': enable
}
master_zone_list.append(zone_info)
elif item['zone_type'] == 'slave':
zone_info = {
'enable': enable
}
slave_zone_list.append(zone_info)
elif item['zone_type'] == 'forward':
zone_info = {
'enable': enable
}
forward_zone_list.append(zone_info)
except Exception as e:
pass
self.__master_zone_list = master_zone_list
self.__slave_zone_list = slave_zone_list
self.__forward_zone_list = forward_zone_list
@property
def master_zone_list(self):
self.__count_zones()
return self.__master_zone_list
@property
def slave_zone_list(self):
self.__count_zones()
return self.__slave_zone_list
@property
def forward_zone_list(self):
self.__count_zones()
return self.__forward_zone_list
class ResolutionWebAPI(object):
def __init__(self):
try:
self.__res_conf_data = execWebAPI('SYNO.DNSServer.ResolutionConf', 1, 'get')['data']
except Exception as e:
self.__res_conf_data = {
'resolve_enable': False,
'limit_enable': False,
'forward_enable': False
}
@property
def resolve_enable(self):
return self.__res_conf_data['resolve_enable']
@property
def limit_enable(self):
return self.__res_conf_data['limit_enable']
@property
def forward_enable(self):
return self.__res_conf_data['forward_enable']
class ZoneRecordWebAPI(object):
def __init__(self, zone_name, domain_name):
try:
kwargs = {
'sort_by': "rr_owner",
'sort_direction': "ASC",
'filter_by': "",
'zone_name': zone_name,
'domain_name': domain_name,
'zone_type': "master"
}
self.__rr_data = execWebAPI('SYNO.DNSServer.Zone.Record', 1, 'list', **kwargs)['data']
except Exception as e:
self.__rr_data = {
'total': -1
}
@property
def total(self):
return self.__rr_data['total']
def main():
resolution = ResolutionWebAPI()
zone = ZoneWebAPI()
result = {
'collector_version': 1,
'zone': {
'master_zone_list': zone.master_zone_list,
'slave_zone_list': zone.slave_zone_list,
'forward_zone_list': zone.forward_zone_list
},
'view_num': get_view_num(),
'key_num': get_key_num(),
'resolution': {
'enable': resolution.resolve_enable,
'limit_enable': resolution.limit_enable,
'forward_enable': resolution.forward_enable,
'condition_num': get_recur_condition_num()
}
}
sys.stdout.write(json.dumps(result))
if __name__ == '__main__':
main()