name: IP Quality Score
version: '1.1'
icon: data:image/png;base64,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
script:
   type: python
   test_connection_code: |
    import os
    import sys
    import urllib3
    import argparse
    import requests

    # disabling all urllib3 warnings.
    urllib3.disable_warnings()


    # For security reason all action params are passed to docker container as Environment variable with variable name equal
    # to the id specified into yaml. we need to have a class to manage Environment variable
    class EnvDefault(argparse.Action):
        def __init__(self, required=True, default=None, **kwargs):
            env_var = kwargs.get("dest")
            default = os.environ.get(env_var, default) if env_var in os.environ else default
            required = False if required and default else required
            super(EnvDefault, self).__init__(default=default, required=required, **kwargs)

        def __call__(self, parser, namespace, values, option_string=None):
            setattr(namespace, self.dest, values)


    try:
        
        # Object for parsing command line strings into Python objects.
        parsers = argparse.ArgumentParser()
        parsers.add_argument('--api_url', help='API URL, REQUIRED', required=True, action=EnvDefault)
        parsers.add_argument('--api_key', help='API Key, REQUIRED', required=True, action=EnvDefault)
        parsers.add_argument('--timeout', help='timeout', required=False, action=EnvDefault)
        parsers.add_argument('--verify', help='verify', required=False, action=EnvDefault)
        parsers.add_argument('--proxy_url', help='proxy_url', required=False, action=EnvDefault)
        args, unknown = parsers.parse_known_args()
        # protocol and hostname to the URL of the proxy.
        proxies = {'http': args.proxy_url, 'https': args.proxy_url} if args.proxy_url is not None else None
        try:
            # How long to wait for the server to send data before giving up, as a float.
            timeout = float(args.timeout)
        except (ValueError, TypeError):
            timeout = 180.0
        # this controls whether we verify the server's TLS certificate or not
        verify = args.verify == 'true'
        # API endpoint details at https://www.ipqualityscore.com/documentation/usage/overview
        endpoint = "{host}/api/json/account/{api_key}".format(host=args.api_url.rstrip('/'), api_key=args.api_key)
        session = requests.Session()
        # Sends a GET request
        response = session.get(endpoint, timeout=timeout, verify=verify, proxies=proxies)
        # HTTPError if one occurred
        response.raise_for_status()
        # Returns the json-encoded content of a response
        response = response.json()
        # check if the 'success' is True or False, was the request successful?
        success = response.get("success")
        if not success:
            # When response 'success' is False, we need to get correct error message
            err_msg = response.get("message")
            if err_msg is not None:
                # raise an in case we proved wrong API key
                raise Exception(str(err_msg))
        # just exit in case we do not have any error, and we do not have any issue
        exit(0)
    except Exception as e:
        # write an Exception
        sys.stderr.write(str(e))
        exit(-1)
docker_repo_tag: 'python3_generic:latest'
configuration:
  testable_connection: true
  require_proxy_config: true
  data_attributes:
    api_url:
        label: 'API URL'
        type: 'text'
        required: true
        default: "https://www.ipqualityscore.com/"
        hint: "https://www.ipqualityscore.com/"
    api_key:
        label: 'API Key'
        type: password
        required: true
    timeout:
        label: 'Connection Timeout (s)'
        type: text
        required: false
        validator: integer
        default: '120'
    verify:
        label: 'Verify Server Certificate'
        type: checkbox
        required: false