HEX
Server: Apache/2.2.34 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0910052141
System: Linux Kou-Etsu-Dou 4.4.59+ #25556 SMP PREEMPT Thu Mar 4 18:03:46 CST 2021 x86_64
User: hosam (1026)
PHP: 7.2.29
Disabled: NONE
Upload Files
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()