예제 #1
0
파일: xmlrpc.py 프로젝트: Cougar/NIPAP
class NipapXMLRPC:
    """ NIPAP XML-RPC API
    """
    def __init__(self):
        self.nip = Nipap()



    @requires_auth
    def echo(self, args):
        """ An echo function

            An API test function which simply echoes what is is passed in the
            'message' element in the args-dict..

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `message` [string]
                String to echo.
            * `sleep` [integer]
                Number of seconds to sleep before echoing.

            Returns a string.
        """
        if args.get('sleep'):
            time.sleep(args.get('sleep'))
        if args.get('message') is not None:
            return args.get('message')



    @requires_auth
    def version(self, args):
        """ Returns nipapd version

            Returns a string.
        """
        return nipap.__version__



    @requires_auth
    def db_version(self, args):
        """ Returns schema version of nipap psql db

            Returns a string.
        """
        return self.nip._get_db_version()



    #
    # VRF FUNCTIONS
    #
    @requires_auth
    def add_vrf(self, args):
        """ Add a new VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                VRF attributes.

            Returns the internal database ID for the VRF.
        """
        try:
            res = self.nip.add_vrf(args.get('auth'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for val in ( 'num_prefixes_v4', 'num_prefixes_v6',
                'total_addresses_v4', 'total_addresses_v6',
                'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                'free_addresses_v6'):
                res[val] = str(res[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def remove_vrf(self, args):
        """ Removes a VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `vrf` [struct]
                A VRF spec.
        """
        try:
            self.nip.remove_vrf(args.get('auth'), args.get('vrf'))
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def list_vrf(self, args):
        """ List VRFs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `vrf` [struct]
                Specifies VRF attributes to match (optional).

            Returns a list of structs matching the VRF spec.
        """
        try:
            res = self.nip.list_vrf(args.get('auth'), args.get('vrf'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res:
                for val in ( 'num_prefixes_v4', 'num_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    vrf[val] = str(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def edit_vrf(self, args):
        """ Edit a VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `vrf` [struct]
                A VRF spec specifying which VRF(s) to edit.
            * `attr` [struct]
                VRF attributes.
        """
        try:
            res = self.nip.edit_vrf(args.get('auth'), args.get('vrf'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res:
                for val in ( 'num_prefixes_v4', 'num_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    vrf[val] = str(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def search_vrf(self, args):
        """ Search for VRFs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result and the search options
            used.
        """
        try:
            res = self.nip.search_vrf(args.get('auth'), args.get('query'), args.get('search_options') or {})

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res['result']:
                for val in ( 'num_prefixes_v4', 'num_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    vrf[val] = str(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def smart_search_vrf(self, args):
        """ Perform a smart search.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query_string` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result, interpretation of the
            search string and the search options used.
        """
        try:
            res = self.nip.smart_search_vrf(args.get('auth'),
                    args.get('query_string'), args.get('search_options', {}),
                    args.get('extra_query'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res['result']:
                for val in ( 'num_prefixes_v4', 'num_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    vrf[val] = str(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    #
    # POOL FUNCTIONS
    #
    @requires_auth
    def add_pool(self, args):
        """ Add a pool.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                Attributes which will be set on the new pool.

            Returns ID of created pool.
        """
        try:
            res = self.nip.add_pool(args.get('auth'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for val in ( 'member_prefixes_v4', 'member_prefixes_v6',
                'used_prefixes_v4', 'used_prefixes_v6',
                'total_addresses_v4', 'total_addresses_v6',
                'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                'free_addresses_v6'):
                res[val] = str(res[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def remove_pool(self, args):
        """ Remove a pool.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `pool` [struct]
                Specifies what pool(s) to remove.
        """
        try:
            self.nip.remove_pool(args.get('auth'), args.get('pool'))
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def list_pool(self, args):
        """ List pools.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `pool` [struct]
                Specifies pool attributes which will be matched.

            Returns a list of structs describing the matching pools.
        """
        try:
            res = self.nip.list_pool(args.get('auth'), args.get('pool'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res:
                for val in ( 'member_prefixes_v4', 'member_prefixes_v6',
                    'used_prefixes_v4', 'used_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    pool[val] = str(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def edit_pool(self, args):
        """ Edit pool.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `pool` [struct]
                Specifies pool attributes to match.
            * `attr` [struct]
                Pool attributes to set.
        """
        try:
            res = self.nip.edit_pool(args.get('auth'), args.get('pool'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res:
                for val in ( 'member_prefixes_v4', 'member_prefixes_v6',
                    'used_prefixes_v4', 'used_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    pool[val] = str(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def search_pool(self, args):
        """ Search for pools.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result and the search options
            used.
        """
        try:
            res = self.nip.search_pool(args.get('auth'), args.get('query'), args.get('search_options') or {})

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res['result']:
                for val in ( 'member_prefixes_v4', 'member_prefixes_v6',
                    'used_prefixes_v4', 'used_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    pool[val] = str(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def smart_search_pool(self, args):
        """ Perform a smart search.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result, interpretation of the
            query string and the search options used.
        """
        try:
            res = self.nip.smart_search_pool(args.get('auth'),
                    args.get('query_string'), args.get('search_options') or {},
                    args.get('extra_query', {}))

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res['result']:
                for val in ( 'member_prefixes_v4', 'member_prefixes_v6',
                    'used_prefixes_v4', 'used_prefixes_v6',
                    'total_addresses_v4', 'total_addresses_v6',
                    'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                    'free_addresses_v6'):
                    pool[val] = str(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    #
    # PREFIX FUNCTIONS
    #
    @requires_auth
    def add_prefix(self, args):
        """ Add a prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                Attributes to set on the new prefix.
            * `args` [srgs]
                Arguments for addition of prefix, such as what pool or prefix
                it should be allocated from.

            Returns ID of created prefix.
        """
        try:
            res = self.nip.add_prefix(args.get('auth'), args.get('attr'), args.get('args'))
            # fugly cast from large numbers to string to deal with XML-RPC
            res['total_addresses'] = str(res['total_addresses'])
            res['used_addresses'] = str(res['used_addresses'])
            res['free_addresses'] = str(res['free_addresses'])
            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def list_prefix(self, args):
        """ List prefixes.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `prefix` [struct]
                Prefix attributes to match.

            Returns a list of structs describing the matching prefixes.

            Certain values are casted from numbers to strings because XML-RPC
            simply cannot handle anything bigger than an integer.
        """
        try:
            res = self.nip.list_prefix(args.get('auth'), args.get('prefix') or {})
            # fugly cast from large numbers to string to deal with XML-RPC
            for pref in res:
                pref['total_addresses'] = str(pref['total_addresses'])
                pref['used_addresses'] = str(pref['used_addresses'])
                pref['free_addresses'] = str(pref['free_addresses'])
            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def edit_prefix(self, args):
        """ Edit prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `prefix` [struct]
                Prefix attributes which describes what prefix(es) to edit.
            * `attr` [struct]
                Attribuets to set on the new prefix.
        """
        try:
            res = self.nip.edit_prefix(args.get('auth'), args.get('prefix'), args.get('attr'))
            # fugly cast from large numbers to string to deal with XML-RPC
            for pref in res:
                pref['total_addresses'] = str(pref['total_addresses'])
                pref['used_addresses'] = str(pref['used_addresses'])
                pref['free_addresses'] = str(pref['free_addresses'])
            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def remove_prefix(self, args):
        """ Remove a prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `prefix` [struct]
                Attributes used to select what prefix to remove.
        """
        try:
            return self.nip.remove_prefix(args.get('auth'), args.get('prefix'), args.get('recursive'))
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def search_prefix(self, args):
        """ Search for prefixes.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing the search result together with the
            search options used.

            Certain values are casted from numbers to strings because XML-RPC
            simply cannot handle anything bigger than an integer.
        """
        try:
            res = self.nip.search_prefix(args.get('auth'), args.get('query'), args.get('search_options') or {})
            # fugly cast from large numbers to string to deal with XML-RPC
            for pref in res['result']:
                pref['total_addresses'] = str(pref['total_addresses'])
                pref['used_addresses'] = str(pref['used_addresses'])
                pref['free_addresses'] = str(pref['free_addresses'])
            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def smart_search_prefix(self, args):
        """ Perform a smart search.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query_string` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.
            * `extra_query` [struct]
                Extra search terms, will be AND:ed together with what is
                extracted from the query string.

            Returns a struct containing search result, interpretation of the
            query string and the search options used.

            Certain values are casted from numbers to strings because XML-RPC
            simply cannot handle anything bigger than an integer.
        """

        try:
            res = self.nip.smart_search_prefix(args.get('auth'),
                    args.get('query_string'), args.get('search_options') or {},
                    args.get('extra_query'))
            # fugly cast from large numbers to string to deal with XML-RPC
            for pref in res['result']:
                pref['total_addresses'] = str(pref['total_addresses'])
                pref['used_addresses'] = str(pref['used_addresses'])
                pref['free_addresses'] = str(pref['free_addresses'])
            return res
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def find_free_prefix(self, args):
        """ Find a free prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `args` [struct]
                Arguments for the find_free_prefix-function such as what prefix
                or pool to allocate from.
        """

        try:
            return self.nip.find_free_prefix(args.get('auth'), args.get('vrf'), args.get('args'))
        except NipapError as exc:
            raise Fault(exc.error_code, str(exc))



    #
    # ASN FUNCTIONS
    #
    @requires_auth
    def add_asn(self, args):
        """ Add a new ASN.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                ASN attributes.

            Returns the ASN.
        """

        try:
            return self.nip.add_asn(args.get('auth'), args.get('attr'))
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def remove_asn(self, args):
        """ Removes an ASN.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `asn` [integer]
                An ASN.
        """

        try:
            self.nip.remove_asn(args.get('auth'), args.get('asn'))
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def list_asn(self, args):
        """ List ASNs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `asn` [struct]
                Specifies ASN attributes to match (optional).

            Returns a list of ASNs matching the ASN spec as a list of structs.
        """

        try:
            return self.nip.list_asn(args.get('auth'), args.get('asn') or {})
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def edit_asn(self, args):
        """ Edit an ASN.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `asn` [integer]
                An integer specifying which ASN to edit.
            * `attr` [struct]
                ASN attributes.
        """

        try:
            return self.nip.edit_asn(args.get('auth'), args.get('asn'), args.get('attr'))
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def search_asn(self, args):
        """ Search ASNs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result and the search options
            used.
        """

        try:
            return self.nip.search_asn(args.get('auth'), args.get('query'), args.get('search_options') or {})
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))



    @requires_auth
    def smart_search_asn(self, args):
        """ Perform a smart search among ASNs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query_string` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result, interpretation of the
            search string and the search options used.
        """

        try:
            return self.nip.smart_search_asn(args.get('auth'), args.get('query_string'), args.get('search_options') or {})
        except (AuthError, NipapError) as exc:
            raise Fault(exc.error_code, str(exc))
예제 #2
0
class NipapXMLRPC:
    """ NIPAP XML-RPC API
    """
    def __init__(self):
        self.nip = Nipap()

    @requires_auth
    def echo(self, args):
        """ An echo function

            An API test function which simply echoes what is is passed in the
            'message' element in the args-dict..

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `message` [string]
                String to echo.
            * `sleep` [integer]
                Number of seconds to sleep before echoing.

            Returns a string.
        """
        if args.get('sleep'):
            time.sleep(args.get('sleep'))
        if args.get('message') is not None:
            return args.get('message')

    @requires_auth
    def version(self, args):
        """ Returns nipapd version

            Returns a string.
        """
        return nipap.__version__

    @requires_auth
    def db_version(self, args):
        """ Returns schema version of nipap psql db

            Returns a string.
        """
        return self.nip._get_db_version()

    #
    # VRF FUNCTIONS
    #
    @requires_auth
    def add_vrf(self, args):
        """ Add a new VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                VRF attributes.

            Returns the internal database ID for the VRF.
        """
        try:
            res = self.nip.add_vrf(args.get('auth'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for val in ('num_prefixes_v4', 'num_prefixes_v6',
                        'total_addresses_v4', 'total_addresses_v6',
                        'used_addresses_v4', 'used_addresses_v6',
                        'free_addresses_v4', 'free_addresses_v6'):
                res[val] = str(res[val])

            return res
        except (AuthError, NipapError), e:
            raise Fault(e.error_code, str(e))
예제 #3
0
class NipapXMLRPC:
    """ NIPAP XML-RPC API
    """
    def __init__(self):
        self.nip = Nipap()
        self.logger = logging.getLogger()

    @requires_auth
    def echo(self, args):
        """ An echo function

            An API test function which simply echoes what is is passed in the
            'message' element in the args-dict..

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `message` [string]
                String to echo.
            * `sleep` [integer]
                Number of seconds to sleep before echoing.

            Returns a string.
        """
        if args.get('sleep'):
            time.sleep(args.get('sleep'))
        if args.get('message') is not None:
            return args.get('message')

    @requires_auth
    def version(self, args):
        """ Returns nipapd version

            Returns a string.
        """
        return nipap.__version__

    @requires_auth
    def db_version(self, args):
        """ Returns schema version of nipap psql db

            Returns a string.
        """
        return self.nip._get_db_version()

    #
    # VRF FUNCTIONS
    #
    @requires_auth
    def add_vrf(self, args):
        """ Add a new VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                VRF attributes.

            Returns the internal database ID for the VRF.
        """
        try:
            res = self.nip.add_vrf(args.get('auth'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for val in ('num_prefixes_v4', 'num_prefixes_v6',
                        'total_addresses_v4', 'total_addresses_v6',
                        'used_addresses_v4', 'used_addresses_v6',
                        'free_addresses_v4', 'free_addresses_v6'):
                res[val] = unicode(res[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def remove_vrf(self, args):
        """ Removes a VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `vrf` [struct]
                A VRF spec.
        """
        try:
            self.nip.remove_vrf(args.get('auth'), args.get('vrf'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def list_vrf(self, args):
        """ List VRFs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `vrf` [struct]
                Specifies VRF attributes to match (optional).

            Returns a list of structs matching the VRF spec.
        """
        try:
            res = self.nip.list_vrf(args.get('auth'), args.get('vrf'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res:
                for val in ('num_prefixes_v4', 'num_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    vrf[val] = unicode(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def edit_vrf(self, args):
        """ Edit a VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `vrf` [struct]
                A VRF spec specifying which VRF(s) to edit.
            * `attr` [struct]
                VRF attributes.
        """
        try:
            res = self.nip.edit_vrf(args.get('auth'), args.get('vrf'),
                                    args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res:
                for val in ('num_prefixes_v4', 'num_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    vrf[val] = unicode(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def search_vrf(self, args):
        """ Search for VRFs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result and the search options
            used.
        """
        try:
            res = self.nip.search_vrf(args.get('auth'), args.get('query'),
                                      args.get('search_options') or {})

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res['result']:
                for val in ('num_prefixes_v4', 'num_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    vrf[val] = unicode(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def smart_search_vrf(self, args):
        """ Perform a smart search.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query_string` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result, interpretation of the
            search string and the search options used.
        """
        try:
            res = self.nip.smart_search_vrf(args.get('auth'),
                                            args.get('query_string'),
                                            args.get('search_options', {}),
                                            args.get('extra_query'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for vrf in res['result']:
                for val in ('num_prefixes_v4', 'num_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    vrf[val] = unicode(vrf[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    #
    # POOL FUNCTIONS
    #
    @requires_auth
    def add_pool(self, args):
        """ Add a pool.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                Attributes which will be set on the new pool.

            Returns ID of created pool.
        """
        try:
            res = self.nip.add_pool(args.get('auth'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for val in ('member_prefixes_v4', 'member_prefixes_v6',
                        'used_prefixes_v4', 'used_prefixes_v6',
                        'free_prefixes_v4', 'free_prefixes_v6',
                        'total_prefixes_v4', 'total_prefixes_v6',
                        'total_addresses_v4', 'total_addresses_v6',
                        'used_addresses_v4', 'used_addresses_v6',
                        'free_addresses_v4', 'free_addresses_v6'):
                if res[val] is not None:
                    res[val] = unicode(res[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def remove_pool(self, args):
        """ Remove a pool.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `pool` [struct]
                Specifies what pool(s) to remove.
        """
        try:
            self.nip.remove_pool(args.get('auth'), args.get('pool'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def list_pool(self, args):
        """ List pools.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `pool` [struct]
                Specifies pool attributes which will be matched.

            Returns a list of structs describing the matching pools.
        """
        try:
            res = self.nip.list_pool(args.get('auth'), args.get('pool'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res:
                for val in ('member_prefixes_v4', 'member_prefixes_v6',
                            'used_prefixes_v4', 'used_prefixes_v6',
                            'free_prefixes_v4', 'free_prefixes_v6',
                            'total_prefixes_v4', 'total_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    if pool[val] is not None:
                        pool[val] = unicode(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def edit_pool(self, args):
        """ Edit pool.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `pool` [struct]
                Specifies pool attributes to match.
            * `attr` [struct]
                Pool attributes to set.
        """
        try:
            res = self.nip.edit_pool(args.get('auth'), args.get('pool'),
                                     args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res:
                for val in ('member_prefixes_v4', 'member_prefixes_v6',
                            'used_prefixes_v4', 'used_prefixes_v6',
                            'free_prefixes_v4', 'free_prefixes_v6',
                            'total_prefixes_v4', 'total_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    if pool[val] is not None:
                        pool[val] = unicode(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def search_pool(self, args):
        """ Search for pools.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result and the search options
            used.
        """
        try:
            res = self.nip.search_pool(args.get('auth'), args.get('query'),
                                       args.get('search_options') or {})

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res['result']:
                for val in ('member_prefixes_v4', 'member_prefixes_v6',
                            'used_prefixes_v4', 'used_prefixes_v6',
                            'free_prefixes_v4', 'free_prefixes_v6',
                            'total_prefixes_v4', 'total_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    if pool[val] is not None:
                        pool[val] = unicode(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def smart_search_pool(self, args):
        """ Perform a smart search.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result, interpretation of the
            query string and the search options used.
        """
        try:
            res = self.nip.smart_search_pool(args.get('auth'),
                                             args.get('query_string'),
                                             args.get('search_options') or {},
                                             args.get('extra_query'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for pool in res['result']:
                for val in ('member_prefixes_v4', 'member_prefixes_v6',
                            'used_prefixes_v4', 'used_prefixes_v6',
                            'free_prefixes_v4', 'free_prefixes_v6',
                            'total_prefixes_v4', 'total_prefixes_v6',
                            'total_addresses_v4', 'total_addresses_v6',
                            'used_addresses_v4', 'used_addresses_v6',
                            'free_addresses_v4', 'free_addresses_v6'):
                    if pool[val] is not None:
                        pool[val] = unicode(pool[val])

            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    #
    # PREFIX FUNCTIONS
    #
    @requires_auth
    def add_prefix(self, args):
        """ Add a prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                Attributes to set on the new prefix.
            * `args` [srgs]
                Arguments for addition of prefix, such as what pool or prefix
                it should be allocated from.

            Returns ID of created prefix.
        """
        try:
            res = self.nip.add_prefix(args.get('auth'), args.get('attr'),
                                      args.get('args'))
            # mangle result
            res = _mangle_prefix(res)
            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def list_prefix(self, args):
        """ List prefixes.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `prefix` [struct]
                Prefix attributes to match.

            Returns a list of structs describing the matching prefixes.

            Certain values are casted from numbers to strings because XML-RPC
            simply cannot handle anything bigger than an integer.
        """
        try:
            res = self.nip.list_prefix(args.get('auth'),
                                       args.get('prefix') or {})
            # mangle result
            for prefix in res:
                prefix = _mangle_prefix(prefix)
            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def edit_prefix(self, args):
        """ Edit prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `prefix` [struct]
                Prefix attributes which describes what prefix(es) to edit.
            * `attr` [struct]
                Attribuets to set on the new prefix.
        """
        try:
            res = self.nip.edit_prefix(args.get('auth'), args.get('prefix'),
                                       args.get('attr'))
            # mangle result
            for prefix in res:
                prefix = _mangle_prefix(prefix)
            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def remove_prefix(self, args):
        """ Remove a prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `prefix` [struct]
                Attributes used to select what prefix to remove.
            * `recursive` [boolean]
                When set to 1, also remove child prefixes.
        """
        try:
            return self.nip.remove_prefix(args.get('auth'), args.get('prefix'),
                                          args.get('recursive'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def search_prefix(self, args):
        """ Search for prefixes.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing the search result together with the
            search options used.

            Certain values are casted from numbers to strings because XML-RPC
            simply cannot handle anything bigger than an integer.
        """
        try:
            res = self.nip.search_prefix(args.get('auth'), args.get('query'),
                                         args.get('search_options') or {})
            # mangle result
            for prefix in res['result']:
                prefix = _mangle_prefix(prefix)
            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def smart_search_prefix(self, args):
        """ Perform a smart search.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query_string` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.
            * `extra_query` [struct]
                Extra search terms, will be AND:ed together with what is
                extracted from the query string.

            Returns a struct containing search result, interpretation of the
            query string and the search options used.

            Certain values are casted from numbers to strings because XML-RPC
            simply cannot handle anything bigger than an integer.
        """

        try:
            res = self.nip.smart_search_prefix(
                args.get('auth'), args.get('query_string'),
                args.get('search_options') or {}, args.get('extra_query'))
            # mangle result
            for prefix in res['result']:
                prefix = _mangle_prefix(prefix)
            return res
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def find_free_prefix(self, args):
        """ Find a free prefix.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `args` [struct]
                Arguments for the find_free_prefix-function such as what prefix
                or pool to allocate from.
        """

        try:
            return self.nip.find_free_prefix(args.get('auth'), args.get('vrf'),
                                             args.get('args'))
        except NipapError as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    #
    # ASN FUNCTIONS
    #
    @requires_auth
    def add_asn(self, args):
        """ Add a new ASN.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                ASN attributes.

            Returns the ASN.
        """

        try:
            return self.nip.add_asn(args.get('auth'), args.get('attr'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def remove_asn(self, args):
        """ Removes an ASN.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `asn` [integer]
                An ASN.
        """

        try:
            self.nip.remove_asn(args.get('auth'), args.get('asn'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def list_asn(self, args):
        """ List ASNs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `asn` [struct]
                Specifies ASN attributes to match (optional).

            Returns a list of ASNs matching the ASN spec as a list of structs.
        """

        try:
            return self.nip.list_asn(args.get('auth'), args.get('asn') or {})
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def edit_asn(self, args):
        """ Edit an ASN.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `asn` [integer]
                An integer specifying which ASN to edit.
            * `attr` [struct]
                ASN attributes.
        """

        try:
            return self.nip.edit_asn(args.get('auth'), args.get('asn'),
                                     args.get('attr'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def search_asn(self, args):
        """ Search ASNs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query` [struct]
                A struct specifying the search query.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result and the search options
            used.
        """

        try:
            return self.nip.search_asn(args.get('auth'), args.get('query'),
                                       args.get('search_options') or {})
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))

    @requires_auth
    def smart_search_asn(self, args):
        """ Perform a smart search among ASNs.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `query_string` [string]
                The search string.
            * `search_options` [struct]
                Options for the search query, such as limiting the number
                of results returned.

            Returns a struct containing search result, interpretation of the
            search string and the search options used.
        """

        try:
            return self.nip.smart_search_asn(args.get('auth'),
                                             args.get('query_string'),
                                             args.get('search_options') or {},
                                             args.get('extra_query'))
        except (AuthError, NipapError) as exc:
            self.logger.debug(unicode(exc))
            raise Fault(exc.error_code, unicode(exc))
예제 #4
0
파일: xmlrpc.py 프로젝트: Tosta-Mixta/NIPAP
class NipapXMLRPC:
    """ NIPAP XML-RPC API
    """
    def __init__(self):
        self.nip = Nipap()



    @requires_auth
    def echo(self, args):
        """ An echo function

            An API test function which simply echoes what is is passed in the
            'message' element in the args-dict..

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `message` [string]
                String to echo.
            * `sleep` [integer]
                Number of seconds to sleep before echoing.

            Returns a string.
        """
        if args.get('sleep'):
            time.sleep(args.get('sleep'))
        if args.get('message') is not None:
            return args.get('message')



    @requires_auth
    def version(self, args):
        """ Returns nipapd version

            Returns a string.
        """
        return nipap.__version__



    @requires_auth
    def db_version(self, args):
        """ Returns schema version of nipap psql db

            Returns a string.
        """
        return self.nip._get_db_version()



    #
    # VRF FUNCTIONS
    #
    @requires_auth
    def add_vrf(self, args):
        """ Add a new VRF.

            Valid keys in the `args`-struct:

            * `auth` [struct]
                Authentication options passed to the :class:`AuthFactory`.
            * `attr` [struct]
                VRF attributes.

            Returns the internal database ID for the VRF.
        """
        try:
            res = self.nip.add_vrf(args.get('auth'), args.get('attr'))

            # fugly cast from large numbers to string to deal with XML-RPC
            for val in ( 'num_prefixes_v4', 'num_prefixes_v6',
                'total_addresses_v4', 'total_addresses_v6',
                'used_addresses_v4', 'used_addresses_v6', 'free_addresses_v4',
                'free_addresses_v6'):
                res[val] = str(res[val])

            return res
        except (AuthError, NipapError), e:
            raise Fault(e.error_code, str(e))