diff options
Diffstat (limited to 'ansible_collections/community/dns')
100 files changed, 10417 insertions, 1790 deletions
diff --git a/ansible_collections/community/dns/.github/workflows/ansible-test.yml b/ansible_collections/community/dns/.github/workflows/ansible-test.yml index 6de639005..7ed813e13 100644 --- a/ansible_collections/community/dns/.github/workflows/ansible-test.yml +++ b/ansible_collections/community/dns/.github/workflows/ansible-test.yml @@ -36,6 +36,7 @@ jobs: - stable-2.13 - stable-2.14 - stable-2.15 + - stable-2.16 - devel # Ansible-test on various stable branches does not yet work well with cgroups v2. # Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04 @@ -76,6 +77,7 @@ jobs: - stable-2.13 - stable-2.14 - stable-2.15 + - stable-2.16 - devel steps: @@ -89,6 +91,8 @@ jobs: # NOTE: we're installing with git to work around Galaxy being a huge PITA (https://github.com/ansible/galaxy/issues/2429) pre-test-cmd: >- git clone --depth=1 --single-branch https://github.com/ansible-collections/community.internal_test_tools.git ../../community/internal_test_tools + ; + tests/unit/replace-requirements.sh requirements-${{ matrix.ansible }}.txt integration: # Ansible-test on various stable branches does not yet work well with cgroups v2. @@ -107,13 +111,12 @@ jobs: ansible: - devel python: - - 2.7 - - 3.6 - 3.7 - 3.8 - 3.9 - "3.10" - "3.11" + - "3.12" include: # 2.9 - ansible: stable-2.9 @@ -139,10 +142,13 @@ jobs: python: "3.9" # 2.15 - ansible: stable-2.15 + python: "3.7" + # 2.16 + - ansible: stable-2.16 python: "2.7" - - ansible: stable-2.15 - python: "3.5" - - ansible: stable-2.15 + - ansible: stable-2.16 + python: "3.6" + - ansible: stable-2.16 python: "3.11" steps: @@ -158,6 +164,6 @@ jobs: integration-retry-on-error: 'true' # NOTE: we're installing with git to work around Galaxy being a huge PITA (https://github.com/ansible/galaxy/issues/2429) pre-test-cmd: >- - git clone --depth=1 --single-branch https://github.com/ansible-collections/community.general.git ../../community/general + tests/integration/replace-requirements.sh requirements-${{ matrix.ansible }}.txt target-python-version: ${{ matrix.python }} testing-type: integration diff --git a/ansible_collections/community/dns/.github/workflows/check-psl.yml b/ansible_collections/community/dns/.github/workflows/check-psl.yml index 145d47041..b4b6051fb 100644 --- a/ansible_collections/community/dns/.github/workflows/check-psl.yml +++ b/ansible_collections/community/dns/.github/workflows/check-psl.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Update PSL (returns exit code 1 if something changed) run: ./update-psl.sh diff --git a/ansible_collections/community/dns/.github/workflows/ee.yml b/ansible_collections/community/dns/.github/workflows/ee.yml index 90dcab306..9a2f1164b 100644 --- a/ansible_collections/community/dns/.github/workflows/ee.yml +++ b/ansible_collections/community/dns/.github/workflows/ee.yml @@ -46,6 +46,10 @@ jobs: - name: ansible-core devel @ RHEL UBI 9 ansible_core: https://github.com/ansible/ansible/archive/devel.tar.gz ansible_runner: ansible-runner + other_deps: |2 + python_interpreter: + package_system: python3.11 python3.11-pip python3.11-wheel python3.11-cryptography + python_path: "/usr/bin/python3.11" base_image: docker.io/redhat/ubi9:latest pre_base: '"#"' - name: ansible-core 2.15 @ Rocky Linux 9 @@ -77,12 +81,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }} - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11' diff --git a/ansible_collections/community/dns/.github/workflows/extra-tests.yml b/ansible_collections/community/dns/.github/workflows/extra-tests.yml index 3f1625615..975404fa5 100644 --- a/ansible_collections/community/dns/.github/workflows/extra-tests.yml +++ b/ansible_collections/community/dns/.github/workflows/extra-tests.yml @@ -26,14 +26,14 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.11' - name: Install ansible-core run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check diff --git a/ansible_collections/community/dns/.github/workflows/import-galaxy.yml b/ansible_collections/community/dns/.github/workflows/import-galaxy.yml index 61b08e0f3..0c0ee402a 100644 --- a/ansible_collections/community/dns/.github/workflows/import-galaxy.yml +++ b/ansible_collections/community/dns/.github/workflows/import-galaxy.yml @@ -4,7 +4,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later name: import-galaxy -on: +'on': # Run CI against all pushes (direct commits, also merged PRs) to main, and all Pull Requests push: branches: @@ -12,77 +12,9 @@ on: - stable-* pull_request: -env: - # Adjust this to your collection - NAMESPACE: community - COLLECTION_NAME: dns - jobs: - build-collection: - name: Build collection artifact - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v3 - with: - path: ./checkout - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - - name: Install ansible-core - run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check - - - name: Make sure galaxy.yml has version entry - run: >- - python -c - 'import yaml ; - f = open("galaxy.yml", "rb") ; - data = yaml.safe_load(f) ; - f.close() ; - data["version"] = data.get("version") or "0.0.1" ; - f = open("galaxy.yml", "wb") ; - f.write(yaml.dump(data).encode("utf-8")) ; - f.close() ; - ' - working-directory: ./checkout - - - name: Build collection - run: ansible-galaxy collection build - working-directory: ./checkout - - - name: Copy artifact into subdirectory - run: mkdir ./artifact && mv ./checkout/${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-*.tar.gz ./artifact - - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: ${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-${{ github.sha }} - path: ./artifact/ - import-galaxy: - name: Import artifact with Galaxy importer - runs-on: ubuntu-latest - needs: - - build-collection - steps: - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - - name: Install ansible-core - run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check - - - name: Install galaxy-importer - run: pip install galaxy-importer --disable-pip-version-check - - - name: Download artifact - uses: actions/download-artifact@v3 - with: - name: ${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-${{ github.sha }} - - - name: Run Galaxy importer - run: python -m galaxy_importer.main ${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-*.tar.gz + permissions: + contents: read + name: Test to import built collection artifact with Galaxy importer + uses: ansible-community/github-action-test-galaxy-import/.github/workflows/test-galaxy-import.yml@main diff --git a/ansible_collections/community/dns/.github/workflows/reuse.yml b/ansible_collections/community/dns/.github/workflows/reuse.yml index 8d9ebde8d..8064af149 100644 --- a/ansible_collections/community/dns/.github/workflows/reuse.yml +++ b/ansible_collections/community/dns/.github/workflows/reuse.yml @@ -21,12 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Install dependencies - run: | - pip install reuse - - - name: Check REUSE compliance - run: | - reuse lint + - name: REUSE Compliance Check + uses: fsfe/reuse-action@v3 diff --git a/ansible_collections/community/dns/CHANGELOG.md b/ansible_collections/community/dns/CHANGELOG.md new file mode 100644 index 000000000..fbce77c60 --- /dev/null +++ b/ansible_collections/community/dns/CHANGELOG.md @@ -0,0 +1,1013 @@ +# Community DNS Collection Release Notes + +**Topics** + +- <a href="#v2-8-3">v2\.8\.3</a> + - <a href="#release-summary">Release Summary</a> + - <a href="#bugfixes">Bugfixes</a> +- <a href="#v2-8-2">v2\.8\.2</a> + - <a href="#release-summary-1">Release Summary</a> + - <a href="#security-fixes">Security Fixes</a> + - <a href="#bugfixes-1">Bugfixes</a> +- <a href="#v2-8-1">v2\.8\.1</a> + - <a href="#release-summary-2">Release Summary</a> + - <a href="#bugfixes-2">Bugfixes</a> +- <a href="#v2-8-0">v2\.8\.0</a> + - <a href="#release-summary-3">Release Summary</a> + - <a href="#minor-changes">Minor Changes</a> + - <a href="#deprecated-features">Deprecated Features</a> + - <a href="#bugfixes-3">Bugfixes</a> +- <a href="#v2-7-0">v2\.7\.0</a> + - <a href="#release-summary-4">Release Summary</a> + - <a href="#minor-changes-1">Minor Changes</a> + - <a href="#bugfixes-4">Bugfixes</a> +- <a href="#v2-6-4">v2\.6\.4</a> + - <a href="#release-summary-5">Release Summary</a> + - <a href="#bugfixes-5">Bugfixes</a> +- <a href="#v2-6-3">v2\.6\.3</a> + - <a href="#release-summary-6">Release Summary</a> + - <a href="#bugfixes-6">Bugfixes</a> +- <a href="#v2-6-2">v2\.6\.2</a> + - <a href="#release-summary-7">Release Summary</a> + - <a href="#bugfixes-7">Bugfixes</a> +- <a href="#v2-6-1">v2\.6\.1</a> + - <a href="#release-summary-8">Release Summary</a> + - <a href="#bugfixes-8">Bugfixes</a> +- <a href="#v2-6-0">v2\.6\.0</a> + - <a href="#release-summary-9">Release Summary</a> + - <a href="#minor-changes-2">Minor Changes</a> + - <a href="#bugfixes-9">Bugfixes</a> + - <a href="#new-plugins">New Plugins</a> + - <a href="#lookup">Lookup</a> + - <a href="#new-modules">New Modules</a> +- <a href="#v2-5-7">v2\.5\.7</a> + - <a href="#release-summary-10">Release Summary</a> + - <a href="#bugfixes-10">Bugfixes</a> +- <a href="#v2-5-6">v2\.5\.6</a> + - <a href="#release-summary-11">Release Summary</a> + - <a href="#known-issues">Known Issues</a> +- <a href="#v2-5-5">v2\.5\.5</a> + - <a href="#release-summary-12">Release Summary</a> + - <a href="#bugfixes-11">Bugfixes</a> +- <a href="#v2-5-4">v2\.5\.4</a> + - <a href="#release-summary-13">Release Summary</a> + - <a href="#bugfixes-12">Bugfixes</a> +- <a href="#v2-5-3">v2\.5\.3</a> + - <a href="#release-summary-14">Release Summary</a> + - <a href="#bugfixes-13">Bugfixes</a> +- <a href="#v2-5-2">v2\.5\.2</a> + - <a href="#release-summary-15">Release Summary</a> + - <a href="#bugfixes-14">Bugfixes</a> +- <a href="#v2-5-1">v2\.5\.1</a> + - <a href="#release-summary-16">Release Summary</a> + - <a href="#bugfixes-15">Bugfixes</a> +- <a href="#v2-5-0">v2\.5\.0</a> + - <a href="#release-summary-17">Release Summary</a> + - <a href="#minor-changes-3">Minor Changes</a> + - <a href="#deprecated-features-1">Deprecated Features</a> + - <a href="#bugfixes-16">Bugfixes</a> +- <a href="#v2-4-2">v2\.4\.2</a> + - <a href="#release-summary-18">Release Summary</a> + - <a href="#bugfixes-17">Bugfixes</a> +- <a href="#v2-4-1">v2\.4\.1</a> + - <a href="#release-summary-19">Release Summary</a> + - <a href="#bugfixes-18">Bugfixes</a> +- <a href="#v2-4-0">v2\.4\.0</a> + - <a href="#release-summary-20">Release Summary</a> + - <a href="#minor-changes-4">Minor Changes</a> + - <a href="#bugfixes-19">Bugfixes</a> +- <a href="#v2-3-4">v2\.3\.4</a> + - <a href="#release-summary-21">Release Summary</a> + - <a href="#bugfixes-20">Bugfixes</a> +- <a href="#v2-3-3">v2\.3\.3</a> + - <a href="#release-summary-22">Release Summary</a> + - <a href="#bugfixes-21">Bugfixes</a> +- <a href="#v2-3-2">v2\.3\.2</a> + - <a href="#release-summary-23">Release Summary</a> + - <a href="#bugfixes-22">Bugfixes</a> +- <a href="#v2-3-1">v2\.3\.1</a> + - <a href="#release-summary-24">Release Summary</a> + - <a href="#minor-changes-5">Minor Changes</a> + - <a href="#bugfixes-23">Bugfixes</a> +- <a href="#v2-3-0">v2\.3\.0</a> + - <a href="#release-summary-25">Release Summary</a> + - <a href="#minor-changes-6">Minor Changes</a> + - <a href="#bugfixes-24">Bugfixes</a> +- <a href="#v2-2-1">v2\.2\.1</a> + - <a href="#release-summary-26">Release Summary</a> + - <a href="#bugfixes-25">Bugfixes</a> +- <a href="#v2-2-0">v2\.2\.0</a> + - <a href="#release-summary-27">Release Summary</a> + - <a href="#minor-changes-7">Minor Changes</a> + - <a href="#bugfixes-26">Bugfixes</a> +- <a href="#v2-1-1">v2\.1\.1</a> + - <a href="#release-summary-28">Release Summary</a> + - <a href="#bugfixes-27">Bugfixes</a> +- <a href="#v2-1-0">v2\.1\.0</a> + - <a href="#release-summary-29">Release Summary</a> + - <a href="#minor-changes-8">Minor Changes</a> + - <a href="#bugfixes-28">Bugfixes</a> +- <a href="#v2-0-9">v2\.0\.9</a> + - <a href="#release-summary-30">Release Summary</a> + - <a href="#bugfixes-29">Bugfixes</a> +- <a href="#v2-0-8">v2\.0\.8</a> + - <a href="#release-summary-31">Release Summary</a> + - <a href="#bugfixes-30">Bugfixes</a> +- <a href="#v2-0-7">v2\.0\.7</a> + - <a href="#release-summary-32">Release Summary</a> + - <a href="#bugfixes-31">Bugfixes</a> +- <a href="#v2-0-6">v2\.0\.6</a> + - <a href="#release-summary-33">Release Summary</a> + - <a href="#bugfixes-32">Bugfixes</a> +- <a href="#v2-0-5">v2\.0\.5</a> + - <a href="#release-summary-34">Release Summary</a> + - <a href="#bugfixes-33">Bugfixes</a> +- <a href="#v2-0-4">v2\.0\.4</a> + - <a href="#release-summary-35">Release Summary</a> + - <a href="#bugfixes-34">Bugfixes</a> +- <a href="#v2-0-3">v2\.0\.3</a> + - <a href="#release-summary-36">Release Summary</a> + - <a href="#minor-changes-9">Minor Changes</a> +- <a href="#v2-0-2">v2\.0\.2</a> + - <a href="#release-summary-37">Release Summary</a> + - <a href="#bugfixes-35">Bugfixes</a> +- <a href="#v2-0-1">v2\.0\.1</a> + - <a href="#release-summary-38">Release Summary</a> + - <a href="#bugfixes-36">Bugfixes</a> +- <a href="#v2-0-0">v2\.0\.0</a> + - <a href="#release-summary-39">Release Summary</a> + - <a href="#minor-changes-10">Minor Changes</a> + - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a> + - <a href="#deprecated-features-2">Deprecated Features</a> + - <a href="#bugfixes-37">Bugfixes</a> + - <a href="#new-plugins-1">New Plugins</a> + - <a href="#inventory">Inventory</a> + - <a href="#new-modules-1">New Modules</a> +- <a href="#v1-2-0">v1\.2\.0</a> + - <a href="#release-summary-40">Release Summary</a> + - <a href="#minor-changes-11">Minor Changes</a> + - <a href="#bugfixes-38">Bugfixes</a> +- <a href="#v1-1-0">v1\.1\.0</a> + - <a href="#release-summary-41">Release Summary</a> + - <a href="#minor-changes-12">Minor Changes</a> + - <a href="#bugfixes-39">Bugfixes</a> +- <a href="#v1-0-1">v1\.0\.1</a> + - <a href="#release-summary-42">Release Summary</a> + - <a href="#bugfixes-40">Bugfixes</a> +- <a href="#v1-0-0">v1\.0\.0</a> + - <a href="#release-summary-43">Release Summary</a> + - <a href="#bugfixes-41">Bugfixes</a> +- <a href="#v0-3-0">v0\.3\.0</a> + - <a href="#release-summary-44">Release Summary</a> + - <a href="#minor-changes-13">Minor Changes</a> + - <a href="#bugfixes-42">Bugfixes</a> + - <a href="#new-modules-2">New Modules</a> +- <a href="#v0-2-0">v0\.2\.0</a> + - <a href="#release-summary-45">Release Summary</a> + - <a href="#major-changes">Major Changes</a> + - <a href="#minor-changes-14">Minor Changes</a> + - <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a> + - <a href="#bugfixes-43">Bugfixes</a> + - <a href="#new-modules-3">New Modules</a> +- <a href="#v0-1-0">v0\.1\.0</a> + - <a href="#release-summary-46">Release Summary</a> + - <a href="#new-plugins-2">New Plugins</a> + - <a href="#filter">Filter</a> + - <a href="#new-modules-4">New Modules</a> + +<a id="v2-8-3"></a> +## v2\.8\.3 + +<a id="release-summary"></a> +### Release Summary + +Bugfix release\. + +<a id="bugfixes"></a> +### Bugfixes + +* DNS record modules\, inventory plugins \- fix the TXT entry encoder to avoid splitting up escape sequences for quotes and backslashes over multiple TXT strings \([https\://github\.com/ansible\-collections/community\.dns/issues/190](https\://github\.com/ansible\-collections/community\.dns/issues/190)\, [https\://github\.com/ansible\-collections/community\.dns/pull/191](https\://github\.com/ansible\-collections/community\.dns/pull/191)\)\. +* Update Public Suffix List\. + +<a id="v2-8-2"></a> +## v2\.8\.2 + +<a id="release-summary-1"></a> +### Release Summary + +Bugfix release\. + +<a id="security-fixes"></a> +### Security Fixes + +* hosttech\_dns\_records and hetzner\_dns\_records inventory plugins \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.dns/pull/189](https\://github\.com/ansible\-collections/community\.dns/pull/189)\)\. + +<a id="bugfixes-1"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-8-1"></a> +## v2\.8\.1 + +<a id="release-summary-2"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-2"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-8-0"></a> +## v2\.8\.0 + +<a id="release-summary-3"></a> +### Release Summary + +Feature and maintenance release with updated PSL\. + +<a id="minor-changes"></a> +### Minor Changes + +* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name still works until community\.hrobot 2\.0\.0\. Then it will change to allow more complex filtering with the <code>community\.library\_inventory\_filtering\_v1</code> collection\'s functionality \([https\://github\.com/ansible\-collections/community\.dns/pull/181](https\://github\.com/ansible\-collections/community\.dns/pull/181)\)\. + +<a id="deprecated-features"></a> +### Deprecated Features + +* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name will stop working in community\.hrobot 2\.0\.0 \([https\://github\.com/ansible\-collections/community\.dns/pull/181](https\://github\.com/ansible\-collections/community\.dns/pull/181)\)\. + +<a id="bugfixes-3"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-7-0"></a> +## v2\.7\.0 + +<a id="release-summary-4"></a> +### Release Summary + +Bugfix and feature release with updated PSL\. + +<a id="minor-changes-1"></a> +### Minor Changes + +* nameserver\_info and nameserver\_record\_info \- add <code>server</code> parameter to specify custom DNS servers \([https\://github\.com/ansible\-collections/community\.dns/pull/168](https\://github\.com/ansible\-collections/community\.dns/pull/168)\, [https\://github\.com/ansible\-collections/community\.dns/pull/178](https\://github\.com/ansible\-collections/community\.dns/pull/178)\)\. +* wait\_for\_txt \- add <code>server</code> parameter to specify custom DNS servers \([https\://github\.com/ansible\-collections/community\.dns/pull/178](https\://github\.com/ansible\-collections/community\.dns/pull/178)\)\. + +<a id="bugfixes-4"></a> +### Bugfixes + +* Update Public Suffix List\. +* wait\_for\_txt\, nameserver\_info\, nameserver\_record\_info \- when looking up nameservers for a domain\, do not treat <code>NXDOMAIN</code> as a fatal error \([https\://github\.com/ansible\-collections/community\.dns/pull/177](https\://github\.com/ansible\-collections/community\.dns/pull/177)\)\. + +<a id="v2-6-4"></a> +## v2\.6\.4 + +<a id="release-summary-5"></a> +### Release Summary + +Bugfix and maintenance version\. + +<a id="bugfixes-5"></a> +### Bugfixes + +* Update Public Suffix List\. +* nameserver\_record\_info \- fix crash when more than one record is retrieved \([https\://github\.com/ansible\-collections/community\.dns/pull/172](https\://github\.com/ansible\-collections/community\.dns/pull/172)\)\. + +<a id="v2-6-3"></a> +## v2\.6\.3 + +<a id="release-summary-6"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-6"></a> +### Bugfixes + +* HTTP module utils \- make compatible with ansible\-core 2\.17 \([https\://github\.com/ansible\-collections/community\.dns/pull/165](https\://github\.com/ansible\-collections/community\.dns/pull/165)\)\. +* Update Public Suffix List\. + +<a id="v2-6-2"></a> +## v2\.6\.2 + +<a id="release-summary-7"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-7"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-6-1"></a> +## v2\.6\.1 + +<a id="release-summary-8"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-8"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-6-0"></a> +## v2\.6\.0 + +<a id="release-summary-9"></a> +### Release Summary + +Feature release with an updated Public Suffix List\. + +<a id="minor-changes-2"></a> +### Minor Changes + +* wait\_for\_txt \- add <code>servfail\_retries</code> parameter that allows retrying after SERVFAIL errors \([https\://github\.com/ansible\-collections/community\.dns/pull/159](https\://github\.com/ansible\-collections/community\.dns/pull/159)\)\. +* wait\_for\_txt\, resolver module utils \- use [EDNS](https\://en\.wikipedia\.org/wiki/Extension\_Mechanisms\_for\_DNS) \([https\://github\.com/ansible\-collections/community\.dns/pull/158](https\://github\.com/ansible\-collections/community\.dns/pull/158)\)\. + +<a id="bugfixes-9"></a> +### Bugfixes + +* Update Public Suffix List\. +* wait\_for\_txt\, resolver module utils \- improve error handling \([https\://github\.com/ansible\-collections/community\.dns/pull/158](https\://github\.com/ansible\-collections/community\.dns/pull/158)\)\. + +<a id="new-plugins"></a> +### New Plugins + +<a id="lookup"></a> +#### Lookup + +* community\.dns\.lookup \- Look up DNS records +* community\.dns\.lookup\_as\_dict \- Look up DNS records as dictionaries + +<a id="new-modules"></a> +### New Modules + +* community\.dns\.nameserver\_info \- Look up nameservers for a DNS name +* community\.dns\.nameserver\_record\_info \- Look up all records of a type from all nameservers for a DNS name + +<a id="v2-5-7"></a> +## v2\.5\.7 + +<a id="release-summary-10"></a> +### Release Summary + +Regular maintenance release with updated Public Suffix List\. + +<a id="bugfixes-10"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-5-6"></a> +## v2\.5\.6 + +<a id="release-summary-11"></a> +### Release Summary + +Maintenance release\. + +From this version on\, community\.dns is using the new [Ansible semantic markup](https\://docs\.ansible\.com/ansible/devel/dev\_guide/developing\_modules\_documenting\.html\#semantic\-markup\-within\-module\-documentation) +in its documentation\. If you look at documentation with the ansible\-doc CLI tool +from ansible\-core before 2\.15\, please note that it does not render the markup +correctly\. You should be still able to read it in most cases\, but you need +ansible\-core 2\.15 or later to see it as it is intended\. Alternatively you can +look at [the devel docsite](https\://docs\.ansible\.com/ansible/devel/collections/community/dns/) +for the rendered HTML version of the documentation of the latest release\. + +<a id="known-issues"></a> +### Known Issues + +* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/dns/](https\://docs\.ansible\.com/ansible/devel/collections/community/dns/)\. + +<a id="v2-5-5"></a> +## v2\.5\.5 + +<a id="release-summary-12"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-11"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-5-4"></a> +## v2\.5\.4 + +<a id="release-summary-13"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-12"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-5-3"></a> +## v2\.5\.3 + +<a id="release-summary-14"></a> +### Release Summary + +Maintenance release with updated PSL\. + +<a id="bugfixes-13"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-5-2"></a> +## v2\.5\.2 + +<a id="release-summary-15"></a> +### Release Summary + +Maintenance release with improved documentation and updated PSL\. + +<a id="bugfixes-14"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-5-1"></a> +## v2\.5\.1 + +<a id="release-summary-16"></a> +### Release Summary + +Maintenance release \(updated PSL\)\. + +<a id="bugfixes-15"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-5-0"></a> +## v2\.5\.0 + +<a id="release-summary-17"></a> +### Release Summary + +Feature and bugfix release with updated PSL\. + +<a id="minor-changes-3"></a> +### Minor Changes + +* hosttech inventory plugin \- allow to configure token\, username\, and password with <code>ANSIBLE\_HOSTTECH\_DNS\_TOKEN</code>\, <code>ANSIBLE\_HOSTTECH\_API\_USERNAME</code>\, and <code>ANSIBLE\_HOSTTECH\_API\_PASSWORD</code> environment variables\, respectively \([https\://github\.com/ansible\-collections/community\.dns/pull/131](https\://github\.com/ansible\-collections/community\.dns/pull/131)\)\. +* various modules and inventory plugins \- add new option <code>txt\_character\_encoding</code> which controls whether numeric escape sequences are interpreted as octals or decimals when <code>txt\_transformation\=quoted</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/134](https\://github\.com/ansible\-collections/community\.dns/pull/134)\)\. + +<a id="deprecated-features-1"></a> +### Deprecated Features + +* The default of the newly added option <code>txt\_character\_encoding</code> will change from <code>octal</code> to <code>decimal</code> in community\.dns 3\.0\.0\. The new default will be compatible with [RFC 1035](https\://www\.ietf\.org/rfc/rfc1035\.txt) \([https\://github\.com/ansible\-collections/community\.dns/pull/134](https\://github\.com/ansible\-collections/community\.dns/pull/134)\)\. + +<a id="bugfixes-16"></a> +### Bugfixes + +* Update Public Suffix List\. +* inventory plugins \- document <code>plugin</code> option used by the <code>ansible\.builtin\.auto</code> inventory plugin and mention required file ending in the documentation \([https\://github\.com/ansible\-collections/community\.dns/issues/130](https\://github\.com/ansible\-collections/community\.dns/issues/130)\, [https\://github\.com/ansible\-collections/community\.dns/pull/131](https\://github\.com/ansible\-collections/community\.dns/pull/131)\)\. + +<a id="v2-4-2"></a> +## v2\.4\.2 + +<a id="release-summary-18"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-17"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-4-1"></a> +## v2\.4\.1 + +<a id="release-summary-19"></a> +### Release Summary + +Regular maintenance release\. + +<a id="bugfixes-18"></a> +### Bugfixes + +* Update Public Suffix List\. +* wait\_for\_txt \- also retrieve IPv6 addresses of nameservers\. Prevents failures with IPv6 only nameservers \([https\://github\.com/ansible\-collections/community\.dns/issues/120](https\://github\.com/ansible\-collections/community\.dns/issues/120)\, [https\://github\.com/ansible\-collections/community\.dns/pull/121](https\://github\.com/ansible\-collections/community\.dns/pull/121)\)\. + +<a id="v2-4-0"></a> +## v2\.4\.0 + +<a id="release-summary-20"></a> +### Release Summary + +Feature and maintenance release\. + +<a id="minor-changes-4"></a> +### Minor Changes + +* Added a <code>community\.dns\.hetzner</code> module defaults group / action group\. Use with <code>group/community\.dns\.hetzner</code> to provide options for all Hetzner DNS modules \([https\://github\.com/ansible\-collections/community\.dns/pull/119](https\://github\.com/ansible\-collections/community\.dns/pull/119)\)\. +* Added a <code>community\.dns\.hosttech</code> module defaults group / action group\. Use with <code>group/community\.dns\.hosttech</code> to provide options for all Hosttech DNS modules \([https\://github\.com/ansible\-collections/community\.dns/pull/119](https\://github\.com/ansible\-collections/community\.dns/pull/119)\)\. +* wait\_for\_txt \- the module now supports check mode\. The only practical change in behavior is that in check mode\, the module is now executed instead of skipped\. Since the module does not change anything\, it should have been marked as supporting check mode since it was originally added \([https\://github\.com/ansible\-collections/community\.dns/pull/119](https\://github\.com/ansible\-collections/community\.dns/pull/119)\)\. + +<a id="bugfixes-19"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-3-4"></a> +## v2\.3\.4 + +<a id="release-summary-21"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-20"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-3-3"></a> +## v2\.3\.3 + +<a id="release-summary-22"></a> +### Release Summary + +Maintenance release including an updated Public Suffix List\. + +<a id="bugfixes-21"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-3-2"></a> +## v2\.3\.2 + +<a id="release-summary-23"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-22"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-3-1"></a> +## v2\.3\.1 + +<a id="release-summary-24"></a> +### Release Summary + +Maintenance release including an updated Public Suffix List\. + +<a id="minor-changes-5"></a> +### Minor Changes + +* The collection repository conforms to the [REUSE specification](https\://reuse\.software/spec/) except for the changelog fragments \([https\://github\.com/ansible\-collections/community\.dns/pull/112](https\://github\.com/ansible\-collections/community\.dns/pull/112)\)\. + +<a id="bugfixes-23"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-3-0"></a> +## v2\.3\.0 + +<a id="release-summary-25"></a> +### Release Summary + +Maintenance release including an updated Public Suffix List\. + +<a id="minor-changes-6"></a> +### Minor Changes + +* All software licenses are now in the <code>LICENSES/</code> directory of the collection root\. Moreover\, <code>SPDX\-License\-Identifier\:</code> is used to declare the applicable license for every file that is not automatically generated \([https\://github\.com/ansible\-collections/community\.dns/pull/109](https\://github\.com/ansible\-collections/community\.dns/pull/109)\)\. + +<a id="bugfixes-24"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-2-1"></a> +## v2\.2\.1 + +<a id="release-summary-26"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-25"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-2-0"></a> +## v2\.2\.0 + +<a id="release-summary-27"></a> +### Release Summary + +Feature release\. + +<a id="minor-changes-7"></a> +### Minor Changes + +* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- allow to template provider\-specific credentials and the <code>zone\_name</code>\, <code>zone\_id</code> options \([https\://github\.com/ansible\-collections/community\.dns/pull/106](https\://github\.com/ansible\-collections/community\.dns/pull/106)\)\. +* wait\_for\_txt \- improve error messages so that in case of SERVFAILs or other DNS errors it is clear which record was queried from which DNS server \([https\://github\.com/ansible\-collections/community\.dns/pull/105](https\://github\.com/ansible\-collections/community\.dns/pull/105)\)\. + +<a id="bugfixes-26"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-1-1"></a> +## v2\.1\.1 + +<a id="release-summary-28"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-27"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-1-0"></a> +## v2\.1\.0 + +<a id="release-summary-29"></a> +### Release Summary + +Feature and maintenance release with updated PSL\. + +<a id="minor-changes-8"></a> +### Minor Changes + +* Prepare collection for inclusion in an Execution Environment by declaring its dependencies \([https\://github\.com/ansible\-collections/community\.dns/pull/93](https\://github\.com/ansible\-collections/community\.dns/pull/93)\)\. + +<a id="bugfixes-28"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-9"></a> +## v2\.0\.9 + +<a id="release-summary-30"></a> +### Release Summary + +Maintenance release with updated Public Suffix List and added collection links file\. + +<a id="bugfixes-29"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-8"></a> +## v2\.0\.8 + +<a id="release-summary-31"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-30"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-7"></a> +## v2\.0\.7 + +<a id="release-summary-32"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-31"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-6"></a> +## v2\.0\.6 + +<a id="release-summary-33"></a> +### Release Summary + +Bugfix release\. + +<a id="bugfixes-32"></a> +### Bugfixes + +* Update Public Suffix List\. +* wait\_for\_txt \- do not fail if <code>NXDOMAIN</code> result is returned\. Also do not succeed if no nameserver can be found \([https\://github\.com/ansible\-collections/community\.dns/issues/81](https\://github\.com/ansible\-collections/community\.dns/issues/81)\, [https\://github\.com/ansible\-collections/community\.dns/pull/82](https\://github\.com/ansible\-collections/community\.dns/pull/82)\)\. + +<a id="v2-0-5"></a> +## v2\.0\.5 + +<a id="release-summary-34"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-33"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-4"></a> +## v2\.0\.4 + +<a id="release-summary-35"></a> +### Release Summary + +Maintenance release with updated Public Suffix List\. + +<a id="bugfixes-34"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-3"></a> +## v2\.0\.3 + +<a id="release-summary-36"></a> +### Release Summary + +Bugfix release\. + +<a id="minor-changes-9"></a> +### Minor Changes + +* HTTP API module utils \- fix usage of <code>fetch\_url</code> with changes in latest ansible\-core <code>devel</code> branch \([https\://github\.com/ansible\-collections/community\.dns/pull/73](https\://github\.com/ansible\-collections/community\.dns/pull/73)\)\. + +<a id="v2-0-2"></a> +## v2\.0\.2 + +<a id="release-summary-37"></a> +### Release Summary + +Regular maintenance release\. + +<a id="bugfixes-35"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-1"></a> +## v2\.0\.1 + +<a id="release-summary-38"></a> +### Release Summary + +Maintenance release with Public Suffix List updates\. + +<a id="bugfixes-36"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v2-0-0"></a> +## v2\.0\.0 + +<a id="release-summary-39"></a> +### Release Summary + +This release contains many new features\, modules and plugins\, but also has several breaking changes to the 1\.x\.y versions\. Please read the changelog carefully to determine what to change if you used an earlier version of this collection\. + +<a id="minor-changes-10"></a> +### Minor Changes + +* Add support for Hetzner DNS \([https\://github\.com/ansible\-collections/community\.dns/pull/27](https\://github\.com/ansible\-collections/community\.dns/pull/27)\)\. +* Added a <code>txt\_transformation</code> option to all modules and plugins working with DNS records \([https\://github\.com/ansible\-collections/community\.dns/issues/48](https\://github\.com/ansible\-collections/community\.dns/issues/48)\, [https\://github\.com/ansible\-collections/community\.dns/pull/57](https\://github\.com/ansible\-collections/community\.dns/pull/57)\, [https\://github\.com/ansible\-collections/community\.dns/pull/60](https\://github\.com/ansible\-collections/community\.dns/pull/60)\)\. +* The hosttech\_dns\_records module has been renamed to hosttech\_dns\_record\_sets \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\. +* The internal API now supports bulk DNS record changes\, if supported by the API \([https\://github\.com/ansible\-collections/community\.dns/pull/39](https\://github\.com/ansible\-collections/community\.dns/pull/39)\)\. +* The internal record API allows to manage extra data \([https\://github\.com/ansible\-collections/community\.dns/pull/63](https\://github\.com/ansible\-collections/community\.dns/pull/63)\)\. +* Use HTTP helper class to make API implementations work for both plugins and modules\. Make WSDL API use <code>fetch\_url</code> instead of <code>open\_url</code> for modules \([https\://github\.com/ansible\-collections/community\.dns/pull/36](https\://github\.com/ansible\-collections/community\.dns/pull/36)\)\. +* hetzner\_dns\_record and hosttech\_dns\_record \- when not using check mode\, use actual return data for diff\, instead of input data\, so that extra data can be shown \([https\://github\.com/ansible\-collections/community\.dns/pull/63](https\://github\.com/ansible\-collections/community\.dns/pull/63)\)\. +* hetzner\_dns\_zone\_info \- the <code>legacy\_ns</code> return value is now sorted\, since its order is unstable \([https\://github\.com/ansible\-collections/community\.dns/pull/46](https\://github\.com/ansible\-collections/community\.dns/pull/46)\)\. +* hosttech\_dns\_\* modules \- rename <code>zone</code> parameter to <code>zone\_name</code>\. The old name <code>zone</code> can still be used as an alias \([https\://github\.com/ansible\-collections/community\.dns/pull/32](https\://github\.com/ansible\-collections/community\.dns/pull/32)\)\. +* hosttech\_dns\_record\_set \- <code>value</code> is no longer required when <code>state\=absent</code> and <code>overwrite\=true</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\. +* hosttech\_dns\_record\_sets \- <code>records</code> has been renamed to <code>record\_sets</code>\. The old name <code>records</code> can still be used as an alias \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\. +* hosttech\_dns\_zone\_info \- return extra information as <code>zone\_info</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/38](https\://github\.com/ansible\-collections/community\.dns/pull/38)\)\. + +<a id="breaking-changes--porting-guide"></a> +### Breaking Changes / Porting Guide + +* All Hetzner modules and plugins which handle DNS records now work with unquoted TXT values by default\. The old behavior can be obtained by setting <code>txt\_transformation\=api</code> \([https\://github\.com/ansible\-collections/community\.dns/issues/48](https\://github\.com/ansible\-collections/community\.dns/issues/48)\, [https\://github\.com/ansible\-collections/community\.dns/pull/57](https\://github\.com/ansible\-collections/community\.dns/pull/57)\, [https\://github\.com/ansible\-collections/community\.dns/pull/60](https\://github\.com/ansible\-collections/community\.dns/pull/60)\)\. +* Hosttech API creation \- now requires a <code>ModuleOptionProvider</code> object instead of an <code>AnsibleModule</code> object\. Alternatively an Ansible plugin instance can be passed \([https\://github\.com/ansible\-collections/community\.dns/pull/37](https\://github\.com/ansible\-collections/community\.dns/pull/37)\)\. +* The hetzner\_dns\_record\_info and hosttech\_dns\_record\_info modules have been renamed to hetzner\_dns\_record\_set\_info and hosttech\_dns\_record\_set\_info\, respectively \([https\://github\.com/ansible\-collections/community\.dns/pull/54](https\://github\.com/ansible\-collections/community\.dns/pull/54)\)\. +* The hosttech\_dns\_record module has been renamed to hosttech\_dns\_record\_set \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\. +* The internal bulk record updating helper \(<code>bulk\_apply\_changes</code>\) now also returns the records that were deleted\, created or updated \([https\://github\.com/ansible\-collections/community\.dns/pull/63](https\://github\.com/ansible\-collections/community\.dns/pull/63)\)\. +* The internal record API no longer allows to manage comments explicitly \([https\://github\.com/ansible\-collections/community\.dns/pull/63](https\://github\.com/ansible\-collections/community\.dns/pull/63)\)\. +* When using the internal modules API\, now a zone ID type and a provider information object must be passed \([https\://github\.com/ansible\-collections/community\.dns/pull/27](https\://github\.com/ansible\-collections/community\.dns/pull/27)\)\. +* hetzner\_dns\_record\* modules \- implement correct handling of default TTL\. The value <code>none</code> is now accepted and returned in this case \([https\://github\.com/ansible\-collections/community\.dns/pull/52](https\://github\.com/ansible\-collections/community\.dns/pull/52)\, [https\://github\.com/ansible\-collections/community\.dns/issues/50](https\://github\.com/ansible\-collections/community\.dns/issues/50)\)\. +* hetzner\_dns\_record\, hetzner\_dns\_record\_set\, hetzner\_dns\_record\_sets \- the default TTL is now 300 and no longer 3600\, which equals the default in the web console \([https\://github\.com/ansible\-collections/community\.dns/pull/43](https\://github\.com/ansible\-collections/community\.dns/pull/43)\)\. +* hosttech\_dns\_record\_set \- the option <code>overwrite</code> was replaced by a new option <code>on\_existing</code>\. Specifying <code>overwrite\=true</code> is equivalent to <code>on\_existing\=replace</code> \(the new default\)\. Specifying <code>overwrite\=false</code> with <code>state\=present</code> is equivalent to <code>on\_existing\=keep\_and\_fail</code>\, and specifying <code>overwrite\=false</code> with <code>state\=absent</code> is equivalent to <code>on\_existing\=keep</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\. + +<a id="deprecated-features-2"></a> +### Deprecated Features + +* The hosttech\_dns\_records module has been renamed to hosttech\_dns\_record\_sets\. The old name will stop working in community\.dns 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\. + +<a id="bugfixes-37"></a> +### Bugfixes + +* Hetzner API \- interpret missing TTL as 300\, which is what the web console also does \([https\://github\.com/ansible\-collections/community\.dns/pull/42](https\://github\.com/ansible\-collections/community\.dns/pull/42)\)\. +* Update Public Suffix List\. +* Update Public Suffix List\. +* Update Public Suffix List\. +* hetzner API code \- make sure to also handle errors returned by the API if the HTTP status code indicates success\. This sometimes happens for 500 Internal Server Error \([https\://github\.com/ansible\-collections/community\.dns/pull/58](https\://github\.com/ansible\-collections/community\.dns/pull/58)\)\. +* hosttech\_dns\_zone\_info \- make sure that full information is returned both when requesting a zone by ID or by name \([https\://github\.com/ansible\-collections/community\.dns/pull/56](https\://github\.com/ansible\-collections/community\.dns/pull/56)\)\. +* wait\_for\_txt \- fix handling of too long TXT values \([https\://github\.com/ansible\-collections/community\.dns/pull/65](https\://github\.com/ansible\-collections/community\.dns/pull/65)\)\. +* wait\_for\_txt \- resolving nameservers sometimes resulted in an empty list\, yielding wrong results \([https\://github\.com/ansible\-collections/community\.dns/pull/64](https\://github\.com/ansible\-collections/community\.dns/pull/64)\)\. + +<a id="new-plugins-1"></a> +### New Plugins + +<a id="inventory"></a> +#### Inventory + +* community\.dns\.hetzner\_dns\_records \- Create inventory from Hetzner DNS records +* community\.dns\.hosttech\_dns\_records \- Create inventory from Hosttech DNS records + +<a id="new-modules-1"></a> +### New Modules + +* community\.dns\.hetzner\_dns\_record \- Add or delete a single record in Hetzner DNS service +* community\.dns\.hetzner\_dns\_record\_info \- Retrieve records in Hetzner DNS service +* community\.dns\.hetzner\_dns\_record\_set \- Add or delete record sets in Hetzner DNS service +* community\.dns\.hetzner\_dns\_record\_set\_info \- Retrieve record sets in Hetzner DNS service +* community\.dns\.hetzner\_dns\_record\_sets \- Bulk synchronize DNS record sets in Hetzner DNS service +* community\.dns\.hetzner\_dns\_zone\_info \- Retrieve zone information in Hetzner DNS service +* community\.dns\.hosttech\_dns\_record \- Add or delete a single record in Hosttech DNS service +* community\.dns\.hosttech\_dns\_record\_info \- Retrieve records in Hosttech DNS service +* community\.dns\.hosttech\_dns\_record\_set \- Add or delete record sets in Hosttech DNS service +* community\.dns\.hosttech\_dns\_record\_sets \- Bulk synchronize DNS record sets in Hosttech DNS service + +<a id="v1-2-0"></a> +## v1\.2\.0 + +<a id="release-summary-40"></a> +### Release Summary + +Last minor 1\.x\.0 version\. The 2\.0\.0 version will have some backwards incompatible changes to the <code>hosttech\_dns\_record</code> and <code>hosttech\_dns\_records</code> modules which will require user intervention\. These changes should result in a better UX\. + +<a id="minor-changes-11"></a> +### Minor Changes + +* hosttech modules \- add <code>api\_token</code> alias for <code>hosttech\_token</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/26](https\://github\.com/ansible\-collections/community\.dns/pull/26)\)\. +* hosttech\_dns\_record \- in <code>diff</code> mode\, also return <code>diff</code> data structure when <code>changed</code> is <code>false</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/28](https\://github\.com/ansible\-collections/community\.dns/pull/28)\)\. +* module utils \- add default implementation for some zone/record API functions\, and move common JSON API code to helper class \([https\://github\.com/ansible\-collections/community\.dns/pull/26](https\://github\.com/ansible\-collections/community\.dns/pull/26)\)\. + +<a id="bugfixes-38"></a> +### Bugfixes + +* Update Public Suffix List\. +* hosttech\_dns\_record \- correctly handle quoting in CAA records for JSON API \([https\://github\.com/ansible\-collections/community\.dns/pull/30](https\://github\.com/ansible\-collections/community\.dns/pull/30)\)\. + +<a id="v1-1-0"></a> +## v1\.1\.0 + +<a id="release-summary-41"></a> +### Release Summary + +Regular maintenance release\. + +<a id="minor-changes-12"></a> +### Minor Changes + +* Avoid internal ansible\-core module\_utils in favor of equivalent public API available since at least Ansible 2\.9 \([https\://github\.com/ansible\-collections/community\.dns/pull/24](https\://github\.com/ansible\-collections/community\.dns/pull/24)\)\. + +<a id="bugfixes-39"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v1-0-1"></a> +## v1\.0\.1 + +<a id="release-summary-42"></a> +### Release Summary + +Regular maintenance release\. + +<a id="bugfixes-40"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v1-0-0"></a> +## v1\.0\.0 + +<a id="release-summary-43"></a> +### Release Summary + +First stable release\. + +<a id="bugfixes-41"></a> +### Bugfixes + +* Update Public Suffix List\. + +<a id="v0-3-0"></a> +## v0\.3\.0 + +<a id="release-summary-44"></a> +### Release Summary + +Fixes bugs\, adds rate limiting for Hosttech JSON API\, and adds a new bulk synchronization module\. + +<a id="minor-changes-13"></a> +### Minor Changes + +* hosttech\_dns\_\* \- handle <code>419 Too Many Requests</code> with proper rate limiting for JSON API \([https\://github\.com/ansible\-collections/community\.dns/pull/14](https\://github\.com/ansible\-collections/community\.dns/pull/14)\)\. + +<a id="bugfixes-42"></a> +### Bugfixes + +* Avoid converting ASCII labels which contain underscores or other printable ASCII characters outside <code>\[a\-zA\-Z0\-9\-\]</code> to alabels during normalization \([https\://github\.com/ansible\-collections/community\.dns/pull/13](https\://github\.com/ansible\-collections/community\.dns/pull/13)\)\. +* Updated Public Suffix List\. + +<a id="new-modules-2"></a> +### New Modules + +* community\.dns\.hosttech\_dns\_records \- Bulk synchronize DNS records in Hosttech DNS service + +<a id="v0-2-0"></a> +## v0\.2\.0 + +<a id="release-summary-45"></a> +### Release Summary + +Major refactoring release\, which adds a zone information module and supports HostTech\'s new REST API\. + +<a id="major-changes"></a> +### Major Changes + +* hosttech\_\* modules \- support the new JSON API at [https\://api\.ns1\.hosttech\.eu/api/documentation/](https\://api\.ns1\.hosttech\.eu/api/documentation/) \([https\://github\.com/ansible\-collections/community\.dns/pull/4](https\://github\.com/ansible\-collections/community\.dns/pull/4)\)\. + +<a id="minor-changes-14"></a> +### Minor Changes + +* hosttech\_dns\_record\* modules \- allow to specify <code>prefix</code> instead of <code>record</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/8](https\://github\.com/ansible\-collections/community\.dns/pull/8)\)\. +* hosttech\_dns\_record\* modules \- allow to specify zone by ID with the <code>zone\_id</code> parameter\, alternatively to the <code>zone</code> parameter \([https\://github\.com/ansible\-collections/community\.dns/pull/7](https\://github\.com/ansible\-collections/community\.dns/pull/7)\)\. +* hosttech\_dns\_record\* modules \- return <code>zone\_id</code> on success \([https\://github\.com/ansible\-collections/community\.dns/pull/7](https\://github\.com/ansible\-collections/community\.dns/pull/7)\)\. +* hosttech\_dns\_record\* modules \- support IDN domain names and prefixes \([https\://github\.com/ansible\-collections/community\.dns/pull/9](https\://github\.com/ansible\-collections/community\.dns/pull/9)\)\. +* hosttech\_dns\_record\_info \- also return <code>prefix</code> for a record set \([https\://github\.com/ansible\-collections/community\.dns/pull/8](https\://github\.com/ansible\-collections/community\.dns/pull/8)\)\. +* hosttech\_record \- allow to delete records without querying their content first by specifying <code>overwrite\=true</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/4](https\://github\.com/ansible\-collections/community\.dns/pull/4)\)\. + +<a id="breaking-changes--porting-guide-1"></a> +### Breaking Changes / Porting Guide + +* hosttech\_\* module\_utils \- completely rewrite and refactor to support new JSON API and allow to reuse provider\-independent module logic \([https\://github\.com/ansible\-collections/community\.dns/pull/4](https\://github\.com/ansible\-collections/community\.dns/pull/4)\)\. + +<a id="bugfixes-43"></a> +### Bugfixes + +* Update Public Suffix List\. +* hosttech\_record \- fix diff mode for <code>state\=absent</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/4](https\://github\.com/ansible\-collections/community\.dns/pull/4)\)\. +* hosttech\_record\_info \- fix authentication error handling \([https\://github\.com/ansible\-collections/community\.dns/pull/4](https\://github\.com/ansible\-collections/community\.dns/pull/4)\)\. + +<a id="new-modules-3"></a> +### New Modules + +* community\.dns\.hosttech\_dns\_zone\_info \- Retrieve zone information in Hosttech DNS service + +<a id="v0-1-0"></a> +## v0\.1\.0 + +<a id="release-summary-46"></a> +### Release Summary + +Initial public release\. + +<a id="new-plugins-2"></a> +### New Plugins + +<a id="filter"></a> +#### Filter + +* community\.dns\.get\_public\_suffix \- Returns the public suffix of a DNS name +* community\.dns\.get\_registrable\_domain \- Returns the registrable domain name of a DNS name +* community\.dns\.remove\_public\_suffix \- Removes the public suffix from a DNS name +* community\.dns\.remove\_registrable\_domain \- Removes the registrable domain name from a DNS name + +<a id="new-modules-4"></a> +### New Modules + +* community\.dns\.hosttech\_dns\_record \- Add or delete entries in Hosttech DNS service +* community\.dns\.hosttech\_dns\_record\_info \- Retrieve entries in Hosttech DNS service +* community\.dns\.wait\_for\_txt \- Wait for TXT entries to be available on all authoritative nameservers diff --git a/ansible_collections/community/dns/CHANGELOG.md.license b/ansible_collections/community/dns/CHANGELOG.md.license new file mode 100644 index 000000000..edff8c768 --- /dev/null +++ b/ansible_collections/community/dns/CHANGELOG.md.license @@ -0,0 +1,3 @@ +GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: Ansible Project diff --git a/ansible_collections/community/dns/CHANGELOG.rst b/ansible_collections/community/dns/CHANGELOG.rst index bc3b3ffd9..37b4a2500 100644 --- a/ansible_collections/community/dns/CHANGELOG.rst +++ b/ansible_collections/community/dns/CHANGELOG.rst @@ -4,6 +4,217 @@ Community DNS Collection Release Notes .. contents:: Topics +v2.8.3 +====== + +Release Summary +--------------- + +Bugfix release. + +Bugfixes +-------- + +- DNS record modules, inventory plugins - fix the TXT entry encoder to avoid splitting up escape sequences for quotes and backslashes over multiple TXT strings (https://github.com/ansible-collections/community.dns/issues/190, https://github.com/ansible-collections/community.dns/pull/191). +- Update Public Suffix List. + +v2.8.2 +====== + +Release Summary +--------------- + +Bugfix release. + +Security Fixes +-------------- + +- hosttech_dns_records and hetzner_dns_records inventory plugins - make sure all data received from the remote servers is marked as unsafe, so remote code execution by obtaining texts that can be evaluated as templates is not possible (https://www.die-welt.net/2024/03/remote-code-execution-in-ansible-dynamic-inventory-plugins/, https://github.com/ansible-collections/community.dns/pull/189). + +Bugfixes +-------- + +- Update Public Suffix List. + +v2.8.1 +====== + +Release Summary +--------------- + +Maintenance release with updated PSL. + +Bugfixes +-------- + +- Update Public Suffix List. + +v2.8.0 +====== + +Release Summary +--------------- + +Feature and maintenance release with updated PSL. + +Minor Changes +------------- + +- hetzner_dns_records and hosttech_dns_records inventory plugins - the ``filters`` option has been renamed to ``simple_filters``. The old name still works until community.hrobot 2.0.0. Then it will change to allow more complex filtering with the ``community.library_inventory_filtering_v1`` collection's functionality (https://github.com/ansible-collections/community.dns/pull/181). + +Deprecated Features +------------------- + +- hetzner_dns_records and hosttech_dns_records inventory plugins - the ``filters`` option has been renamed to ``simple_filters``. The old name will stop working in community.hrobot 2.0.0 (https://github.com/ansible-collections/community.dns/pull/181). + +Bugfixes +-------- + +- Update Public Suffix List. + +v2.7.0 +====== + +Release Summary +--------------- + +Bugfix and feature release with updated PSL. + +Minor Changes +------------- + +- nameserver_info and nameserver_record_info - add ``server`` parameter to specify custom DNS servers (https://github.com/ansible-collections/community.dns/pull/168, https://github.com/ansible-collections/community.dns/pull/178). +- wait_for_txt - add ``server`` parameter to specify custom DNS servers (https://github.com/ansible-collections/community.dns/pull/178). + +Bugfixes +-------- + +- Update Public Suffix List. +- wait_for_txt, nameserver_info, nameserver_record_info - when looking up nameservers for a domain, do not treat ``NXDOMAIN`` as a fatal error (https://github.com/ansible-collections/community.dns/pull/177). + +v2.6.4 +====== + +Release Summary +--------------- + +Bugfix and maintenance version. + +Bugfixes +-------- + +- Update Public Suffix List. +- nameserver_record_info - fix crash when more than one record is retrieved (https://github.com/ansible-collections/community.dns/pull/172). + +v2.6.3 +====== + +Release Summary +--------------- + +Maintenance release with updated PSL. + +Bugfixes +-------- + +- HTTP module utils - make compatible with ansible-core 2.17 (https://github.com/ansible-collections/community.dns/pull/165). +- Update Public Suffix List. + +v2.6.2 +====== + +Release Summary +--------------- + +Maintenance release with updated PSL. + +Bugfixes +-------- + +- Update Public Suffix List. + +v2.6.1 +====== + +Release Summary +--------------- + +Maintenance release with updated PSL. + +Bugfixes +-------- + +- Update Public Suffix List. + +v2.6.0 +====== + +Release Summary +--------------- + +Feature release with an updated Public Suffix List. + +Minor Changes +------------- + +- wait_for_txt - add ``servfail_retries`` parameter that allows retrying after SERVFAIL errors (https://github.com/ansible-collections/community.dns/pull/159). +- wait_for_txt, resolver module utils - use `EDNS <https://en.wikipedia.org/wiki/Extension_Mechanisms_for_DNS>`__ (https://github.com/ansible-collections/community.dns/pull/158). + +Bugfixes +-------- + +- Update Public Suffix List. +- wait_for_txt, resolver module utils - improve error handling (https://github.com/ansible-collections/community.dns/pull/158). + +New Plugins +----------- + +Lookup +~~~~~~ + +- community.dns.lookup - Look up DNS records +- community.dns.lookup_as_dict - Look up DNS records as dictionaries + +New Modules +----------- + +- community.dns.nameserver_info - Look up nameservers for a DNS name +- community.dns.nameserver_record_info - Look up all records of a type from all nameservers for a DNS name + +v2.5.7 +====== + +Release Summary +--------------- + +Regular maintenance release with updated Public Suffix List. + +Bugfixes +-------- + +- Update Public Suffix List. + +v2.5.6 +====== + +Release Summary +--------------- + +Maintenance release. + +From this version on, community.dns is using the new `Ansible semantic markup +<https://docs.ansible.com/ansible/devel/dev_guide/developing_modules_documenting.html#semantic-markup-within-module-documentation>`__ +in its documentation. If you look at documentation with the ansible-doc CLI tool +from ansible-core before 2.15, please note that it does not render the markup +correctly. You should be still able to read it in most cases, but you need +ansible-core 2.15 or later to see it as it is intended. Alternatively you can +look at `the devel docsite <https://docs.ansible.com/ansible/devel/collections/community/dns/>`__ +for the rendered HTML version of the documentation of the latest release. + +Known Issues +------------ + +- Ansible markup will show up in raw form on ansible-doc text output for ansible-core before 2.15. If you have trouble deciphering the documentation markup, please upgrade to ansible-core 2.15 (or newer), or read the HTML documentation on https://docs.ansible.com/ansible/devel/collections/community/dns/. v2.5.5 ====== @@ -484,7 +695,6 @@ Release Summary Last minor 1.x.0 version. The 2.0.0 version will have some backwards incompatible changes to the ``hosttech_dns_record`` and ``hosttech_dns_records`` modules which will require user intervention. These changes should result in a better UX. - Minor Changes ------------- @@ -592,7 +802,7 @@ Minor Changes Breaking Changes / Porting Guide -------------------------------- -- hosttech_* module_utils - completely rewrite and refactor to support new JSON API and allow to re-use provider-independent module logic (https://github.com/ansible-collections/community.dns/pull/4). +- hosttech_* module_utils - completely rewrite and refactor to support new JSON API and allow to reuse provider-independent module logic (https://github.com/ansible-collections/community.dns/pull/4). Bugfixes -------- diff --git a/ansible_collections/community/dns/FILES.json b/ansible_collections/community/dns/FILES.json index 28b4fc42f..8bda06632 100644 --- a/ansible_collections/community/dns/FILES.json +++ b/ansible_collections/community/dns/FILES.json @@ -25,14 +25,14 @@ "name": ".github/workflows/ansible-test.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "57f43a933f9c97400b40a433e63641f054cd983d9dbe80634f46a03cca350224", + "chksum_sha256": "cb9ff13908693ca232d8a96c732b37b686549b5a18c58241a40c14cafe97dec0", "format": 1 }, { "name": ".github/workflows/check-psl.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "328ab30e4396fbcd5256cbd489493fe4fbd60d5e91285c843066102762cc8d13", + "chksum_sha256": "118df96cf8dd220a3796a3626cdf1110d7c516f3442bd7d2ca8d5d8e7d6a06a5", "format": 1 }, { @@ -53,28 +53,28 @@ "name": ".github/workflows/ee.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fc968cc46f8bfe4e3a61e9bd923514e7c3a740f7561e5f954b88c0ff278852cd", + "chksum_sha256": "bcef35a96fa3202cfec5d7adcb76b93124fa08e1a8c6dd914bf8cbb8aed28f11", "format": 1 }, { "name": ".github/workflows/extra-tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c563072f09b977b1e3f5de4bef418a4985efc2be2e9b8c3ce5f3ded827e0f829", + "chksum_sha256": "c7ed351192ec963495e9a1752c3ecd914698582affd90dec5065c7f2180fe1dc", "format": 1 }, { "name": ".github/workflows/import-galaxy.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3adc031272832a2901eeca54ab1e98f08f65682fd3046ec6d8f79885c6d21e97", + "chksum_sha256": "739c36223d6e0e6ccc98907c43cba53296e7b1ccd64a2d995c2ff21df4ab25a5", "format": 1 }, { "name": ".github/workflows/reuse.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e8a5666a792db2dbbb984d861032728af7523bd05eb64f72d5fe24d7888c4a85", + "chksum_sha256": "91fb4be801aaf7897a138f4774f1fa172291af4fcd9e1c7a3a5e3830236305fe", "format": 1 }, { @@ -151,7 +151,7 @@ "name": "changelogs/changelog.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "87340f9738ad8fd68d3b353331f75224c62db5146a60dc8ec73aee23e127de8c", + "chksum_sha256": "86ce7da485fe12025925410c18b8b391fccc9b84dffff900037604813663277f", "format": 1 }, { @@ -165,7 +165,7 @@ "name": "changelogs/config.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "eaf381e2fe7a048e89338e704fb11ed2be9366b56f9b0c1aecb5c69200d245ae", + "chksum_sha256": "e43f412de1a581ff888e1c037718691d86545bf11e07aaf66719f51233fc3d9b", "format": 1 }, { @@ -193,21 +193,21 @@ "name": "docs/docsite/rst/filter_guide.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4951821c42291a5155c07ab8890b797891a797a48d56177f5c43fa1f68e40ed3", + "chksum_sha256": "b407b72d65102202fc82d449bef8dd026f4d2debb9f7140fa6ac664a4cd4f5fc", "format": 1 }, { "name": "docs/docsite/rst/hetzner_guide.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9f1add331b70dab5095c92502c08e1315ed425ab313aa0d140dd34a53215dc80", + "chksum_sha256": "b7f406b5c5d7921909eb2196feae0ec9a28e18ee5a2ce08e0a8db50c3e2506f6", "format": 1 }, { "name": "docs/docsite/rst/hosttech_guide.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a5a52988e830180e5ce155bfbcdb1a7f6b4f32d49ac36a9754af2c2ab41b0dbe", + "chksum_sha256": "aa681fcb4d15501cb903fa73e3f12f587a094ccf38b4293cbc2f7c3c68fbb1d1", "format": 1 }, { @@ -277,77 +277,77 @@ "name": "plugins/doc_fragments/filters.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b96398417b1b6574669976db5fb6db1d797ca98c4966973ea28c7d90a8e89d45", + "chksum_sha256": "1cb405a996cfcbd3e2f3b93bebbb46bb58d1a3d4a096e2cd4f4224300622e22c", "format": 1 }, { "name": "plugins/doc_fragments/hetzner.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d533aa9b538b4b516f61b1bc279cc41f5182b61768982a589b60b5fb93d7e826", + "chksum_sha256": "404be926c5e8d5ebd8c3ca9d2298ee20271a94002718af887dbf9fb2a2c2f5d5", "format": 1 }, { "name": "plugins/doc_fragments/hosttech.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c688311bad0e2ef03270326ec7c5395c6a337dc9c6858085723c543f330634dd", + "chksum_sha256": "8d5111e6a8451815e488972647ddd93c97ee7c0643ed1d93486b08ce64e94aea", "format": 1 }, { "name": "plugins/doc_fragments/inventory_records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9901b4cc5e7285e71f460b2284c135f4dce22089ef4cf0594d1425cc1f49f4a1", + "chksum_sha256": "ca51ab2e9350f36f68827a2fa86145ad0865838ac43313e07e09f853fd6e1f3c", "format": 1 }, { "name": "plugins/doc_fragments/module_record.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3b2487963454cf78d4603577d87fa09f021682fa63b91c87a5bf7d37a18f6188", + "chksum_sha256": "d47652ca9323493adf9e018cc4854f647963b0343cf50baf5120a4dd6f6de632", "format": 1 }, { "name": "plugins/doc_fragments/module_record_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a6de9b0cc1556bcfb4ec0db4ae29d8bd16e0b618ecb58754d5c1a9bdda7ee541", + "chksum_sha256": "9b2ca73771adedb40bd5563517538018e7e94e972be9d4c11c7477f262425bee", "format": 1 }, { "name": "plugins/doc_fragments/module_record_set.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6239eb43284dd8561616e048e1fd96aeaadaf5c0e9a43db9a8d203622f4a6d4b", + "chksum_sha256": "93f0a0b7e58c77fb0b0458fec03fefdfe2e29d74b54ab058b120263da2416b7a", "format": 1 }, { "name": "plugins/doc_fragments/module_record_set_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b10b9465de88c3b79b2f76e181745559ca662166e0a4036c29b1311af9ac44a7", + "chksum_sha256": "76cefb614786062fba1bb6f1e2cbf704f51c4a4089992fd0dc125f8f9d89ecd6", "format": 1 }, { "name": "plugins/doc_fragments/module_record_sets.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1898824cddb3853becd5c2207e42f6d2ccc18cdae5539ebf3911e8b3ca7b2f89", + "chksum_sha256": "08ae979b4324fe3b21e61e46226a494fa0bd5ce9b24c3f5daec40eec11dda18c", "format": 1 }, { "name": "plugins/doc_fragments/module_zone_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "91f80f14cdef9da9c08c1f969ed9ffb07f097070efac7447c5f30c11394d8031", + "chksum_sha256": "8618f26a1465c96304e63f4f8af7ee310a983343be77d2a5aa3541fc0664145e", "format": 1 }, { "name": "plugins/doc_fragments/options.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "10ac33fbbbeb9be9afaa107f62ade852ef9ee471e829588e4ee4e108ba873b05", + "chksum_sha256": "d6187dcb10a41b78a6bf385d22a3fafe2c1a8e69b296aeb8292d109edfab3b22", "format": 1 }, { @@ -403,14 +403,35 @@ "name": "plugins/inventory/hetzner_dns_records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b4ef8ec66c251b7703b461ae5d782b0f3208c96bff19df643bb29b618d172724", + "chksum_sha256": "b6531b5ee8da29ac4909eeb4db27b9d5c232c8acfd8741dc99cc6d5877ccf213", "format": 1 }, { "name": "plugins/inventory/hosttech_dns_records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7dcc6657d43c6d2004c4a0c45d5a0f704481e1536673d154d8e3bba0e85494e9", + "chksum_sha256": "ed0fef2e327ea3103a8e3c08a0af587f1cc48c6239ad14e3164f706e86d7f160", + "format": 1 + }, + { + "name": "plugins/lookup", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/lookup/lookup.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6571e35773f4c9116eaf7c21e5c25ab95d803e54d3c929e6b94b82eaa503d8ee", + "format": 1 + }, + { + "name": "plugins/lookup/lookup_as_dict.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2eb51bdf708dc19c84dd15e16c8804570922cdf0b5cfad337c7a85c93b326750", "format": 1 }, { @@ -445,7 +466,7 @@ "name": "plugins/module_utils/conversion/txt.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f4ef8ea4cc71f015b68f1d5e964790321c963c9a4e4e29e24c424539c0e874f2", + "chksum_sha256": "2b67dedea39b7e459c5013b1fea65b14ff051564cf2fc266fd14b95c29be656f", "format": 1 }, { @@ -554,10 +575,24 @@ "format": 1 }, { + "name": "plugins/module_utils/dnspython_records.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9ac13fa2d67854365a63648e79af5d1a3dec899add8c6feb377c513fdbeb1ab1", + "format": 1 + }, + { "name": "plugins/module_utils/http.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f6e60896ab9557f54b702025c41b7906b483eecf5191807cd69d3d9396e0192a", + "chksum_sha256": "5ea2697586e3d869be7ccb0c65d52869f385acae200f828d79ec3fd7aa8029ec", + "format": 1 + }, + { + "name": "plugins/module_utils/ips.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "971a40f6bbc1a97df51c6c4f79dab21be0efb95c0ce79627f65841752aabbdcd", "format": 1 }, { @@ -599,7 +634,7 @@ "name": "plugins/module_utils/resolver.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d2780e267283aee2fa56258926a9a7d89b63ee56838e7ea8c108f4067347a346", + "chksum_sha256": "2d0ceedf04f529e982d7865daa9c7d56b4ba49361e665a5e246fb4f3f4de569a", "format": 1 }, { @@ -627,7 +662,7 @@ "name": "plugins/module_utils/zone_record_helpers.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9b2b9aab72062fe177da968c554fe7a8155803848b40f98c3a0c4d1b40e3bc7a", + "chksum_sha256": "23ffb0889b6edb65129f732eda29f2c37ed2ffeeda7d28c0b7aa116076d20361", "format": 1 }, { @@ -641,98 +676,112 @@ "name": "plugins/modules/hosttech_dns_records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "542133e245b31b09c514d862ae33a41df558c3d36e3fff047fbb8a5b41465074", + "chksum_sha256": "fe2c760eaf5bccaed8abbefe6dd6952b428fd05c0cc48919dc579acc7ad57141", "format": 1 }, { "name": "plugins/modules/hetzner_dns_record.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1af221c28f0c4686cb2695434bb792f2f153c1d2454a9f8d427b1d5d8953c7f8", + "chksum_sha256": "235b7a73ce5f2a9e74098f8c4100fbe2ca828a13ec021872392e5f0442cc6e56", "format": 1 }, { "name": "plugins/modules/hetzner_dns_record_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "05ddf1bfd4c7afe5760b05f1bdc5693839fc302af7f76adb0e1be1e271561608", + "chksum_sha256": "4c18b6d859e1f97180dd4636faa1fba61b54b72e9b93d38888ac54b910988ba1", "format": 1 }, { "name": "plugins/modules/hetzner_dns_record_set.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c4c0a209ff43962f5030cb44ddd1e7deabfea3f82d848bd460d7307059027972", + "chksum_sha256": "35f71b7b8f680261f51b78d7c34cf4d89f490ba5937674614055cd6593e578d3", "format": 1 }, { "name": "plugins/modules/hetzner_dns_record_set_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1e24dd296cbbc1210759b5e60a9f754b8e78fb5b017333aba4b343ecf5c57cd1", + "chksum_sha256": "d16b0111d6afd73ebe845a3a500a63bd39996442e0a4f45ed1d6c6bd7de9d201", "format": 1 }, { "name": "plugins/modules/hetzner_dns_record_sets.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0801be20ea6bdc1b9af8ce0d04e57ae8b32b8f0bfe20656021b850a2a3a83907", + "chksum_sha256": "ed1dc6db050606eb7a36e857055aabe827b88f28e5dcca03c5faa45d1cde5ce4", "format": 1 }, { "name": "plugins/modules/hetzner_dns_zone_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "336ed14aae54e4a0e6604914b40ff8867a49eb84c33308b78c58aa4a1b0f53cd", + "chksum_sha256": "209b496fff14e93f73349d1dc20d18e99e725bde2b050ebed3207360ec4a1f3d", "format": 1 }, { "name": "plugins/modules/hosttech_dns_record.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1edf1a6d7e0ea5939606ae153a2b563834dc2de960a23a98a018dfcddbaef409", + "chksum_sha256": "a3d8f2e8e85e018a3487bdac1300204d798d05a3d3ed7f2d09a9a34328f0ede6", "format": 1 }, { "name": "plugins/modules/hosttech_dns_record_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "24a8c3b3a5197c1530f1c7f8f2f0dea1117bf5ca05f3027f36b1ef6b8b6b14f0", + "chksum_sha256": "9edad91069d7d4016822c269ccafcb4da3241345a2992c6066459a99c7099851", "format": 1 }, { "name": "plugins/modules/hosttech_dns_record_set.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "18230d597c1cd3d7d150f7cb07d417b2b68a12276813c88cf3456c80a63e6eaa", + "chksum_sha256": "20c17392e17dc9a9a4e79dc59a38d48e811eb6078729036e538cdf96e03f1183", "format": 1 }, { "name": "plugins/modules/hosttech_dns_record_set_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6751d18dfa5c640f35da77a20d2465338ece071ba8ac8b5303e9eda396737a04", + "chksum_sha256": "cabdcbcaa21e3ab61dc0342905d3cd3a255a807e30199b45600c27eef9b572e6", "format": 1 }, { "name": "plugins/modules/hosttech_dns_record_sets.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "542133e245b31b09c514d862ae33a41df558c3d36e3fff047fbb8a5b41465074", + "chksum_sha256": "fe2c760eaf5bccaed8abbefe6dd6952b428fd05c0cc48919dc579acc7ad57141", "format": 1 }, { "name": "plugins/modules/hosttech_dns_zone_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8f9c3a5fd7836a5fc5cdfd571db72a7998fcc62e05acddf8e607a046da022e0d", + "chksum_sha256": "cdeb61c41acdc861c80778c828bdf9d8cf8731671f7c82162aa67e5e1ceb85c1", + "format": 1 + }, + { + "name": "plugins/modules/nameserver_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ff4478b83dc13d0a0ce0fc21612cb1cfa1a387e1555912825ef0cb1cefa9efc8", + "format": 1 + }, + { + "name": "plugins/modules/nameserver_record_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7852ebc817c22900ff6d713e8d088a304d81f405645ed6c81cecb9004089bf4f", "format": 1 }, { "name": "plugins/modules/wait_for_txt.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "eca0b0120be5426a13aafb56265d82666b12068b75d21732e45625a1005dc8a8", + "chksum_sha256": "bec1dbe1203bb7c3297f09d0384bd13cdac68d68b2a12acc11598c3553f1b0cb", "format": 1 }, { @@ -753,7 +802,14 @@ "name": "plugins/plugin_utils/inventory/records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2de808c5923d8e4b84e41eeb43b91c5ad8e7bf4400b03f359afcd0c49237ff03", + "chksum_sha256": "c77b1d234e40d804759699724336db0683f6c9173f8e36c69b8b0e3d3a33a50c", + "format": 1 + }, + { + "name": "plugins/plugin_utils/ips.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "22851f00f437e72a6ed6eaa759088c5e56fa06a442fb7cd4feac13cf87566def", "format": 1 }, { @@ -764,6 +820,13 @@ "format": 1 }, { + "name": "plugins/plugin_utils/resolver.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "831ba70576c5668bb20489f28e0a1506c5d8914abb57d56a5c6dc07969bfde0d", + "format": 1 + }, + { "name": "plugins/plugin_utils/templated_options.py", "ftype": "file", "chksum_type": "sha256", @@ -774,7 +837,7 @@ "name": "plugins/public_suffix_list.dat", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c21461ca3f4ac0267bf3dc8d64c5c0b3dcdc27a43cae7e1cf2677ed951d26ecc", + "chksum_sha256": "9bf809262c4506519ef0c2d89681b77c8a87d2bcf5d17d7b0496840c1451cfd9", "format": 1 }, { @@ -844,7 +907,7 @@ "name": "tests/ee/roles/wait_for_txt/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "93362d607677767f4a6b1c9ed53b1d8888f7a2fb84e24647768f2ebf2008c76d", + "chksum_sha256": "78632512c81d43f6c1a65fadb752180ec7e432b39d0baafe51c31bc52eeb6f00", "format": 1 }, { @@ -981,6 +1044,104 @@ "format": 1 }, { + "name": "tests/integration/targets/lookup_lookup", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "34db5ec41377c4c79e1cf83b7f4ac88e29fd0b3c467ddf26104ee21eec89024e", + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cbe5933470cb27da2d1df8a8d3e8dc0b860df5b8e474c3413389f1ae841002ec", + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup_as_dict", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup_as_dict/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup_as_dict/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d4d40eff9ec56b5236626dafd6db61fb0ef2c54f15af48dcd0aedf584cabea0c", + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_lookup_as_dict/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cbe5933470cb27da2d1df8a8d3e8dc0b860df5b8e474c3413389f1ae841002ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nameserver_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nameserver_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nameserver_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cac88735a717b40fcc635462966e50790db466e2dae4456bef2e012a96b50eb9", + "format": 1 + }, + { + "name": "tests/integration/targets/nameserver_record_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nameserver_record_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nameserver_record_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bc4a4c41bf13fee592e97d01d01d235928fb2cc89dda219ae39c71fe3b3bffc5", + "format": 1 + }, + { "name": "tests/integration/targets/required_module_params", "ftype": "dir", "chksum_type": null, @@ -1026,42 +1187,56 @@ "name": "tests/integration/targets/wait_for_txt/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a08332f1fc96503af7257974f9b0cb006a259961b4a5ef3137f6766a4d310704", + "chksum_sha256": "e91a52fae8adc8b0aa8b108f09765135ea432639d8e97416ad26eddf8e5cde86", "format": 1 }, { "name": "tests/integration/targets/wait_for_txt/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "22aabe027192db7fa8fcbb72d5ae66aa903097169aba7e68a6a3fc5e7fc577d5", + "chksum_sha256": "cbe5933470cb27da2d1df8a8d3e8dc0b860df5b8e474c3413389f1ae841002ec", "format": 1 }, { - "name": "tests/integration/targets/wait_for_txt/runme.sh", + "name": "tests/integration/integration_config.yml.hetzner-template", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "af4e97f0430418d1e5ca825f0f42e739c645b62ffd32de00f6b6c033f2f50aa2", + "chksum_sha256": "16daaa2db3d94f40abd5d91871dee781b04c139f3692ed7057ea768ea0458fe2", "format": 1 }, { - "name": "tests/integration/targets/wait_for_txt/runme.yml", + "name": "tests/integration/integration_config.yml.hosttech-template", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f1153fc402d8c568c711113c99130006d3fedc0f8b81cb6f80eb25eb1578c239", + "chksum_sha256": "62bb2d772cba011fc9151a14393d616fcd55554b400bb8dc0ef56f9cdc7c19ea", "format": 1 }, { - "name": "tests/integration/integration_config.yml.hetzner-template", + "name": "tests/integration/replace-requirements.sh", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "16daaa2db3d94f40abd5d91871dee781b04c139f3692ed7057ea768ea0458fe2", + "chksum_sha256": "9ef269363fb4921693e63d5bca4f113028c7a98d954b3d25e752d7f96cea2bdb", "format": 1 }, { - "name": "tests/integration/integration_config.yml.hosttech-template", + "name": "tests/integration/requirements-stable-2.10.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "62bb2d772cba011fc9151a14393d616fcd55554b400bb8dc0ef56f9cdc7c19ea", + "chksum_sha256": "2c089ca496e1059909afc4d13958f4744bfb953ee039ea1e39a98c3f8309c5fa", + "format": 1 + }, + { + "name": "tests/integration/requirements-stable-2.9.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2c089ca496e1059909afc4d13958f4744bfb953ee039ea1e39a98c3f8309c5fa", + "format": 1 + }, + { + "name": "tests/integration/requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3a63580de11a7ce96ccf62858dba53e99cb433bcf1238ca526dac32e089202dc", "format": 1 }, { @@ -1103,7 +1278,7 @@ "name": "tests/sanity/extra/extra-docs.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0fbd87476e9c35e4c5feb31be4aa1e8fc6aebf0de13058e5a267879f741ec0bf", + "chksum_sha256": "c52e316daf1292bbb063be19429fd1f06e02bce3c9d4622a8dfc61fa3af06688", "format": 1 }, { @@ -1180,7 +1355,7 @@ "name": "tests/sanity/ignore-2.10.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786", + "chksum_sha256": "b2d0fb7a1b0d0126f05818085d52eb73d78a9f6e4f3805971496df81150e80ca", "format": 1 }, { @@ -1194,7 +1369,7 @@ "name": "tests/sanity/ignore-2.11.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786", + "chksum_sha256": "a4d81352bb04ea35d84a43ea0150df5a717fd8f9591bab74ab5d25e360a7e456", "format": 1 }, { @@ -1208,7 +1383,7 @@ "name": "tests/sanity/ignore-2.12.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786", + "chksum_sha256": "a4d81352bb04ea35d84a43ea0150df5a717fd8f9591bab74ab5d25e360a7e456", "format": 1 }, { @@ -1222,7 +1397,7 @@ "name": "tests/sanity/ignore-2.13.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786", + "chksum_sha256": "a4d81352bb04ea35d84a43ea0150df5a717fd8f9591bab74ab5d25e360a7e456", "format": 1 }, { @@ -1236,7 +1411,7 @@ "name": "tests/sanity/ignore-2.14.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786", + "chksum_sha256": "a4d81352bb04ea35d84a43ea0150df5a717fd8f9591bab74ab5d25e360a7e456", "format": 1 }, { @@ -1275,13 +1450,27 @@ "format": 1 }, { - "name": "tests/sanity/ignore-2.9.txt", + "name": "tests/sanity/ignore-2.17.txt", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786", "format": 1 }, { + "name": "tests/sanity/ignore-2.17.txt.license", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.9.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b2d0fb7a1b0d0126f05818085d52eb73d78a9f6e4f3805971496df81150e80ca", + "format": 1 + }, + { "name": "tests/sanity/ignore-2.9.txt.license", "ftype": "file", "chksum_type": "sha256", @@ -1313,14 +1502,35 @@ "name": "tests/unit/plugins/inventory/test_hetzner_dns_records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "75a38f930f1989126cfd8c06d1389e4fd5c648486dc4359147b8bf9d9d553e1f", + "chksum_sha256": "b0a2245e3bc7a899c5ba90f7ea85471fa5f3c26aa612ac859e3cf0ede691ea44", "format": 1 }, { "name": "tests/unit/plugins/inventory/test_hosttech_dns_records.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "eb49251839b33f89c0d18f218c1862ad42a33c1b8665f6dd741ffeb5d05fbdda", + "chksum_sha256": "c8c44d2037060fbfbaab8d05fc3af1d78513af2a5d91d872199aa75768a82b93", + "format": 1 + }, + { + "name": "tests/unit/plugins/lookup", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/plugins/lookup/test_lookup.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a888fcf181730c2aae23357e0a073cbf1996a2172b13ea8c96e0ab17623937af", + "format": 1 + }, + { + "name": "tests/unit/plugins/lookup/test_lookup_as_dict.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "283ff7237b352e16cc23b413fd05b39bcb474c047f1662507f7c078a56d0814e", "format": 1 }, { @@ -1348,7 +1558,7 @@ "name": "tests/unit/plugins/module_utils/conversion/test_txt.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d0334105e803f8b137097c4cbaef351f12484f7a578f35f0d186a6f63e98c23d", + "chksum_sha256": "a3623f51a80dd57864dc7f318d50ef231bd864e11aa1b2a03a3b5efa848df739", "format": 1 }, { @@ -1411,7 +1621,7 @@ "name": "tests/unit/plugins/module_utils/resolver_helper.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e9527f31a6eda7f9b1e2fca62e9325a9c9b964343a5704c1f94e304cec4c2b3b", + "chksum_sha256": "1732b34b946b6911c9cc9690330f589691a71eccc1344d1973f31d3814327bf8", "format": 1 }, { @@ -1422,6 +1632,20 @@ "format": 1 }, { + "name": "tests/unit/plugins/module_utils/test_dnspython_records.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4fac8d9cfac7288257f5dc344e546cc51fba21ac83ad4e3cd658491dced79b3d", + "format": 1 + }, + { + "name": "tests/unit/plugins/module_utils/test_ips.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ff7a4c1b5002faf507cebb5757e92dce739dfab607955716d3d717703972d4e", + "format": 1 + }, + { "name": "tests/unit/plugins/module_utils/test_json_api_helper.py", "ftype": "file", "chksum_type": "sha256", @@ -1453,7 +1677,7 @@ "name": "tests/unit/plugins/module_utils/test_resolver.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dd95bd83c9cab2adc7698ed7a6968298ff3334cdbbae8db56b85777801753ada", + "chksum_sha256": "f79b5af9da07abe1ce92836406dfbbc31359c8580e2b6fab1557675e8ef45d4b", "format": 1 }, { @@ -1576,10 +1800,24 @@ "format": 1 }, { + "name": "tests/unit/plugins/modules/test_nameserver_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "630ee0b0abefcb61b8e1f2399d2db0e988ff24e4339a5aaae953a14cccd44e12", + "format": 1 + }, + { + "name": "tests/unit/plugins/modules/test_nameserver_record_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "448d339b5969e83a9897f6192f6ac4b898403419c70b2055dfac97f2b422c050", + "format": 1 + }, + { "name": "tests/unit/plugins/modules/test_wait_for_txt.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "822afe1474b99d4865a523118ae616d36e9793eb6693add50034986d05b8aeaa", + "chksum_sha256": "8def3b82a62a61d0d28ee33bc589364336da840bb024ada98b070e5024f7ee21", "format": 1 }, { @@ -1590,6 +1828,13 @@ "format": 1 }, { + "name": "tests/unit/plugins/plugin_utils/test_ips.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f92989d10aa1264b11862d9b7c88eff833d5306f35edac9acac2f2d9f8d2388d", + "format": 1 + }, + { "name": "tests/unit/plugins/plugin_utils/test_public_suffix.py", "ftype": "file", "chksum_type": "sha256", @@ -1597,10 +1842,38 @@ "format": 1 }, { + "name": "tests/unit/plugins/plugin_utils/test_resolver.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3fd725a172beea7cb73ed85bafc6c6745d7e8aaf08d74b1e9e7c534a05c7ddab", + "format": 1 + }, + { + "name": "tests/unit/replace-requirements.sh", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9ef269363fb4921693e63d5bca4f113028c7a98d954b3d25e752d7f96cea2bdb", + "format": 1 + }, + { + "name": "tests/unit/requirements-stable-2.10.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1404c050017797dba43f1a8963794f33afaf0e5667abc792c062adf8ac84c254", + "format": 1 + }, + { + "name": "tests/unit/requirements-stable-2.9.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1404c050017797dba43f1a8963794f33afaf0e5667abc792c062adf8ac84c254", + "format": 1 + }, + { "name": "tests/unit/requirements.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3d0ac34bebc9bdedbd7bd3bcd3342985b276839ae82cc75442c297609b01cf25", + "chksum_sha256": "b4f4056523e6ab794378043243f6ca8a5681a46c73e1a4cbcb197ae7056333ee", "format": 1 }, { @@ -1618,10 +1891,24 @@ "format": 1 }, { + "name": "CHANGELOG.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ab12a2e489b31f469f321b053a4cb432216fe20e8374cd0ffb4ecf68bc8c7348", + "format": 1 + }, + { + "name": "CHANGELOG.md.license", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1", + "format": 1 + }, + { "name": "CHANGELOG.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c3789f0c3f34ccaee424dff34293d3172ac44dcfd15393861c9c8e805e2d33a4", + "chksum_sha256": "a2deefeaf4feaee535b1f34f517495188be0c31c22c1e5a33e470f86245dc92f", "format": 1 }, { @@ -1649,7 +1936,7 @@ "name": "README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6986b272ce1b0a3e2842a19405c8f44b0df445ec1c563e076260d7bc5622080d", + "chksum_sha256": "9083e4932c4b72abbc6c7382b3c964df7826b1a12a49f4d2e34cc36155380fd7", "format": 1 }, { @@ -1670,7 +1957,7 @@ "name": "update-docs-fragments.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e92bad2be3a0fd524207e52e587cebed402ec87dd723ca7e33f48725121ea18f", + "chksum_sha256": "ee7f8429976728a0bc777fab9b822b57d1138ccf142aebac3367cffed485f86a", "format": 1 }, { diff --git a/ansible_collections/community/dns/MANIFEST.json b/ansible_collections/community/dns/MANIFEST.json index 133510541..fcbfda5d6 100644 --- a/ansible_collections/community/dns/MANIFEST.json +++ b/ansible_collections/community/dns/MANIFEST.json @@ -2,7 +2,7 @@ "collection_info": { "namespace": "community", "name": "dns", - "version": "2.5.5", + "version": "2.8.3", "authors": [ "Felix Fontein (github.com/felixfontein)", "Markus Bergholz (github.com/markuman)" @@ -30,7 +30,7 @@ "name": "FILES.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fa3df6e39a948ef0e253b1076133edf0f43b1119e56063a3e2a35ed2f8c5344e", + "chksum_sha256": "8234c71782176e94860f305e6a9e4365b2167e2bd47e59e9c580a1011fc96b39", "format": 1 }, "format": 1 diff --git a/ansible_collections/community/dns/README.md b/ansible_collections/community/dns/README.md index 5796339b4..8a404fa3a 100644 --- a/ansible_collections/community/dns/README.md +++ b/ansible_collections/community/dns/README.md @@ -16,7 +16,7 @@ Please note that this collection does **not** support Windows targets. ## Tested with Ansible -Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, and ansible-core 2.14 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported. +Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core 2.16 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported. ## External requirements @@ -47,10 +47,15 @@ If you use the Ansible package and do not update collections independently, use - `hosttech_dns_record_set`: create/update/delete DNS record sets with HostTech DNS. - `hosttech_dns_record_set`: bulk synchronize DNS record sets in Hosttech DNS service. - `hosttech_dns_zone_info`: retrieve zone information from HostTech DNS. + - `nameserver_info`: Look up nameservers for a DNS name. + - `nameserver_record_info`: Look up all records of a type from all nameservers for a DNS name. - `wait_for_txt`: wait for TXT records to propagate to all name servers. +- Lookup plugins: + - `lookup`: look up DNS records and return them as a list of strings. + - `lookup_as_dict`: look up DNS records and return them as a list of dictionaries. - Inventory plugins: - - `hetzner_dns_records`: create inventory from Hetzner DNS records - - `hosttech_dns_records`: create inventory from HostTech DNS records + - `hetzner_dns_records`: create inventory from Hetzner DNS records. + - `hosttech_dns_records`: create inventory from HostTech DNS records. - Filters: - `get_public_suffix`: given a domain name, returns the public suffix. For example, `"www.ansible.com" | community.dns.get_public_suffix == ".com"` and `"some.random.prefixes.ansible.co.uk" | community.dns.get_public_suffix == ".co.uk"`. - `get_registrable_domain`: given a domain name, returns the *registrable domain name* (also called *registered domain name*). For example, `"www.ansible.com" | community.dns.get_registrable_domain == "ansible.com"` and `"some.random.prefixes.ansible.co.uk" | community.dns.get_registrable_domain == "ansible.co.uk"`. @@ -82,7 +87,7 @@ You can find more information in the [developer guide for collections](https://d ## Release notes -See the [changelog](https://github.com/ansible-collections/community.dns/tree/main/CHANGELOG.rst). +See the [changelog](https://github.com/ansible-collections/community.dns/tree/main/CHANGELOG.md). ## Releasing, Versioning and Deprecation diff --git a/ansible_collections/community/dns/changelogs/changelog.yaml b/ansible_collections/community/dns/changelogs/changelog.yaml index b287c50db..626ad4abf 100644 --- a/ansible_collections/community/dns/changelogs/changelog.yaml +++ b/ansible_collections/community/dns/changelogs/changelog.yaml @@ -35,7 +35,7 @@ releases: changes: breaking_changes: - hosttech_* module_utils - completely rewrite and refactor to support new JSON - API and allow to re-use provider-independent module logic (https://github.com/ansible-collections/community.dns/pull/4). + API and allow to reuse provider-independent module logic (https://github.com/ansible-collections/community.dns/pull/4). bugfixes: - Update Public Suffix List. - hosttech_record - fix diff mode for ``state=absent`` (https://github.com/ansible-collections/community.dns/pull/4). @@ -617,3 +617,195 @@ releases: - 2.5.5.yml - update-psl.yml release_date: '2023-06-19' + 2.5.6: + changes: + known_issues: + - Ansible markup will show up in raw form on ansible-doc text output for ansible-core + before 2.15. If you have trouble deciphering the documentation markup, please + upgrade to ansible-core 2.15 (or newer), or read the HTML documentation on + https://docs.ansible.com/ansible/devel/collections/community/dns/. + release_summary: 'Maintenance release. + + + From this version on, community.dns is using the new `Ansible semantic markup + + <https://docs.ansible.com/ansible/devel/dev_guide/developing_modules_documenting.html#semantic-markup-within-module-documentation>`__ + + in its documentation. If you look at documentation with the ansible-doc CLI + tool + + from ansible-core before 2.15, please note that it does not render the markup + + correctly. You should be still able to read it in most cases, but you need + + ansible-core 2.15 or later to see it as it is intended. Alternatively you + can + + look at `the devel docsite <https://docs.ansible.com/ansible/devel/collections/community/dns/>`__ + + for the rendered HTML version of the documentation of the latest release. + + ' + fragments: + - 2.5.6.yml + release_date: '2023-06-22' + 2.5.7: + changes: + bugfixes: + - Update Public Suffix List. + release_summary: Regular maintenance release with updated Public Suffix List. + fragments: + - 2.5.7.yml + - update-psl.yml + release_date: '2023-07-17' + 2.6.0: + changes: + bugfixes: + - Update Public Suffix List. + - wait_for_txt, resolver module utils - improve error handling (https://github.com/ansible-collections/community.dns/pull/158). + minor_changes: + - wait_for_txt - add ``servfail_retries`` parameter that allows retrying after + SERVFAIL errors (https://github.com/ansible-collections/community.dns/pull/159). + - wait_for_txt, resolver module utils - use `EDNS <https://en.wikipedia.org/wiki/Extension_Mechanisms_for_DNS>`__ + (https://github.com/ansible-collections/community.dns/pull/158). + release_summary: Feature release with an updated Public Suffix List. + fragments: + - 158-resolver.yml + - 159-servfail.yml + - 2.6.0.yml + - update-psl.yml + modules: + - description: Look up nameservers for a DNS name + name: nameserver_info + namespace: '' + - description: Look up all records of a type from all nameservers for a DNS name + name: nameserver_record_info + namespace: '' + plugins: + lookup: + - description: Look up DNS records + name: lookup + namespace: null + - description: Look up DNS records as dictionaries + name: lookup_as_dict + namespace: null + release_date: '2023-08-15' + 2.6.1: + changes: + bugfixes: + - Update Public Suffix List. + release_summary: Maintenance release with updated PSL. + fragments: + - 2.6.1.yml + - update-psl.yml + release_date: '2023-09-12' + 2.6.2: + changes: + bugfixes: + - Update Public Suffix List. + release_summary: Maintenance release with updated PSL. + fragments: + - 2.6.2.yml + - update-psl.yml + release_date: '2023-10-08' + 2.6.3: + changes: + bugfixes: + - HTTP module utils - make compatible with ansible-core 2.17 (https://github.com/ansible-collections/community.dns/pull/165). + - Update Public Suffix List. + release_summary: Maintenance release with updated PSL. + fragments: + - 165-url.yml + - 2.6.3.yml + - update-psl.yml + release_date: '2023-11-06' + 2.6.4: + changes: + bugfixes: + - Update Public Suffix List. + - nameserver_record_info - fix crash when more than one record is retrieved + (https://github.com/ansible-collections/community.dns/pull/172). + release_summary: Bugfix and maintenance version. + fragments: + - 172-nameserver_record_info.yml + - 2.6.4.yml + - update-psl.yml + release_date: '2023-12-03' + 2.7.0: + changes: + bugfixes: + - Update Public Suffix List. + - wait_for_txt, nameserver_info, nameserver_record_info - when looking up nameservers + for a domain, do not treat ``NXDOMAIN`` as a fatal error (https://github.com/ansible-collections/community.dns/pull/177). + minor_changes: + - nameserver_info and nameserver_record_info - add ``server`` parameter to specify + custom DNS servers (https://github.com/ansible-collections/community.dns/pull/168, + https://github.com/ansible-collections/community.dns/pull/178). + - wait_for_txt - add ``server`` parameter to specify custom DNS servers (https://github.com/ansible-collections/community.dns/pull/178). + release_summary: Bugfix and feature release with updated PSL. + fragments: + - 168-custom-dns-server.yml + - 177-ns-lookup-nxdomain.yml + - 178-wait_for_txt-server.yml + - 2.7.0.yml + - update-psl.yml + release_date: '2024-01-01' + 2.8.0: + changes: + bugfixes: + - Update Public Suffix List. + deprecated_features: + - hetzner_dns_records and hosttech_dns_records inventory plugins - the ``filters`` + option has been renamed to ``simple_filters``. The old name will stop working + in community.hrobot 2.0.0 (https://github.com/ansible-collections/community.dns/pull/181). + minor_changes: + - hetzner_dns_records and hosttech_dns_records inventory plugins - the ``filters`` + option has been renamed to ``simple_filters``. The old name still works until + community.hrobot 2.0.0. Then it will change to allow more complex filtering + with the ``community.library_inventory_filtering_v1`` collection's functionality + (https://github.com/ansible-collections/community.dns/pull/181). + release_summary: Feature and maintenance release with updated PSL. + fragments: + - 181-inventory-filters.yml + - 2.8.0.yml + - update-psl.yml + release_date: '2024-01-29' + 2.8.1: + changes: + bugfixes: + - Update Public Suffix List. + release_summary: Maintenance release with updated PSL. + fragments: + - 2.8.1.yml + - update-psl.yml + release_date: '2024-02-25' + 2.8.2: + changes: + bugfixes: + - Update Public Suffix List. + release_summary: Bugfix release. + security_fixes: + - hosttech_dns_records and hetzner_dns_records inventory plugins - make sure + all data received from the remote servers is marked as unsafe, so remote code + execution by obtaining texts that can be evaluated as templates is not possible + (https://www.die-welt.net/2024/03/remote-code-execution-in-ansible-dynamic-inventory-plugins/, + https://github.com/ansible-collections/community.dns/pull/189). + fragments: + - 2.8.2.yml + - inventory-rce.yml + - update-psl.yml + release_date: '2024-03-16' + 2.8.3: + changes: + bugfixes: + - DNS record modules, inventory plugins - fix the TXT entry encoder to avoid + splitting up escape sequences for quotes and backslashes over multiple TXT + strings (https://github.com/ansible-collections/community.dns/issues/190, + https://github.com/ansible-collections/community.dns/pull/191). + - Update Public Suffix List. + release_summary: Bugfix release. + fragments: + - 191-txt-quoting.yml + - 2.8.3.yml + - update-psl.yml + release_date: '2024-03-24' diff --git a/ansible_collections/community/dns/changelogs/config.yaml b/ansible_collections/community/dns/changelogs/config.yaml index 5f5075391..06dc33cc8 100644 --- a/ansible_collections/community/dns/changelogs/config.yaml +++ b/ansible_collections/community/dns/changelogs/config.yaml @@ -11,6 +11,9 @@ keep_fragments: false mention_ancestor: true new_plugins_after_name: removed_features notesdir: fragments +output_formats: +- rst +- md prelude_section_name: release_summary prelude_section_title: Release Summary sections: diff --git a/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst b/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst index a2169369c..aee397f8a 100644 --- a/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst +++ b/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst @@ -14,10 +14,10 @@ Community.Dns Filter Guide The :ref:`community.dns collection <plugins_in_community.dns>` offers several filters for working with DNS names: -- :ref:`community.dns.get_public_suffix <ansible_collections.community.dns.get_public_suffix_filter>`: given a domain name, returns the public suffix; -- :ref:`community.dns.get_registrable_domain <ansible_collections.community.dns.get_registrable_domain_filter>`: given a domain name, returns the registrable domain name; -- :ref:`community.dns.remove_public_suffix <ansible_collections.community.dns.remove_public_suffix_filter>`: given a domain name, returns the part before the public suffix; -- :ref:`community.dns.remove_registrable_domain <ansible_collections.community.dns.remove_registrable_domain_filter>`: given a domain name, returns the part before the registrable domain name. +- :ansplugin:`community.dns.get_public_suffix#filter`: given a domain name, returns the public suffix; +- :ansplugin:`community.dns.get_registrable_domain#filter`: given a domain name, returns the registrable domain name; +- :ansplugin:`community.dns.remove_public_suffix#filter`: given a domain name, returns the part before the public suffix; +- :ansplugin:`community.dns.remove_registrable_domain#filter`: given a domain name, returns the part before the registrable domain name. These filters allow to work with `public suffixes <https://en.wikipedia.org/wiki/Public_Suffix_List>`_; a *public suffix* is a DNS suffix under which users can (or could) directly register names. They use the `Public Suffix List <https://publicsuffix.org/>`_, a Mozilla initiative maintained as a community resource which tries to list all such public suffixes. Common examples for public suffixes are ``.com``, ``.net``, but also longer suffixes such as ``.co.uk`` or ``.github.io``. @@ -26,7 +26,7 @@ The label directly before the public suffix together with the suffix is called t Working with public suffixes ---------------------------- -The :ref:`community.dns.get_public_suffix <ansible_collections.community.dns.get_public_suffix_filter>` and :ref:`community.dns.remove_public_suffix <ansible_collections.community.dns.remove_public_suffix_filter>` filters allow to extract and remove public suffixes from DNS names: +The :ansplugin:`community.dns.get_public_suffix#filter` and :ansplugin:`community.dns.remove_public_suffix#filter` filters allow to extract and remove public suffixes from DNS names: .. code-block:: yaml+jinja @@ -45,28 +45,28 @@ The filters also allow additional options (keyword arguments): :keep_unknown_suffix: - A boolean with default value ``true``. This treats unknown TLDs as valid public suffixes. So for example the public suffix of ``example.tlddoesnotexist`` is ``.tlddoesnotexist`` if this is ``true``. If set to ``false``, it will return an empty string in this case. This option corresponds to whether the global wildcard rule ``*`` in the Public Suffix List is used or not. + A boolean with default value :ansval:`true`. This treats unknown TLDs as valid public suffixes. So for example the public suffix of :ansval:`example.tlddoesnotexist` is ``.tlddoesnotexist`` if this is :ansval:`true`. If set to :ansval:`false`, it will return an empty string in this case. This option corresponds to whether the global wildcard rule ``*`` in the Public Suffix List is used or not. :icann_only: - A boolean with default value ``false``. This controls whether only entries from the ICANN section of the Public Suffix List are used, or also entries from the Private section. For example, ``.co.uk`` is in the ICANN section, but ``github.io`` is in the Private section. + A boolean with default value :ansval:`false`. This controls whether only entries from the ICANN section of the Public Suffix List are used, or also entries from the Private section. For example, ``.co.uk`` is in the ICANN section, but ``github.io`` is in the Private section. :normalize_result: - (Only for :ref:`community.dns.get_public_suffix <ansible_collections.community.dns.get_public_suffix_filter>`) A boolean with default value ``false``. This controls whether the result is reconstructed from the normalized name used during lookup. During normalization, ulabels are converted to alabels, and every label is converted to lowercase. For example, the ulabel ``ëçãmplê`` is converted to ``xn--mpl-llatwb`` (puny-code), and ``Example.COM`` is converted to ``example.com``. + (Only for :ansplugin:`community.dns.get_public_suffix#filter`) A boolean with default value :ansval:`false`. This controls whether the result is reconstructed from the normalized name used during lookup. During normalization, ulabels are converted to alabels, and every label is converted to lowercase. For example, the ulabel :ansval:`ëçãmplê` is converted to ``xn--mpl-llatwb`` (puny-code), and :ansval:`Example.COM` is converted to ``example.com``. :keep_leading_period: - (Only for :ref:`community.dns.get_public_suffix <ansible_collections.community.dns.get_public_suffix_filter>`) A boolean with default value ``true``. This controls whether the leading period of a public suffix is preserved or not. + (Only for :ansplugin:`community.dns.get_public_suffix#filter`) A boolean with default value :ansval:`true`. This controls whether the leading period of a public suffix is preserved or not. :keep_trailing_period: - (Only for :ref:`community.dns.remove_public_suffix <ansible_collections.community.dns.remove_public_suffix_filter>`) A boolean with default value ``false``. This controls whether the trailing period of the prefix (that is, the part before the public suffix) is preserved or not. + (Only for :ansplugin:`community.dns.remove_public_suffix#filter`) A boolean with default value :ansval:`false`. This controls whether the trailing period of the prefix (that is, the part before the public suffix) is preserved or not. Working with registrable domain names ------------------------------------- -The :ref:`community.dns.get_registrable_domain <ansible_collections.community.dns.get_registrable_domain_filter>` and :ref:`community.dns.remove_registrable_domain <ansible_collections.community.dns.remove_registrable_domain_filter>` filters allow to extract and remove registrable domain names from DNS names: +The :ansplugin:`community.dns.get_registrable_domain#filter` and :ansplugin:`community.dns.remove_registrable_domain#filter` filters allow to extract and remove registrable domain names from DNS names: .. code-block:: yaml+jinja @@ -85,20 +85,20 @@ The filters also allow additional options (keyword arguments): :keep_unknown_suffix: - A boolean with default value ``true``. This treats unknown TLDs as valid public suffixes. So for example the public suffix of ``example.tlddoesnotexist`` is ``.tlddoesnotexist`` if this is ``true``, and hence the registrable domain of ``www.example.tlddoesnotexist`` is ``example.tlddoesnotexist``. If set to ``false``, the registrable domain of ``www.example.tlddoesnotexist`` is ``tlddoesnotexist``. This option corresponds to whether the global wildcard rule ``*`` in the Public Suffix List is used or not. + A boolean with default value :ansval:`true`. This treats unknown TLDs as valid public suffixes. So for example the public suffix of :ansval:`example.tlddoesnotexist` is ``.tlddoesnotexist`` if this is :ansval:`true`, and hence the registrable domain of :ansval:`www.example.tlddoesnotexist` is ``example.tlddoesnotexist``. If set to :ansval:`false`, the registrable domain of :ansval:`www.example.tlddoesnotexist` is ``tlddoesnotexist``. This option corresponds to whether the global wildcard rule ``*`` in the Public Suffix List is used or not. :icann_only: - A boolean with default value ``false``. This controls whether only entries from the ICANN section of the Public Suffix List are used, or also entries from the Private section. For example, ``.co.uk`` is in the ICANN section, but ``github.io`` is in the Private section. + A boolean with default value :ansval:`false`. This controls whether only entries from the ICANN section of the Public Suffix List are used, or also entries from the Private section. For example, ``.co.uk`` is in the ICANN section, but ``github.io`` is in the Private section. :only_if_registerable: - A boolean with default value ``true``. This controls the behavior in case there is no label in front of the public suffix. This is the case if the DNS name itself is a public suffix. If set to ``false``, in this case the public suffix is treated as a registrable domain. If set to ``true`` (default), the registrable domain of a public suffix is interpreted as an empty string. + A boolean with default value :ansval:`true`. This controls the behavior in case there is no label in front of the public suffix. This is the case if the DNS name itself is a public suffix. If set to :ansval:`false`, in this case the public suffix is treated as a registrable domain. If set to :ansval:`true` (default), the registrable domain of a public suffix is interpreted as an empty string. :normalize_result: - (Only for :ref:`community.dns.get_registrable_domain <ansible_collections.community.dns.get_registrable_domain_filter>`) A boolean with default value ``false``. This controls whether the result is reconstructed from the normalized name used during lookup. During normalization, ulabels are converted to alabels, and every label is converted to lowercase. For example, the ulabel ``ëçãmplê`` is converted to ``xn--mpl-llatwb`` (puny-code), and ``Example.COM`` is converted to ``example.com``. + (Only for :ansplugin:`community.dns.get_registrable_domain#filter`) A boolean with default value :ansval:`false`. This controls whether the result is reconstructed from the normalized name used during lookup. During normalization, ulabels are converted to alabels, and every label is converted to lowercase. For example, the ulabel :ansval:`ëçãmplê` is converted to ``xn--mpl-llatwb`` (puny-code), and :ansval:`Example.COM` is converted to ``example.com``. :keep_trailing_period: - (Only for :ref:`community.dns.remove_registrable_domain <ansible_collections.community.dns.remove_registrable_domain_filter>`) A boolean with default value ``false``. This controls whether the trailing period of the prefix (that is, the part before the registrable domain) is preserved or not. + (Only for :ansplugin:`community.dns.remove_registrable_domain#filter`) A boolean with default value :ansval:`false`. This controls whether the trailing period of the prefix (that is, the part before the registrable domain) is preserved or not. diff --git a/ansible_collections/community/dns/docs/docsite/rst/hetzner_guide.rst b/ansible_collections/community/dns/docs/docsite/rst/hetzner_guide.rst index cbb029dcf..8c0e34e26 100644 --- a/ansible_collections/community/dns/docs/docsite/rst/hetzner_guide.rst +++ b/ansible_collections/community/dns/docs/docsite/rst/hetzner_guide.rst @@ -17,23 +17,23 @@ The modules use the `JSON REST based API <https://dns.hetzner.com/api-docs/>`_. The collection provides six modules for working with Hetzner DNS: -- :ref:`community.dns.hetzner_dns_record <ansible_collections.community.dns.hetzner_dns_record_module>`: create/update/delete single DNS records -- :ref:`community.dns.hetzner_dns_record_info <ansible_collections.community.dns.hetzner_dns_record_info_module>`: retrieve information on DNS records -- :ref:`community.dns.hetzner_dns_record_set <ansible_collections.community.dns.hetzner_dns_record_set_module>`: create/update/delete DNS record sets -- :ref:`community.dns.hetzner_dns_record_set_info <ansible_collections.community.dns.hetzner_dns_record_set_info_module>`: retrieve information on DNS record sets -- :ref:`community.dns.hetzner_dns_record_sets <ansible_collections.community.dns.hetzner_dns_record_sets_module>`: bulk synchronize DNS record sets -- :ref:`community.dns.hetzner_dns_zone_info <ansible_collections.community.dns.hetzner_dns_zone_info_module>`: retrieve zone information +- :ansplugin:`community.dns.hetzner_dns_record#module`: create/update/delete single DNS records +- :ansplugin:`community.dns.hetzner_dns_record_info#module`: retrieve information on DNS records +- :ansplugin:`community.dns.hetzner_dns_record_set#module`: create/update/delete DNS record sets +- :ansplugin:`community.dns.hetzner_dns_record_set_info#module`: retrieve information on DNS record sets +- :ansplugin:`community.dns.hetzner_dns_record_sets#module`: bulk synchronize DNS record sets +- :ansplugin:`community.dns.hetzner_dns_zone_info#module`: retrieve zone information -If you are interested in migrating from the `markuman.hetzner_dns collection <https://galaxy.ansible.com/markuman/hetzner_dns>`_, please see :ref:`ansible_collections.community.dns.docsite.hetzner_guide.migration_markuman_hetzner_dns`. +If you are interested in migrating from the `markuman.hetzner_dns collection <https://galaxy.ansible.com/ui/repo/published/markuman/hetzner_dns/>`_, please see :ref:`ansible_collections.community.dns.docsite.hetzner_guide.migration_markuman_hetzner_dns`. It also provides an inventory plugin: -- :ref:`community.dns.hetzner_dns_records <ansible_collections.community.dns.hetzner_dns_records_inventory>`: create inventory from DNS records +- :ansplugin:`community.dns.hetzner_dns_records#inventory`: create inventory from DNS records Authentication -------------- -To use Hetzner's API, you need to create an API token. You can manage API tokens in the "API tokens" menu entry in your user menu in the `DNS Console <https://dns.hetzner.com/>`_. You must provide the token to the ``hetzner_token`` option of the modules, its alias ``api_token``, or pass it on in the ``HETZNER_DNS_TOKEN`` environment variable: +To use Hetzner's API, you need to create an API token. You can manage API tokens in the "API tokens" menu entry in your user menu in the `DNS Console <https://dns.hetzner.com/>`_. You must provide the token to the :ansopt:`hetzner_token` option of the modules, its alias :ansopt:`api_token`, or pass it on in the :envvar:`HETZNER_DNS_TOKEN` environment variable: .. code-block:: yaml+jinja @@ -77,7 +77,7 @@ Here all two tasks will use the options set for the module defaults group. Working with DNS zones ---------------------- -The :ref:`community.dns.hetzner_dns_zone_info module <ansible_collections.community.dns.hetzner_dns_zone_info_module>` allows to query information on a zone. The zone can be identified both by its name and by its ID (which is an integer): +The :ansplugin:`community.dns.hetzner_dns_zone_info module <community.dns.hetzner_dns_zone_info#module>` allows to query information on a zone. The zone can be identified both by its name and by its ID (which is an integer): .. code-block:: yaml+jinja @@ -105,12 +105,12 @@ Working with DNS records .. note:: - By default, TXT record values returned and accepted by the modules and plugins in this collection are unquoted. This means that you do not have to add double quotes (``"``), and escape double quotes (as ``\"``) and backslashes (as ``\\``). All modules and plugins which work with DNS records support the ``txt_transformation`` option which allows to configure this behavior. + By default, TXT record values returned and accepted by the modules and plugins in this collection are unquoted. This means that you do not have to add double quotes (``"``), and escape double quotes (as ``\"``) and backslashes (as ``\\``). All modules and plugins which work with DNS records support the :ansopt:`community.dns.hetzner_dns_record_set#module:txt_transformation` option which allows to configure this behavior. Querying DNS records and record sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`community.dns.hetzner_dns_record_set_info module <ansible_collections.community.dns.hetzner_dns_record_set_info_module>` allows to query DNS record sets from the API. It can be used to query a single record set: +The :ansplugin:`community.dns.hetzner_dns_record_set_info module <community.dns.hetzner_dns_record_set_info#module>` allows to query DNS record sets from the API. It can be used to query a single record set: .. code-block:: yaml+jinja @@ -137,7 +137,7 @@ The :ref:`community.dns.hetzner_dns_record_set_info module <ansible_collections. msg: There is no A record for www.example.com when: not result.set -In all examples in this section, you can replace ``zone_name=example.com`` by ``zone_id=aBcDeFgHiJlMnOpQrStUvW`` with the zone's ID string. +In all examples in this section, you can replace :ansopt:`community.dns.hetzner_dns_record_set_info#module:zone_name=example.com` by :ansopt:`community.dns.hetzner_dns_record_set_info#module:zone_id=aBcDeFgHiJlMnOpQrStUvW` with the zone's ID string. You can also query a list of all record sets for a record name or prefix: @@ -177,14 +177,14 @@ Finally you can query all record sets for a zone: TTL {{ item.ttl }} has values {{ item.value | join(', ') }} loop: result.sets -If you are interested in individual DNS records, and not record sets, you should use the :ref:`community.dns.hetzner_dns_record_info module <ansible_collections.community.dns.hetzner_dns_record_info_module>`. It supports the same limiting options as the ``community.dns.hetzner_dns_record_set_info`` module. +If you are interested in individual DNS records, and not record sets, you should use the :ansplugin:`community.dns.hetzner_dns_record_info module <community.dns.hetzner_dns_record_info#module>`. It supports the same limiting options as the :ansplugin:`community.dns.hetzner_dns_record_set_info module <community.dns.hetzner_dns_record_set_info#module>`. Creating and updating DNS single records ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you do not want to add/remove values, but replace values, you will be interested in modifying a **record set** and not a single record. This is in particular important when working with ``CNAME`` and ``SOA`` records. -The :ref:`community.dns.hetzner_dns_record module <ansible_collections.community.dns.hetzner_dns_record_module>` allows to set, update and remove single DNS records. Setting and updating can be done as follows. Records will be matched by record name and type, and the TTL value will be updated if necessary: +The :ansplugin:`community.dns.hetzner_dns_record module <community.dns.hetzner_dns_record#module>` allows to set, update and remove single DNS records. Setting and updating can be done as follows. Records will be matched by record name and type, and the TTL value will be updated if necessary: .. code-block:: yaml+jinja @@ -200,7 +200,7 @@ The :ref:`community.dns.hetzner_dns_record module <ansible_collections.community value: 1.1.1.1 ttl: 300 -To delete records, simply use ``state=absent``. Records will be matched by record name and type, and the TTL will be ignored: +To delete records, simply use :ansopt:`community.dns.hetzner_dns_record#module:state=absent`. Records will be matched by record name and type, and the TTL will be ignored: .. code-block:: yaml+jinja @@ -217,7 +217,7 @@ Records of the same type for the same record name with other values are ignored. Creating and updating DNS record sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`community.dns.hetzner_dns_record_set module <ansible_collections.community.dns.hetzner_dns_record_set_module>` allows to set, update and remove DNS record sets. Setting and updating can be done as follows: +The :ansplugin:`community.dns.hetzner_dns_record_set module <community.dns.hetzner_dns_record_set#module>` allows to set, update and remove DNS record sets. Setting and updating can be done as follows: .. code-block:: yaml+jinja @@ -234,9 +234,9 @@ The :ref:`community.dns.hetzner_dns_record_set module <ansible_collections.commu - 1.1.1.1 - 8.8.8.8 -If you want to assert that a record has a certain value, set ``on_existing=keep``. Using ``keep_and_warn`` instead will emit a warning if this happens, and ``keep_and_fail`` will make the module fail. +If you want to assert that a record has a certain value, set :ansopt:`community.dns.hetzner_dns_record_set#module:on_existing=keep`. Using :ansval:`keep_and_warn` instead will emit a warning if this happens, and :ansval:`keep_and_fail` will make the module fail. -To delete values, you can either overwrite the values with value ``[]``, or use ``state=absent``: +To delete values, you can either overwrite the values with value :ansval:`[]`, or use :ansopt:`community.dns.hetzner_dns_record_set#module:state=absent`: .. code-block:: yaml+jinja @@ -266,12 +266,12 @@ To delete values, you can either overwrite the values with value ``[]``, or use value: - '::1' -In the third example, ``on_existing=keep_and_fail`` is present and an explicit value and TTL are given. This makes the module remove the current value only if there's a AAAA record for ``www.example.com`` whose current value is ``::1`` and whose TTL is 300. If another value is set, the module will not make any change, but fail. This can be useful to not accidentally remove values you do not want to change. To issue a warning instead of failing, use ``on_existing=keep_and_warn``, and to simply not do a change without any indication of this situation, use ``on_existing=keep``. +In the third example, :ansopt:`community.dns.hetzner_dns_record_set#module:on_existing=keep_and_fail` is present and an explicit value and TTL are given. This makes the module remove the current value only if there's a AAAA record for ``www.example.com`` whose current value is ``::1`` and whose TTL is 300. If another value is set, the module will not make any change, but fail. This can be useful to not accidentally remove values you do not want to change. To issue a warning instead of failing, use :ansopt:`community.dns.hetzner_dns_record_set#module:on_existing=keep_and_warn`, and to simply not do a change without any indication of this situation, use :ansopt:`community.dns.hetzner_dns_record_set#module:on_existing=keep`. Bulk synchronization of DNS record sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you want to set/update multiple records at once, or even make sure that the precise set of records you are providing are present and nothing else, you can use the :ref:`community.dns.hetzner_dns_record_sets module <ansible_collections.community.dns.hetzner_dns_record_sets_module>`. +If you want to set/update multiple records at once, or even make sure that the precise set of records you are providing are present and nothing else, you can use the :ansplugin:`community.dns.hetzner_dns_record_sets module <community.dns.hetzner_dns_record_sets#module>`. The following example shows up to set/update multiple records at once: @@ -280,7 +280,7 @@ The following example shows up to set/update multiple records at once: - name: Make sure that multiple records are present community.dns.hetzner_dns_record_sets: zone_name: example.com - records: + record_sets: - prefix: www type: A value: @@ -291,7 +291,7 @@ The following example shows up to set/update multiple records at once: value: - '::1' -The next example shows how to make sure that only the given records are available and all other records are deleted. Note that for the ``type=NS`` record we used ``ignore=true``, which allows us to skip the value. It tells the module that it should not touch the ``NS`` record for ``example.com``. +The next example shows how to make sure that only the given records are available and all other records are deleted. Note that for the :ansopt:`community.dns.hetzner_dns_record_sets#module:record_sets[].type=NS` record we used :ansopt:`community.dns.hetzner_dns_record_sets#module:record_sets[].ignore=true`, which allows us to skip the value. It tells the module that it should not touch the ``NS`` record for ``example.com``. .. code-block:: yaml+jinja @@ -299,7 +299,7 @@ The next example shows how to make sure that only the given records are availabl community.dns.hetzner_dns_record_sets: zone_name: example.com prune: true - records: + record_sets: - prefix: www type: A value: @@ -318,7 +318,7 @@ The next example shows how to make sure that only the given records are availabl Migrating from ``markuman.hetzner_dns`` --------------------------------------- -This section describes how to migrate playbooks and roles from using the `markuman.hetzner_dns collection <https://galaxy.ansible.com/markuman/hetzner_dns>`_ to the Hetzner modules and plugins in the ``community.dns`` collection. +This section describes how to migrate playbooks and roles from using the `markuman.hetzner_dns collection <https://galaxy.ansible.com/ui/repo/published/markuman/hetzner_dns/>`_ to the Hetzner modules and plugins in the ``community.dns`` collection. There are three steps for migrating. Two of these steps must be done on migration, the third step can also be done later: @@ -326,18 +326,18 @@ There are three steps for migrating. Two of these steps must be done on migratio 2. Adjust module and plugin options if necessary. 3. Avoid deprecated aliases which ease the transition. -The `markuman.hetzner_dns collection <https://galaxy.ansible.com/markuman/hetzner_dns>`_ collection provides three modules and one inventory plugin. +The `markuman.hetzner_dns collection <https://galaxy.ansible.com/ui/repo/published/markuman/hetzner_dns/>`_ collection provides three modules and one inventory plugin. .. note:: - When working with TXT records, please look at the ``txt_transformation`` option. By default, the modules and plugins in this collection use **unquoted** values (you do not have to add double quotes and escape double quotes and backslashes), while the modules and plugins in ``markuman.hetzner_dns`` use partially quoted values. You can switch behavior of the ``community.dns`` modules by passing ``txt_transformation=api`` or ``txt_transformation=quoted``. + When working with TXT records, please look at the :ansopt:`community.dns.hetzner_dns_record_set#module:txt_transformation` option. By default, the modules and plugins in this collection use **unquoted** values (you do not have to add double quotes and escape double quotes and backslashes), while the modules and plugins in ``markuman.hetzner_dns`` use partially quoted values. You can switch behavior of the ``community.dns`` modules by passing :ansopt:`community.dns.hetzner_dns_record_set#module:txt_transformation=api` or :ansopt:`community.dns.hetzner_dns_record_set#module:txt_transformation=quoted`. The markuman.hetzner_dns.record module ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``markuman.hetzner_dns.zone_info`` module can be replaced by the :ref:`community.dns.hetzner_dns_record module <ansible_collections.community.dns.hetzner_dns_record_module>` and the :ref:`community.dns.hetzner_dns_record_set module <ansible_collections.community.dns.hetzner_dns_record_set_module>`, depending on what it is used for. +The ``markuman.hetzner_dns.zone_info`` module can be replaced by the :ansplugin:`community.dns.hetzner_dns_record module <community.dns.hetzner_dns_record#module>` and the :ansplugin:`community.dns.hetzner_dns_record_set module <community.dns.hetzner_dns_record_set#module>`, depending on what it is used for. -When creating, updating or removing single records, the :ref:`community.dns.hetzner_dns_record module <ansible_collections.community.dns.hetzner_dns_record_module>` should be used. This is the case when ``purge=false`` is specified (the default value). Note that ``replace``, ``overwrite`` and ``solo`` are aliases of ``purge``. +When creating, updating or removing single records, the :ansplugin:`community.dns.hetzner_dns_record module <community.dns.hetzner_dns_record#module>` should be used. This is the case when :ansopt:`purge=false` is specified (the default value). Note that :ansopt:`replace`, :ansopt:`overwrite` and :ansopt:`solo` are aliases of :ansopt:`purge`. .. code-block:: yaml+jinja @@ -370,7 +370,7 @@ When creating, updating or removing single records, the :ref:`community.dns.hetz # or keep the following option: txt_transformation: api -When the ``markuman.hetzner_dns.record`` module is in replace mode, it should be replaced by the :ref:`community.dns.hetzner_dns_record_set module <ansible_collections.community.dns.hetzner_dns_record_set_module>`, since then it operates on the *record set* and not just on a single record: +When the ``markuman.hetzner_dns.record`` module is in replace mode, it should be replaced by the :ansplugin:`community.dns.hetzner_dns_record_set module <community.dns.hetzner_dns_record_set#module>`, since then it operates on the *record set* and not just on a single record: .. code-block:: yaml+jinja @@ -410,7 +410,7 @@ When the ``markuman.hetzner_dns.record`` module is in replace mode, it should be # or keep the following option: txt_transformation: api -When deleting a record, it depends on whether ``value`` is specified or not. If ``value`` is specified, the module is deleting a single DNS record, and the :ref:`community.dns.hetzner_dns_record module <ansible_collections.community.dns.hetzner_dns_record_module>` should be used: +When deleting a record, it depends on whether :ansopt:`value` is specified or not. If :ansopt:`value` is specified, the module is deleting a single DNS record, and the :ansplugin:`community.dns.hetzner_dns_record module <community.dns.hetzner_dns_record#module>` should be used: .. code-block:: yaml+jinja @@ -440,7 +440,7 @@ When deleting a record, it depends on whether ``value`` is specified or not. If # or keep the following option: txt_transformation: api -When ``value`` is not specified, the ``markuman.hetzner_dns.record`` module will delete all records for this prefix and type. In that case, it operates on a record set and the :ref:`community.dns.hetzner_dns_record_set module <ansible_collections.community.dns.hetzner_dns_record_set_module>` should be used: +When :ansopt:`value` is not specified, the ``markuman.hetzner_dns.record`` module will delete all records for this prefix and type. In that case, it operates on a record set and the :ansplugin:`community.dns.hetzner_dns_record_set module <community.dns.hetzner_dns_record_set#module>` should be used: .. code-block:: yaml+jinja @@ -463,22 +463,22 @@ When ``value`` is not specified, the ``markuman.hetzner_dns.record`` module will # 'type' does not change: type: A -A last step is replacing the deprecated alias ``name`` of ``prefix`` by ``prefix``. This can be done later though, if you do not mind the deprecation warnings. +A last step is replacing the deprecated alias :ansopt:`community.dns.hetzner_dns_record_set#module:name` of :ansopt:`community.dns.hetzner_dns_record_set#module:prefix` by :ansopt:`community.dns.hetzner_dns_record_set#module:prefix`. This can be done later though, if you do not mind the deprecation warnings. The markuman.hetzner_dns.record_info module ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``markuman.hetzner_dns.record_info`` module can be replaced by the :ref:`community.dns.hetzner_dns_record_info module <ansible_collections.community.dns.hetzner_dns_record_info_module>`. The main difference is that instead of by the ``filters`` option, the output is controlled by the ``what`` option (choices ``single_record``, ``all_types_for_record``, and ``all_records``), the ``type`` option (needed when ``what=single_record``), and the ``record`` and ``prefix`` options (needed when ``what`` is not ``all_records``). +The ``markuman.hetzner_dns.record_info`` module can be replaced by the :ansplugin:`community.dns.hetzner_dns_record_info module <community.dns.hetzner_dns_record_info#module>`. The main difference is that instead of by the :ansopt:`filters` option, the output is controlled by the :ansopt:`community.dns.hetzner_dns_record_info#module:what` option (choices :ansval:`single_record`, :ansval:`all_types_for_record`, and :ansval:`all_records`), the :ansopt:`community.dns.hetzner_dns_record_info#module:type` option (needed when :ansopt:`community.dns.hetzner_dns_record_info#module:what=single_record`), and the :ansopt:`community.dns.hetzner_dns_record_info#module:record` and :ansopt:`community.dns.hetzner_dns_record_info#module:prefix` options (needed when :ansopt:`community.dns.hetzner_dns_record_info#module:what` is not :ansval:`all_records`). The markuman.hetzner_dns.zone_info module ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``markuman.hetzner_dns.zone_info`` module can be replaced by the :ref:`community.dns.hetzner_dns_zone_info module <ansible_collections.community.dns.hetzner_dns_zone_info_module>`. The main differences are: +The ``markuman.hetzner_dns.zone_info`` module can be replaced by the :ansplugin:`community.dns.hetzner_dns_zone_info module <community.dns.hetzner_dns_zone_info#module>`. The main differences are: -1. The parameter ``name`` must be changed to ``zone_name`` or ``zone``. -2. The return value ``zone_info`` no longer has the ``name`` and ``id`` entries. Use the return values ``zone_name`` and ``zone_id`` instead. +1. The parameter :ansopt:`name` must be changed to :ansopt:`community.dns.hetzner_dns_zone_info#module:zone_name` or :ansopt:`community.dns.hetzner_dns_zone_info#module:zone`. +2. The return value :ansretval:`community.dns.hetzner_dns_zone_info#module:zone_info` no longer has the ``name`` and ``id`` entries. Use the return values :ansretval:`community.dns.hetzner_dns_zone_info#module:zone_name` and :ansretval:`community.dns.hetzner_dns_zone_info#module:zone_id` instead. The markuman.hetzner_dns.inventory inventory plugin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``markuman.hetzner_dns.inventory`` inventory plugin can be replaced by the :ref:`community.dns.hetzner_dns_records inventory plugin <ansible_collections.community.dns.hetzner_dns_records_inventory>`. Besides the plugin name, no change should be necessary. +The ``markuman.hetzner_dns.inventory`` inventory plugin can be replaced by the :ansplugin:`community.dns.hetzner_dns_records inventory plugin <community.dns.hetzner_dns_records#inventory>`. Besides the plugin name, no change should be necessary. diff --git a/ansible_collections/community/dns/docs/docsite/rst/hosttech_guide.rst b/ansible_collections/community/dns/docs/docsite/rst/hosttech_guide.rst index 8efb8058f..ed44685d5 100644 --- a/ansible_collections/community/dns/docs/docsite/rst/hosttech_guide.rst +++ b/ansible_collections/community/dns/docs/docsite/rst/hosttech_guide.rst @@ -17,26 +17,26 @@ The modules support both the old `WSDL-based API <https://ns1.hosttech.eu/public The collection provides six modules for working with HostTech DNS: -- :ref:`community.dns.hosttech_dns_record <ansible_collections.community.dns.hosttech_dns_record_module>`: create/update/delete single DNS records -- :ref:`community.dns.hosttech_dns_record_info <ansible_collections.community.dns.hosttech_dns_record_info_module>`: retrieve information on DNS records -- :ref:`community.dns.hosttech_dns_record_set <ansible_collections.community.dns.hosttech_dns_record_set_module>`: create/update/delete DNS record sets -- :ref:`community.dns.hosttech_dns_record_set_info <ansible_collections.community.dns.hosttech_dns_record_set_info_module>`: retrieve information on DNS record sets -- :ref:`community.dns.hosttech_dns_record_sets <ansible_collections.community.dns.hosttech_dns_record_sets_module>`: bulk synchronize DNS record sets -- :ref:`community.dns.hosttech_dns_zone_info <ansible_collections.community.dns.hosttech_dns_zone_info_module>`: retrieve zone information +- :ansplugin:`community.dns.hosttech_dns_record#module`: create/update/delete single DNS records +- :ansplugin:`community.dns.hosttech_dns_record_info#module`: retrieve information on DNS records +- :ansplugin:`community.dns.hosttech_dns_record_set#module`: create/update/delete DNS record sets +- :ansplugin:`community.dns.hosttech_dns_record_set_info#module`: retrieve information on DNS record sets +- :ansplugin:`community.dns.hosttech_dns_record_sets#module`: bulk synchronize DNS record sets +- :ansplugin:`community.dns.hosttech_dns_zone_info#module`: retrieve zone information It also provides an inventory plugin: -- :ref:`community.dns.hosttech_dns_records <ansible_collections.community.dns.hosttech_dns_records_inventory>`: create inventory from DNS records +- :ansplugin:`community.dns.hosttech_dns_records#inventory`: create inventory from DNS records Authentication, Requirements and APIs ------------------------------------- -HostTech currently has two APIs for working with DNS records: the old WSDL-based API, and the new JSON-based REST API. We recommend using the new REST API if possible. +HostTech currently has two APIs for working with DNS records: the old WSDL-based API, and the new JSON-based REST API. We recommend using the new JSON REST API if possible. JSON REST API ~~~~~~~~~~~~~ -To use the JSON REST API, you need to create a API token. You can manage API tokens in the "DNS Editor" in the "API" section. You must provide the token to the ``hosttech_token`` option of the modules: +To use the JSON REST API, you need to create a API token. You can manage API tokens in the "DNS Editor" in the "API" section. You must provide the token to the :ansopt:`hosttech_token` option of the modules: .. code-block:: yaml+jinja @@ -49,7 +49,7 @@ In the examples in this guide, we will leave the authentication options away. Pl WSDL API ~~~~~~~~ -To use the WSDL API, you need to set API credentials. These can be found and changed in the "Servercenter" and there in the "Solutions" section under settings for the "DNS Tool". The username is fixed, but the password can be changed. The credentials must be provided to the ``hosttech_username`` and ``hosttech_password`` options of the modules. +To use the WSDL API, you need to set API credentials. These can be found and changed in the "Servercenter" and there in the "Solutions" section under settings for the "DNS Tool". The username is fixed, but the password can be changed. The credentials must be provided to the :ansopt:`hosttech_username` and :ansopt:`hosttech_password` options of the modules. You also need to install the `lxml Python module <https://pypi.org/project/lxml/>`_ to work with the WSDL API. This can be done before using the modules: @@ -101,7 +101,7 @@ Here all two tasks will use the options set for the module defaults group. Working with DNS zones ---------------------- -The :ref:`community.dns.hosttech_dns_zone_info module <ansible_collections.community.dns.hosttech_dns_zone_info_module>` allows to query information on a zone. The zone can be identified both by its name and by its ID (which is an integer): +The :ansplugin:`community.dns.hosttech_dns_zone_info module <community.dns.hosttech_dns_zone_info#module>` allows to query information on a zone. The zone can be identified both by its name and by its ID (which is an integer): .. code-block:: yaml+jinja @@ -129,12 +129,12 @@ Working with DNS records .. note:: - By default, TXT record values returned and accepted by the modules and plugins in this collection are unquoted. This means that you do not have to add double quotes (``"``), and escape double quotes (as ``\"``) and backslashes (as ``\\``). All modules and plugins which work with DNS records support the ``txt_transformation`` option which allows to configure this behavior. + By default, TXT record values returned and accepted by the modules and plugins in this collection are unquoted. This means that you do not have to add double quotes (``"``), and escape double quotes (as ``\"``) and backslashes (as ``\\``). All modules and plugins which work with DNS records support the :ansopt:`community.dns.hosttech_dns_record_set#module:txt_transformation` option which allows to configure this behavior. Querying DNS records and record sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`community.dns.hosttech_dns_record_set_info module <ansible_collections.community.dns.hosttech_dns_record_set_info_module>` allows to query DNS record sets from the API. It can be used to query a single record set: +The :ansplugin:`community.dns.hosttech_dns_record_set_info module <community.dns.hosttech_dns_record_set_info#module>` allows to query DNS record sets from the API. It can be used to query a single record set: .. code-block:: yaml+jinja @@ -161,7 +161,7 @@ The :ref:`community.dns.hosttech_dns_record_set_info module <ansible_collections msg: There is no A record for www.example.com when: not result.set -In all examples in this section, you can replace ``zone_name: example.com`` by ``zone_id: 42`` with the zone's integer ID. +In all examples in this section, you can replace :ansopt:`community.dns.hosttech_dns_record_set_info#module:zone_name=example.com` by :ansopt:`community.dns.hosttech_dns_record_set_info#module:zone_id=42` with the zone's integer ID. You can also query a list of all record sets for a record name or prefix: @@ -201,14 +201,14 @@ Finally you can query all record sets for a zone: TTL {{ item.ttl }} has values {{ item.value | join(', ') }} loop: result.sets -If you are interested in individual DNS records, and not record sets, you should use the :ref:`community.dns.hosttech_dns_record_info module <ansible_collections.community.dns.hosttech_dns_record_info_module>`. It supports the same limiting options as the ``community.dns.hosttech_dns_record_set_info`` module. +If you are interested in individual DNS records, and not record sets, you should use the :ansplugin:`community.dns.hosttech_dns_record_info module <community.dns.hosttech_dns_record_info#module>`. It supports the same limiting options as the :ansplugin:`community.dns.hosttech_dns_record_set_info module <community.dns.hosttech_dns_record_set_info#module>`. Creating and updating DNS single records ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you do not want to add/remove values, but replace values, you will be interested in modifying a **record set** and not a single record. This is in particular important when working with ``CNAME`` and ``SOA`` records. -The :ref:`community.dns.hosttech_dns_record module <ansible_collections.community.dns.hosttech_dns_record_module>` allows to set, update and remove single DNS records. Setting and updating can be done as follows. Records will be matched by record name and type, and the TTL value will be updated if necessary: +The :ansplugin:`community.dns.hosttech_dns_record module <community.dns.hosttech_dns_record#module>` allows to set, update and remove single DNS records. Setting and updating can be done as follows. Records will be matched by record name and type, and the TTL value will be updated if necessary: .. code-block:: yaml+jinja @@ -224,7 +224,7 @@ The :ref:`community.dns.hosttech_dns_record module <ansible_collections.communit value: 1.1.1.1 ttl: 300 -To delete records, simply use ``state: absent``. Records will be matched by record name and type, and the TTL will be ignored: +To delete records, simply use :ansopt:`community.dns.hosttech_dns_record#module:state=absent`. Records will be matched by record name and type, and the TTL will be ignored: .. code-block:: yaml+jinja @@ -241,7 +241,7 @@ Records of the same type for the same record name with other values are ignored. Creating and updating DNS record sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`community.dns.hosttech_dns_record_set module <ansible_collections.community.dns.hosttech_dns_record_set_module>` allows to set, update and remove DNS record sets. Setting and updating can be done as follows: +The :ansplugin:`community.dns.hosttech_dns_record_set module <community.dns.hosttech_dns_record_set#module>` allows to set, update and remove DNS record sets. Setting and updating can be done as follows: .. code-block:: yaml+jinja @@ -258,9 +258,9 @@ The :ref:`community.dns.hosttech_dns_record_set module <ansible_collections.comm - 1.1.1.1 - 8.8.8.8 -If you want to assert that a record has a certain value, set ``on_existing: keep``. Using ``keep_and_warn`` instead will emit a warning if this happens, and ``keep_and_fail`` will make the module fail. +If you want to assert that a record has a certain value, set :ansopt:`community.dns.hosttech_dns_record_set#module:on_existing=keep`. Using :ansval:`keep_and_warn` instead will emit a warning if this happens, and :ansval:`keep_and_fail` will make the module fail. -To delete values, you can either overwrite the values with value ``[]``, or use ``state: absent``: +To delete values, you can either overwrite the values with value :ansval:`[]`, or use :ansopt:`community.dns.hosttech_dns_record_set#module:state=absent`: .. code-block:: yaml+jinja @@ -290,12 +290,12 @@ To delete values, you can either overwrite the values with value ``[]``, or use value: - '::1' -In the third example, ``on_existing: keep_and_fail`` is present and an explicit value and TTL are given. This makes the module remove the current value only if there's a AAAA record for ``www.example.com`` whose current value is ``::1`` and whose TTL is 300. If another value is set, the module will not make any change, but fail. This can be useful to not accidentally remove values you do not want to change. To issue a warning instead of failing, use ``on_existing: keep_and_warn``, and to simply not do a change without any indication of this situation, use ``on_existing: keep``. +In the third example, :ansopt:`community.dns.hosttech_dns_record_set#module:on_existing=keep_and_fail` is present and an explicit value and TTL are given. This makes the module remove the current value only if there's a AAAA record for ``www.example.com`` whose current value is ``::1`` and whose TTL is 300. If another value is set, the module will not make any change, but fail. This can be useful to not accidentally remove values you do not want to change. To issue a warning instead of failing, use :ansopt:`community.dns.hosttech_dns_record_set#module:on_existing=keep_and_warn`, and to simply not do a change without any indication of this situation, use :ansopt:`community.dns.hosttech_dns_record_set#module:on_existing=keep`. Bulk synchronization of DNS record sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you want to set/update multiple records at once, or even make sure that the precise set of records you are providing are present and nothing else, you can use the :ref:`community.dns.hosttech_dns_record_sets module <ansible_collections.community.dns.hosttech_dns_record_sets_module>`. +If you want to set/update multiple records at once, or even make sure that the precise set of records you are providing are present and nothing else, you can use the :ansplugin:`community.dns.hosttech_dns_record_sets module <community.dns.hosttech_dns_record_sets#module>`. The following example shows up to set/update multiple records at once: @@ -304,7 +304,7 @@ The following example shows up to set/update multiple records at once: - name: Make sure that multiple records are present community.dns.hosttech_dns_record_sets: zone_name: example.com - records: + record_sets: - prefix: www type: A value: @@ -315,7 +315,7 @@ The following example shows up to set/update multiple records at once: value: - '::1' -The next example shows how to make sure that only the given records are available and all other records are deleted. Note that for the ``type: NS`` record we used ``ignore: true``, which allows us to skip the value. It tells the module that it should not touch the ``NS`` record for ``example.com``. +The next example shows how to make sure that only the given records are available and all other records are deleted. Note that for the :ansopt:`community.dns.hosttech_dns_record_sets#module:record_sets[].type=NS` record we used :ansopt:`community.dns.hosttech_dns_record_sets#module:record_sets[].ignore=true`, which allows us to skip the value. It tells the module that it should not touch the ``NS`` record for ``example.com``. .. code-block:: yaml+jinja @@ -323,7 +323,7 @@ The next example shows how to make sure that only the given records are availabl community.dns.hosttech_dns_record_sets: zone_name: example.com prune: true - records: + record_sets: - prefix: www type: A value: diff --git a/ansible_collections/community/dns/plugins/doc_fragments/filters.py b/ansible_collections/community/dns/plugins/doc_fragments/filters.py index e153d4bf9..3227c0f21 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/filters.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/filters.py @@ -26,8 +26,8 @@ options: keep_unknown_suffix: description: - This treats unknown TLDs as valid public suffixes. So for example the public suffix - of C(example.tlddoesnotexist) is C(.tlddoesnotexist) if this is C(true). If set to - C(false), it will return an empty string in this case. + of C(example.tlddoesnotexist) is C(.tlddoesnotexist) if this is V(true). If set to + V(false), it will return an empty string in this case. - This option corresponds to whether the global wildcard rule C(*) in the Public Suffix List is used or not. type: boolean @@ -40,17 +40,17 @@ options: description: - This controls the behavior in case there is no label in front of the public suffix. This is the case if the DNS name itself is a public suffix. - - If set to C(false), in this case the public suffix is treated as a registrable domain. - - If set to C(true) (default), the registrable domain of a public suffix is interpreted as an + - If set to V(false), in this case the public suffix is treated as a registrable domain. + - If set to V(true) (default), the registrable domain of a public suffix is interpreted as an empty string. type: boolean default: true keep_unknown_suffix: description: - This treats unknown TLDs as valid public suffixes. So for example the public suffix of - C(example.tlddoesnotexist) is C(.tlddoesnotexist) if this is C(true), and hence the + C(example.tlddoesnotexist) is C(.tlddoesnotexist) if this is V(true), and hence the registrable domain of C(www.example.tlddoesnotexist) is C(example.tlddoesnotexist). - If set to C(false), the registrable domain of C(www.example.tlddoesnotexist) is + If set to V(false), the registrable domain of C(www.example.tlddoesnotexist) is C(tlddoesnotexist). - This option corresponds to whether the global wildcard rule C(*) in the Public Suffix List is used or not. diff --git a/ansible_collections/community/dns/plugins/doc_fragments/hetzner.py b/ansible_collections/community/dns/plugins/doc_fragments/hetzner.py index 3b79e5da0..3e8199b85 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/hetzner.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/hetzner.py @@ -16,7 +16,7 @@ options: hetzner_token: description: - The token for the Hetzner API. - - If not provided, will be read from the environment variable C(HETZNER_DNS_TOKEN). + - If not provided, will be read from the environment variable E(HETZNER_DNS_TOKEN). aliases: - api_token type: str @@ -33,6 +33,15 @@ options: - name: HETZNER_DNS_TOKEN ''' + # NOTE: This document fragment adds additional information on records. + RECORD_NOTES = r''' +options: {} +notes: + - For C(CNAME) records, use absolute DNS names for values. Absolute DNS names end with + a trailing period C(.), for example C(foo.example.com.). If you use a relative DNS name, with no + trailing period, the value will be relative to the zone of the C(CNAME) record. +''' + # WARNING: This section is automatically generated by update-docs-fragments.py. # It is used to augment the docs fragments module_record, module_record_set. # DO NOT EDIT MANUALLY! @@ -76,17 +85,19 @@ options: record: description: - The full DNS record to create or delete. - - Exactly one of I(record) and I(prefix) must be specified. + - Exactly one of O(record_sets[].record) and O(record_sets[].prefix) + must be specified. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, - if the record to be modified is C(www.example.com) for the zone - C(example.com), the prefix is C(www). If the record in this - example would be C(example.com), the prefix would be C('') (empty - string). - - Exactly one of I(record) and I(prefix) must be specified. + - This is the part of O(record_sets[].record) before O(zone_name). + For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record + in this example would be C(example.com), the prefix would be + V('') (empty string). + - Exactly one of O(record_sets[].record) and O(record_sets[].prefix) + must be specified. type: str ttl: description: @@ -119,13 +130,13 @@ options: - YAML lists or multiple comma-spaced values are allowed. - When deleting a record all values for the record must be specified or it will not be deleted. - - Must be specified if I(ignore=false). + - Must be specified if O(record_sets[].ignore=false). type: list elements: str ignore: description: - - If set to C(true), I(value) will be ignored. - - This is useful when I(prune=true), but you do not want certain + - If set to V(true), O(record_sets[].value) will be ignored. + - This is useful when O(prune=true), but you do not want certain entries to be removed without having to know their current value. type: bool default: false @@ -136,7 +147,7 @@ options: # DO NOT EDIT MANUALLY! RECORD_TYPE_CHOICES_RECORDS_INVENTORY = r''' options: - filters: + simple_filters: suboptions: type: description: diff --git a/ansible_collections/community/dns/plugins/doc_fragments/hosttech.py b/ansible_collections/community/dns/plugins/doc_fragments/hosttech.py index 937983f50..571b0e595 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/hosttech.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/hosttech.py @@ -19,20 +19,20 @@ options: hosttech_username: description: - The username for the Hosttech API user. - - If provided, I(hosttech_password) must also be provided. - - Mutually exclusive with I(hosttech_token). + - If provided, O(hosttech_password) must also be provided. + - Mutually exclusive with O(hosttech_token). type: str hosttech_password: description: - The password for the Hosttech API user. - - If provided, I(hosttech_username) must also be provided. - - Mutually exclusive with I(hosttech_token). + - If provided, O(hosttech_username) must also be provided. + - Mutually exclusive with O(hosttech_token). type: str hosttech_token: description: - The password for the Hosttech API user. - - Mutually exclusive with I(hosttech_username) and I(hosttech_password). - - Since community.dns 1.2.0, the alias I(api_token) can be used. + - Mutually exclusive with O(hosttech_username) and O(hosttech_password). + - Since community.dns 1.2.0, the alias O(ignore:api_token) can be used. aliases: - api_token type: str @@ -58,6 +58,11 @@ options: version_added: 2.5.0 ''' + # NOTE: This document fragment adds additional information on records. + RECORD_NOTES = r''' +options: {} +''' + # WARNING: This section is automatically generated by update-docs-fragments.py. # It is used to augment the docs fragments module_record, module_record_set. # DO NOT EDIT MANUALLY! @@ -97,17 +102,19 @@ options: record: description: - The full DNS record to create or delete. - - Exactly one of I(record) and I(prefix) must be specified. + - Exactly one of O(record_sets[].record) and O(record_sets[].prefix) + must be specified. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, - if the record to be modified is C(www.example.com) for the zone - C(example.com), the prefix is C(www). If the record in this - example would be C(example.com), the prefix would be C('') (empty - string). - - Exactly one of I(record) and I(prefix) must be specified. + - This is the part of O(record_sets[].record) before O(zone_name). + For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record + in this example would be C(example.com), the prefix would be + V('') (empty string). + - Exactly one of O(record_sets[].record) and O(record_sets[].prefix) + must be specified. type: str ttl: description: @@ -136,13 +143,13 @@ options: - YAML lists or multiple comma-spaced values are allowed. - When deleting a record all values for the record must be specified or it will not be deleted. - - Must be specified if I(ignore=false). + - Must be specified if O(record_sets[].ignore=false). type: list elements: str ignore: description: - - If set to C(true), I(value) will be ignored. - - This is useful when I(prune=true), but you do not want certain + - If set to V(true), O(record_sets[].value) will be ignored. + - This is useful when O(prune=true), but you do not want certain entries to be removed without having to know their current value. type: bool default: false @@ -153,7 +160,7 @@ options: # DO NOT EDIT MANUALLY! RECORD_TYPE_CHOICES_RECORDS_INVENTORY = r''' options: - filters: + simple_filters: suboptions: type: description: diff --git a/ansible_collections/community/dns/plugins/doc_fragments/inventory_records.py b/ansible_collections/community/dns/plugins/doc_fragments/inventory_records.py index fcdc55acb..e7a90a7b7 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/inventory_records.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/inventory_records.py @@ -17,24 +17,28 @@ description: - Records are matched by prefix / record name and value. notes: - - The I(zone_name) and I(zone_id) options can be templated. + - The O(zone_name) and O(zone_id) options can be templated. options: zone_name: description: - The DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. - filters: + - Exactly one of O(zone_name) and O(zone_id) must be specified. + simple_filters: description: - A dictionary of filter value pairs. + - This option has been renamed from O(filters) to O(simple_filters) in community.dns 2.8.0. + The old name can still be used until community.dns 3.0.0. type: dict + aliases: + - filters default: {} suboptions: # (The following must be kept in sync with the equivalent lines in <provider_name>.py!) diff --git a/ansible_collections/community/dns/plugins/doc_fragments/module_record.py b/ansible_collections/community/dns/plugins/doc_fragments/module_record.py index 4eaa956aa..d79313555 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/module_record.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/module_record.py @@ -28,26 +28,26 @@ options: zone_name: description: - The DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. record: description: - The full DNS record to create or delete. - - Exactly one of I(record) and I(prefix) must be specified. + - Exactly one of O(record) and O(prefix) must be specified. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, if the record to be modified is C(www.example.com) - for the zone C(example.com), the prefix is C(www). If the record in this example would be C(example.com), the - prefix would be C('') (empty string). - - Exactly one of I(record) and I(prefix) must be specified. + - This is the part of O(record) before O(zone_name). For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record in this example would be C(example.com), the + prefix would be V('') (empty string). + - Exactly one of O(record) and O(prefix) must be specified. type: str ttl: description: diff --git a/ansible_collections/community/dns/plugins/doc_fragments/module_record_info.py b/ansible_collections/community/dns/plugins/doc_fragments/module_record_info.py index e039ec6aa..43b0549c2 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/module_record_info.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/module_record_info.py @@ -27,30 +27,30 @@ options: zone_name: description: - The DNS zone to modify. - - Exactly one of I(zone) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. record: description: - The full DNS record to retrieve. - - If I(what) is C(single_record) or C(all_types_for_record), exactly one of I(record) and I(prefix) is required. + - If O(what) is V(single_record) or V(all_types_for_record), exactly one of O(record) and O(prefix) is required. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, if the record to be modified is C(www.example.com) - for the zone C(example.com), the prefix is C(www). If the record in this example would be C(example.com), the - prefix would be C('') (empty string). - - If I(what) is C(single_record) or C(all_types_for_record), exactly one of I(record) and I(prefix) is required. + - This is the part of O(record) before O(zone_name). For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record in this example would be C(example.com), the + prefix would be V('') (empty string). + - If O(what) is V(single_record) or V(all_types_for_record), exactly one of O(record) and O(prefix) is required. type: str type: description: - The type of DNS record to retrieve. - - Required if I(what) is C(single_record). + - Required if O(what) is V(single_record). type: str ''' diff --git a/ansible_collections/community/dns/plugins/doc_fragments/module_record_set.py b/ansible_collections/community/dns/plugins/doc_fragments/module_record_set.py index 2b4004422..2fb83186c 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/module_record_set.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/module_record_set.py @@ -25,33 +25,32 @@ options: zone_name: description: - The DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. version_added: 0.2.0 record: description: - The full DNS record to create or delete. - - Exactly one of I(record) and I(prefix) must be specified. + - Exactly one of O(record) and O(prefix) must be specified. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, if the record to be modified is C(www.example.com) - for the zone C(example.com), the prefix is C(www). If the record in this example would be C(example.com), the - prefix would be C('') (empty string). - - Exactly one of I(record) and I(prefix) must be specified. + - This is the part of O(record) before O(zone_name). For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record in this example would be C(example.com), the + prefix would be V('') (empty string). + - Exactly one of O(record) and O(prefix) must be specified. type: str version_added: 0.2.0 ttl: description: - The TTL to give the new record, in seconds. - - Will be ignored if I(state=absent) and I(on_existing=replace). type: int type: description: @@ -64,22 +63,22 @@ options: - YAML lists or multiple comma-spaced values are allowed. - When deleting a record all values for the record must be specified or it will not be deleted. - - Must be specified if I(state=present) or when I(on_existing) is not C(replace). - - Will be ignored if I(state=absent) and I(on_existing=replace). + - Must be specified if O(state=present) or when O(on_existing) is not V(replace). + - Will be ignored if O(state=absent) and O(on_existing=replace). type: list elements: str on_existing: description: - This option defines the behavior if the record set already exists, but differs from the specified record set. - For this comparison, I(value) and I(ttl) are used for all records of type I(type) matching the I(prefix) resp. I(record). - - If set to C(replace), the record will be updated (I(state=present)) or removed (I(state=absent)). - This is the old I(overwrite=true) behavior. - - If set to C(keep_and_fail), the module will fail and not modify the records. - This is the old I(overwrite=false) behavior if I(state=present). - - If set to C(keep_and_warn), the module will warn and not modify the records. - - If set to C(keep), the module will not modify the records. - This is the old I(overwrite=false) behavior if I(state=absent). - - If I(state=absent) and the value is not C(replace), I(value) must be specified. + For this comparison, O(value) and O(ttl) are used for all records of type O(type) matching the O(prefix) resp. O(record). + - If set to V(replace), the record will be updated (O(state=present)) or removed (O(state=absent)). + This is the old O(ignore:overwrite=true) behavior. + - If set to V(keep_and_fail), the module will fail and not modify the records. + This is the old O(ignore:overwrite=false) behavior if O(state=present). + - If set to V(keep_and_warn), the module will warn and not modify the records. + - If set to V(keep), the module will not modify the records. + This is the old O(ignore:overwrite=false) behavior if O(state=absent). + - If O(state=absent) and the value is not V(replace), O(value) must be specified. default: replace type: str choices: diff --git a/ansible_collections/community/dns/plugins/doc_fragments/module_record_set_info.py b/ansible_collections/community/dns/plugins/doc_fragments/module_record_set_info.py index 857e9036e..2fa5321dd 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/module_record_set_info.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/module_record_set_info.py @@ -27,32 +27,32 @@ options: zone_name: description: - The DNS zone to modify. - - Exactly one of I(zone) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. version_added: 0.2.0 record: description: - The full DNS record to retrieve. - - If I(what) is C(single_record) or C(all_types_for_record), exactly one of I(record) and I(prefix) is required. + - If O(what) is V(single_record) or V(all_types_for_record), exactly one of O(record) and O(prefix) is required. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, if the record to be modified is C(www.example.com) - for the zone C(example.com), the prefix is C(www). If the record in this example would be C(example.com), the - prefix would be C('') (empty string). - - If I(what) is C(single_record) or C(all_types_for_record), exactly one of I(record) and I(prefix) is required. + - This is the part of O(record) before O(zone_name). For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record in this example would be C(example.com), the + prefix would be V('') (empty string). + - If O(what) is V(single_record) or V(all_types_for_record), exactly one of O(record) and O(prefix) is required. type: str version_added: 0.2.0 type: description: - The type of DNS record to retrieve. - - Required if I(what) is C(single_record). + - Required if O(what) is V(single_record). type: str ''' diff --git a/ansible_collections/community/dns/plugins/doc_fragments/module_record_sets.py b/ansible_collections/community/dns/plugins/doc_fragments/module_record_sets.py index 1b393b444..cf3fcbe9f 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/module_record_sets.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/module_record_sets.py @@ -14,27 +14,27 @@ class ModuleDocFragment(object): DOCUMENTATION = r''' description: - The module allows to set, modify and delete multiple DNS record sets at once. - - With the I(purge) option, it is also possible to delete existing record sets + - With the O(prune) option, it is also possible to delete existing record sets that are not mentioned in the module parameters. With this, it is possible to synchronize the expected state of a DNS zone with the expected state. - - "It is possible to ignore certain record sets by specifying I(ignore: true) for + - "It is possible to ignore certain record sets by specifying O(record_sets[].ignore=true) for that record set." options: zone_name: description: - The DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to modify. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. prune: description: - - If set to C(true), will remove all existing records in the zone that are not listed in I(records). + - If set to V(true), will remove all existing records in the zone that are not listed in O(record_sets). type: bool default: false record_sets: @@ -50,15 +50,15 @@ options: record: description: - The full DNS record to create or delete. - - Exactly one of I(record) and I(prefix) must be specified. + - Exactly one of O(record_sets[].record) and O(record_sets[].prefix) must be specified. type: str prefix: description: - The prefix of the DNS record. - - This is the part of I(record) before I(zone_name). For example, if the record to be modified is C(www.example.com) - for the zone C(example.com), the prefix is C(www). If the record in this example would be C(example.com), the - prefix would be C('') (empty string). - - Exactly one of I(record) and I(prefix) must be specified. + - This is the part of O(record_sets[].record) before O(zone_name). For example, if the record to be modified is C(www.example.com) + for the zone C(example.com), the prefix is V(www). If the record in this example would be C(example.com), the + prefix would be V('') (empty string). + - Exactly one of O(record_sets[].record) and O(record_sets[].prefix) must be specified. type: str ttl: description: @@ -75,13 +75,13 @@ options: - YAML lists or multiple comma-spaced values are allowed. - When deleting a record all values for the record must be specified or it will not be deleted. - - Must be specified if I(ignore=false). + - Must be specified if O(record_sets[].ignore=false). type: list elements: str ignore: description: - - If set to C(true), I(value) will be ignored. - - This is useful when I(prune=true), but you do not want certain entries to be removed + - If set to V(true), O(record_sets[].value) will be ignored. + - This is useful when O(prune=true), but you do not want certain entries to be removed without having to know their current value. type: bool default: false diff --git a/ansible_collections/community/dns/plugins/doc_fragments/module_zone_info.py b/ansible_collections/community/dns/plugins/doc_fragments/module_zone_info.py index b218051e5..bcccfea73 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/module_zone_info.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/module_zone_info.py @@ -16,13 +16,13 @@ options: zone_name: description: - The DNS zone to query. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. type: str aliases: - zone zone_id: description: - The ID of the DNS zone to query. - - Exactly one of I(zone_name) and I(zone_id) must be specified. + - Exactly one of O(zone_name) and O(zone_id) must be specified. version_added: 0.2.0 ''' diff --git a/ansible_collections/community/dns/plugins/doc_fragments/options.py b/ansible_collections/community/dns/plugins/doc_fragments/options.py index a9e92e8b5..55c83f1b2 100644 --- a/ansible_collections/community/dns/plugins/doc_fragments/options.py +++ b/ansible_collections/community/dns/plugins/doc_fragments/options.py @@ -28,23 +28,23 @@ options: description: - Determines how TXT entry values are converted between the API and this module's input and output. - - The value C(api) means that values are returned from this module as they are returned + - The value V(api) means that values are returned from this module as they are returned from the API, and pushed to the API as they have been passed to this module. For idempotency checks, the input string will be compared to the strings returned by the API. The API might automatically transform some values, like splitting long values or adding quotes, which can cause problems with idempotency. - - The value C(unquoted) automatically transforms values so that you can pass in unquoted + - The value V(unquoted) automatically transforms values so that you can pass in unquoted values, and the module will return unquoted values. If you pass in quoted values, they will be double-quoted. - - The value C(quoted) automatically transforms values so that you must use quoting for values + - The value V(quoted) automatically transforms values so that you must use quoting for values that contain spaces, characters such as quotation marks and backslashes, and that are longer than 255 bytes. It also makes sure to return values from the API in a normalized encoding. - - The default value, C(unquoted), ensures that you can work with values without having - to care about how to correctly quote for DNS. Most users should use one of C(unquoted) - or C(quoted), but not C(api). + - The default value, V(unquoted), ensures that you can work with values without having + to care about how to correctly quote for DNS. Most users should use one of V(unquoted) + or V(quoted), but not V(api). - B(Note:) the conversion code assumes UTF-8 encoding for values. If you need another - encoding use I(txt_transformation=api) and handle the encoding yourself. + encoding use O(txt_transformation=api) and handle the encoding yourself. type: str choices: - api @@ -53,10 +53,10 @@ options: default: unquoted txt_character_encoding: description: - - Whether to treat numeric escape sequences (C(\xyz)) as octal or decimal numbers. - This is only used when I(txt_transformation=quoted). - - The current default is C(octal) which is deprecated. It will change to C(decimal) in - community.dns 3.0.0. The value C(decimal) is compatible to L(RFC 1035, https://www.ietf.org/rfc/rfc1035.txt). + - Whether to treat numeric escape sequences (V(\\xyz)) as octal or decimal numbers. + This is only used when O(txt_transformation=quoted). + - The current default is V(octal) which is deprecated. It will change to V(decimal) in + community.dns 3.0.0. The value V(decimal) is compatible to L(RFC 1035, https://www.ietf.org/rfc/rfc1035.txt). type: str choices: - decimal diff --git a/ansible_collections/community/dns/plugins/inventory/hetzner_dns_records.py b/ansible_collections/community/dns/plugins/inventory/hetzner_dns_records.py index 970cd8631..7982c23f0 100644 --- a/ansible_collections/community/dns/plugins/inventory/hetzner_dns_records.py +++ b/ansible_collections/community/dns/plugins/inventory/hetzner_dns_records.py @@ -23,7 +23,7 @@ description: options: plugin: - description: The name of this plugin. Should always be set to C(community.dns.hetzner_dns_records) for this plugin to recognize it as its own. + description: The name of this plugin. Should always be set to V(community.dns.hetzner_dns_records) for this plugin to recognize it as its own. # TODO: add `required: true` in 3.0.0 # required: true choices: @@ -39,7 +39,7 @@ extends_documentation_fragment: - community.dns.options.record_transformation notes: - - The provider-specific I(hetzner_token) option can be templated. + - The provider-specific O(hetzner_token) option can be templated. author: - Markus Bergholz (@markuman) <markuman+spambelongstogoogle@gmail.com> @@ -55,7 +55,7 @@ EXAMPLES = ''' plugin: community.dns.hetzner_dns_records zone_name: domain.de -filters: +simple_filters: type: - TXT txt_transformation: unquoted diff --git a/ansible_collections/community/dns/plugins/inventory/hosttech_dns_records.py b/ansible_collections/community/dns/plugins/inventory/hosttech_dns_records.py index aa840510d..d14cf73ed 100644 --- a/ansible_collections/community/dns/plugins/inventory/hosttech_dns_records.py +++ b/ansible_collections/community/dns/plugins/inventory/hosttech_dns_records.py @@ -23,7 +23,7 @@ description: options: plugin: - description: The name of this plugin. Should always be set to C(community.dns.hosttech_dns_records) for this plugin to recognize it as its own. + description: The name of this plugin. Should always be set to V(community.dns.hosttech_dns_records) for this plugin to recognize it as its own. # TODO: add `required: true` in 3.0.0 # required: true choices: @@ -47,7 +47,7 @@ extends_documentation_fragment: - community.dns.options.record_transformation notes: - - The provider-specific I(hosttech_username), I(hosttech_password), and I(hosttech_token) options can be templated. + - The provider-specific O(hosttech_username), O(hosttech_password), and O(hosttech_token) options can be templated. author: - Markus Bergholz (@markuman) <markuman+spambelongstogoogle@gmail.com> @@ -63,7 +63,7 @@ EXAMPLES = ''' plugin: community.dns.hosttech_dns_records zone_name: domain.ch -filters: +simple_filters: type: - AAAA diff --git a/ansible_collections/community/dns/plugins/lookup/lookup.py b/ansible_collections/community/dns/plugins/lookup/lookup.py new file mode 100644 index 000000000..9f18164b1 --- /dev/null +++ b/ansible_collections/community/dns/plugins/lookup/lookup.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +DOCUMENTATION = r''' +name: lookup +author: Felix Fontein (@felixfontein) +short_description: Look up DNS records +version_added: 2.6.0 +requirements: + - dnspython >= 1.15.0 (maybe older versions also work) + - ipaddress (on Python 2.7 when using O(server)) +description: + - Look up DNS records. +options: + _terms: + description: + - Domain name(s) to query. + type: list + elements: str + required: true + type: + description: + - The record type to retrieve. + type: str + default: A + choices: + - A + - ALL + - AAAA + - CAA + - CNAME + - DNAME + - DNSKEY + - DS + - HINFO + - LOC + - MX + - NAPTR + - NS + - NSEC + - NSEC3 + - NSEC3PARAM + - PTR + - RP + - RRSIG + - SOA + - SPF + - SRV + - SSHFP + - TLSA + - TXT + query_retry: + description: + - Number of retries for DNS query timeouts. + type: int + default: 3 + query_timeout: + description: + - Timeout per DNS query in seconds. + type: float + default: 10 + server: + description: + - The DNS server(s) to use to look up the result. Must be a list of one or more IP addresses. + - By default, the system's standard resolver is used. + type: list + elements: str + servfail_retries: + description: + - How often to retry on SERVFAIL errors. + type: int + default: 0 + nxdomain_handling: + description: + - How to handle NXDOMAIN errors. These appear if an unknown domain name is queried. + - V(empty) (default) returns an empty result for that domain name. + This means that for the corresponding domain name, nothing is added to RV(_result). + - V(fail) makes the lookup fail. + - V(message) adds the string V(NXDOMAIN) to RV(_result). + type: str + choices: + - empty + - fail + - message + default: empty +notes: + - Note that when using this lookup plugin with V(lookup(\)), and the result is a one-element list, + Ansible simply returns the one element not as a list. Since this behavior is surprising and + can cause problems, it is better to use V(query(\)) instead of V(lookup(\)). See the examples + and also R(Forcing lookups to return lists, query) in the Ansible documentation. +''' + +EXAMPLES = """ +- name: Look up A (IPv4) records for example.org + ansible.builtin.debug: + msg: "{{ query('community.dns.lookup', 'example.org.') }}" + +- name: Look up AAAA (IPv6) records for example.org + ansible.builtin.debug: + msg: "{{ query('community.dns.lookup', 'example.org.', type='AAAA' ) }}" +""" + +RETURN = """ +_result: + description: + - The records of type O(type) for all queried DNS names. + - If multiple DNS names are queried in O(_terms), the resulting lists have been concatenated. + type: list + elements: str + sample: + - 127.0.0.1 +""" + +from ansible.errors import AnsibleLookupError +from ansible.plugins.lookup import LookupBase +from ansible.module_utils.common.text.converters import to_text + +from ansible_collections.community.dns.plugins.module_utils.ips import ( + is_ip_address, +) + +from ansible_collections.community.dns.plugins.module_utils.dnspython_records import ( + NAME_TO_RDTYPE, +) + +from ansible_collections.community.dns.plugins.module_utils.resolver import ( + SimpleResolver, +) + +from ansible_collections.community.dns.plugins.plugin_utils.ips import ( + assert_requirements_present as assert_requirements_present_ipaddress, +) + +from ansible_collections.community.dns.plugins.plugin_utils.resolver import ( + assert_requirements_present as assert_requirements_present_dnspython, + guarded_run, +) + +try: + import dns.resolver +except ImportError: + # handled by assert_requirements_present_dnspython + pass + + +class LookupModule(LookupBase): + @staticmethod + def _resolve(resolver, name, rdtype, server_addresses, nxdomain_handling): + def callback(): + try: + rrset = resolver.resolve( + name, + rdtype=rdtype, + server_addresses=server_addresses, + nxdomain_is_empty=nxdomain_handling == 'empty', + ) + if not rrset: + return [] + return [to_text(data) for data in rrset] + except dns.resolver.NXDOMAIN: + if nxdomain_handling == 'message': + return ['NXDOMAIN'] + raise AnsibleLookupError('Got NXDOMAIN when querying {name}'.format(name=name)) + + return guarded_run( + callback, + error_class=AnsibleLookupError, + server=name, + ) + + def run(self, terms, variables=None, **kwargs): + assert_requirements_present_dnspython('community.dns.lookup', 'lookup') + + self.set_options(var_options=variables, direct=kwargs) + + resolver = SimpleResolver( + timeout=self.get_option('query_timeout'), + timeout_retries=self.get_option('query_retry'), + servfail_retries=self.get_option('servfail_retries'), + ) + + rdtype = NAME_TO_RDTYPE[self.get_option('type')] + + nxdomain_handling = self.get_option('nxdomain_handling') + + server_addresses = None + if self.get_option('server'): + server_addresses = [] + assert_requirements_present_ipaddress('community.dns.lookup', 'lookup') + for server in self.get_option('server'): + if is_ip_address(server): + server_addresses.append(server) + continue + else: + server_addresses.extend(guarded_run( + lambda: resolver.resolve_addresses(server), + error_class=AnsibleLookupError, + server=server, + )) + + result = [] + for name in terms: + result.extend(self._resolve(resolver, name, rdtype, server_addresses, nxdomain_handling)) + return result diff --git a/ansible_collections/community/dns/plugins/lookup/lookup_as_dict.py b/ansible_collections/community/dns/plugins/lookup/lookup_as_dict.py new file mode 100644 index 000000000..8783d86c1 --- /dev/null +++ b/ansible_collections/community/dns/plugins/lookup/lookup_as_dict.py @@ -0,0 +1,497 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +DOCUMENTATION = r''' +name: lookup_as_dict +author: Felix Fontein (@felixfontein) +short_description: Look up DNS records as dictionaries +version_added: 2.6.0 +requirements: + - dnspython >= 1.15.0 (maybe older versions also work) + - ipaddress (on Python 2.7 when using O(server)) +description: + - Look up DNS records and return them as interpreted dictionaries. +options: + _terms: + description: + - Domain name(s) to query. + type: list + elements: str + required: true + type: + description: + - The record type to retrieve. + type: str + default: A + choices: + - A + - ALL + - AAAA + - CAA + - CNAME + - DNAME + - DNSKEY + - DS + - HINFO + - LOC + - MX + - NAPTR + - NS + - NSEC + - NSEC3 + - NSEC3PARAM + - PTR + - RP + - RRSIG + - SOA + - SPF + - SRV + - SSHFP + - TLSA + - TXT + query_retry: + description: + - Number of retries for DNS query timeouts. + type: int + default: 3 + query_timeout: + description: + - Timeout per DNS query in seconds. + type: float + default: 10 + server: + description: + - The DNS server(s) to use to look up the result. Must be a list of one or more IP addresses. + - By default, the system's standard resolver is used. + type: list + elements: str + servfail_retries: + description: + - How often to retry on SERVFAIL errors. + type: int + default: 0 + nxdomain_handling: + description: + - How to handle NXDOMAIN errors. These appear if an unknown domain name is queried. + - V(empty) (default) returns an empty result for that domain name. + This means that for the corresponding domain name, nothing is added to RV(_result). + - V(fail) makes the lookup fail. + type: str + choices: + - empty + - fail + default: empty +notes: + - Note that when using this lookup plugin with V(lookup(\)), and the result is a one-element list, + Ansible simply returns the one element not as a list. Since this behavior is surprising and + can cause problems, it is better to use V(query(\)) instead of V(lookup(\)). See the examples + and also R(Forcing lookups to return lists, query) in the Ansible documentation. +''' + +EXAMPLES = """ +- name: Look up A (IPv4) records for example.org as a list of dictionaries + ansible.builtin.debug: + msg: "{{ query('community.dns.lookup_as_dict', 'example.org.') }}" + +- name: Look up AAAA (IPv6) records for example.org as a list of IPv6 addresses + ansible.builtin.debug: + msg: "{{ query('community.dns.lookup_as_dict', 'example.org.', type='AAAA' ) | map(attribute='address') }}" + +- name: Look up TXT records for ansible.com as a list of strings + ansible.builtin.debug: + msg: "{{ query('community.dns.lookup_as_dict', 'ansible.com.', type='TXT' ) | map(attribute='value') }}" +""" + +RETURN = """ +_result: + description: + - The records of type O(type) for all queried DNS names. + - If multiple DNS names are queried in O(_terms), the resulting lists have been concatenated. + - Depending on O(type), different fields are returned. + - For O(type=TXT) and O(type=SPF), also the concatenated value is returned as RV(_result[].value). + type: list + elements: dict + sample: + - address: 127.0.0.1 + contains: + address: + description: + - A IPv4 respectively IPv6 address. + type: str + returned: if O(type=A) or O(type=AAAA) + algorithm: + description: + - The algorithm ID. + type: int + returned: if O(type=DNSKEY) or O(type=DS) or O(type=NSEC3) or O(type=NSEC3PARAM) or O(type=RRSIG) or O(type=SSHFP) + altitude: + description: + - The altitude. + type: float + returned: if O(type=LOC) + cert: + description: + - The certificate. + type: str + returned: if O(type=TLSA) + cpu: + description: + - The CPU. + type: str + returned: if O(type=HINFO) + digest: + description: + - The digest. + type: str + returned: if O(type=DS) + digest_type: + description: + - The digest's type. + type: int + returned: if O(type=DS) + exchange: + description: + - The exchange server. + type: str + returned: if O(type=MX) + expiration: + description: + - The expiration Unix timestamp. + type: int + returned: if O(type=RRSIG) + expire: + description: + - Number of seconds after which secondary name servers should stop answering request + for this zone if the main name server does not respond. + type: int + returned: if O(type=SOA) + fingerprint: + description: + - The fingerprint. + type: str + returned: if O(type=SSHFP) + flags: + description: + - Flags. + - This is actually of type C(string) for O(type=NAPTR). + type: int + returned: if O(type=CAA) or O(type=DNSKEY) or O(type=NAPTR) or O(type=NSEC3) or O(type=NSEC3PARAM) + fp_type: + description: + - The fingerprint's type. + type: int + returned: if O(type=SSHFP) + horizontal_precision: + description: + - The horizontal precision of the location. + type: float + returned: if O(type=LOC) + inception: + description: + - The inception Unix timestamp. + type: int + returned: if O(type=RRSIG) + iterations: + description: + - The number of iterations. + type: int + returned: if O(type=NSEC3) or O(type=NSEC3PARAM) + key: + description: + - The key. + type: str + returned: if O(type=DNSKEY) + key_tag: + description: + - The key's tag. + type: int + returned: if O(type=DS) or O(type=RRSIG) + labels: + description: + - The labels. + type: int + returned: if O(type=RRSIG) + latitude: + description: + - The location's latitude. + type: list + elements: int + returned: if O(type=LOC) + longitude: + description: + - The location's longitude. + type: list + elements: int + returned: if O(type=LOC) + mbox: + description: + - The mbox. + type: str + returned: if O(type=RP) + minimum: + description: + - Used to calculate the TTL for purposes of negative caching. + type: int + returned: if O(type=SOA) + mname: + description: + - Primary main name server for this zone. + type: str + returned: if O(type=SOA) + mtype: + description: + - The mtype. + type: int + returned: if O(type=TLSA) + next: + description: + - The next value. + type: str + returned: if O(type=NSEC) or O(type=NSEC3) + order: + description: + - The order value. + type: int + returned: if O(type=NAPTR) + original_ttl: + description: + - The original TTL. + type: int + returned: if O(type=RRSIG) + os: + description: + - The operating system. + type: str + returned: if O(type=HINFO) + port: + description: + - The port. + type: int + returned: if O(type=SRV) + preference: + description: + - The preference value for this record. + type: int + returned: if O(type=MX) or O(type=NAPTR) + priority: + description: + - The priority value for this record. + type: int + returned: if O(type=SRV) + protocol: + description: + - The protocol. + type: int + returned: if O(type=DNSKEY) + refresh: + description: + - Number of seconds after which secondary name servers should query the main + name server for the SOA record to detect zone changes. + type: int + returned: if O(type=SOA) + regexp: + description: + - A regular expression. + type: str + returned: if O(type=NAPTR) + replacement: + description: + - The replacement. + type: str + returned: if O(type=NAPTR) + retry: + description: + - Number of seconds after which secondary name servers should retry to request + the serial number from the main name server if the main name server does not respond. + type: int + returned: if O(type=SOA) + rname: + description: + - E-mail address of the administrator responsible for this zone. + type: str + returned: if O(type=SOA) + salt: + description: + - The salt. + type: str + returned: if O(type=NSEC3) or O(type=NSEC3PARAM) + selector: + description: + - The selector. + type: int + returned: if O(type=TLSA) + serial: + description: + - Serial number for this zone. + type: int + returned: if O(type=SOA) + service: + description: + - The service. + type: str + returned: if O(type=NAPTR) + signature: + description: + - The signature. + type: str + returned: if O(type=RRSIG) + signer: + description: + - The signer. + type: str + returned: if O(type=RRSIG) + size: + description: + - The size of the location. + type: float + returned: if O(type=LOC) + strings: + description: + - List of strings for this record. + - See RV(_result[].value) for the concatenated result. + type: list + elements: str + returned: if O(type=SPF) or O(type=TXT) + tag: + description: + - The tag. + type: str + returned: if O(type=CAA) + target: + description: + - The target. + type: str + returned: if O(type=CNAME) or O(type=DNAME) or O(type=NS) or O(type=PTR) or O(type=SRV) + txt: + description: + - The TXT value. + type: str + returned: if O(type=RP) + type_covered: + description: + - The type covered. + type: str + returned: if O(type=RRSIG) + usage: + description: + - The usage flag. + type: int + returned: if O(type=TLSA) + value: + description: + - The value. + - For O(type=SPF) or O(type=TXT), this is the concatenation of RV(_result[].strings). + type: str + returned: if O(type=CAA) or O(type=SPF) or O(type=TXT) + vertical_precision: + description: + - The vertical precision of the location. + type: float + returned: if O(type=LOC) + weight: + description: + - The service's weight. + type: int + returned: if O(type=SRV) + windows: + description: + - The windows. + type: str + returned: if O(type=NSEC) or O(type=NSEC3) +""" + +from ansible.errors import AnsibleLookupError +from ansible.plugins.lookup import LookupBase + +from ansible_collections.community.dns.plugins.module_utils.ips import ( + is_ip_address, +) + +from ansible_collections.community.dns.plugins.module_utils.dnspython_records import ( + NAME_TO_RDTYPE, + convert_rdata_to_dict, +) + +from ansible_collections.community.dns.plugins.module_utils.resolver import ( + SimpleResolver, +) + +from ansible_collections.community.dns.plugins.plugin_utils.ips import ( + assert_requirements_present as assert_requirements_present_ipaddress, +) + +from ansible_collections.community.dns.plugins.plugin_utils.resolver import ( + assert_requirements_present as assert_requirements_present_dnspython, + guarded_run, +) + +try: + import dns.resolver +except ImportError: + # handled by assert_requirements_present_dnspython + pass + + +class LookupModule(LookupBase): + @staticmethod + def _resolve(resolver, name, rdtype, server_addresses, nxdomain_handling): + def callback(): + try: + rrset = resolver.resolve( + name, + rdtype=rdtype, + server_addresses=server_addresses, + nxdomain_is_empty=nxdomain_handling == 'empty', + ) + if not rrset: + return [] + return [convert_rdata_to_dict(data) for data in rrset] + except dns.resolver.NXDOMAIN: + raise AnsibleLookupError('Got NXDOMAIN when querying {name}'.format(name=name)) + + return guarded_run( + callback, + error_class=AnsibleLookupError, + server=name, + ) + + def run(self, terms, variables=None, **kwargs): + assert_requirements_present_dnspython('community.dns.lookup', 'lookup_as_dict') + + self.set_options(var_options=variables, direct=kwargs) + + resolver = SimpleResolver( + timeout=self.get_option('query_timeout'), + timeout_retries=self.get_option('query_retry'), + servfail_retries=self.get_option('servfail_retries'), + ) + + rdtype = NAME_TO_RDTYPE[self.get_option('type')] + + nxdomain_handling = self.get_option('nxdomain_handling') + + server_addresses = None + if self.get_option('server'): + server_addresses = [] + assert_requirements_present_ipaddress('community.dns.lookup', 'lookup_as_dict') + for server in self.get_option('server'): + if is_ip_address(server): + server_addresses.append(server) + continue + else: + server_addresses.extend(guarded_run( + lambda: resolver.resolve_addresses(server), + error_class=AnsibleLookupError, + server=server, + )) + + result = [] + for name in terms: + result.extend(self._resolve(resolver, name, rdtype, server_addresses, nxdomain_handling)) + return result diff --git a/ansible_collections/community/dns/plugins/module_utils/conversion/txt.py b/ansible_collections/community/dns/plugins/module_utils/conversion/txt.py index a4521c7fa..7258ef58d 100644 --- a/ansible_collections/community/dns/plugins/module_utils/conversion/txt.py +++ b/ansible_collections/community/dns/plugins/module_utils/conversion/txt.py @@ -183,6 +183,10 @@ def encode_txt_value(value, always_quote=False, use_character_encoding=_SENTINEL # Add letter if letter in (b'"', b'\\'): + # Make sure that we don't split up an escape sequence over multiple TXT strings + if len(buffer) + 2 > 255: + append(buffer[:255]) + buffer = buffer[255:] buffer.append(b'\\') buffer.append(letter) elif use_character_encoding and not (0x20 <= ord(letter) < 0x7F): diff --git a/ansible_collections/community/dns/plugins/module_utils/dnspython_records.py b/ansible_collections/community/dns/plugins/module_utils/dnspython_records.py new file mode 100644 index 000000000..c5bb0b5e4 --- /dev/null +++ b/ansible_collections/community/dns/plugins/module_utils/dnspython_records.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015, Jan-Piet Mens <jpmens(at)gmail.com> +# Copyright (c) 2017 Ansible Project +# Copyright (c) 2022, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +import base64 + +from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text +from ansible.module_utils.six import binary_type + +NAME_TO_RDTYPE = {} +RDTYPE_TO_NAME = {} +RDTYPE_TO_FIELDS = {} + +try: + import dns.name + import dns.rdata + import dns.rdatatype + + # The following data has been borrowed from community.general's dig lookup plugin. + # + # Note: adding support for RRSIG is hard work. :) + for name, rdtype, fields in [ + ('A', dns.rdatatype.A, ['address']), + ('AAAA', dns.rdatatype.AAAA, ['address']), + ('CAA', dns.rdatatype.CAA, ['flags', 'tag', 'value']), + ('CNAME', dns.rdatatype.CNAME, ['target']), + ('DNAME', dns.rdatatype.DNAME, ['target']), + ('DNSKEY', dns.rdatatype.DNSKEY, ['flags', 'algorithm', 'protocol', 'key']), + ('DS', dns.rdatatype.DS, ['algorithm', 'digest_type', 'key_tag', 'digest']), + ('HINFO', dns.rdatatype.HINFO, ['cpu', 'os']), + ('LOC', dns.rdatatype.LOC, ['latitude', 'longitude', 'altitude', 'size', 'horizontal_precision', 'vertical_precision']), + ('MX', dns.rdatatype.MX, ['preference', 'exchange']), + ('NAPTR', dns.rdatatype.NAPTR, ['order', 'preference', 'flags', 'service', 'regexp', 'replacement']), + ('NS', dns.rdatatype.NS, ['target']), + ('NSEC', dns.rdatatype.NSEC, ['next', 'windows']), + ('NSEC3', dns.rdatatype.NSEC3, ['algorithm', 'flags', 'iterations', 'salt', 'next', 'windows']), + ('NSEC3PARAM', dns.rdatatype.NSEC3PARAM, ['algorithm', 'flags', 'iterations', 'salt']), + ('PTR', dns.rdatatype.PTR, ['target']), + ('RP', dns.rdatatype.RP, ['mbox', 'txt']), + ('RRSIG', dns.rdatatype.RRSIG, ['type_covered', 'algorithm', 'labels', 'original_ttl', 'expiration', 'inception', 'key_tag', 'signer', 'signature']), + ('SOA', dns.rdatatype.SOA, ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire', 'minimum']), + ('SPF', dns.rdatatype.SPF, ['strings']), + ('SRV', dns.rdatatype.SRV, ['priority', 'weight', 'port', 'target']), + ('SSHFP', dns.rdatatype.SSHFP, ['algorithm', 'fp_type', 'fingerprint']), + ('TLSA', dns.rdatatype.TLSA, ['usage', 'selector', 'mtype', 'cert']), + ('TXT', dns.rdatatype.TXT, ['strings']), + ]: + NAME_TO_RDTYPE[name] = rdtype + RDTYPE_TO_NAME[rdtype] = name + RDTYPE_TO_FIELDS[rdtype] = fields + +except ImportError: + pass # has to be handled on application level + + +def convert_rdata_to_dict(rdata, to_unicode=True, add_synthetic=True): + ''' + Convert a DNSPython record data object to a Python dictionary. + + Code borrowed from community.general's dig looup plugin. + + If ``to_unicode=True``, all strings will be converted to Unicode/UTF-8 strings. + + If ``add_synthetic=True``, for some record types additional fields are added. + For TXT and SPF records, ``value`` contains the concatenated strings, for example. + ''' + result = {} + + fields = RDTYPE_TO_FIELDS.get(rdata.rdtype) + if fields is None: + raise ValueError('Unsupported record type {rdtype}'.format(rdtype=rdata.rdtype)) + for f in fields: + val = rdata.__getattribute__(f) + + if isinstance(val, dns.name.Name): + val = dns.name.Name.to_text(val) + + if rdata.rdtype == dns.rdatatype.DS and f == 'digest': + val = dns.rdata._hexify(rdata.digest).replace(' ', '') + if rdata.rdtype == dns.rdatatype.DNSKEY and f == 'algorithm': + val = int(val) + if rdata.rdtype == dns.rdatatype.DNSKEY and f == 'key': + val = dns.rdata._base64ify(rdata.key).replace(' ', '') + if rdata.rdtype == dns.rdatatype.NSEC3 and f == 'next': + val = to_native(base64.b32encode(rdata.next).translate(dns.rdtypes.ANY.NSEC3.b32_normal_to_hex).lower()) + if rdata.rdtype in (dns.rdatatype.NSEC, dns.rdatatype.NSEC3) and f == 'windows': + try: + val = dns.rdtypes.util.Bitmap(rdata.windows).to_text().lstrip(' ') + except AttributeError: + # dnspython < 2.0.0 + val = [] + for window, bitmap in rdata.windows: + for i, byte in enumerate(bitmap): + for j in range(8): + if (byte >> (7 - j)) & 1 != 0: + val.append(dns.rdatatype.to_text(window * 256 + i * 8 + j)) + val = ' '.join(val).lstrip(' ') + if rdata.rdtype in (dns.rdatatype.NSEC3, dns.rdatatype.NSEC3PARAM) and f == 'salt': + val = dns.rdata._hexify(rdata.salt).replace(' ', '') + if rdata.rdtype == dns.rdatatype.RRSIG and f == 'type_covered': + val = RDTYPE_TO_NAME.get(rdata.type_covered) or str(val) + if rdata.rdtype == dns.rdatatype.RRSIG and f == 'algorithm': + val = int(val) + if rdata.rdtype == dns.rdatatype.RRSIG and f == 'signature': + val = dns.rdata._base64ify(rdata.signature).replace(' ', '') + if rdata.rdtype == dns.rdatatype.SSHFP and f == 'fingerprint': + val = dns.rdata._hexify(rdata.fingerprint).replace(' ', '') + if rdata.rdtype == dns.rdatatype.TLSA and f == 'cert': + val = dns.rdata._hexify(rdata.cert).replace(' ', '') + + if isinstance(val, (list, tuple)): + if to_unicode: + val = [to_text(v) if isinstance(v, binary_type) else v for v in val] + else: + val = list(val) + elif to_unicode and isinstance(val, binary_type): + val = to_text(val) + + result[f] = val + + if add_synthetic: + if rdata.rdtype in (dns.rdatatype.TXT, dns.rdatatype.SPF): + if to_unicode: + result['value'] = u''.join([to_text(str) for str in rdata.strings]) + else: + result['value'] = b''.join([to_bytes(str) for str in rdata.strings]) + return result diff --git a/ansible_collections/community/dns/plugins/module_utils/http.py b/ansible_collections/community/dns/plugins/module_utils/http.py index fc4e1a590..d904100fc 100644 --- a/ansible_collections/community/dns/plugins/module_utils/http.py +++ b/ansible_collections/community/dns/plugins/module_utils/http.py @@ -13,7 +13,8 @@ import abc from ansible.module_utils import six from ansible.module_utils.common.text.converters import to_native from ansible.module_utils.six import PY3 -from ansible.module_utils.urls import fetch_url, open_url, urllib_error, NoSSLError, ConnectionError +from ansible.module_utils.urls import fetch_url, open_url, NoSSLError, ConnectionError +import ansible.module_utils.six.moves.urllib.error as urllib_error class NetworkError(Exception): diff --git a/ansible_collections/community/dns/plugins/module_utils/ips.py b/ansible_collections/community/dns/plugins/module_utils/ips.py new file mode 100644 index 000000000..adad9d228 --- /dev/null +++ b/ansible_collections/community/dns/plugins/module_utils/ips.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +import traceback + +from ansible.module_utils.basic import missing_required_lib +from ansible.module_utils.common.text.converters import to_text + +try: + import ipaddress +except ImportError: + IPADDRESS_IMPORT_EXC = traceback.format_exc() +else: + IPADDRESS_IMPORT_EXC = None + + +def is_ip_address(server): + try: + ipaddress.ip_address(to_text(server)) + return True + except ValueError: + return False + + +def assert_requirements_present(module): + if IPADDRESS_IMPORT_EXC is not None: + module.fail_json( + msg=missing_required_lib('ipaddress'), + exception=IPADDRESS_IMPORT_EXC, + ) diff --git a/ansible_collections/community/dns/plugins/module_utils/resolver.py b/ansible_collections/community/dns/plugins/module_utils/resolver.py index 98f1034e0..280b697d4 100644 --- a/ansible_collections/community/dns/plugins/module_utils/resolver.py +++ b/ansible_collections/community/dns/plugins/module_utils/resolver.py @@ -10,7 +10,7 @@ __metaclass__ = type import traceback from ansible.module_utils.basic import missing_required_lib -from ansible.module_utils.common.text.converters import to_text +from ansible.module_utils.common.text.converters import to_native, to_text try: import dns @@ -27,23 +27,26 @@ else: DNSPYTHON_IMPORTERROR = None +_EDNS_SIZE = 1232 # equals dns.message.DEFAULT_EDNS_PAYLOAD; larger values cause problems with Route53 nameservers for me + + class ResolverError(Exception): pass -class ResolveDirectlyFromNameServers(object): - def __init__(self, timeout=10, timeout_retries=3, always_ask_default_resolver=True): - self.cache = {} +class _Resolve(object): + def __init__(self, timeout=10, timeout_retries=3, servfail_retries=0): self.timeout = timeout self.timeout_retries = timeout_retries + self.servfail_retries = servfail_retries self.default_resolver = dns.resolver.get_default_resolver() - self.default_nameservers = self.default_resolver.nameservers - self.always_ask_default_resolver = always_ask_default_resolver - def _handle_reponse_errors(self, target, response, nameserver=None, query=None): + def _handle_reponse_errors(self, target, response, nameserver=None, query=None, accept_errors=None): rcode = response.rcode() if rcode == dns.rcode.NOERROR: return True + if accept_errors and rcode in accept_errors: + return True if rcode == dns.rcode.NXDOMAIN: raise dns.resolver.NXDOMAIN(qnames=[target], responses={target: response}) msg = 'Error %s' % dns.rcode.to_text(rcode) @@ -63,6 +66,96 @@ class ResolveDirectlyFromNameServers(object): raise exc retry += 1 + def _resolve(self, resolver, dnsname, handle_response_errors=False, **kwargs): + retry = 0 + while True: + try: + response = self._handle_timeout(resolver.resolve, dnsname, lifetime=self.timeout, **kwargs) + except AttributeError: + # For dnspython < 2.0.0 + resolver.search = False + try: + response = self._handle_timeout(resolver.query, dnsname, lifetime=self.timeout, **kwargs) + except TypeError: + # For dnspython < 1.6.0 + resolver.lifetime = self.timeout + response = self._handle_timeout(resolver.query, dnsname, **kwargs) + if response.response.rcode() == dns.rcode.SERVFAIL and retry < self.servfail_retries: + retry += 1 + continue + if handle_response_errors: + self._handle_reponse_errors(dnsname, response.response, nameserver=resolver.nameservers) + return response.rrset + + +class SimpleResolver(_Resolve): + def __init__( + self, + timeout=10, + timeout_retries=3, + servfail_retries=0, + ): + super(SimpleResolver, self).__init__( + timeout=timeout, + timeout_retries=timeout_retries, + servfail_retries=servfail_retries, + ) + + def resolve(self, target, nxdomain_is_empty=True, server_addresses=None, **kwargs): + dnsname = dns.name.from_unicode(to_text(target)) + + resolver = self.default_resolver + if server_addresses: + resolver = dns.resolver.Resolver(configure=False) + resolver.timeout = self.timeout + resolver.nameservers = server_addresses + + resolver.use_edns(0, ednsflags=dns.flags.DO, payload=_EDNS_SIZE) + + try: + return self._resolve(resolver, dnsname, handle_response_errors=True, **kwargs) + except dns.resolver.NXDOMAIN: + if nxdomain_is_empty: + return None + raise + except dns.resolver.NoAnswer: + return None + + def resolve_addresses(self, target, **kwargs): + dnsname = dns.name.from_unicode(to_text(target)) + resolver = self.default_resolver + result = [] + try: + for data in self._resolve(resolver, dnsname, handle_response_errors=True, rdtype=dns.rdatatype.A, **kwargs): + result.append(str(data)) + except dns.resolver.NoAnswer: + pass + try: + for data in self._resolve(resolver, dnsname, handle_response_errors=True, rdtype=dns.rdatatype.AAAA, **kwargs): + result.append(str(data)) + except dns.resolver.NoAnswer: + pass + return result + + +class ResolveDirectlyFromNameServers(_Resolve): + def __init__( + self, + timeout=10, + timeout_retries=3, + servfail_retries=0, + always_ask_default_resolver=True, + server_addresses=None, + ): + super(ResolveDirectlyFromNameServers, self).__init__( + timeout=timeout, + timeout_retries=timeout_retries, + servfail_retries=servfail_retries, + ) + self.cache = {} + self.default_nameservers = self.default_resolver.nameservers if server_addresses is None else server_addresses + self.always_ask_default_resolver = always_ask_default_resolver + def _lookup_ns_names(self, target, nameservers=None, nameserver_ips=None): if self.always_ask_default_resolver: nameservers = None @@ -75,8 +168,16 @@ class ResolveDirectlyFromNameServers(object): raise ResolverError('Have neither nameservers nor nameserver IPs') query = dns.message.make_query(target, dns.rdatatype.NS) - response = self._handle_timeout(dns.query.udp, query, nameserver_ips[0], timeout=self.timeout) - self._handle_reponse_errors(target, response, nameserver=nameserver_ips[0], query='get NS for "%s"' % target) + retry = 0 + while True: + response = self._handle_timeout(dns.query.udp, query, nameserver_ips[0], timeout=self.timeout) + if response.rcode() == dns.rcode.SERVFAIL and retry < self.servfail_retries: + retry += 1 + continue + break + self._handle_reponse_errors( + target, response, nameserver=nameserver_ips[0], query='get NS for "%s"' % target, accept_errors=[dns.rcode.NXDOMAIN], + ) cname = None for rrset in response.answer: @@ -96,18 +197,8 @@ class ResolveDirectlyFromNameServers(object): def _lookup_address_impl(self, target, rdtype): try: - try: - answer = self._handle_timeout(self.default_resolver.resolve, target, rdtype=rdtype, lifetime=self.timeout) - except AttributeError: - # For dnspython < 2.0.0 - self.default_resolver.search = False - try: - answer = self._handle_timeout(self.default_resolver.query, target, rdtype=rdtype, lifetime=self.timeout) - except TypeError: - # For dnspython < 1.6.0 - self.default_resolver.lifetime = self.timeout - answer = self._handle_timeout(self.default_resolver.query, target, rdtype=rdtype) - return [str(res) for res in answer.rrset] + answer = self._resolve(self.default_resolver, target, handle_response_errors=True, rdtype=rdtype) + return [str(res) for res in answer] except dns.resolver.NoAnswer: return [] @@ -150,6 +241,7 @@ class ResolveDirectlyFromNameServers(object): resolver = self.cache.get(cache_index) if resolver is None: resolver = dns.resolver.Resolver(configure=False) + resolver.use_edns(0, ednsflags=dns.flags.DO, payload=_EDNS_SIZE) resolver.timeout = self.timeout nameserver_ips = set() for nameserver in nameservers: @@ -162,10 +254,10 @@ class ResolveDirectlyFromNameServers(object): nameservers = self._lookup_ns(dns.name.from_unicode(to_text(target))) if resolve_addresses: nameserver_ips = set() - for nameserver in nameservers: + for nameserver in nameservers or []: nameserver_ips.update(self._lookup_address(nameserver)) nameservers = list(nameserver_ips) - return sorted(nameservers) + return sorted(nameservers or []) def resolve(self, target, nxdomain_is_empty=True, **kwargs): dnsname = dns.name.from_unicode(to_text(target)) @@ -186,28 +278,47 @@ class ResolveDirectlyFromNameServers(object): loop_catcher.add(dnsname) results = {} - for nameserver in nameservers: + for nameserver in nameservers or []: results[nameserver] = None resolver = self._get_resolver(dnsname, [nameserver]) try: - try: - response = self._handle_timeout(resolver.resolve, dnsname, lifetime=self.timeout, **kwargs) - except AttributeError: - # For dnspython < 2.0.0 - resolver.search = False - try: - response = self._handle_timeout(resolver.query, dnsname, lifetime=self.timeout, **kwargs) - except TypeError: - # For dnspython < 1.6.0 - resolver.lifetime = self.timeout - response = self._handle_timeout(resolver.query, dnsname, **kwargs) - if response.rrset: - results[nameserver] = response.rrset + results[nameserver] = self._resolve(resolver, dnsname, handle_response_errors=True, **kwargs) except dns.resolver.NoAnswer: pass + except dns.resolver.NXDOMAIN: + if nxdomain_is_empty: + results[nameserver] = [] + else: + raise return results +def guarded_run(runner, module, server=None, generate_additional_results=None): + suffix = ' for {0}'.format(server) if server is not None else '' + kwargs = {} + try: + return runner() + except ResolverError as e: + if generate_additional_results is not None: + kwargs = generate_additional_results() + module.fail_json( + msg='Unexpected resolving error{0}: {1}'.format(suffix, to_native(e)), + exception=traceback.format_exc(), + **kwargs + ) + except dns.exception.DNSException as e: + if generate_additional_results is not None: + kwargs = generate_additional_results() + module.fail_json( + msg='Unexpected DNS error{0}: {1}'.format(suffix, to_native(e)), + exception=traceback.format_exc(), + **kwargs + ) + + def assert_requirements_present(module): if DNSPYTHON_IMPORTERROR is not None: - module.fail_json(msg=missing_required_lib('dnspython'), exception=DNSPYTHON_IMPORTERROR) + module.fail_json( + msg=missing_required_lib('dnspython'), + exception=DNSPYTHON_IMPORTERROR, + ) diff --git a/ansible_collections/community/dns/plugins/module_utils/zone_record_helpers.py b/ansible_collections/community/dns/plugins/module_utils/zone_record_helpers.py index 57277e29b..27b62c04d 100644 --- a/ansible_collections/community/dns/plugins/module_utils/zone_record_helpers.py +++ b/ansible_collections/community/dns/plugins/module_utils/zone_record_helpers.py @@ -37,7 +37,7 @@ def bulk_apply_changes(api, @param stop_early_on_errors: If set to ``True``, try to stop changes after the first error happens. This might only work on some APIs. @return A tuple (changed, errors, success) where ``changed`` is a boolean which indicates whether a - change was made, ``errors`` is a list of ``DNSAPIError`` instances for the errors occured, + change was made, ``errors`` is a list of ``DNSAPIError`` instances for the errors occurred, and ``success`` is a dictionary with three lists ``success['deleted']``, ``success['changed']`` and ``success['created']``, which list all records that were deleted, changed and created, respectively. diff --git a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record.py b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record.py index b17e0842c..23c873322 100644 --- a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record.py +++ b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record.py @@ -27,6 +27,7 @@ description: extends_documentation_fragment: - community.dns.hetzner - community.dns.hetzner.record_default_ttl + - community.dns.hetzner.record_notes - community.dns.hetzner.record_type_choices - community.dns.hetzner.zone_id_type - community.dns.module_record diff --git a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_info.py b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_info.py index 9d77a38d5..edf65aaca 100644 --- a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_info.py +++ b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_info.py @@ -37,6 +37,11 @@ attributes: author: - Markus Bergholz (@markuman) <markuman+spambelongstogoogle@gmail.com> - Felix Fontein (@felixfontein) + +seealso: + - module: community.dns.hetzner_dns_record_set_info + - plugin: community.dns.hetzner_dns_records + plugin_type: inventory ''' EXAMPLES = ''' @@ -58,7 +63,7 @@ records: description: The list of fetched records. type: list elements: dict - returned: success and I(what) is not C(single_record) + returned: success and O(what) is not V(single_record) contains: record: description: The record name. @@ -75,7 +80,7 @@ records: ttl: description: - The TTL. - - Will return C(none) if the zone's default TTL is used. + - Will return V(none) if the zone's default TTL is used. type: int sample: 3600 value: diff --git a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set.py b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set.py index 0766e6465..ce3ad313a 100644 --- a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set.py +++ b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set.py @@ -23,6 +23,7 @@ description: extends_documentation_fragment: - community.dns.hetzner - community.dns.hetzner.record_default_ttl + - community.dns.hetzner.record_notes - community.dns.hetzner.record_type_choices - community.dns.hetzner.zone_id_type - community.dns.module_record_set @@ -128,10 +129,9 @@ EXAMPLES = ''' zone: foo.com record: foo.com type: CAA - ttl: 3600 value: - - "128 issue letsencrypt.org" - - "128 iodef mailto:webmaster@foo.com" + - '128 issue "letsencrypt.org"' + - '128 iodef "mailto:webmaster@foo.com"' hetzner_token: access_token - name: Add an MX record diff --git a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set_info.py b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set_info.py index 5c70d1fb0..2df5d0f77 100644 --- a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set_info.py +++ b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_set_info.py @@ -37,6 +37,11 @@ attributes: author: - Markus Bergholz (@markuman) <markuman+spambelongstogoogle@gmail.com> - Felix Fontein (@felixfontein) + +seealso: + - module: community.dns.hetzner_dns_record_info + - plugin: community.dns.hetzner_dns_records + plugin_type: inventory ''' EXAMPLES = ''' @@ -57,7 +62,7 @@ RETURN = ''' set: description: The fetched record set. Is empty if record set does not exist. type: dict - returned: success and I(what) is C(single_record) + returned: success and O(what) is V(single_record) contains: record: description: The record name. @@ -76,7 +81,7 @@ set: description: - The TTL. - If there are records in this set with different TTLs, the minimum of the TTLs will be presented here. - - Will return C(none) if the zone's default TTL is used. + - Will return V(none) if the zone's default TTL is used. type: int sample: 3600 ttls: @@ -109,7 +114,7 @@ sets: description: The list of fetched record sets. type: list elements: dict - returned: success and I(what) is not C(single_record) + returned: success and O(what) is not V(single_record) contains: record: description: The record name. @@ -128,7 +133,7 @@ sets: description: - The TTL. - If there are records in this set with different TTLs, the minimum of the TTLs will be presented here. - - Will return C(none) if the zone's default TTL is used. + - Will return V(none) if the zone's default TTL is used. type: int sample: 3600 ttls: diff --git a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_sets.py b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_sets.py index 52857186c..e7d515efe 100644 --- a/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_sets.py +++ b/ansible_collections/community/dns/plugins/modules/hetzner_dns_record_sets.py @@ -22,6 +22,7 @@ description: extends_documentation_fragment: - community.dns.hetzner + - community.dns.hetzner.record_notes - community.dns.hetzner.record_type_choices_record_sets_module - community.dns.hetzner.zone_id_type - community.dns.module_record_sets diff --git a/ansible_collections/community/dns/plugins/modules/hetzner_dns_zone_info.py b/ansible_collections/community/dns/plugins/modules/hetzner_dns_zone_info.py index 44cc88af5..9f4626e06 100644 --- a/ansible_collections/community/dns/plugins/modules/hetzner_dns_zone_info.py +++ b/ansible_collections/community/dns/plugins/modules/hetzner_dns_zone_info.py @@ -121,7 +121,7 @@ zone_info: status: description: - Status of the zone. - - Can be one of C(verified), C(failed) and C(pending). + - Can be one of V(verified), V(failed) and V(pending). type: str sample: verified # choices: diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record.py index 0756b6a4c..1473f6624 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record.py @@ -28,6 +28,7 @@ description: extends_documentation_fragment: - community.dns.hosttech - community.dns.hosttech.record_default_ttl + - community.dns.hosttech.record_notes - community.dns.hosttech.record_type_choices - community.dns.hosttech.zone_id_type - community.dns.module_record diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_info.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_info.py index 84ee8e3b2..71004464e 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_info.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_info.py @@ -36,6 +36,11 @@ attributes: author: - Felix Fontein (@felixfontein) + +seealso: + - module: community.dns.hosttech_dns_record_set_info + - plugin: community.dns.hosttech_dns_records + plugin_type: inventory ''' EXAMPLES = ''' @@ -57,7 +62,7 @@ records: description: The list of fetched records. type: list elements: dict - returned: success and I(what) is not C(single_record) + returned: success and O(what) is not V(single_record) contains: record: description: The record name. diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set.py index d16c82ad7..7da02aec4 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set.py @@ -24,6 +24,7 @@ description: extends_documentation_fragment: - community.dns.hosttech - community.dns.hosttech.record_default_ttl + - community.dns.hosttech.record_notes - community.dns.hosttech.record_type_choices - community.dns.hosttech.zone_id_type - community.dns.module_record_set @@ -128,8 +129,8 @@ EXAMPLES = ''' type: CAA ttl: 3600 value: - - "128 issue letsencrypt.org" - - "128 iodef mailto:webmaster@foo.com" + - '128 issue "letsencrypt.org"' + - '128 iodef "mailto:webmaster@foo.com"' hosttech_token: access_token - name: Add an MX record diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set_info.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set_info.py index 5b7c576b8..60a54809d 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set_info.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_set_info.py @@ -19,7 +19,7 @@ version_added: 0.1.0 description: - "Retrieves DNS record sets in Hosttech DNS service." - - This module was renamed from C(community.dns.hosttech_dns_record_info) to C(community.dns.hosttech_dns_record_set_info) + - This module was renamed from C(community.dns.hosttech_dns_record_info) to M(community.dns.hosttech_dns_record_set_info) in community.dns 2.0.0. extends_documentation_fragment: @@ -38,6 +38,11 @@ attributes: author: - Felix Fontein (@felixfontein) + +seealso: + - module: community.dns.hosttech_dns_record_info + - plugin: community.dns.hosttech_dns_records + plugin_type: inventory ''' EXAMPLES = ''' @@ -58,7 +63,7 @@ RETURN = ''' set: description: The fetched record set. Is empty if record set does not exist. type: dict - returned: success and I(what) is C(single_record) + returned: success and O(what=single_record) contains: record: description: The record name. @@ -109,7 +114,7 @@ sets: description: The list of fetched record sets. type: list elements: dict - returned: success and I(what) is not C(single_record) + returned: success and O(what=single_record) contains: record: description: The record name. diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_sets.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_sets.py index c985779ca..583cfa58e 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_sets.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_record_sets.py @@ -23,6 +23,7 @@ description: extends_documentation_fragment: - community.dns.hosttech + - community.dns.hosttech.record_notes - community.dns.hosttech.record_type_choices_record_sets_module - community.dns.hosttech.zone_id_type - community.dns.module_record_sets diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_records.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_records.py index c985779ca..583cfa58e 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_records.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_records.py @@ -23,6 +23,7 @@ description: extends_documentation_fragment: - community.dns.hosttech + - community.dns.hosttech.record_notes - community.dns.hosttech.record_type_choices_record_sets_module - community.dns.hosttech.zone_id_type - community.dns.module_record_sets diff --git a/ansible_collections/community/dns/plugins/modules/hosttech_dns_zone_info.py b/ansible_collections/community/dns/plugins/modules/hosttech_dns_zone_info.py index 6621893a7..d364d0694 100644 --- a/ansible_collections/community/dns/plugins/modules/hosttech_dns_zone_info.py +++ b/ansible_collections/community/dns/plugins/modules/hosttech_dns_zone_info.py @@ -80,22 +80,22 @@ zone_info: description: - Whether DNSSEC is enabled for the zone or not. type: bool - returned: When I(hosttech_token) has been specified. + returned: When O(hosttech_token) has been specified. dnssec_email: description: - The email address contacted when the DNSSEC key is changed. - - Is C(none) if DNSSEC is not enabled. + - Is V(none) if DNSSEC is not enabled. type: str - returned: When I(hosttech_token) has been specified. + returned: When O(hosttech_token) has been specified. ds_records: description: - The DS records. - See L(Section 5 of RFC 4034,https://datatracker.ietf.org/doc/html/rfc4034#section-5) and L(Section 2.1 of RFC 4034,https://datatracker.ietf.org/doc/html/rfc4034#section-2.1) for details. - - Is C(none) if DNSSEC is not enabled. + - Is V(none) if DNSSEC is not enabled. type: list elements: dict - returned: When I(hosttech_token) has been specified. + returned: When O(hosttech_token) has been specified. contains: algorithm: description: diff --git a/ansible_collections/community/dns/plugins/modules/nameserver_info.py b/ansible_collections/community/dns/plugins/modules/nameserver_info.py new file mode 100644 index 000000000..62ba30961 --- /dev/null +++ b/ansible_collections/community/dns/plugins/modules/nameserver_info.py @@ -0,0 +1,168 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright (c) 2022, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +DOCUMENTATION = r''' +--- +module: nameserver_info +short_description: Look up nameservers for a DNS name +version_added: 2.6.0 +description: + - Retrieve all nameservers that are responsible for a DNS name. +extends_documentation_fragment: + - community.dns.attributes + - community.dns.attributes.info_module +author: + - Felix Fontein (@felixfontein) +options: + name: + description: + - A list of DNS names whose nameservers to retrieve. + required: true + type: list + elements: str + resolve_addresses: + description: + - Whether to resolve the nameserver names to IP addresses. + type: bool + default: false + query_retry: + description: + - Number of retries for DNS query timeouts. + type: int + default: 3 + query_timeout: + description: + - Timeout per DNS query in seconds. + type: float + default: 10 + always_ask_default_resolver: + description: + - When set to V(true) (default), will use the default resolver to find the authoritative nameservers + of a subzone. See O(server) for how to configure the default resolver. + - When set to V(false), will use the authoritative nameservers of the parent zone to find the + authoritative nameservers of a subzone. This only makes sense when the nameservers were recently + changed and have not yet propagated. + type: bool + default: true + servfail_retries: + description: + - How often to retry on SERVFAIL errors. + type: int + default: 0 + server: + description: + - The DNS server(s) to use to look up the result. Must be a list of one or more IP addresses. + - By default, the system's standard resolver is used. + type: list + elements: str + version_added: 2.7.0 +requirements: + - dnspython >= 1.15.0 (maybe older versions also work) +''' + +EXAMPLES = r''' +- name: Retrieve name servers of two DNS names + community.dns.nameserver_info: + name: + - www.example.com + - example.org + register: result + +- name: Show nameservers for www.example.com + ansible.builtin.debug: + msg: '{{ result.results[0].nameserver }}' +''' + +RETURN = r''' +results: + description: + - Information on the nameservers for every DNS name provided in O(name). + returned: always + type: list + elements: dict + contains: + name: + description: + - The DNS name this entry is for. + returned: always + type: str + sample: www.example.com + nameservers: + description: + - A list of nameservers for this DNS name. + returned: success + type: list + elements: str + sample: + - ns1.example.com + - ns2.example.com + sample: + - name: www.example.com + nameservers: + - ns1.example.com + - ns2.example.com + - name: example.org + nameservers: + - ns1.example.org + - ns2.example.org + - ns3.example.org +''' + +from ansible.module_utils.basic import AnsibleModule + +from ansible_collections.community.dns.plugins.module_utils.resolver import ( + ResolveDirectlyFromNameServers, + assert_requirements_present, + guarded_run, +) + + +def main(): + module = AnsibleModule( + argument_spec=dict( + name=dict(required=True, type='list', elements='str'), + resolve_addresses=dict(type='bool', default=False), + query_retry=dict(type='int', default=3), + query_timeout=dict(type='float', default=10), + always_ask_default_resolver=dict(type='bool', default=True), + servfail_retries=dict(type='int', default=0), + server=dict(type='list', elements='str'), + ), + supports_check_mode=True, + ) + assert_requirements_present(module) + + names = module.params['name'] + resolve_addresses = module.params['resolve_addresses'] + + resolver = ResolveDirectlyFromNameServers( + timeout=module.params['query_timeout'], + timeout_retries=module.params['query_retry'], + servfail_retries=module.params['servfail_retries'], + always_ask_default_resolver=module.params['always_ask_default_resolver'], + server_addresses=module.params['server'], + ) + results = [None] * len(names) + for index, name in enumerate(names): + results[index] = { + 'name': name, + } + + def f(): + for index, name in enumerate(names): + results[index]['nameservers'] = sorted(resolver.resolve_nameservers(name, resolve_addresses=resolve_addresses)) + + guarded_run(f, module, generate_additional_results=lambda: dict(results=results)) + module.exit_json(results=results) + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/community/dns/plugins/modules/nameserver_record_info.py b/ansible_collections/community/dns/plugins/modules/nameserver_record_info.py new file mode 100644 index 000000000..f9374acae --- /dev/null +++ b/ansible_collections/community/dns/plugins/modules/nameserver_record_info.py @@ -0,0 +1,568 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright (c) 2022, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +DOCUMENTATION = r''' +--- +module: nameserver_record_info +short_description: Look up all records of a type from all nameservers for a DNS name +version_added: 2.6.0 +description: + - Given a DNS name and a record type, will retrieve all nameservers that are responsible for + this DNS name, and from them all records for this name of the given type. +extends_documentation_fragment: + - community.dns.attributes + - community.dns.attributes.info_module +author: + - Felix Fontein (@felixfontein) +options: + name: + description: + - A list of DNS names whose nameservers to retrieve. + required: true + type: list + elements: str + type: + description: + - The record type to retrieve. + required: true + type: str + choices: + - A + - ALL + - AAAA + - CAA + - CNAME + - DNAME + - DNSKEY + - DS + - HINFO + - LOC + - MX + - NAPTR + - NS + - NSEC + - NSEC3 + - NSEC3PARAM + - PTR + - RP + - RRSIG + - SOA + - SPF + - SRV + - SSHFP + - TLSA + - TXT + query_retry: + description: + - Number of retries for DNS query timeouts. + type: int + default: 3 + query_timeout: + description: + - Timeout per DNS query in seconds. + type: float + default: 10 + always_ask_default_resolver: + description: + - When set to V(true) (default), will use the default resolver to find the authoritative nameservers + of a subzone. See O(server) for how to configure the default resolver. + - When set to V(false), will use the authoritative nameservers of the parent zone to find the + authoritative nameservers of a subzone. This only makes sense when the nameservers were recently + changed and have not yet propagated. + type: bool + default: true + servfail_retries: + description: + - How often to retry on SERVFAIL errors. + type: int + default: 0 + server: + description: + - The DNS server(s) to use to look up the result. Must be a list of one or more IP addresses. + - By default, the system's standard resolver is used. + type: list + elements: str + version_added: 2.7.0 +requirements: + - dnspython >= 1.15.0 (maybe older versions also work) +notes: + - dnspython before 2.0.0 does not correctly support (un-)escaping UTF-8 in TXT-like records. This can + result in wrongly decoded TXT records. Please use dnspython 2.0.0 or later to fix this issue; see also + U(https://github.com/rthalley/dnspython/issues/321). + Unfortunately dnspython 2.0.0 requires Python 3.6 or newer. +''' + +EXAMPLES = r''' +- name: Retrieve TXT values from all nameservers for two DNS names + community.dns.nameserver_record_info: + name: + - www.example.com + - example.org + type: TXT + register: result + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result.results[0].result }}' +''' + +RETURN = r''' +results: + description: + - Information on the records for every DNS name provided in O(name). + returned: always + type: list + elements: dict + contains: + name: + description: + - The DNS name this entry is for. + returned: always + type: str + sample: www.example.com + result: + description: + - A list of values per nameserver. + returned: success + type: list + elements: dict + sample: + - nameserver: ns1.example.com + values: + - X + - nameserver: ns2.example.com + values: + - X + contains: + nameserver: + description: + - The nameserver. + returned: success + type: str + sample: ns1.example.com + values: + description: + - The records of type O(type). + - Depending on O(type), different fields are returned. + - For O(type=TXT) and O(type=SPF), also the concatenated value is returned as RV(results[].result[].values[].value). + returned: success + type: list + elements: dict + sample: + - address: 127.0.0.1 + contains: + address: + description: + - A IPv4 respectively IPv6 address. + type: str + returned: if O(type=A) or O(type=AAAA) + algorithm: + description: + - The algorithm ID. + type: int + returned: if O(type=DNSKEY) or O(type=DS) or O(type=NSEC3) or O(type=NSEC3PARAM) or O(type=RRSIG) or O(type=SSHFP) + altitude: + description: + - The altitude. + type: float + returned: if O(type=LOC) + cert: + description: + - The certificate. + type: str + returned: if O(type=TLSA) + cpu: + description: + - The CPU. + type: str + returned: if O(type=HINFO) + digest: + description: + - The digest. + type: str + returned: if O(type=DS) + digest_type: + description: + - The digest's type. + type: int + returned: if O(type=DS) + exchange: + description: + - The exchange server. + type: str + returned: if O(type=MX) + expiration: + description: + - The expiration Unix timestamp. + type: int + returned: if O(type=RRSIG) + expire: + description: + - Number of seconds after which secondary name servers should stop answering request + for this zone if the main name server does not respond. + type: int + returned: if O(type=SOA) + fingerprint: + description: + - The fingerprint. + type: str + returned: if O(type=SSHFP) + flags: + description: + - Flags. + - This is actually of type C(string) for O(type=NAPTR). + type: int + returned: if O(type=CAA) or O(type=DNSKEY) or O(type=NAPTR) or O(type=NSEC3) or O(type=NSEC3PARAM) + fp_type: + description: + - The fingerprint's type. + type: int + returned: if O(type=SSHFP) + horizontal_precision: + description: + - The horizontal precision of the location. + type: float + returned: if O(type=LOC) + inception: + description: + - The inception Unix timestamp. + type: int + returned: if O(type=RRSIG) + iterations: + description: + - The number of iterations. + type: int + returned: if O(type=NSEC3) or O(type=NSEC3PARAM) + key: + description: + - The key. + type: str + returned: if O(type=DNSKEY) + key_tag: + description: + - The key's tag. + type: int + returned: if O(type=DS) or O(type=RRSIG) + labels: + description: + - The labels. + type: int + returned: if O(type=RRSIG) + latitude: + description: + - The location's latitude. + type: list + elements: int + returned: if O(type=LOC) + longitude: + description: + - The location's longitude. + type: list + elements: int + returned: if O(type=LOC) + mbox: + description: + - The mbox. + type: str + returned: if O(type=RP) + minimum: + description: + - Used to calculate the TTL for purposes of negative caching. + type: int + returned: if O(type=SOA) + mname: + description: + - Primary main name server for this zone. + type: str + returned: if O(type=SOA) + mtype: + description: + - The mtype. + type: int + returned: if O(type=TLSA) + next: + description: + - The next value. + type: str + returned: if O(type=NSEC) or O(type=NSEC3) + order: + description: + - The order value. + type: int + returned: if O(type=NAPTR) + original_ttl: + description: + - The original TTL. + type: int + returned: if O(type=RRSIG) + os: + description: + - The operating system. + type: str + returned: if O(type=HINFO) + port: + description: + - The port. + type: int + returned: if O(type=SRV) + preference: + description: + - The preference value for this record. + type: int + returned: if O(type=MX) or O(type=NAPTR) + priority: + description: + - The priority value for this record. + type: int + returned: if O(type=SRV) + protocol: + description: + - The protocol. + type: int + returned: if O(type=DNSKEY) + refresh: + description: + - Number of seconds after which secondary name servers should query the main + name server for the SOA record to detect zone changes. + type: int + returned: if O(type=SOA) + regexp: + description: + - A regular expression. + type: str + returned: if O(type=NAPTR) + replacement: + description: + - The replacement. + type: str + returned: if O(type=NAPTR) + retry: + description: + - Number of seconds after which secondary name servers should retry to request + the serial number from the main name server if the main name server does not respond. + type: int + returned: if O(type=SOA) + rname: + description: + - E-mail address of the administrator responsible for this zone. + type: str + returned: if O(type=SOA) + salt: + description: + - The salt. + type: str + returned: if O(type=NSEC3) or O(type=NSEC3PARAM) + selector: + description: + - The selector. + type: int + returned: if O(type=TLSA) + serial: + description: + - Serial number for this zone. + type: int + returned: if O(type=SOA) + service: + description: + - The service. + type: str + returned: if O(type=NAPTR) + signature: + description: + - The signature. + type: str + returned: if O(type=RRSIG) + signer: + description: + - The signer. + type: str + returned: if O(type=RRSIG) + size: + description: + - The size of the location. + type: float + returned: if O(type=LOC) + strings: + description: + - List of strings for this record. + - See RV(results[].result[].values[].value) for the concatenated result. + type: list + elements: str + returned: if O(type=SPF) or O(type=TXT) + tag: + description: + - The tag. + type: str + returned: if O(type=CAA) + target: + description: + - The target. + type: str + returned: if O(type=CNAME) or O(type=DNAME) or O(type=NS) or O(type=PTR) or O(type=SRV) + txt: + description: + - The TXT value. + type: str + returned: if O(type=RP) + type_covered: + description: + - The type covered. + type: str + returned: if O(type=RRSIG) + usage: + description: + - The usage flag. + type: int + returned: if O(type=TLSA) + value: + description: + - The value. + - For O(type=SPF) or O(type=TXT), this is the concatenation of RV(results[].result[].values[].strings). + type: str + returned: if O(type=CAA) or O(type=SPF) or O(type=TXT) + vertical_precision: + description: + - The vertical precision of the location. + type: float + returned: if O(type=LOC) + weight: + description: + - The service's weight. + type: int + returned: if O(type=SRV) + windows: + description: + - The windows. + type: str + returned: if O(type=NSEC) or O(type=NSEC3) + sample: + - name: www.example.com + result: + - nameserver: ns1.example.com + values: + - address: 127.0.0.1 + - nameserver: ns2.example.com + values: + - address: 127.0.0.1 + - name: example.org + result: + - nameserver: ns1.example.org + values: + - address: 127.0.0.1 + - address: 127.0.0.2 + - nameserver: ns2.example.org + values: + - address: 127.0.0.2 + - nameserver: ns3.example.org + values: + - address: 127.0.0.1 +''' + +from ansible.module_utils.basic import AnsibleModule + +from ansible_collections.community.dns.plugins.module_utils.resolver import ( + ResolveDirectlyFromNameServers, + assert_requirements_present, + guarded_run, +) + +from ansible_collections.community.dns.plugins.module_utils.dnspython_records import ( + NAME_TO_RDTYPE, + convert_rdata_to_dict, +) + + +def main(): + module = AnsibleModule( + argument_spec=dict( + name=dict(required=True, type='list', elements='str'), + type=dict( + required=True, + type='str', + choices=[ + 'A', + 'ALL', + 'AAAA', + 'CAA', + 'CNAME', + 'DNAME', + 'DNSKEY', + 'DS', + 'HINFO', + 'LOC', + 'MX', + 'NAPTR', + 'NS', + 'NSEC', + 'NSEC3', + 'NSEC3PARAM', + 'PTR', + 'RP', + 'RRSIG', + 'SOA', + 'SPF', + 'SRV', + 'SSHFP', + 'TLSA', + 'TXT', + ], + ), + query_retry=dict(type='int', default=3), + query_timeout=dict(type='float', default=10), + always_ask_default_resolver=dict(type='bool', default=True), + servfail_retries=dict(type='int', default=0), + server=dict(type='list', elements='str'), + ), + supports_check_mode=True, + ) + assert_requirements_present(module) + + names = module.params['name'] + record_type = module.params['type'] + + resolver = ResolveDirectlyFromNameServers( + timeout=module.params['query_timeout'], + timeout_retries=module.params['query_retry'], + servfail_retries=module.params['servfail_retries'], + always_ask_default_resolver=module.params['always_ask_default_resolver'], + server_addresses=module.params['server'], + ) + results = [None] * len(names) + for index, name in enumerate(names): + results[index] = { + 'name': name, + } + + rdtype = NAME_TO_RDTYPE[record_type] + + def f(): + for index, name in enumerate(names): + result = [] + results[index]['result'] = result + records_for_nameservers = resolver.resolve(name, rdtype=rdtype) + for nameserver, records in records_for_nameservers.items(): + ns_result = { + 'nameserver': nameserver, + } + result.append(ns_result) + values = [] + if records is not None: + for data in records: + values.append(convert_rdata_to_dict(data)) + ns_result['values'] = values + result.sort(key=lambda v: v['nameserver']) + + guarded_run(f, module, generate_additional_results=lambda: dict(results=results)) + module.exit_json(results=results) + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/community/dns/plugins/modules/wait_for_txt.py b/ansible_collections/community/dns/plugins/modules/wait_for_txt.py index 1a09c5ed6..7252ae883 100644 --- a/ansible_collections/community/dns/plugins/modules/wait_for_txt.py +++ b/ansible_collections/community/dns/plugins/modules/wait_for_txt.py @@ -40,7 +40,7 @@ options: suboptions: name: description: - - A DNS name, like C(www.example.com). + - A DNS name, like V(www.example.com). type: str required: true values: @@ -51,17 +51,17 @@ options: required: true mode: description: - - Comparison modes for the values in I(values). - - If C(subset), I(values) should be a (not necessarily proper) subset of the TXT values set for + - Comparison modes for the values in O(records[].values). + - If V(subset), O(records[].values) should be a (not necessarily proper) subset of the TXT values set for the DNS name. - - If C(superset), I(values) should be a (not necessarily proper) superset of the TXT values set + - If V(superset), O(records[].values) should be a (not necessarily proper) superset of the TXT values set for the DNS name. This includes the case that no TXT entries are set. - - If C(superset_not_empty), I(values) should be a (not necessarily proper) superset of the TXT + - If V(superset_not_empty), O(records[].values) should be a (not necessarily proper) superset of the TXT values set for the DNS name, assuming at least one TXT record is present. - - If C(equals), I(values) should be the same set of strings as the TXT values for the DNS name + - If V(equals), O(records[].values) should be the same set of strings as the TXT values for the DNS name (up to order). - - If C(equals_ordered), I(values) should be the same ordered list of strings as the TXT values + - If V(equals_ordered), O(records[].values) should be the same ordered list of strings as the TXT values for the DNS name. type: str default: subset @@ -93,13 +93,26 @@ options: default: 10 always_ask_default_resolver: description: - - When set to C(true) (default), will use the default resolver to find the authoritative nameservers - of a subzone. - - When set to C(false), will use the authoritative nameservers of the parent zone to find the + - When set to V(true) (default), will use the default resolver to find the authoritative nameservers + of a subzone. See O(server) for how to configure the default resolver. + - When set to V(false), will use the authoritative nameservers of the parent zone to find the authoritative nameservers of a subzone. This only makes sense when the nameservers were recently - changed and haven't propagated. + changed and have not yet propagated. type: bool default: true + servfail_retries: + description: + - How often to retry on SERVFAIL errors. + type: int + default: 0 + version_added: 2.6.0 + server: + description: + - The DNS server(s) to use to look up the result. Must be a list of one or more IP addresses. + - By default, the system's standard resolver is used. + type: list + elements: str + version_added: 2.7.0 requirements: - dnspython >= 1.15.0 (maybe older versions also work) ''' @@ -124,7 +137,7 @@ RETURN = r''' records: description: - Results on the TXT records queried. - - The entries are in a 1:1 correspondence to the entries of the I(records) parameter, + - The entries are in a 1:1 correspondence to the entries of the O(records) parameter, in exactly the same order. returned: always type: list @@ -180,7 +193,6 @@ completed: ''' import time -import traceback try: from time import monotonic @@ -188,16 +200,15 @@ except ImportError: from time import clock as monotonic from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.text.converters import to_native, to_text +from ansible.module_utils.common.text.converters import to_text from ansible_collections.community.dns.plugins.module_utils.resolver import ( ResolveDirectlyFromNameServers, - ResolverError, assert_requirements_present, + guarded_run, ) try: - import dns.exception import dns.rdatatype except ImportError: pass # handled in assert_requirements_present() @@ -238,97 +249,107 @@ def validate_check(record_values, expected_values, comparison_mode): raise Exception('Internal error!') -def main(): - module = AnsibleModule( - argument_spec=dict( - records=dict(required=True, type='list', elements='dict', options=dict( - name=dict(required=True, type='str'), - values=dict(required=True, type='list', elements='str'), - mode=dict(type='str', default='subset', choices=['subset', 'superset', 'superset_not_empty', 'equals', 'equals_ordered']), - )), - query_retry=dict(type='int', default=3), - query_timeout=dict(type='float', default=10), - timeout=dict(type='float'), - max_sleep=dict(type='float', default=10), - always_ask_default_resolver=dict(type='bool', default=True), - ), - supports_check_mode=True, - ) - assert_requirements_present(module) +class Waiter(object): + def __init__(self, module): + self.module = module + + self.resolver = ResolveDirectlyFromNameServers( + timeout=self.module.params['query_timeout'], + timeout_retries=self.module.params['query_retry'], + servfail_retries=self.module.params['servfail_retries'], + always_ask_default_resolver=self.module.params['always_ask_default_resolver'], + server_addresses=self.module.params['server'], + ) + self.records = self.module.params['records'] + self.timeout = self.module.params['timeout'] + self.max_sleep = self.module.params['max_sleep'] + + self.results = [None] * len(self.records) + for index in range(len(self.records)): + self.results[index] = { + 'name': self.records[index]['name'], + 'done': False, + 'check_count': 0, + } + self.finished_checks = 0 + + def _run(self): + self.start_time = monotonic() - resolver = ResolveDirectlyFromNameServers( - timeout=module.params['query_timeout'], - timeout_retries=module.params['query_retry'], - always_ask_default_resolver=module.params['always_ask_default_resolver'], - ) - records = module.params['records'] - timeout = module.params['timeout'] - max_sleep = module.params['max_sleep'] - - results = [None] * len(records) - for index in range(len(records)): - results[index] = { - 'name': records[index]['name'], - 'done': False, - 'check_count': 0, - } - finished_checks = 0 - - start_time = monotonic() - try: step = 0 while True: has_timeout = False - if timeout is not None: - expired = monotonic() - start_time - has_timeout = expired > timeout + if self.timeout is not None: + expired = monotonic() - self.start_time + has_timeout = expired > self.timeout done = True - for index, record in enumerate(records): - if results[index]['done']: + for index, record in enumerate(self.records): + if self.results[index]['done']: continue - txts = lookup(resolver, record['name']) - results[index]['values'] = txts - results[index]['check_count'] += 1 + txts = lookup(self.resolver, record['name']) + self.results[index]['values'] = txts + self.results[index]['check_count'] += 1 if txts and all(validate_check(txt, record['values'], record['mode']) for txt in txts.values()): - results[index]['done'] = True - finished_checks += 1 + self.results[index]['done'] = True + self.finished_checks += 1 else: done = False if done: - module.exit_json( + self.module.exit_json( msg='All checks passed', - records=results, - completed=finished_checks) + **self._generate_additional_results() + ) if has_timeout: - module.fail_json( - msg='Timeout ({0} out of {1} check(s) passed).'.format(finished_checks, len(records)), - records=results, - completed=finished_checks) + self.module.fail_json( + msg='Timeout ({0} out of {1} check(s) passed).'.format(self.finished_checks, len(self.records)), + **self._generate_additional_results() + ) # Simple quadratic sleep with maximum wait of max_sleep seconds - wait = min(2 + step * 0.5, max_sleep) - if timeout is not None: + wait = min(2 + step * 0.5, self.max_sleep) + if self.timeout is not None: # Make sure we do not exceed the timeout by much by waiting - expired = monotonic() - start_time - wait = max(min(wait, timeout - expired + 0.1), 0.1) + expired = monotonic() - self.start_time + wait = max(min(wait, self.timeout - expired + 0.1), 0.1) time.sleep(wait) step += 1 - except ResolverError as e: - module.fail_json( - msg='Unexpected resolving error: {0}'.format(to_native(e)), - records=results, - completed=finished_checks, - exception=traceback.format_exc()) - except dns.exception.DNSException as e: - module.fail_json( - msg='Unexpected DNS error: {0}'.format(to_native(e)), - records=results, - completed=finished_checks, - exception=traceback.format_exc()) + + def _generate_additional_results(self): + return dict( + records=self.results, + completed=self.finished_checks, + ) + + def run(self): + guarded_run(self._run, self.module, generate_additional_results=self._generate_additional_results) + + +def main(): + module = AnsibleModule( + argument_spec=dict( + records=dict(required=True, type='list', elements='dict', options=dict( + name=dict(required=True, type='str'), + values=dict(required=True, type='list', elements='str'), + mode=dict(type='str', default='subset', choices=['subset', 'superset', 'superset_not_empty', 'equals', 'equals_ordered']), + )), + query_retry=dict(type='int', default=3), + query_timeout=dict(type='float', default=10), + timeout=dict(type='float'), + max_sleep=dict(type='float', default=10), + always_ask_default_resolver=dict(type='bool', default=True), + servfail_retries=dict(type='int', default=0), + server=dict(type='list', elements='str'), + ), + supports_check_mode=True, + ) + assert_requirements_present(module) + + waiter = Waiter(module) + waiter.run() if __name__ == "__main__": diff --git a/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py b/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py index 461a92b35..30fa11bdc 100644 --- a/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py +++ b/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py @@ -15,6 +15,7 @@ from ansible.module_utils import six from ansible.module_utils.common._collections_compat import Sequence from ansible.plugins.inventory import BaseInventoryPlugin from ansible.utils.display import Display +from ansible.utils.unsafe_proxy import wrap_var as make_unsafe from ansible.template import Templar from ansible_collections.community.dns.plugins.module_utils.provider import ( @@ -65,7 +66,15 @@ class RecordsInventoryModule(BaseInventoryPlugin): def parse(self, inventory, loader, path, cache=False): super(RecordsInventoryModule, self).parse(inventory, loader, path, cache) - self._read_config_data(path) + orig_config = self._read_config_data(path) + + if 'filters' in orig_config: + display.deprecated( + 'The `filters` option of the %s inventory plugin has been renamed to `simple_filters`. ' + 'The old name will stop working in community.dns 3.0.0.' % self.NAME, + collection_name='community.dns', + version='3.0.0', + ) self.templar = Templar(loader=loader) @@ -109,7 +118,7 @@ class RecordsInventoryModule(BaseInventoryPlugin): except DNSAPIError as e: raise AnsibleError('Error: %s' % e) - filters = self.get_option('filters') + filters = self.get_option('simple_filters') filter_types = filters.get('type') or ['A', 'AAAA', 'CNAME'] if not isinstance(filter_types, Sequence) or isinstance(filter_types, six.string_types): @@ -121,4 +130,4 @@ class RecordsInventoryModule(BaseInventoryPlugin): if record.prefix: name = '%s.%s' % (record.prefix, name) self.inventory.add_host(name) - self.inventory.set_variable(name, 'ansible_host', record.target) + self.inventory.set_variable(name, 'ansible_host', make_unsafe(record.target)) diff --git a/ansible_collections/community/dns/plugins/plugin_utils/ips.py b/ansible_collections/community/dns/plugins/plugin_utils/ips.py new file mode 100644 index 000000000..256078794 --- /dev/null +++ b/ansible_collections/community/dns/plugins/plugin_utils/ips.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +from ansible.errors import AnsibleError +from ansible.module_utils.basic import missing_required_lib +from ansible.module_utils.six import raise_from + +try: + import ipaddress # pylint: disable=unused-import +except ImportError as exc: + IPADDRESS_IMPORT_EXC = exc +else: + IPADDRESS_IMPORT_EXC = None + + +def assert_requirements_present(plugin_name, plugin_type): + if IPADDRESS_IMPORT_EXC is not None: + msg = 'The {fqcn} {type} plugin is missing requirements: {msg}'.format( + msg=missing_required_lib('ipaddress'), fqcn=plugin_name, type=plugin_type + ) + raise_from(AnsibleError(msg), IPADDRESS_IMPORT_EXC) diff --git a/ansible_collections/community/dns/plugins/plugin_utils/resolver.py b/ansible_collections/community/dns/plugins/plugin_utils/resolver.py new file mode 100644 index 000000000..99c875643 --- /dev/null +++ b/ansible_collections/community/dns/plugins/plugin_utils/resolver.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +from ansible.errors import AnsibleError +from ansible.module_utils.basic import missing_required_lib +from ansible.module_utils.common.text.converters import to_native +from ansible.module_utils.six import raise_from + +from ansible_collections.community.dns.plugins.module_utils.resolver import ( + ResolverError, +) + +try: + import dns # pylint: disable=unused-import + import dns.exception # pylint: disable=unused-import + import dns.name # pylint: disable=unused-import + import dns.message # pylint: disable=unused-import + import dns.query # pylint: disable=unused-import + import dns.rcode # pylint: disable=unused-import + import dns.rdatatype # pylint: disable=unused-import + import dns.resolver # pylint: disable=unused-import +except ImportError as exc: + DNSPYTHON_IMPORTERROR = exc +else: + DNSPYTHON_IMPORTERROR = None + + +def guarded_run(runner, error_class=AnsibleError, server=None): + suffix = ' for {0}'.format(server) if server is not None else '' + try: + return runner() + except ResolverError as e: + raise_from(error_class('Unexpected resolving error{0}: {1}'.format(suffix, to_native(e))), e) + except dns.exception.DNSException as e: + raise_from(error_class('Unexpected DNS error{0}: {1}'.format(suffix, to_native(e))), e) + + +def assert_requirements_present(plugin_name, plugin_type): + if DNSPYTHON_IMPORTERROR is not None: + msg = 'The {fqcn} {type} plugin is missing requirements: {msg}'.format( + msg=missing_required_lib('dnspython'), fqcn=plugin_name, type=plugin_type + ) + raise_from(AnsibleError(msg), DNSPYTHON_IMPORTERROR) diff --git a/ansible_collections/community/dns/plugins/public_suffix_list.dat b/ansible_collections/community/dns/plugins/public_suffix_list.dat index b63242437..dd8bd923e 100644 --- a/ansible_collections/community/dns/plugins/public_suffix_list.dat +++ b/ansible_collections/community/dns/plugins/public_suffix_list.dat @@ -1059,22 +1059,11 @@ gouv.fr nom.fr prd.fr tm.fr -// Former "domaines sectoriels", still registration suffixes -aeroport.fr -avocat.fr +// Other SLDs now selfmanaged out of AFNIC range. Former "domaines sectoriels", still registration suffixes avoues.fr cci.fr -chambagri.fr -chirurgiens-dentistes.fr -experts-comptables.fr -geometre-expert.fr greta.fr huissier-justice.fr -medecin.fr -notaires.fr -pharmacien.fr -port.fr -veterinaire.fr // ga : https://en.wikipedia.org/wiki/.ga ga @@ -5892,6 +5881,7 @@ kyiv.ua lg.ua lt.ua lugansk.ua +luhansk.ua lutsk.ua lv.ua lviv.ua @@ -5915,11 +5905,13 @@ te.ua ternopil.ua uz.ua uzhgorod.ua +uzhhorod.ua vinnica.ua vinnytsia.ua vn.ua volyn.ua yalta.ua +zakarpattia.ua zaporizhzhe.ua zaporizhzhia.ua zhitomir.ua @@ -6031,7 +6023,6 @@ k12.ca.us k12.co.us k12.ct.us k12.dc.us -k12.de.us k12.fl.us k12.ga.us k12.gu.us @@ -6719,3420 +6710,4478 @@ org.zw // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2023-06-16T15:12:40Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2024-03-06T15:14:58Z // This list is auto-generated, don't edit it manually. -// aaa : 2015-02-26 American Automobile Association, Inc. +// aaa : American Automobile Association, Inc. +// https://www.iana.org/domains/root/db/aaa.html aaa -// aarp : 2015-05-21 AARP +// aarp : AARP +// https://www.iana.org/domains/root/db/aarp.html aarp -// abb : 2014-10-24 ABB Ltd +// abb : ABB Ltd +// https://www.iana.org/domains/root/db/abb.html abb -// abbott : 2014-07-24 Abbott Laboratories, Inc. +// abbott : Abbott Laboratories, Inc. +// https://www.iana.org/domains/root/db/abbott.html abbott -// abbvie : 2015-07-30 AbbVie Inc. +// abbvie : AbbVie Inc. +// https://www.iana.org/domains/root/db/abbvie.html abbvie -// abc : 2015-07-30 Disney Enterprises, Inc. +// abc : Disney Enterprises, Inc. +// https://www.iana.org/domains/root/db/abc.html abc -// able : 2015-06-25 Able Inc. +// able : Able Inc. +// https://www.iana.org/domains/root/db/able.html able -// abogado : 2014-04-24 Registry Services, LLC +// abogado : Registry Services, LLC +// https://www.iana.org/domains/root/db/abogado.html abogado -// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +// abudhabi : Abu Dhabi Systems and Information Centre +// https://www.iana.org/domains/root/db/abudhabi.html abudhabi -// academy : 2013-11-07 Binky Moon, LLC +// academy : Binky Moon, LLC +// https://www.iana.org/domains/root/db/academy.html academy -// accenture : 2014-08-15 Accenture plc +// accenture : Accenture plc +// https://www.iana.org/domains/root/db/accenture.html accenture -// accountant : 2014-11-20 dot Accountant Limited +// accountant : dot Accountant Limited +// https://www.iana.org/domains/root/db/accountant.html accountant -// accountants : 2014-03-20 Binky Moon, LLC +// accountants : Binky Moon, LLC +// https://www.iana.org/domains/root/db/accountants.html accountants -// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +// aco : ACO Severin Ahlmann GmbH & Co. KG +// https://www.iana.org/domains/root/db/aco.html aco -// actor : 2013-12-12 Dog Beach, LLC +// actor : Dog Beach, LLC +// https://www.iana.org/domains/root/db/actor.html actor -// ads : 2014-12-04 Charleston Road Registry Inc. +// ads : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/ads.html ads -// adult : 2014-10-16 ICM Registry AD LLC +// adult : ICM Registry AD LLC +// https://www.iana.org/domains/root/db/adult.html adult -// aeg : 2015-03-19 Aktiebolaget Electrolux +// aeg : Aktiebolaget Electrolux +// https://www.iana.org/domains/root/db/aeg.html aeg -// aetna : 2015-05-21 Aetna Life Insurance Company +// aetna : Aetna Life Insurance Company +// https://www.iana.org/domains/root/db/aetna.html aetna -// afl : 2014-10-02 Australian Football League +// afl : Australian Football League +// https://www.iana.org/domains/root/db/afl.html afl -// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +// africa : ZA Central Registry NPC trading as Registry.Africa +// https://www.iana.org/domains/root/db/africa.html africa -// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +// agakhan : Fondation Aga Khan (Aga Khan Foundation) +// https://www.iana.org/domains/root/db/agakhan.html agakhan -// agency : 2013-11-14 Binky Moon, LLC +// agency : Binky Moon, LLC +// https://www.iana.org/domains/root/db/agency.html agency -// aig : 2014-12-18 American International Group, Inc. +// aig : American International Group, Inc. +// https://www.iana.org/domains/root/db/aig.html aig -// airbus : 2015-07-30 Airbus S.A.S. +// airbus : Airbus S.A.S. +// https://www.iana.org/domains/root/db/airbus.html airbus -// airforce : 2014-03-06 Dog Beach, LLC +// airforce : Dog Beach, LLC +// https://www.iana.org/domains/root/db/airforce.html airforce -// airtel : 2014-10-24 Bharti Airtel Limited +// airtel : Bharti Airtel Limited +// https://www.iana.org/domains/root/db/airtel.html airtel -// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +// akdn : Fondation Aga Khan (Aga Khan Foundation) +// https://www.iana.org/domains/root/db/akdn.html akdn -// alibaba : 2015-01-15 Alibaba Group Holding Limited +// alibaba : Alibaba Group Holding Limited +// https://www.iana.org/domains/root/db/alibaba.html alibaba -// alipay : 2015-01-15 Alibaba Group Holding Limited +// alipay : Alibaba Group Holding Limited +// https://www.iana.org/domains/root/db/alipay.html alipay -// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +// allfinanz : Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +// https://www.iana.org/domains/root/db/allfinanz.html allfinanz -// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +// allstate : Allstate Fire and Casualty Insurance Company +// https://www.iana.org/domains/root/db/allstate.html allstate -// ally : 2015-06-18 Ally Financial Inc. +// ally : Ally Financial Inc. +// https://www.iana.org/domains/root/db/ally.html ally -// alsace : 2014-07-02 Region Grand Est +// alsace : Region Grand Est +// https://www.iana.org/domains/root/db/alsace.html alsace -// alstom : 2015-07-30 ALSTOM +// alstom : ALSTOM +// https://www.iana.org/domains/root/db/alstom.html alstom -// amazon : 2019-12-19 Amazon Registry Services, Inc. +// amazon : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/amazon.html amazon -// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +// americanexpress : American Express Travel Related Services Company, Inc. +// https://www.iana.org/domains/root/db/americanexpress.html americanexpress -// americanfamily : 2015-07-23 AmFam, Inc. +// americanfamily : AmFam, Inc. +// https://www.iana.org/domains/root/db/americanfamily.html americanfamily -// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +// amex : American Express Travel Related Services Company, Inc. +// https://www.iana.org/domains/root/db/amex.html amex -// amfam : 2015-07-23 AmFam, Inc. +// amfam : AmFam, Inc. +// https://www.iana.org/domains/root/db/amfam.html amfam -// amica : 2015-05-28 Amica Mutual Insurance Company +// amica : Amica Mutual Insurance Company +// https://www.iana.org/domains/root/db/amica.html amica -// amsterdam : 2014-07-24 Gemeente Amsterdam +// amsterdam : Gemeente Amsterdam +// https://www.iana.org/domains/root/db/amsterdam.html amsterdam -// analytics : 2014-12-18 Campus IP LLC +// analytics : Campus IP LLC +// https://www.iana.org/domains/root/db/analytics.html analytics -// android : 2014-08-07 Charleston Road Registry Inc. +// android : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/android.html android -// anquan : 2015-01-08 Beijing Qihu Keji Co., Ltd. +// anquan : Beijing Qihu Keji Co., Ltd. +// https://www.iana.org/domains/root/db/anquan.html anquan -// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +// anz : Australia and New Zealand Banking Group Limited +// https://www.iana.org/domains/root/db/anz.html anz -// aol : 2015-09-17 Oath Inc. +// aol : Oath Inc. +// https://www.iana.org/domains/root/db/aol.html aol -// apartments : 2014-12-11 Binky Moon, LLC +// apartments : Binky Moon, LLC +// https://www.iana.org/domains/root/db/apartments.html apartments -// app : 2015-05-14 Charleston Road Registry Inc. +// app : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/app.html app -// apple : 2015-05-14 Apple Inc. +// apple : Apple Inc. +// https://www.iana.org/domains/root/db/apple.html apple -// aquarelle : 2014-07-24 Aquarelle.com +// aquarelle : Aquarelle.com +// https://www.iana.org/domains/root/db/aquarelle.html aquarelle -// arab : 2015-11-12 League of Arab States +// arab : League of Arab States +// https://www.iana.org/domains/root/db/arab.html arab -// aramco : 2014-11-20 Aramco Services Company +// aramco : Aramco Services Company +// https://www.iana.org/domains/root/db/aramco.html aramco -// archi : 2014-02-06 Identity Digital Limited +// archi : Identity Digital Limited +// https://www.iana.org/domains/root/db/archi.html archi -// army : 2014-03-06 Dog Beach, LLC +// army : Dog Beach, LLC +// https://www.iana.org/domains/root/db/army.html army -// art : 2016-03-24 UK Creative Ideas Limited +// art : UK Creative Ideas Limited +// https://www.iana.org/domains/root/db/art.html art -// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +// arte : Association Relative à la Télévision Européenne G.E.I.E. +// https://www.iana.org/domains/root/db/arte.html arte -// asda : 2015-07-31 Wal-Mart Stores, Inc. +// asda : Wal-Mart Stores, Inc. +// https://www.iana.org/domains/root/db/asda.html asda -// associates : 2014-03-06 Binky Moon, LLC +// associates : Binky Moon, LLC +// https://www.iana.org/domains/root/db/associates.html associates -// athleta : 2015-07-30 The Gap, Inc. +// athleta : The Gap, Inc. +// https://www.iana.org/domains/root/db/athleta.html athleta -// attorney : 2014-03-20 Dog Beach, LLC +// attorney : Dog Beach, LLC +// https://www.iana.org/domains/root/db/attorney.html attorney -// auction : 2014-03-20 Dog Beach, LLC +// auction : Dog Beach, LLC +// https://www.iana.org/domains/root/db/auction.html auction -// audi : 2015-05-21 AUDI Aktiengesellschaft +// audi : AUDI Aktiengesellschaft +// https://www.iana.org/domains/root/db/audi.html audi -// audible : 2015-06-25 Amazon Registry Services, Inc. +// audible : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/audible.html audible -// audio : 2014-03-20 XYZ.COM LLC +// audio : XYZ.COM LLC +// https://www.iana.org/domains/root/db/audio.html audio -// auspost : 2015-08-13 Australian Postal Corporation +// auspost : Australian Postal Corporation +// https://www.iana.org/domains/root/db/auspost.html auspost -// author : 2014-12-18 Amazon Registry Services, Inc. +// author : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/author.html author -// auto : 2014-11-13 XYZ.COM LLC +// auto : XYZ.COM LLC +// https://www.iana.org/domains/root/db/auto.html auto -// autos : 2014-01-09 XYZ.COM LLC +// autos : XYZ.COM LLC +// https://www.iana.org/domains/root/db/autos.html autos -// avianca : 2015-01-08 Avianca Inc. +// avianca : Avianca Inc. +// https://www.iana.org/domains/root/db/avianca.html avianca -// aws : 2015-06-25 AWS Registry LLC +// aws : AWS Registry LLC +// https://www.iana.org/domains/root/db/aws.html aws -// axa : 2013-12-19 AXA Group Operations SAS +// axa : AXA Group Operations SAS +// https://www.iana.org/domains/root/db/axa.html axa -// azure : 2014-12-18 Microsoft Corporation +// azure : Microsoft Corporation +// https://www.iana.org/domains/root/db/azure.html azure -// baby : 2015-04-09 XYZ.COM LLC +// baby : XYZ.COM LLC +// https://www.iana.org/domains/root/db/baby.html baby -// baidu : 2015-01-08 Baidu, Inc. +// baidu : Baidu, Inc. +// https://www.iana.org/domains/root/db/baidu.html baidu -// banamex : 2015-07-30 Citigroup Inc. +// banamex : Citigroup Inc. +// https://www.iana.org/domains/root/db/banamex.html banamex -// bananarepublic : 2015-07-31 The Gap, Inc. -bananarepublic - -// band : 2014-06-12 Dog Beach, LLC +// band : Dog Beach, LLC +// https://www.iana.org/domains/root/db/band.html band -// bank : 2014-09-25 fTLD Registry Services LLC +// bank : fTLD Registry Services LLC +// https://www.iana.org/domains/root/db/bank.html bank -// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +// bar : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +// https://www.iana.org/domains/root/db/bar.html bar -// barcelona : 2014-07-24 Municipi de Barcelona +// barcelona : Municipi de Barcelona +// https://www.iana.org/domains/root/db/barcelona.html barcelona -// barclaycard : 2014-11-20 Barclays Bank PLC +// barclaycard : Barclays Bank PLC +// https://www.iana.org/domains/root/db/barclaycard.html barclaycard -// barclays : 2014-11-20 Barclays Bank PLC +// barclays : Barclays Bank PLC +// https://www.iana.org/domains/root/db/barclays.html barclays -// barefoot : 2015-06-11 Gallo Vineyards, Inc. +// barefoot : Gallo Vineyards, Inc. +// https://www.iana.org/domains/root/db/barefoot.html barefoot -// bargains : 2013-11-14 Binky Moon, LLC +// bargains : Binky Moon, LLC +// https://www.iana.org/domains/root/db/bargains.html bargains -// baseball : 2015-10-29 MLB Advanced Media DH, LLC +// baseball : MLB Advanced Media DH, LLC +// https://www.iana.org/domains/root/db/baseball.html baseball -// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +// basketball : Fédération Internationale de Basketball (FIBA) +// https://www.iana.org/domains/root/db/basketball.html basketball -// bauhaus : 2014-04-17 Werkhaus GmbH +// bauhaus : Werkhaus GmbH +// https://www.iana.org/domains/root/db/bauhaus.html bauhaus -// bayern : 2014-01-23 Bayern Connect GmbH +// bayern : Bayern Connect GmbH +// https://www.iana.org/domains/root/db/bayern.html bayern -// bbc : 2014-12-18 British Broadcasting Corporation +// bbc : British Broadcasting Corporation +// https://www.iana.org/domains/root/db/bbc.html bbc -// bbt : 2015-07-23 BB&T Corporation +// bbt : BB&T Corporation +// https://www.iana.org/domains/root/db/bbt.html bbt -// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +// bbva : BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +// https://www.iana.org/domains/root/db/bbva.html bbva -// bcg : 2015-04-02 The Boston Consulting Group, Inc. +// bcg : The Boston Consulting Group, Inc. +// https://www.iana.org/domains/root/db/bcg.html bcg -// bcn : 2014-07-24 Municipi de Barcelona +// bcn : Municipi de Barcelona +// https://www.iana.org/domains/root/db/bcn.html bcn -// beats : 2015-05-14 Beats Electronics, LLC +// beats : Beats Electronics, LLC +// https://www.iana.org/domains/root/db/beats.html beats -// beauty : 2015-12-03 XYZ.COM LLC +// beauty : XYZ.COM LLC +// https://www.iana.org/domains/root/db/beauty.html beauty -// beer : 2014-01-09 Registry Services, LLC +// beer : Registry Services, LLC +// https://www.iana.org/domains/root/db/beer.html beer -// bentley : 2014-12-18 Bentley Motors Limited +// bentley : Bentley Motors Limited +// https://www.iana.org/domains/root/db/bentley.html bentley -// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +// berlin : dotBERLIN GmbH & Co. KG +// https://www.iana.org/domains/root/db/berlin.html berlin -// best : 2013-12-19 BestTLD Pty Ltd +// best : BestTLD Pty Ltd +// https://www.iana.org/domains/root/db/best.html best -// bestbuy : 2015-07-31 BBY Solutions, Inc. +// bestbuy : BBY Solutions, Inc. +// https://www.iana.org/domains/root/db/bestbuy.html bestbuy -// bet : 2015-05-07 Identity Digital Limited +// bet : Identity Digital Limited +// https://www.iana.org/domains/root/db/bet.html bet -// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +// bharti : Bharti Enterprises (Holding) Private Limited +// https://www.iana.org/domains/root/db/bharti.html bharti -// bible : 2014-06-19 American Bible Society +// bible : American Bible Society +// https://www.iana.org/domains/root/db/bible.html bible -// bid : 2013-12-19 dot Bid Limited +// bid : dot Bid Limited +// https://www.iana.org/domains/root/db/bid.html bid -// bike : 2013-08-27 Binky Moon, LLC +// bike : Binky Moon, LLC +// https://www.iana.org/domains/root/db/bike.html bike -// bing : 2014-12-18 Microsoft Corporation +// bing : Microsoft Corporation +// https://www.iana.org/domains/root/db/bing.html bing -// bingo : 2014-12-04 Binky Moon, LLC +// bingo : Binky Moon, LLC +// https://www.iana.org/domains/root/db/bingo.html bingo -// bio : 2014-03-06 Identity Digital Limited +// bio : Identity Digital Limited +// https://www.iana.org/domains/root/db/bio.html bio -// black : 2014-01-16 Identity Digital Limited +// black : Identity Digital Limited +// https://www.iana.org/domains/root/db/black.html black -// blackfriday : 2014-01-16 Registry Services, LLC +// blackfriday : Registry Services, LLC +// https://www.iana.org/domains/root/db/blackfriday.html blackfriday -// blockbuster : 2015-07-30 Dish DBS Corporation +// blockbuster : Dish DBS Corporation +// https://www.iana.org/domains/root/db/blockbuster.html blockbuster -// blog : 2015-05-14 Knock Knock WHOIS There, LLC +// blog : Knock Knock WHOIS There, LLC +// https://www.iana.org/domains/root/db/blog.html blog -// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +// bloomberg : Bloomberg IP Holdings LLC +// https://www.iana.org/domains/root/db/bloomberg.html bloomberg -// blue : 2013-11-07 Identity Digital Limited +// blue : Identity Digital Limited +// https://www.iana.org/domains/root/db/blue.html blue -// bms : 2014-10-30 Bristol-Myers Squibb Company +// bms : Bristol-Myers Squibb Company +// https://www.iana.org/domains/root/db/bms.html bms -// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +// bmw : Bayerische Motoren Werke Aktiengesellschaft +// https://www.iana.org/domains/root/db/bmw.html bmw -// bnpparibas : 2014-05-29 BNP Paribas +// bnpparibas : BNP Paribas +// https://www.iana.org/domains/root/db/bnpparibas.html bnpparibas -// boats : 2014-12-04 XYZ.COM LLC +// boats : XYZ.COM LLC +// https://www.iana.org/domains/root/db/boats.html boats -// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +// boehringer : Boehringer Ingelheim International GmbH +// https://www.iana.org/domains/root/db/boehringer.html boehringer -// bofa : 2015-07-31 Bank of America Corporation +// bofa : Bank of America Corporation +// https://www.iana.org/domains/root/db/bofa.html bofa -// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +// bom : Núcleo de Informação e Coordenação do Ponto BR - NIC.br +// https://www.iana.org/domains/root/db/bom.html bom -// bond : 2014-06-05 ShortDot SA +// bond : ShortDot SA +// https://www.iana.org/domains/root/db/bond.html bond -// boo : 2014-01-30 Charleston Road Registry Inc. +// boo : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/boo.html boo -// book : 2015-08-27 Amazon Registry Services, Inc. +// book : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/book.html book -// booking : 2015-07-16 Booking.com B.V. +// booking : Booking.com B.V. +// https://www.iana.org/domains/root/db/booking.html booking -// bosch : 2015-06-18 Robert Bosch GMBH +// bosch : Robert Bosch GMBH +// https://www.iana.org/domains/root/db/bosch.html bosch -// bostik : 2015-05-28 Bostik SA +// bostik : Bostik SA +// https://www.iana.org/domains/root/db/bostik.html bostik -// boston : 2015-12-10 Registry Services, LLC +// boston : Registry Services, LLC +// https://www.iana.org/domains/root/db/boston.html boston -// bot : 2014-12-18 Amazon Registry Services, Inc. +// bot : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/bot.html bot -// boutique : 2013-11-14 Binky Moon, LLC +// boutique : Binky Moon, LLC +// https://www.iana.org/domains/root/db/boutique.html boutique -// box : 2015-11-12 Intercap Registry Inc. +// box : Intercap Registry Inc. +// https://www.iana.org/domains/root/db/box.html box -// bradesco : 2014-12-18 Banco Bradesco S.A. +// bradesco : Banco Bradesco S.A. +// https://www.iana.org/domains/root/db/bradesco.html bradesco -// bridgestone : 2014-12-18 Bridgestone Corporation +// bridgestone : Bridgestone Corporation +// https://www.iana.org/domains/root/db/bridgestone.html bridgestone -// broadway : 2014-12-22 Celebrate Broadway, Inc. +// broadway : Celebrate Broadway, Inc. +// https://www.iana.org/domains/root/db/broadway.html broadway -// broker : 2014-12-11 Dog Beach, LLC +// broker : Dog Beach, LLC +// https://www.iana.org/domains/root/db/broker.html broker -// brother : 2015-01-29 Brother Industries, Ltd. +// brother : Brother Industries, Ltd. +// https://www.iana.org/domains/root/db/brother.html brother -// brussels : 2014-02-06 DNS.be vzw +// brussels : DNS.be vzw +// https://www.iana.org/domains/root/db/brussels.html brussels -// build : 2013-11-07 Plan Bee LLC +// build : Plan Bee LLC +// https://www.iana.org/domains/root/db/build.html build -// builders : 2013-11-07 Binky Moon, LLC +// builders : Binky Moon, LLC +// https://www.iana.org/domains/root/db/builders.html builders -// business : 2013-11-07 Binky Moon, LLC +// business : Binky Moon, LLC +// https://www.iana.org/domains/root/db/business.html business -// buy : 2014-12-18 Amazon Registry Services, Inc. +// buy : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/buy.html buy -// buzz : 2013-10-02 DOTSTRATEGY CO. +// buzz : DOTSTRATEGY CO. +// https://www.iana.org/domains/root/db/buzz.html buzz -// bzh : 2014-02-27 Association www.bzh +// bzh : Association www.bzh +// https://www.iana.org/domains/root/db/bzh.html bzh -// cab : 2013-10-24 Binky Moon, LLC +// cab : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cab.html cab -// cafe : 2015-02-11 Binky Moon, LLC +// cafe : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cafe.html cafe -// cal : 2014-07-24 Charleston Road Registry Inc. +// cal : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/cal.html cal -// call : 2014-12-18 Amazon Registry Services, Inc. +// call : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/call.html call -// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +// calvinklein : PVH gTLD Holdings LLC +// https://www.iana.org/domains/root/db/calvinklein.html calvinklein -// cam : 2016-04-21 Cam Connecting SARL +// cam : Cam Connecting SARL +// https://www.iana.org/domains/root/db/cam.html cam -// camera : 2013-08-27 Binky Moon, LLC +// camera : Binky Moon, LLC +// https://www.iana.org/domains/root/db/camera.html camera -// camp : 2013-11-07 Binky Moon, LLC +// camp : Binky Moon, LLC +// https://www.iana.org/domains/root/db/camp.html camp -// canon : 2014-09-12 Canon Inc. +// canon : Canon Inc. +// https://www.iana.org/domains/root/db/canon.html canon -// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +// capetown : ZA Central Registry NPC trading as ZA Central Registry +// https://www.iana.org/domains/root/db/capetown.html capetown -// capital : 2014-03-06 Binky Moon, LLC +// capital : Binky Moon, LLC +// https://www.iana.org/domains/root/db/capital.html capital -// capitalone : 2015-08-06 Capital One Financial Corporation +// capitalone : Capital One Financial Corporation +// https://www.iana.org/domains/root/db/capitalone.html capitalone -// car : 2015-01-22 XYZ.COM LLC +// car : XYZ.COM LLC +// https://www.iana.org/domains/root/db/car.html car -// caravan : 2013-12-12 Caravan International, Inc. +// caravan : Caravan International, Inc. +// https://www.iana.org/domains/root/db/caravan.html caravan -// cards : 2013-12-05 Binky Moon, LLC +// cards : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cards.html cards -// care : 2014-03-06 Binky Moon, LLC +// care : Binky Moon, LLC +// https://www.iana.org/domains/root/db/care.html care -// career : 2013-10-09 dotCareer LLC +// career : dotCareer LLC +// https://www.iana.org/domains/root/db/career.html career -// careers : 2013-10-02 Binky Moon, LLC +// careers : Binky Moon, LLC +// https://www.iana.org/domains/root/db/careers.html careers -// cars : 2014-11-13 XYZ.COM LLC +// cars : XYZ.COM LLC +// https://www.iana.org/domains/root/db/cars.html cars -// casa : 2013-11-21 Registry Services, LLC +// casa : Registry Services, LLC +// https://www.iana.org/domains/root/db/casa.html casa -// case : 2015-09-03 Digity, LLC +// case : Digity, LLC +// https://www.iana.org/domains/root/db/case.html case -// cash : 2014-03-06 Binky Moon, LLC +// cash : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cash.html cash -// casino : 2014-12-18 Binky Moon, LLC +// casino : Binky Moon, LLC +// https://www.iana.org/domains/root/db/casino.html casino -// catering : 2013-12-05 Binky Moon, LLC +// catering : Binky Moon, LLC +// https://www.iana.org/domains/root/db/catering.html catering -// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// catholic : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// https://www.iana.org/domains/root/db/catholic.html catholic -// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +// cba : COMMONWEALTH BANK OF AUSTRALIA +// https://www.iana.org/domains/root/db/cba.html cba -// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +// cbn : The Christian Broadcasting Network, Inc. +// https://www.iana.org/domains/root/db/cbn.html cbn -// cbre : 2015-07-02 CBRE, Inc. +// cbre : CBRE, Inc. +// https://www.iana.org/domains/root/db/cbre.html cbre -// cbs : 2015-08-06 CBS Domains Inc. -cbs - -// center : 2013-11-07 Binky Moon, LLC +// center : Binky Moon, LLC +// https://www.iana.org/domains/root/db/center.html center -// ceo : 2013-11-07 CEOTLD Pty Ltd +// ceo : XYZ.COM LLC +// https://www.iana.org/domains/root/db/ceo.html ceo -// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +// cern : European Organization for Nuclear Research ("CERN") +// https://www.iana.org/domains/root/db/cern.html cern -// cfa : 2014-08-28 CFA Institute +// cfa : CFA Institute +// https://www.iana.org/domains/root/db/cfa.html cfa -// cfd : 2014-12-11 ShortDot SA +// cfd : ShortDot SA +// https://www.iana.org/domains/root/db/cfd.html cfd -// chanel : 2015-04-09 Chanel International B.V. +// chanel : Chanel International B.V. +// https://www.iana.org/domains/root/db/chanel.html chanel -// channel : 2014-05-08 Charleston Road Registry Inc. +// channel : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/channel.html channel -// charity : 2018-04-11 Public Interest Registry +// charity : Public Interest Registry +// https://www.iana.org/domains/root/db/charity.html charity -// chase : 2015-04-30 JPMorgan Chase Bank, National Association +// chase : JPMorgan Chase Bank, National Association +// https://www.iana.org/domains/root/db/chase.html chase -// chat : 2014-12-04 Binky Moon, LLC +// chat : Binky Moon, LLC +// https://www.iana.org/domains/root/db/chat.html chat -// cheap : 2013-11-14 Binky Moon, LLC +// cheap : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cheap.html cheap -// chintai : 2015-06-11 CHINTAI Corporation +// chintai : CHINTAI Corporation +// https://www.iana.org/domains/root/db/chintai.html chintai -// christmas : 2013-11-21 XYZ.COM LLC +// christmas : XYZ.COM LLC +// https://www.iana.org/domains/root/db/christmas.html christmas -// chrome : 2014-07-24 Charleston Road Registry Inc. +// chrome : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/chrome.html chrome -// church : 2014-02-06 Binky Moon, LLC +// church : Binky Moon, LLC +// https://www.iana.org/domains/root/db/church.html church -// cipriani : 2015-02-19 Hotel Cipriani Srl +// cipriani : Hotel Cipriani Srl +// https://www.iana.org/domains/root/db/cipriani.html cipriani -// circle : 2014-12-18 Amazon Registry Services, Inc. +// circle : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/circle.html circle -// cisco : 2014-12-22 Cisco Technology, Inc. +// cisco : Cisco Technology, Inc. +// https://www.iana.org/domains/root/db/cisco.html cisco -// citadel : 2015-07-23 Citadel Domain LLC +// citadel : Citadel Domain LLC +// https://www.iana.org/domains/root/db/citadel.html citadel -// citi : 2015-07-30 Citigroup Inc. +// citi : Citigroup Inc. +// https://www.iana.org/domains/root/db/citi.html citi -// citic : 2014-01-09 CITIC Group Corporation +// citic : CITIC Group Corporation +// https://www.iana.org/domains/root/db/citic.html citic -// city : 2014-05-29 Binky Moon, LLC +// city : Binky Moon, LLC +// https://www.iana.org/domains/root/db/city.html city -// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. -cityeats - -// claims : 2014-03-20 Binky Moon, LLC +// claims : Binky Moon, LLC +// https://www.iana.org/domains/root/db/claims.html claims -// cleaning : 2013-12-05 Binky Moon, LLC +// cleaning : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cleaning.html cleaning -// click : 2014-06-05 Internet Naming Company LLC +// click : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/click.html click -// clinic : 2014-03-20 Binky Moon, LLC +// clinic : Binky Moon, LLC +// https://www.iana.org/domains/root/db/clinic.html clinic -// clinique : 2015-10-01 The Estée Lauder Companies Inc. +// clinique : The Estée Lauder Companies Inc. +// https://www.iana.org/domains/root/db/clinique.html clinique -// clothing : 2013-08-27 Binky Moon, LLC +// clothing : Binky Moon, LLC +// https://www.iana.org/domains/root/db/clothing.html clothing -// cloud : 2015-04-16 Aruba PEC S.p.A. +// cloud : Aruba PEC S.p.A. +// https://www.iana.org/domains/root/db/cloud.html cloud -// club : 2013-11-08 Registry Services, LLC +// club : Registry Services, LLC +// https://www.iana.org/domains/root/db/club.html club -// clubmed : 2015-06-25 Club Méditerranée S.A. +// clubmed : Club Méditerranée S.A. +// https://www.iana.org/domains/root/db/clubmed.html clubmed -// coach : 2014-10-09 Binky Moon, LLC +// coach : Binky Moon, LLC +// https://www.iana.org/domains/root/db/coach.html coach -// codes : 2013-10-31 Binky Moon, LLC +// codes : Binky Moon, LLC +// https://www.iana.org/domains/root/db/codes.html codes -// coffee : 2013-10-17 Binky Moon, LLC +// coffee : Binky Moon, LLC +// https://www.iana.org/domains/root/db/coffee.html coffee -// college : 2014-01-16 XYZ.COM LLC +// college : XYZ.COM LLC +// https://www.iana.org/domains/root/db/college.html college -// cologne : 2014-02-05 dotKoeln GmbH +// cologne : dotKoeln GmbH +// https://www.iana.org/domains/root/db/cologne.html cologne -// comcast : 2015-07-23 Comcast IP Holdings I, LLC -comcast - -// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +// commbank : COMMONWEALTH BANK OF AUSTRALIA +// https://www.iana.org/domains/root/db/commbank.html commbank -// community : 2013-12-05 Binky Moon, LLC +// community : Binky Moon, LLC +// https://www.iana.org/domains/root/db/community.html community -// company : 2013-11-07 Binky Moon, LLC +// company : Binky Moon, LLC +// https://www.iana.org/domains/root/db/company.html company -// compare : 2015-10-08 Registry Services, LLC +// compare : Registry Services, LLC +// https://www.iana.org/domains/root/db/compare.html compare -// computer : 2013-10-24 Binky Moon, LLC +// computer : Binky Moon, LLC +// https://www.iana.org/domains/root/db/computer.html computer -// comsec : 2015-01-08 VeriSign, Inc. +// comsec : VeriSign, Inc. +// https://www.iana.org/domains/root/db/comsec.html comsec -// condos : 2013-12-05 Binky Moon, LLC +// condos : Binky Moon, LLC +// https://www.iana.org/domains/root/db/condos.html condos -// construction : 2013-09-16 Binky Moon, LLC +// construction : Binky Moon, LLC +// https://www.iana.org/domains/root/db/construction.html construction -// consulting : 2013-12-05 Dog Beach, LLC +// consulting : Dog Beach, LLC +// https://www.iana.org/domains/root/db/consulting.html consulting -// contact : 2015-01-08 Dog Beach, LLC +// contact : Dog Beach, LLC +// https://www.iana.org/domains/root/db/contact.html contact -// contractors : 2013-09-10 Binky Moon, LLC +// contractors : Binky Moon, LLC +// https://www.iana.org/domains/root/db/contractors.html contractors -// cooking : 2013-11-21 Registry Services, LLC +// cooking : Registry Services, LLC +// https://www.iana.org/domains/root/db/cooking.html cooking -// cool : 2013-11-14 Binky Moon, LLC +// cool : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cool.html cool -// corsica : 2014-09-25 Collectivité de Corse +// corsica : Collectivité de Corse +// https://www.iana.org/domains/root/db/corsica.html corsica -// country : 2013-12-19 Internet Naming Company LLC +// country : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/country.html country -// coupon : 2015-02-26 Amazon Registry Services, Inc. +// coupon : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/coupon.html coupon -// coupons : 2015-03-26 Binky Moon, LLC +// coupons : Binky Moon, LLC +// https://www.iana.org/domains/root/db/coupons.html coupons -// courses : 2014-12-04 Registry Services, LLC +// courses : Registry Services, LLC +// https://www.iana.org/domains/root/db/courses.html courses -// cpa : 2019-06-10 American Institute of Certified Public Accountants +// cpa : American Institute of Certified Public Accountants +// https://www.iana.org/domains/root/db/cpa.html cpa -// credit : 2014-03-20 Binky Moon, LLC +// credit : Binky Moon, LLC +// https://www.iana.org/domains/root/db/credit.html credit -// creditcard : 2014-03-20 Binky Moon, LLC +// creditcard : Binky Moon, LLC +// https://www.iana.org/domains/root/db/creditcard.html creditcard -// creditunion : 2015-01-22 DotCooperation LLC +// creditunion : DotCooperation LLC +// https://www.iana.org/domains/root/db/creditunion.html creditunion -// cricket : 2014-10-09 dot Cricket Limited +// cricket : dot Cricket Limited +// https://www.iana.org/domains/root/db/cricket.html cricket -// crown : 2014-10-24 Crown Equipment Corporation +// crown : Crown Equipment Corporation +// https://www.iana.org/domains/root/db/crown.html crown -// crs : 2014-04-03 Federated Co-operatives Limited +// crs : Federated Co-operatives Limited +// https://www.iana.org/domains/root/db/crs.html crs -// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +// cruise : Viking River Cruises (Bermuda) Ltd. +// https://www.iana.org/domains/root/db/cruise.html cruise -// cruises : 2013-12-05 Binky Moon, LLC +// cruises : Binky Moon, LLC +// https://www.iana.org/domains/root/db/cruises.html cruises -// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +// cuisinella : SCHMIDT GROUPE S.A.S. +// https://www.iana.org/domains/root/db/cuisinella.html cuisinella -// cymru : 2014-05-08 Nominet UK +// cymru : Nominet UK +// https://www.iana.org/domains/root/db/cymru.html cymru -// cyou : 2015-01-22 ShortDot SA +// cyou : ShortDot SA +// https://www.iana.org/domains/root/db/cyou.html cyou -// dabur : 2014-02-06 Dabur India Limited +// dabur : Dabur India Limited +// https://www.iana.org/domains/root/db/dabur.html dabur -// dad : 2014-01-23 Charleston Road Registry Inc. +// dad : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/dad.html dad -// dance : 2013-10-24 Dog Beach, LLC +// dance : Dog Beach, LLC +// https://www.iana.org/domains/root/db/dance.html dance -// data : 2016-06-02 Dish DBS Corporation +// data : Dish DBS Corporation +// https://www.iana.org/domains/root/db/data.html data -// date : 2014-11-20 dot Date Limited +// date : dot Date Limited +// https://www.iana.org/domains/root/db/date.html date -// dating : 2013-12-05 Binky Moon, LLC +// dating : Binky Moon, LLC +// https://www.iana.org/domains/root/db/dating.html dating -// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +// datsun : NISSAN MOTOR CO., LTD. +// https://www.iana.org/domains/root/db/datsun.html datsun -// day : 2014-01-30 Charleston Road Registry Inc. +// day : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/day.html day -// dclk : 2014-11-20 Charleston Road Registry Inc. +// dclk : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/dclk.html dclk -// dds : 2015-05-07 Registry Services, LLC +// dds : Registry Services, LLC +// https://www.iana.org/domains/root/db/dds.html dds -// deal : 2015-06-25 Amazon Registry Services, Inc. +// deal : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/deal.html deal -// dealer : 2014-12-22 Intercap Registry Inc. +// dealer : Intercap Registry Inc. +// https://www.iana.org/domains/root/db/dealer.html dealer -// deals : 2014-05-22 Binky Moon, LLC +// deals : Binky Moon, LLC +// https://www.iana.org/domains/root/db/deals.html deals -// degree : 2014-03-06 Dog Beach, LLC +// degree : Dog Beach, LLC +// https://www.iana.org/domains/root/db/degree.html degree -// delivery : 2014-09-11 Binky Moon, LLC +// delivery : Binky Moon, LLC +// https://www.iana.org/domains/root/db/delivery.html delivery -// dell : 2014-10-24 Dell Inc. +// dell : Dell Inc. +// https://www.iana.org/domains/root/db/dell.html dell -// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +// deloitte : Deloitte Touche Tohmatsu +// https://www.iana.org/domains/root/db/deloitte.html deloitte -// delta : 2015-02-19 Delta Air Lines, Inc. +// delta : Delta Air Lines, Inc. +// https://www.iana.org/domains/root/db/delta.html delta -// democrat : 2013-10-24 Dog Beach, LLC +// democrat : Dog Beach, LLC +// https://www.iana.org/domains/root/db/democrat.html democrat -// dental : 2014-03-20 Binky Moon, LLC +// dental : Binky Moon, LLC +// https://www.iana.org/domains/root/db/dental.html dental -// dentist : 2014-03-20 Dog Beach, LLC +// dentist : Dog Beach, LLC +// https://www.iana.org/domains/root/db/dentist.html dentist -// desi : 2013-11-14 Desi Networks LLC +// desi +// https://www.iana.org/domains/root/db/desi.html desi -// design : 2014-11-07 Registry Services, LLC +// design : Registry Services, LLC +// https://www.iana.org/domains/root/db/design.html design -// dev : 2014-10-16 Charleston Road Registry Inc. +// dev : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/dev.html dev -// dhl : 2015-07-23 Deutsche Post AG +// dhl : Deutsche Post AG +// https://www.iana.org/domains/root/db/dhl.html dhl -// diamonds : 2013-09-22 Binky Moon, LLC +// diamonds : Binky Moon, LLC +// https://www.iana.org/domains/root/db/diamonds.html diamonds -// diet : 2014-06-26 XYZ.COM LLC +// diet : XYZ.COM LLC +// https://www.iana.org/domains/root/db/diet.html diet -// digital : 2014-03-06 Binky Moon, LLC +// digital : Binky Moon, LLC +// https://www.iana.org/domains/root/db/digital.html digital -// direct : 2014-04-10 Binky Moon, LLC +// direct : Binky Moon, LLC +// https://www.iana.org/domains/root/db/direct.html direct -// directory : 2013-09-20 Binky Moon, LLC +// directory : Binky Moon, LLC +// https://www.iana.org/domains/root/db/directory.html directory -// discount : 2014-03-06 Binky Moon, LLC +// discount : Binky Moon, LLC +// https://www.iana.org/domains/root/db/discount.html discount -// discover : 2015-07-23 Discover Financial Services +// discover : Discover Financial Services +// https://www.iana.org/domains/root/db/discover.html discover -// dish : 2015-07-30 Dish DBS Corporation +// dish : Dish DBS Corporation +// https://www.iana.org/domains/root/db/dish.html dish -// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +// diy : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/diy.html diy -// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +// dnp : Dai Nippon Printing Co., Ltd. +// https://www.iana.org/domains/root/db/dnp.html dnp -// docs : 2014-10-16 Charleston Road Registry Inc. +// docs : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/docs.html docs -// doctor : 2016-06-02 Binky Moon, LLC +// doctor : Binky Moon, LLC +// https://www.iana.org/domains/root/db/doctor.html doctor -// dog : 2014-12-04 Binky Moon, LLC +// dog : Binky Moon, LLC +// https://www.iana.org/domains/root/db/dog.html dog -// domains : 2013-10-17 Binky Moon, LLC +// domains : Binky Moon, LLC +// https://www.iana.org/domains/root/db/domains.html domains -// dot : 2015-05-21 Dish DBS Corporation +// dot : Dish DBS Corporation +// https://www.iana.org/domains/root/db/dot.html dot -// download : 2014-11-20 dot Support Limited +// download : dot Support Limited +// https://www.iana.org/domains/root/db/download.html download -// drive : 2015-03-05 Charleston Road Registry Inc. +// drive : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/drive.html drive -// dtv : 2015-06-04 Dish DBS Corporation +// dtv : Dish DBS Corporation +// https://www.iana.org/domains/root/db/dtv.html dtv -// dubai : 2015-01-01 Dubai Smart Government Department +// dubai : Dubai Smart Government Department +// https://www.iana.org/domains/root/db/dubai.html dubai -// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +// dunlop : The Goodyear Tire & Rubber Company +// https://www.iana.org/domains/root/db/dunlop.html dunlop -// dupont : 2015-06-25 DuPont Specialty Products USA, LLC +// dupont : DuPont Specialty Products USA, LLC +// https://www.iana.org/domains/root/db/dupont.html dupont -// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +// durban : ZA Central Registry NPC trading as ZA Central Registry +// https://www.iana.org/domains/root/db/durban.html durban -// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +// dvag : Deutsche Vermögensberatung Aktiengesellschaft DVAG +// https://www.iana.org/domains/root/db/dvag.html dvag -// dvr : 2016-05-26 DISH Technologies L.L.C. +// dvr : DISH Technologies L.L.C. +// https://www.iana.org/domains/root/db/dvr.html dvr -// earth : 2014-12-04 Interlink Systems Innovation Institute K.K. +// earth : Interlink Systems Innovation Institute K.K. +// https://www.iana.org/domains/root/db/earth.html earth -// eat : 2014-01-23 Charleston Road Registry Inc. +// eat : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/eat.html eat -// eco : 2016-07-08 Big Room Inc. +// eco : Big Room Inc. +// https://www.iana.org/domains/root/db/eco.html eco -// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +// edeka : EDEKA Verband kaufmännischer Genossenschaften e.V. +// https://www.iana.org/domains/root/db/edeka.html edeka -// education : 2013-11-07 Binky Moon, LLC +// education : Binky Moon, LLC +// https://www.iana.org/domains/root/db/education.html education -// email : 2013-10-31 Binky Moon, LLC +// email : Binky Moon, LLC +// https://www.iana.org/domains/root/db/email.html email -// emerck : 2014-04-03 Merck KGaA +// emerck : Merck KGaA +// https://www.iana.org/domains/root/db/emerck.html emerck -// energy : 2014-09-11 Binky Moon, LLC +// energy : Binky Moon, LLC +// https://www.iana.org/domains/root/db/energy.html energy -// engineer : 2014-03-06 Dog Beach, LLC +// engineer : Dog Beach, LLC +// https://www.iana.org/domains/root/db/engineer.html engineer -// engineering : 2014-03-06 Binky Moon, LLC +// engineering : Binky Moon, LLC +// https://www.iana.org/domains/root/db/engineering.html engineering -// enterprises : 2013-09-20 Binky Moon, LLC +// enterprises : Binky Moon, LLC +// https://www.iana.org/domains/root/db/enterprises.html enterprises -// epson : 2014-12-04 Seiko Epson Corporation +// epson : Seiko Epson Corporation +// https://www.iana.org/domains/root/db/epson.html epson -// equipment : 2013-08-27 Binky Moon, LLC +// equipment : Binky Moon, LLC +// https://www.iana.org/domains/root/db/equipment.html equipment -// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +// ericsson : Telefonaktiebolaget L M Ericsson +// https://www.iana.org/domains/root/db/ericsson.html ericsson -// erni : 2014-04-03 ERNI Group Holding AG +// erni : ERNI Group Holding AG +// https://www.iana.org/domains/root/db/erni.html erni -// esq : 2014-05-08 Charleston Road Registry Inc. +// esq : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/esq.html esq -// estate : 2013-08-27 Binky Moon, LLC +// estate : Binky Moon, LLC +// https://www.iana.org/domains/root/db/estate.html estate -// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -etisalat - -// eurovision : 2014-04-24 European Broadcasting Union (EBU) +// eurovision : European Broadcasting Union (EBU) +// https://www.iana.org/domains/root/db/eurovision.html eurovision -// eus : 2013-12-12 Puntueus Fundazioa +// eus : Puntueus Fundazioa +// https://www.iana.org/domains/root/db/eus.html eus -// events : 2013-12-05 Binky Moon, LLC +// events : Binky Moon, LLC +// https://www.iana.org/domains/root/db/events.html events -// exchange : 2014-03-06 Binky Moon, LLC +// exchange : Binky Moon, LLC +// https://www.iana.org/domains/root/db/exchange.html exchange -// expert : 2013-11-21 Binky Moon, LLC +// expert : Binky Moon, LLC +// https://www.iana.org/domains/root/db/expert.html expert -// exposed : 2013-12-05 Binky Moon, LLC +// exposed : Binky Moon, LLC +// https://www.iana.org/domains/root/db/exposed.html exposed -// express : 2015-02-11 Binky Moon, LLC +// express : Binky Moon, LLC +// https://www.iana.org/domains/root/db/express.html express -// extraspace : 2015-05-14 Extra Space Storage LLC +// extraspace : Extra Space Storage LLC +// https://www.iana.org/domains/root/db/extraspace.html extraspace -// fage : 2014-12-18 Fage International S.A. +// fage : Fage International S.A. +// https://www.iana.org/domains/root/db/fage.html fage -// fail : 2014-03-06 Binky Moon, LLC +// fail : Binky Moon, LLC +// https://www.iana.org/domains/root/db/fail.html fail -// fairwinds : 2014-11-13 FairWinds Partners, LLC +// fairwinds : FairWinds Partners, LLC +// https://www.iana.org/domains/root/db/fairwinds.html fairwinds -// faith : 2014-11-20 dot Faith Limited +// faith : dot Faith Limited +// https://www.iana.org/domains/root/db/faith.html faith -// family : 2015-04-02 Dog Beach, LLC +// family : Dog Beach, LLC +// https://www.iana.org/domains/root/db/family.html family -// fan : 2014-03-06 Dog Beach, LLC +// fan : Dog Beach, LLC +// https://www.iana.org/domains/root/db/fan.html fan -// fans : 2014-11-07 ZDNS International Limited +// fans : ZDNS International Limited +// https://www.iana.org/domains/root/db/fans.html fans -// farm : 2013-11-07 Binky Moon, LLC +// farm : Binky Moon, LLC +// https://www.iana.org/domains/root/db/farm.html farm -// farmers : 2015-07-09 Farmers Insurance Exchange +// farmers : Farmers Insurance Exchange +// https://www.iana.org/domains/root/db/farmers.html farmers -// fashion : 2014-07-03 Registry Services, LLC +// fashion : Registry Services, LLC +// https://www.iana.org/domains/root/db/fashion.html fashion -// fast : 2014-12-18 Amazon Registry Services, Inc. +// fast : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/fast.html fast -// fedex : 2015-08-06 Federal Express Corporation +// fedex : Federal Express Corporation +// https://www.iana.org/domains/root/db/fedex.html fedex -// feedback : 2013-12-19 Top Level Spectrum, Inc. +// feedback : Top Level Spectrum, Inc. +// https://www.iana.org/domains/root/db/feedback.html feedback -// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +// ferrari : Fiat Chrysler Automobiles N.V. +// https://www.iana.org/domains/root/db/ferrari.html ferrari -// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +// ferrero : Ferrero Trading Lux S.A. +// https://www.iana.org/domains/root/db/ferrero.html ferrero -// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +// fidelity : Fidelity Brokerage Services LLC +// https://www.iana.org/domains/root/db/fidelity.html fidelity -// fido : 2015-08-06 Rogers Communications Canada Inc. +// fido : Rogers Communications Canada Inc. +// https://www.iana.org/domains/root/db/fido.html fido -// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +// film : Motion Picture Domain Registry Pty Ltd +// https://www.iana.org/domains/root/db/film.html film -// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +// final : Núcleo de Informação e Coordenação do Ponto BR - NIC.br +// https://www.iana.org/domains/root/db/final.html final -// finance : 2014-03-20 Binky Moon, LLC +// finance : Binky Moon, LLC +// https://www.iana.org/domains/root/db/finance.html finance -// financial : 2014-03-06 Binky Moon, LLC +// financial : Binky Moon, LLC +// https://www.iana.org/domains/root/db/financial.html financial -// fire : 2015-06-25 Amazon Registry Services, Inc. +// fire : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/fire.html fire -// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +// firestone : Bridgestone Licensing Services, Inc +// https://www.iana.org/domains/root/db/firestone.html firestone -// firmdale : 2014-03-27 Firmdale Holdings Limited +// firmdale : Firmdale Holdings Limited +// https://www.iana.org/domains/root/db/firmdale.html firmdale -// fish : 2013-12-12 Binky Moon, LLC +// fish : Binky Moon, LLC +// https://www.iana.org/domains/root/db/fish.html fish -// fishing : 2013-11-21 Registry Services, LLC +// fishing : Registry Services, LLC +// https://www.iana.org/domains/root/db/fishing.html fishing -// fit : 2014-11-07 Registry Services, LLC +// fit : Registry Services, LLC +// https://www.iana.org/domains/root/db/fit.html fit -// fitness : 2014-03-06 Binky Moon, LLC +// fitness : Binky Moon, LLC +// https://www.iana.org/domains/root/db/fitness.html fitness -// flickr : 2015-04-02 Flickr, Inc. +// flickr : Flickr, Inc. +// https://www.iana.org/domains/root/db/flickr.html flickr -// flights : 2013-12-05 Binky Moon, LLC +// flights : Binky Moon, LLC +// https://www.iana.org/domains/root/db/flights.html flights -// flir : 2015-07-23 FLIR Systems, Inc. +// flir : FLIR Systems, Inc. +// https://www.iana.org/domains/root/db/flir.html flir -// florist : 2013-11-07 Binky Moon, LLC +// florist : Binky Moon, LLC +// https://www.iana.org/domains/root/db/florist.html florist -// flowers : 2014-10-09 XYZ.COM LLC +// flowers : XYZ.COM LLC +// https://www.iana.org/domains/root/db/flowers.html flowers -// fly : 2014-05-08 Charleston Road Registry Inc. +// fly : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/fly.html fly -// foo : 2014-01-23 Charleston Road Registry Inc. +// foo : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/foo.html foo -// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +// food : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/food.html food -// football : 2014-12-18 Binky Moon, LLC +// football : Binky Moon, LLC +// https://www.iana.org/domains/root/db/football.html football -// ford : 2014-11-13 Ford Motor Company +// ford : Ford Motor Company +// https://www.iana.org/domains/root/db/ford.html ford -// forex : 2014-12-11 Dog Beach, LLC +// forex : Dog Beach, LLC +// https://www.iana.org/domains/root/db/forex.html forex -// forsale : 2014-05-22 Dog Beach, LLC +// forsale : Dog Beach, LLC +// https://www.iana.org/domains/root/db/forsale.html forsale -// forum : 2015-04-02 Fegistry, LLC +// forum : Fegistry, LLC +// https://www.iana.org/domains/root/db/forum.html forum -// foundation : 2013-12-05 Public Interest Registry +// foundation : Public Interest Registry +// https://www.iana.org/domains/root/db/foundation.html foundation -// fox : 2015-09-11 FOX Registry, LLC +// fox : FOX Registry, LLC +// https://www.iana.org/domains/root/db/fox.html fox -// free : 2015-12-10 Amazon Registry Services, Inc. +// free : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/free.html free -// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +// fresenius : Fresenius Immobilien-Verwaltungs-GmbH +// https://www.iana.org/domains/root/db/fresenius.html fresenius -// frl : 2014-05-15 FRLregistry B.V. +// frl : FRLregistry B.V. +// https://www.iana.org/domains/root/db/frl.html frl -// frogans : 2013-12-19 OP3FT +// frogans : OP3FT +// https://www.iana.org/domains/root/db/frogans.html frogans -// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. -frontdoor - -// frontier : 2015-02-05 Frontier Communications Corporation +// frontier : Frontier Communications Corporation +// https://www.iana.org/domains/root/db/frontier.html frontier -// ftr : 2015-07-16 Frontier Communications Corporation +// ftr : Frontier Communications Corporation +// https://www.iana.org/domains/root/db/ftr.html ftr -// fujitsu : 2015-07-30 Fujitsu Limited +// fujitsu : Fujitsu Limited +// https://www.iana.org/domains/root/db/fujitsu.html fujitsu -// fun : 2016-01-14 Radix FZC +// fun : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/fun.html fun -// fund : 2014-03-20 Binky Moon, LLC +// fund : Binky Moon, LLC +// https://www.iana.org/domains/root/db/fund.html fund -// furniture : 2014-03-20 Binky Moon, LLC +// furniture : Binky Moon, LLC +// https://www.iana.org/domains/root/db/furniture.html furniture -// futbol : 2013-09-20 Dog Beach, LLC +// futbol : Dog Beach, LLC +// https://www.iana.org/domains/root/db/futbol.html futbol -// fyi : 2015-04-02 Binky Moon, LLC +// fyi : Binky Moon, LLC +// https://www.iana.org/domains/root/db/fyi.html fyi -// gal : 2013-11-07 Asociación puntoGAL +// gal : Asociación puntoGAL +// https://www.iana.org/domains/root/db/gal.html gal -// gallery : 2013-09-13 Binky Moon, LLC +// gallery : Binky Moon, LLC +// https://www.iana.org/domains/root/db/gallery.html gallery -// gallo : 2015-06-11 Gallo Vineyards, Inc. +// gallo : Gallo Vineyards, Inc. +// https://www.iana.org/domains/root/db/gallo.html gallo -// gallup : 2015-02-19 Gallup, Inc. +// gallup : Gallup, Inc. +// https://www.iana.org/domains/root/db/gallup.html gallup -// game : 2015-05-28 XYZ.COM LLC +// game : XYZ.COM LLC +// https://www.iana.org/domains/root/db/game.html game -// games : 2015-05-28 Dog Beach, LLC +// games : Dog Beach, LLC +// https://www.iana.org/domains/root/db/games.html games -// gap : 2015-07-31 The Gap, Inc. +// gap : The Gap, Inc. +// https://www.iana.org/domains/root/db/gap.html gap -// garden : 2014-06-26 Registry Services, LLC +// garden : Registry Services, LLC +// https://www.iana.org/domains/root/db/garden.html garden -// gay : 2019-05-23 Registry Services, LLC +// gay : Registry Services, LLC +// https://www.iana.org/domains/root/db/gay.html gay -// gbiz : 2014-07-17 Charleston Road Registry Inc. +// gbiz : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/gbiz.html gbiz -// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +// gdn : Joint Stock Company "Navigation-information systems" +// https://www.iana.org/domains/root/db/gdn.html gdn -// gea : 2014-12-04 GEA Group Aktiengesellschaft +// gea : GEA Group Aktiengesellschaft +// https://www.iana.org/domains/root/db/gea.html gea -// gent : 2014-01-23 Easyhost BV +// gent : Easyhost BV +// https://www.iana.org/domains/root/db/gent.html gent -// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +// genting : Resorts World Inc Pte. Ltd. +// https://www.iana.org/domains/root/db/genting.html genting -// george : 2015-07-31 Wal-Mart Stores, Inc. +// george : Wal-Mart Stores, Inc. +// https://www.iana.org/domains/root/db/george.html george -// ggee : 2014-01-09 GMO Internet, Inc. +// ggee : GMO Internet, Inc. +// https://www.iana.org/domains/root/db/ggee.html ggee -// gift : 2013-10-17 DotGift, LLC +// gift : DotGift, LLC +// https://www.iana.org/domains/root/db/gift.html gift -// gifts : 2014-07-03 Binky Moon, LLC +// gifts : Binky Moon, LLC +// https://www.iana.org/domains/root/db/gifts.html gifts -// gives : 2014-03-06 Public Interest Registry +// gives : Public Interest Registry +// https://www.iana.org/domains/root/db/gives.html gives -// giving : 2014-11-13 Public Interest Registry +// giving : Public Interest Registry +// https://www.iana.org/domains/root/db/giving.html giving -// glass : 2013-11-07 Binky Moon, LLC +// glass : Binky Moon, LLC +// https://www.iana.org/domains/root/db/glass.html glass -// gle : 2014-07-24 Charleston Road Registry Inc. +// gle : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/gle.html gle -// global : 2014-04-17 Identity Digital Limited +// global : Identity Digital Limited +// https://www.iana.org/domains/root/db/global.html global -// globo : 2013-12-19 Globo Comunicação e Participações S.A +// globo : Globo Comunicação e Participações S.A +// https://www.iana.org/domains/root/db/globo.html globo -// gmail : 2014-05-01 Charleston Road Registry Inc. +// gmail : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/gmail.html gmail -// gmbh : 2016-01-29 Binky Moon, LLC +// gmbh : Binky Moon, LLC +// https://www.iana.org/domains/root/db/gmbh.html gmbh -// gmo : 2014-01-09 GMO Internet, Inc. +// gmo : GMO Internet, Inc. +// https://www.iana.org/domains/root/db/gmo.html gmo -// gmx : 2014-04-24 1&1 Mail & Media GmbH +// gmx : 1&1 Mail & Media GmbH +// https://www.iana.org/domains/root/db/gmx.html gmx -// godaddy : 2015-07-23 Go Daddy East, LLC +// godaddy : Go Daddy East, LLC +// https://www.iana.org/domains/root/db/godaddy.html godaddy -// gold : 2015-01-22 Binky Moon, LLC +// gold : Binky Moon, LLC +// https://www.iana.org/domains/root/db/gold.html gold -// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +// goldpoint : YODOBASHI CAMERA CO.,LTD. +// https://www.iana.org/domains/root/db/goldpoint.html goldpoint -// golf : 2014-12-18 Binky Moon, LLC +// golf : Binky Moon, LLC +// https://www.iana.org/domains/root/db/golf.html golf -// goo : 2014-12-18 NTT Resonant Inc. +// goo : NTT DOCOMO, INC. +// https://www.iana.org/domains/root/db/goo.html goo -// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +// goodyear : The Goodyear Tire & Rubber Company +// https://www.iana.org/domains/root/db/goodyear.html goodyear -// goog : 2014-11-20 Charleston Road Registry Inc. +// goog : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/goog.html goog -// google : 2014-07-24 Charleston Road Registry Inc. +// google : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/google.html google -// gop : 2014-01-16 Republican State Leadership Committee, Inc. +// gop : Republican State Leadership Committee, Inc. +// https://www.iana.org/domains/root/db/gop.html gop -// got : 2014-12-18 Amazon Registry Services, Inc. +// got : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/got.html got -// grainger : 2015-05-07 Grainger Registry Services, LLC +// grainger : Grainger Registry Services, LLC +// https://www.iana.org/domains/root/db/grainger.html grainger -// graphics : 2013-09-13 Binky Moon, LLC +// graphics : Binky Moon, LLC +// https://www.iana.org/domains/root/db/graphics.html graphics -// gratis : 2014-03-20 Binky Moon, LLC +// gratis : Binky Moon, LLC +// https://www.iana.org/domains/root/db/gratis.html gratis -// green : 2014-05-08 Identity Digital Limited +// green : Identity Digital Limited +// https://www.iana.org/domains/root/db/green.html green -// gripe : 2014-03-06 Binky Moon, LLC +// gripe : Binky Moon, LLC +// https://www.iana.org/domains/root/db/gripe.html gripe -// grocery : 2016-06-16 Wal-Mart Stores, Inc. +// grocery : Wal-Mart Stores, Inc. +// https://www.iana.org/domains/root/db/grocery.html grocery -// group : 2014-08-15 Binky Moon, LLC +// group : Binky Moon, LLC +// https://www.iana.org/domains/root/db/group.html group -// guardian : 2015-07-30 The Guardian Life Insurance Company of America -guardian - -// gucci : 2014-11-13 Guccio Gucci S.p.a. +// gucci : Guccio Gucci S.p.a. +// https://www.iana.org/domains/root/db/gucci.html gucci -// guge : 2014-08-28 Charleston Road Registry Inc. +// guge : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/guge.html guge -// guide : 2013-09-13 Binky Moon, LLC +// guide : Binky Moon, LLC +// https://www.iana.org/domains/root/db/guide.html guide -// guitars : 2013-11-14 XYZ.COM LLC +// guitars : XYZ.COM LLC +// https://www.iana.org/domains/root/db/guitars.html guitars -// guru : 2013-08-27 Binky Moon, LLC +// guru : Binky Moon, LLC +// https://www.iana.org/domains/root/db/guru.html guru -// hair : 2015-12-03 XYZ.COM LLC +// hair : XYZ.COM LLC +// https://www.iana.org/domains/root/db/hair.html hair -// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +// hamburg : Hamburg Top-Level-Domain GmbH +// https://www.iana.org/domains/root/db/hamburg.html hamburg -// hangout : 2014-11-13 Charleston Road Registry Inc. +// hangout : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/hangout.html hangout -// haus : 2013-12-05 Dog Beach, LLC +// haus : Dog Beach, LLC +// https://www.iana.org/domains/root/db/haus.html haus -// hbo : 2015-07-30 HBO Registry Services, Inc. +// hbo : HBO Registry Services, Inc. +// https://www.iana.org/domains/root/db/hbo.html hbo -// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +// hdfc : HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +// https://www.iana.org/domains/root/db/hdfc.html hdfc -// hdfcbank : 2015-02-12 HDFC Bank Limited +// hdfcbank : HDFC Bank Limited +// https://www.iana.org/domains/root/db/hdfcbank.html hdfcbank -// health : 2015-02-11 Registry Services, LLC +// health : Registry Services, LLC +// https://www.iana.org/domains/root/db/health.html health -// healthcare : 2014-06-12 Binky Moon, LLC +// healthcare : Binky Moon, LLC +// https://www.iana.org/domains/root/db/healthcare.html healthcare -// help : 2014-06-26 Innovation service Limited +// help : Innovation service Limited +// https://www.iana.org/domains/root/db/help.html help -// helsinki : 2015-02-05 City of Helsinki +// helsinki : City of Helsinki +// https://www.iana.org/domains/root/db/helsinki.html helsinki -// here : 2014-02-06 Charleston Road Registry Inc. +// here : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/here.html here -// hermes : 2014-07-10 HERMES INTERNATIONAL +// hermes : HERMES INTERNATIONAL +// https://www.iana.org/domains/root/db/hermes.html hermes -// hiphop : 2014-03-06 Dot Hip Hop, LLC +// hiphop : Dot Hip Hop, LLC +// https://www.iana.org/domains/root/db/hiphop.html hiphop -// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +// hisamitsu : Hisamitsu Pharmaceutical Co.,Inc. +// https://www.iana.org/domains/root/db/hisamitsu.html hisamitsu -// hitachi : 2014-10-31 Hitachi, Ltd. +// hitachi : Hitachi, Ltd. +// https://www.iana.org/domains/root/db/hitachi.html hitachi -// hiv : 2014-03-13 Internet Naming Company LLC +// hiv : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/hiv.html hiv -// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +// hkt : PCCW-HKT DataCom Services Limited +// https://www.iana.org/domains/root/db/hkt.html hkt -// hockey : 2015-03-19 Binky Moon, LLC +// hockey : Binky Moon, LLC +// https://www.iana.org/domains/root/db/hockey.html hockey -// holdings : 2013-08-27 Binky Moon, LLC +// holdings : Binky Moon, LLC +// https://www.iana.org/domains/root/db/holdings.html holdings -// holiday : 2013-11-07 Binky Moon, LLC +// holiday : Binky Moon, LLC +// https://www.iana.org/domains/root/db/holiday.html holiday -// homedepot : 2015-04-02 Home Depot Product Authority, LLC +// homedepot : Home Depot Product Authority, LLC +// https://www.iana.org/domains/root/db/homedepot.html homedepot -// homegoods : 2015-07-16 The TJX Companies, Inc. +// homegoods : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/homegoods.html homegoods -// homes : 2014-01-09 XYZ.COM LLC +// homes : XYZ.COM LLC +// https://www.iana.org/domains/root/db/homes.html homes -// homesense : 2015-07-16 The TJX Companies, Inc. +// homesense : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/homesense.html homesense -// honda : 2014-12-18 Honda Motor Co., Ltd. +// honda : Honda Motor Co., Ltd. +// https://www.iana.org/domains/root/db/honda.html honda -// horse : 2013-11-21 Registry Services, LLC +// horse : Registry Services, LLC +// https://www.iana.org/domains/root/db/horse.html horse -// hospital : 2016-10-20 Binky Moon, LLC +// hospital : Binky Moon, LLC +// https://www.iana.org/domains/root/db/hospital.html hospital -// host : 2014-04-17 Radix FZC +// host : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/host.html host -// hosting : 2014-05-29 XYZ.COM LLC +// hosting : XYZ.COM LLC +// https://www.iana.org/domains/root/db/hosting.html hosting -// hot : 2015-08-27 Amazon Registry Services, Inc. +// hot : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/hot.html hot -// hoteles : 2015-03-05 Travel Reservations SRL -hoteles - -// hotels : 2016-04-07 Booking.com B.V. +// hotels : Booking.com B.V. +// https://www.iana.org/domains/root/db/hotels.html hotels -// hotmail : 2014-12-18 Microsoft Corporation +// hotmail : Microsoft Corporation +// https://www.iana.org/domains/root/db/hotmail.html hotmail -// house : 2013-11-07 Binky Moon, LLC +// house : Binky Moon, LLC +// https://www.iana.org/domains/root/db/house.html house -// how : 2014-01-23 Charleston Road Registry Inc. +// how : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/how.html how -// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +// hsbc : HSBC Global Services (UK) Limited +// https://www.iana.org/domains/root/db/hsbc.html hsbc -// hughes : 2015-07-30 Hughes Satellite Systems Corporation +// hughes : Hughes Satellite Systems Corporation +// https://www.iana.org/domains/root/db/hughes.html hughes -// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +// hyatt : Hyatt GTLD, L.L.C. +// https://www.iana.org/domains/root/db/hyatt.html hyatt -// hyundai : 2015-07-09 Hyundai Motor Company +// hyundai : Hyundai Motor Company +// https://www.iana.org/domains/root/db/hyundai.html hyundai -// ibm : 2014-07-31 International Business Machines Corporation +// ibm : International Business Machines Corporation +// https://www.iana.org/domains/root/db/ibm.html ibm -// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +// icbc : Industrial and Commercial Bank of China Limited +// https://www.iana.org/domains/root/db/icbc.html icbc -// ice : 2014-10-30 IntercontinentalExchange, Inc. +// ice : IntercontinentalExchange, Inc. +// https://www.iana.org/domains/root/db/ice.html ice -// icu : 2015-01-08 ShortDot SA +// icu : ShortDot SA +// https://www.iana.org/domains/root/db/icu.html icu -// ieee : 2015-07-23 IEEE Global LLC +// ieee : IEEE Global LLC +// https://www.iana.org/domains/root/db/ieee.html ieee -// ifm : 2014-01-30 ifm electronic gmbh +// ifm : ifm electronic gmbh +// https://www.iana.org/domains/root/db/ifm.html ifm -// ikano : 2015-07-09 Ikano S.A. +// ikano : Ikano S.A. +// https://www.iana.org/domains/root/db/ikano.html ikano -// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +// imamat : Fondation Aga Khan (Aga Khan Foundation) +// https://www.iana.org/domains/root/db/imamat.html imamat -// imdb : 2015-06-25 Amazon Registry Services, Inc. +// imdb : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/imdb.html imdb -// immo : 2014-07-10 Binky Moon, LLC +// immo : Binky Moon, LLC +// https://www.iana.org/domains/root/db/immo.html immo -// immobilien : 2013-11-07 Dog Beach, LLC +// immobilien : Dog Beach, LLC +// https://www.iana.org/domains/root/db/immobilien.html immobilien -// inc : 2018-03-10 Intercap Registry Inc. +// inc : Intercap Registry Inc. +// https://www.iana.org/domains/root/db/inc.html inc -// industries : 2013-12-05 Binky Moon, LLC +// industries : Binky Moon, LLC +// https://www.iana.org/domains/root/db/industries.html industries -// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +// infiniti : NISSAN MOTOR CO., LTD. +// https://www.iana.org/domains/root/db/infiniti.html infiniti -// ing : 2014-01-23 Charleston Road Registry Inc. +// ing : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/ing.html ing -// ink : 2013-12-05 Registry Services, LLC +// ink : Registry Services, LLC +// https://www.iana.org/domains/root/db/ink.html ink -// institute : 2013-11-07 Binky Moon, LLC +// institute : Binky Moon, LLC +// https://www.iana.org/domains/root/db/institute.html institute -// insurance : 2015-02-19 fTLD Registry Services LLC +// insurance : fTLD Registry Services LLC +// https://www.iana.org/domains/root/db/insurance.html insurance -// insure : 2014-03-20 Binky Moon, LLC +// insure : Binky Moon, LLC +// https://www.iana.org/domains/root/db/insure.html insure -// international : 2013-11-07 Binky Moon, LLC +// international : Binky Moon, LLC +// https://www.iana.org/domains/root/db/international.html international -// intuit : 2015-07-30 Intuit Administrative Services, Inc. +// intuit : Intuit Administrative Services, Inc. +// https://www.iana.org/domains/root/db/intuit.html intuit -// investments : 2014-03-20 Binky Moon, LLC +// investments : Binky Moon, LLC +// https://www.iana.org/domains/root/db/investments.html investments -// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +// ipiranga : Ipiranga Produtos de Petroleo S.A. +// https://www.iana.org/domains/root/db/ipiranga.html ipiranga -// irish : 2014-08-07 Binky Moon, LLC +// irish : Binky Moon, LLC +// https://www.iana.org/domains/root/db/irish.html irish -// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +// ismaili : Fondation Aga Khan (Aga Khan Foundation) +// https://www.iana.org/domains/root/db/ismaili.html ismaili -// ist : 2014-08-28 Istanbul Metropolitan Municipality +// ist : Istanbul Metropolitan Municipality +// https://www.iana.org/domains/root/db/ist.html ist -// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +// istanbul : Istanbul Metropolitan Municipality +// https://www.iana.org/domains/root/db/istanbul.html istanbul -// itau : 2014-10-02 Itau Unibanco Holding S.A. +// itau : Itau Unibanco Holding S.A. +// https://www.iana.org/domains/root/db/itau.html itau -// itv : 2015-07-09 ITV Services Limited +// itv : ITV Services Limited +// https://www.iana.org/domains/root/db/itv.html itv -// jaguar : 2014-11-13 Jaguar Land Rover Ltd +// jaguar : Jaguar Land Rover Ltd +// https://www.iana.org/domains/root/db/jaguar.html jaguar -// java : 2014-06-19 Oracle Corporation +// java : Oracle Corporation +// https://www.iana.org/domains/root/db/java.html java -// jcb : 2014-11-20 JCB Co., Ltd. +// jcb : JCB Co., Ltd. +// https://www.iana.org/domains/root/db/jcb.html jcb -// jeep : 2015-07-30 FCA US LLC. +// jeep : FCA US LLC. +// https://www.iana.org/domains/root/db/jeep.html jeep -// jetzt : 2014-01-09 Binky Moon, LLC +// jetzt : Binky Moon, LLC +// https://www.iana.org/domains/root/db/jetzt.html jetzt -// jewelry : 2015-03-05 Binky Moon, LLC +// jewelry : Binky Moon, LLC +// https://www.iana.org/domains/root/db/jewelry.html jewelry -// jio : 2015-04-02 Reliance Industries Limited +// jio : Reliance Industries Limited +// https://www.iana.org/domains/root/db/jio.html jio -// jll : 2015-04-02 Jones Lang LaSalle Incorporated +// jll : Jones Lang LaSalle Incorporated +// https://www.iana.org/domains/root/db/jll.html jll -// jmp : 2015-03-26 Matrix IP LLC +// jmp : Matrix IP LLC +// https://www.iana.org/domains/root/db/jmp.html jmp -// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +// jnj : Johnson & Johnson Services, Inc. +// https://www.iana.org/domains/root/db/jnj.html jnj -// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +// joburg : ZA Central Registry NPC trading as ZA Central Registry +// https://www.iana.org/domains/root/db/joburg.html joburg -// jot : 2014-12-18 Amazon Registry Services, Inc. +// jot : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/jot.html jot -// joy : 2014-12-18 Amazon Registry Services, Inc. +// joy : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/joy.html joy -// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +// jpmorgan : JPMorgan Chase Bank, National Association +// https://www.iana.org/domains/root/db/jpmorgan.html jpmorgan -// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +// jprs : Japan Registry Services Co., Ltd. +// https://www.iana.org/domains/root/db/jprs.html jprs -// juegos : 2014-03-20 Internet Naming Company LLC +// juegos : Dog Beach, LLC +// https://www.iana.org/domains/root/db/juegos.html juegos -// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +// juniper : JUNIPER NETWORKS, INC. +// https://www.iana.org/domains/root/db/juniper.html juniper -// kaufen : 2013-11-07 Dog Beach, LLC +// kaufen : Dog Beach, LLC +// https://www.iana.org/domains/root/db/kaufen.html kaufen -// kddi : 2014-09-12 KDDI CORPORATION +// kddi : KDDI CORPORATION +// https://www.iana.org/domains/root/db/kddi.html kddi -// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +// kerryhotels : Kerry Trading Co. Limited +// https://www.iana.org/domains/root/db/kerryhotels.html kerryhotels -// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +// kerrylogistics : Kerry Trading Co. Limited +// https://www.iana.org/domains/root/db/kerrylogistics.html kerrylogistics -// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +// kerryproperties : Kerry Trading Co. Limited +// https://www.iana.org/domains/root/db/kerryproperties.html kerryproperties -// kfh : 2014-12-04 Kuwait Finance House +// kfh : Kuwait Finance House +// https://www.iana.org/domains/root/db/kfh.html kfh -// kia : 2015-07-09 KIA MOTORS CORPORATION +// kia : KIA MOTORS CORPORATION +// https://www.iana.org/domains/root/db/kia.html kia -// kids : 2021-08-13 DotKids Foundation Limited +// kids : DotKids Foundation Limited +// https://www.iana.org/domains/root/db/kids.html kids -// kim : 2013-09-23 Identity Digital Limited +// kim : Identity Digital Limited +// https://www.iana.org/domains/root/db/kim.html kim -// kinder : 2014-11-07 Ferrero Trading Lux S.A. -kinder - -// kindle : 2015-06-25 Amazon Registry Services, Inc. +// kindle : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/kindle.html kindle -// kitchen : 2013-09-20 Binky Moon, LLC +// kitchen : Binky Moon, LLC +// https://www.iana.org/domains/root/db/kitchen.html kitchen -// kiwi : 2013-09-20 DOT KIWI LIMITED +// kiwi : DOT KIWI LIMITED +// https://www.iana.org/domains/root/db/kiwi.html kiwi -// koeln : 2014-01-09 dotKoeln GmbH +// koeln : dotKoeln GmbH +// https://www.iana.org/domains/root/db/koeln.html koeln -// komatsu : 2015-01-08 Komatsu Ltd. +// komatsu : Komatsu Ltd. +// https://www.iana.org/domains/root/db/komatsu.html komatsu -// kosher : 2015-08-20 Kosher Marketing Assets LLC +// kosher : Kosher Marketing Assets LLC +// https://www.iana.org/domains/root/db/kosher.html kosher -// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +// kpmg : KPMG International Cooperative (KPMG International Genossenschaft) +// https://www.iana.org/domains/root/db/kpmg.html kpmg -// kpn : 2015-01-08 Koninklijke KPN N.V. +// kpn : Koninklijke KPN N.V. +// https://www.iana.org/domains/root/db/kpn.html kpn -// krd : 2013-12-05 KRG Department of Information Technology +// krd : KRG Department of Information Technology +// https://www.iana.org/domains/root/db/krd.html krd -// kred : 2013-12-19 KredTLD Pty Ltd +// kred : KredTLD Pty Ltd +// https://www.iana.org/domains/root/db/kred.html kred -// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +// kuokgroup : Kerry Trading Co. Limited +// https://www.iana.org/domains/root/db/kuokgroup.html kuokgroup -// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +// kyoto : Academic Institution: Kyoto Jyoho Gakuen +// https://www.iana.org/domains/root/db/kyoto.html kyoto -// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +// lacaixa : Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +// https://www.iana.org/domains/root/db/lacaixa.html lacaixa -// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +// lamborghini : Automobili Lamborghini S.p.A. +// https://www.iana.org/domains/root/db/lamborghini.html lamborghini -// lamer : 2015-10-01 The Estée Lauder Companies Inc. +// lamer : The Estée Lauder Companies Inc. +// https://www.iana.org/domains/root/db/lamer.html lamer -// lancaster : 2015-02-12 LANCASTER +// lancaster : LANCASTER +// https://www.iana.org/domains/root/db/lancaster.html lancaster -// land : 2013-09-10 Binky Moon, LLC +// land : Binky Moon, LLC +// https://www.iana.org/domains/root/db/land.html land -// landrover : 2014-11-13 Jaguar Land Rover Ltd +// landrover : Jaguar Land Rover Ltd +// https://www.iana.org/domains/root/db/landrover.html landrover -// lanxess : 2015-07-30 LANXESS Corporation +// lanxess : LANXESS Corporation +// https://www.iana.org/domains/root/db/lanxess.html lanxess -// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +// lasalle : Jones Lang LaSalle Incorporated +// https://www.iana.org/domains/root/db/lasalle.html lasalle -// lat : 2014-10-16 XYZ.COM LLC +// lat : XYZ.COM LLC +// https://www.iana.org/domains/root/db/lat.html lat -// latino : 2015-07-30 Dish DBS Corporation +// latino : Dish DBS Corporation +// https://www.iana.org/domains/root/db/latino.html latino -// latrobe : 2014-06-16 La Trobe University +// latrobe : La Trobe University +// https://www.iana.org/domains/root/db/latrobe.html latrobe -// law : 2015-01-22 Registry Services, LLC +// law : Registry Services, LLC +// https://www.iana.org/domains/root/db/law.html law -// lawyer : 2014-03-20 Dog Beach, LLC +// lawyer : Dog Beach, LLC +// https://www.iana.org/domains/root/db/lawyer.html lawyer -// lds : 2014-03-20 IRI Domain Management, LLC +// lds : IRI Domain Management, LLC +// https://www.iana.org/domains/root/db/lds.html lds -// lease : 2014-03-06 Binky Moon, LLC +// lease : Binky Moon, LLC +// https://www.iana.org/domains/root/db/lease.html lease -// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +// leclerc : A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +// https://www.iana.org/domains/root/db/leclerc.html leclerc -// lefrak : 2015-07-16 LeFrak Organization, Inc. +// lefrak : LeFrak Organization, Inc. +// https://www.iana.org/domains/root/db/lefrak.html lefrak -// legal : 2014-10-16 Binky Moon, LLC +// legal : Binky Moon, LLC +// https://www.iana.org/domains/root/db/legal.html legal -// lego : 2015-07-16 LEGO Juris A/S +// lego : LEGO Juris A/S +// https://www.iana.org/domains/root/db/lego.html lego -// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +// lexus : TOYOTA MOTOR CORPORATION +// https://www.iana.org/domains/root/db/lexus.html lexus -// lgbt : 2014-05-08 Identity Digital Limited +// lgbt : Identity Digital Limited +// https://www.iana.org/domains/root/db/lgbt.html lgbt -// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +// lidl : Schwarz Domains und Services GmbH & Co. KG +// https://www.iana.org/domains/root/db/lidl.html lidl -// life : 2014-02-06 Binky Moon, LLC +// life : Binky Moon, LLC +// https://www.iana.org/domains/root/db/life.html life -// lifeinsurance : 2015-01-15 American Council of Life Insurers +// lifeinsurance : American Council of Life Insurers +// https://www.iana.org/domains/root/db/lifeinsurance.html lifeinsurance -// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +// lifestyle : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/lifestyle.html lifestyle -// lighting : 2013-08-27 Binky Moon, LLC +// lighting : Binky Moon, LLC +// https://www.iana.org/domains/root/db/lighting.html lighting -// like : 2014-12-18 Amazon Registry Services, Inc. +// like : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/like.html like -// lilly : 2015-07-31 Eli Lilly and Company +// lilly : Eli Lilly and Company +// https://www.iana.org/domains/root/db/lilly.html lilly -// limited : 2014-03-06 Binky Moon, LLC +// limited : Binky Moon, LLC +// https://www.iana.org/domains/root/db/limited.html limited -// limo : 2013-10-17 Binky Moon, LLC +// limo : Binky Moon, LLC +// https://www.iana.org/domains/root/db/limo.html limo -// lincoln : 2014-11-13 Ford Motor Company +// lincoln : Ford Motor Company +// https://www.iana.org/domains/root/db/lincoln.html lincoln -// link : 2013-11-14 Nova Registry Ltd +// link : Nova Registry Ltd +// https://www.iana.org/domains/root/db/link.html link -// lipsy : 2015-06-25 Lipsy Ltd +// lipsy : Lipsy Ltd +// https://www.iana.org/domains/root/db/lipsy.html lipsy -// live : 2014-12-04 Dog Beach, LLC +// live : Dog Beach, LLC +// https://www.iana.org/domains/root/db/live.html live -// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +// living : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/living.html living -// llc : 2017-12-14 Identity Digital Limited +// llc : Identity Digital Limited +// https://www.iana.org/domains/root/db/llc.html llc -// llp : 2019-08-26 Intercap Registry Inc. +// llp : Intercap Registry Inc. +// https://www.iana.org/domains/root/db/llp.html llp -// loan : 2014-11-20 dot Loan Limited +// loan : dot Loan Limited +// https://www.iana.org/domains/root/db/loan.html loan -// loans : 2014-03-20 Binky Moon, LLC +// loans : Binky Moon, LLC +// https://www.iana.org/domains/root/db/loans.html loans -// locker : 2015-06-04 Dish DBS Corporation +// locker : Orange Domains LLC +// https://www.iana.org/domains/root/db/locker.html locker -// locus : 2015-06-25 Locus Analytics LLC +// locus : Locus Analytics LLC +// https://www.iana.org/domains/root/db/locus.html locus -// lol : 2015-01-30 XYZ.COM LLC +// lol : XYZ.COM LLC +// https://www.iana.org/domains/root/db/lol.html lol -// london : 2013-11-14 Dot London Domains Limited +// london : Dot London Domains Limited +// https://www.iana.org/domains/root/db/london.html london -// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +// lotte : Lotte Holdings Co., Ltd. +// https://www.iana.org/domains/root/db/lotte.html lotte -// lotto : 2014-04-10 Identity Digital Limited +// lotto : Identity Digital Limited +// https://www.iana.org/domains/root/db/lotto.html lotto -// love : 2014-12-22 Merchant Law Group LLP +// love : Merchant Law Group LLP +// https://www.iana.org/domains/root/db/love.html love -// lpl : 2015-07-30 LPL Holdings, Inc. +// lpl : LPL Holdings, Inc. +// https://www.iana.org/domains/root/db/lpl.html lpl -// lplfinancial : 2015-07-30 LPL Holdings, Inc. +// lplfinancial : LPL Holdings, Inc. +// https://www.iana.org/domains/root/db/lplfinancial.html lplfinancial -// ltd : 2014-09-25 Binky Moon, LLC +// ltd : Binky Moon, LLC +// https://www.iana.org/domains/root/db/ltd.html ltd -// ltda : 2014-04-17 InterNetX, Corp +// ltda : InterNetX, Corp +// https://www.iana.org/domains/root/db/ltda.html ltda -// lundbeck : 2015-08-06 H. Lundbeck A/S +// lundbeck : H. Lundbeck A/S +// https://www.iana.org/domains/root/db/lundbeck.html lundbeck -// luxe : 2014-01-09 Registry Services, LLC +// luxe : Registry Services, LLC +// https://www.iana.org/domains/root/db/luxe.html luxe -// luxury : 2013-10-17 Luxury Partners, LLC +// luxury : Luxury Partners, LLC +// https://www.iana.org/domains/root/db/luxury.html luxury -// madrid : 2014-05-01 Comunidad de Madrid +// madrid : Comunidad de Madrid +// https://www.iana.org/domains/root/db/madrid.html madrid -// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +// maif : Mutuelle Assurance Instituteur France (MAIF) +// https://www.iana.org/domains/root/db/maif.html maif -// maison : 2013-12-05 Binky Moon, LLC +// maison : Binky Moon, LLC +// https://www.iana.org/domains/root/db/maison.html maison -// makeup : 2015-01-15 XYZ.COM LLC +// makeup : XYZ.COM LLC +// https://www.iana.org/domains/root/db/makeup.html makeup -// man : 2014-12-04 MAN SE +// man : MAN SE +// https://www.iana.org/domains/root/db/man.html man -// management : 2013-11-07 Binky Moon, LLC +// management : Binky Moon, LLC +// https://www.iana.org/domains/root/db/management.html management -// mango : 2013-10-24 PUNTO FA S.L. +// mango : PUNTO FA S.L. +// https://www.iana.org/domains/root/db/mango.html mango -// map : 2016-06-09 Charleston Road Registry Inc. +// map : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/map.html map -// market : 2014-03-06 Dog Beach, LLC +// market : Dog Beach, LLC +// https://www.iana.org/domains/root/db/market.html market -// marketing : 2013-11-07 Binky Moon, LLC +// marketing : Binky Moon, LLC +// https://www.iana.org/domains/root/db/marketing.html marketing -// markets : 2014-12-11 Dog Beach, LLC +// markets : Dog Beach, LLC +// https://www.iana.org/domains/root/db/markets.html markets -// marriott : 2014-10-09 Marriott Worldwide Corporation +// marriott : Marriott Worldwide Corporation +// https://www.iana.org/domains/root/db/marriott.html marriott -// marshalls : 2015-07-16 The TJX Companies, Inc. +// marshalls : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/marshalls.html marshalls -// mattel : 2015-08-06 Mattel Sites, Inc. +// mattel : Mattel Sites, Inc. +// https://www.iana.org/domains/root/db/mattel.html mattel -// mba : 2015-04-02 Binky Moon, LLC +// mba : Binky Moon, LLC +// https://www.iana.org/domains/root/db/mba.html mba -// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +// mckinsey : McKinsey Holdings, Inc. +// https://www.iana.org/domains/root/db/mckinsey.html mckinsey -// med : 2015-08-06 Medistry LLC +// med : Medistry LLC +// https://www.iana.org/domains/root/db/med.html med -// media : 2014-03-06 Binky Moon, LLC +// media : Binky Moon, LLC +// https://www.iana.org/domains/root/db/media.html media -// meet : 2014-01-16 Charleston Road Registry Inc. +// meet : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/meet.html meet -// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +// melbourne : The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +// https://www.iana.org/domains/root/db/melbourne.html melbourne -// meme : 2014-01-30 Charleston Road Registry Inc. +// meme : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/meme.html meme -// memorial : 2014-10-16 Dog Beach, LLC +// memorial : Dog Beach, LLC +// https://www.iana.org/domains/root/db/memorial.html memorial -// men : 2015-02-26 Exclusive Registry Limited +// men : Exclusive Registry Limited +// https://www.iana.org/domains/root/db/men.html men -// menu : 2013-09-11 Dot Menu Registry, LLC +// menu : Dot Menu Registry, LLC +// https://www.iana.org/domains/root/db/menu.html menu -// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +// merckmsd : MSD Registry Holdings, Inc. +// https://www.iana.org/domains/root/db/merckmsd.html merckmsd -// miami : 2013-12-19 Registry Services, LLC +// miami : Registry Services, LLC +// https://www.iana.org/domains/root/db/miami.html miami -// microsoft : 2014-12-18 Microsoft Corporation +// microsoft : Microsoft Corporation +// https://www.iana.org/domains/root/db/microsoft.html microsoft -// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +// mini : Bayerische Motoren Werke Aktiengesellschaft +// https://www.iana.org/domains/root/db/mini.html mini -// mint : 2015-07-30 Intuit Administrative Services, Inc. +// mint : Intuit Administrative Services, Inc. +// https://www.iana.org/domains/root/db/mint.html mint -// mit : 2015-07-02 Massachusetts Institute of Technology +// mit : Massachusetts Institute of Technology +// https://www.iana.org/domains/root/db/mit.html mit -// mitsubishi : 2015-07-23 Mitsubishi Corporation +// mitsubishi : Mitsubishi Corporation +// https://www.iana.org/domains/root/db/mitsubishi.html mitsubishi -// mlb : 2015-05-21 MLB Advanced Media DH, LLC +// mlb : MLB Advanced Media DH, LLC +// https://www.iana.org/domains/root/db/mlb.html mlb -// mls : 2015-04-23 The Canadian Real Estate Association +// mls : The Canadian Real Estate Association +// https://www.iana.org/domains/root/db/mls.html mls -// mma : 2014-11-07 MMA IARD +// mma : MMA IARD +// https://www.iana.org/domains/root/db/mma.html mma -// mobile : 2016-06-02 Dish DBS Corporation +// mobile : Dish DBS Corporation +// https://www.iana.org/domains/root/db/mobile.html mobile -// moda : 2013-11-07 Dog Beach, LLC +// moda : Dog Beach, LLC +// https://www.iana.org/domains/root/db/moda.html moda -// moe : 2013-11-13 Interlink Systems Innovation Institute K.K. +// moe : Interlink Systems Innovation Institute K.K. +// https://www.iana.org/domains/root/db/moe.html moe -// moi : 2014-12-18 Amazon Registry Services, Inc. +// moi : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/moi.html moi -// mom : 2015-04-16 XYZ.COM LLC +// mom : XYZ.COM LLC +// https://www.iana.org/domains/root/db/mom.html mom -// monash : 2013-09-30 Monash University +// monash : Monash University +// https://www.iana.org/domains/root/db/monash.html monash -// money : 2014-10-16 Binky Moon, LLC +// money : Binky Moon, LLC +// https://www.iana.org/domains/root/db/money.html money -// monster : 2015-09-11 XYZ.COM LLC +// monster : XYZ.COM LLC +// https://www.iana.org/domains/root/db/monster.html monster -// mormon : 2013-12-05 IRI Domain Management, LLC +// mormon : IRI Domain Management, LLC +// https://www.iana.org/domains/root/db/mormon.html mormon -// mortgage : 2014-03-20 Dog Beach, LLC +// mortgage : Dog Beach, LLC +// https://www.iana.org/domains/root/db/mortgage.html mortgage -// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +// moscow : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +// https://www.iana.org/domains/root/db/moscow.html moscow -// moto : 2015-06-04 Motorola Trademark Holdings, LLC +// moto : Motorola Trademark Holdings, LLC +// https://www.iana.org/domains/root/db/moto.html moto -// motorcycles : 2014-01-09 XYZ.COM LLC +// motorcycles : XYZ.COM LLC +// https://www.iana.org/domains/root/db/motorcycles.html motorcycles -// mov : 2014-01-30 Charleston Road Registry Inc. +// mov : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/mov.html mov -// movie : 2015-02-05 Binky Moon, LLC +// movie : Binky Moon, LLC +// https://www.iana.org/domains/root/db/movie.html movie -// msd : 2015-07-23 MSD Registry Holdings, Inc. +// msd : MSD Registry Holdings, Inc. +// https://www.iana.org/domains/root/db/msd.html msd -// mtn : 2014-12-04 MTN Dubai Limited +// mtn : MTN Dubai Limited +// https://www.iana.org/domains/root/db/mtn.html mtn -// mtr : 2015-03-12 MTR Corporation Limited +// mtr : MTR Corporation Limited +// https://www.iana.org/domains/root/db/mtr.html mtr -// music : 2021-05-04 DotMusic Limited +// music : DotMusic Limited +// https://www.iana.org/domains/root/db/music.html music -// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC -mutual - -// nab : 2015-08-20 National Australia Bank Limited +// nab : National Australia Bank Limited +// https://www.iana.org/domains/root/db/nab.html nab -// nagoya : 2013-10-24 GMO Registry, Inc. +// nagoya : GMO Registry, Inc. +// https://www.iana.org/domains/root/db/nagoya.html nagoya -// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +// natura : NATURA COSMÉTICOS S.A. +// https://www.iana.org/domains/root/db/natura.html natura -// navy : 2014-03-06 Dog Beach, LLC +// navy : Dog Beach, LLC +// https://www.iana.org/domains/root/db/navy.html navy -// nba : 2015-07-31 NBA REGISTRY, LLC +// nba : NBA REGISTRY, LLC +// https://www.iana.org/domains/root/db/nba.html nba -// nec : 2015-01-08 NEC Corporation +// nec : NEC Corporation +// https://www.iana.org/domains/root/db/nec.html nec -// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +// netbank : COMMONWEALTH BANK OF AUSTRALIA +// https://www.iana.org/domains/root/db/netbank.html netbank -// netflix : 2015-06-18 Netflix, Inc. +// netflix : Netflix, Inc. +// https://www.iana.org/domains/root/db/netflix.html netflix -// network : 2013-11-14 Binky Moon, LLC +// network : Binky Moon, LLC +// https://www.iana.org/domains/root/db/network.html network -// neustar : 2013-12-05 NeuStar, Inc. +// neustar : NeuStar, Inc. +// https://www.iana.org/domains/root/db/neustar.html neustar -// new : 2014-01-30 Charleston Road Registry Inc. +// new : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/new.html new -// news : 2014-12-18 Dog Beach, LLC +// news : Dog Beach, LLC +// https://www.iana.org/domains/root/db/news.html news -// next : 2015-06-18 Next plc +// next : Next plc +// https://www.iana.org/domains/root/db/next.html next -// nextdirect : 2015-06-18 Next plc +// nextdirect : Next plc +// https://www.iana.org/domains/root/db/nextdirect.html nextdirect -// nexus : 2014-07-24 Charleston Road Registry Inc. +// nexus : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/nexus.html nexus -// nfl : 2015-07-23 NFL Reg Ops LLC +// nfl : NFL Reg Ops LLC +// https://www.iana.org/domains/root/db/nfl.html nfl -// ngo : 2014-03-06 Public Interest Registry +// ngo : Public Interest Registry +// https://www.iana.org/domains/root/db/ngo.html ngo -// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +// nhk : Japan Broadcasting Corporation (NHK) +// https://www.iana.org/domains/root/db/nhk.html nhk -// nico : 2014-12-04 DWANGO Co., Ltd. +// nico : DWANGO Co., Ltd. +// https://www.iana.org/domains/root/db/nico.html nico -// nike : 2015-07-23 NIKE, Inc. +// nike : NIKE, Inc. +// https://www.iana.org/domains/root/db/nike.html nike -// nikon : 2015-05-21 NIKON CORPORATION +// nikon : NIKON CORPORATION +// https://www.iana.org/domains/root/db/nikon.html nikon -// ninja : 2013-11-07 Dog Beach, LLC +// ninja : Dog Beach, LLC +// https://www.iana.org/domains/root/db/ninja.html ninja -// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +// nissan : NISSAN MOTOR CO., LTD. +// https://www.iana.org/domains/root/db/nissan.html nissan -// nissay : 2015-10-29 Nippon Life Insurance Company +// nissay : Nippon Life Insurance Company +// https://www.iana.org/domains/root/db/nissay.html nissay -// nokia : 2015-01-08 Nokia Corporation +// nokia : Nokia Corporation +// https://www.iana.org/domains/root/db/nokia.html nokia -// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC -northwesternmutual - -// norton : 2014-12-04 NortonLifeLock Inc. +// norton : NortonLifeLock Inc. +// https://www.iana.org/domains/root/db/norton.html norton -// now : 2015-06-25 Amazon Registry Services, Inc. +// now : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/now.html now -// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// nowruz : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// https://www.iana.org/domains/root/db/nowruz.html nowruz -// nowtv : 2015-05-14 Starbucks (HK) Limited +// nowtv : Starbucks (HK) Limited +// https://www.iana.org/domains/root/db/nowtv.html nowtv -// nra : 2014-05-22 NRA Holdings Company, INC. +// nra : NRA Holdings Company, INC. +// https://www.iana.org/domains/root/db/nra.html nra -// nrw : 2013-11-21 Minds + Machines GmbH +// nrw : Minds + Machines GmbH +// https://www.iana.org/domains/root/db/nrw.html nrw -// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +// ntt : NIPPON TELEGRAPH AND TELEPHONE CORPORATION +// https://www.iana.org/domains/root/db/ntt.html ntt -// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +// nyc : The City of New York by and through the New York City Department of Information Technology & Telecommunications +// https://www.iana.org/domains/root/db/nyc.html nyc -// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +// obi : OBI Group Holding SE & Co. KGaA +// https://www.iana.org/domains/root/db/obi.html obi -// observer : 2015-04-30 Dog Beach, LLC +// observer : Fegistry, LLC +// https://www.iana.org/domains/root/db/observer.html observer -// office : 2015-03-12 Microsoft Corporation +// office : Microsoft Corporation +// https://www.iana.org/domains/root/db/office.html office -// okinawa : 2013-12-05 BRregistry, Inc. +// okinawa : BRregistry, Inc. +// https://www.iana.org/domains/root/db/okinawa.html okinawa -// olayan : 2015-05-14 Competrol (Luxembourg) Sarl +// olayan : Competrol (Luxembourg) Sarl +// https://www.iana.org/domains/root/db/olayan.html olayan -// olayangroup : 2015-05-14 Competrol (Luxembourg) Sarl +// olayangroup : Competrol (Luxembourg) Sarl +// https://www.iana.org/domains/root/db/olayangroup.html olayangroup -// oldnavy : 2015-07-31 The Gap, Inc. -oldnavy - -// ollo : 2015-06-04 Dish DBS Corporation +// ollo : Dish DBS Corporation +// https://www.iana.org/domains/root/db/ollo.html ollo -// omega : 2015-01-08 The Swatch Group Ltd +// omega : The Swatch Group Ltd +// https://www.iana.org/domains/root/db/omega.html omega -// one : 2014-11-07 One.com A/S +// one : One.com A/S +// https://www.iana.org/domains/root/db/one.html one -// ong : 2014-03-06 Public Interest Registry +// ong : Public Interest Registry +// https://www.iana.org/domains/root/db/ong.html ong -// onl : 2013-09-16 iRegistry GmbH +// onl : iRegistry GmbH +// https://www.iana.org/domains/root/db/onl.html onl -// online : 2015-01-15 Radix FZC +// online : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/online.html online -// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +// ooo : INFIBEAM AVENUES LIMITED +// https://www.iana.org/domains/root/db/ooo.html ooo -// open : 2015-07-31 American Express Travel Related Services Company, Inc. +// open : American Express Travel Related Services Company, Inc. +// https://www.iana.org/domains/root/db/open.html open -// oracle : 2014-06-19 Oracle Corporation +// oracle : Oracle Corporation +// https://www.iana.org/domains/root/db/oracle.html oracle -// orange : 2015-03-12 Orange Brand Services Limited +// orange : Orange Brand Services Limited +// https://www.iana.org/domains/root/db/orange.html orange -// organic : 2014-03-27 Identity Digital Limited +// organic : Identity Digital Limited +// https://www.iana.org/domains/root/db/organic.html organic -// origins : 2015-10-01 The Estée Lauder Companies Inc. +// origins : The Estée Lauder Companies Inc. +// https://www.iana.org/domains/root/db/origins.html origins -// osaka : 2014-09-04 Osaka Registry Co., Ltd. +// osaka : Osaka Registry Co., Ltd. +// https://www.iana.org/domains/root/db/osaka.html osaka -// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +// otsuka : Otsuka Holdings Co., Ltd. +// https://www.iana.org/domains/root/db/otsuka.html otsuka -// ott : 2015-06-04 Dish DBS Corporation +// ott : Dish DBS Corporation +// https://www.iana.org/domains/root/db/ott.html ott -// ovh : 2014-01-16 MédiaBC +// ovh : MédiaBC +// https://www.iana.org/domains/root/db/ovh.html ovh -// page : 2014-12-04 Charleston Road Registry Inc. +// page : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/page.html page -// panasonic : 2015-07-30 Panasonic Holdings Corporation +// panasonic : Panasonic Holdings Corporation +// https://www.iana.org/domains/root/db/panasonic.html panasonic -// paris : 2014-01-30 City of Paris +// paris : City of Paris +// https://www.iana.org/domains/root/db/paris.html paris -// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// pars : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// https://www.iana.org/domains/root/db/pars.html pars -// partners : 2013-12-05 Binky Moon, LLC +// partners : Binky Moon, LLC +// https://www.iana.org/domains/root/db/partners.html partners -// parts : 2013-12-05 Binky Moon, LLC +// parts : Binky Moon, LLC +// https://www.iana.org/domains/root/db/parts.html parts -// party : 2014-09-11 Blue Sky Registry Limited +// party : Blue Sky Registry Limited +// https://www.iana.org/domains/root/db/party.html party -// passagens : 2015-03-05 Travel Reservations SRL -passagens - -// pay : 2015-08-27 Amazon Registry Services, Inc. +// pay : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/pay.html pay -// pccw : 2015-05-14 PCCW Enterprises Limited +// pccw : PCCW Enterprises Limited +// https://www.iana.org/domains/root/db/pccw.html pccw -// pet : 2015-05-07 Identity Digital Limited +// pet : Identity Digital Limited +// https://www.iana.org/domains/root/db/pet.html pet -// pfizer : 2015-09-11 Pfizer Inc. +// pfizer : Pfizer Inc. +// https://www.iana.org/domains/root/db/pfizer.html pfizer -// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +// pharmacy : National Association of Boards of Pharmacy +// https://www.iana.org/domains/root/db/pharmacy.html pharmacy -// phd : 2016-07-28 Charleston Road Registry Inc. +// phd : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/phd.html phd -// philips : 2014-11-07 Koninklijke Philips N.V. +// philips : Koninklijke Philips N.V. +// https://www.iana.org/domains/root/db/philips.html philips -// phone : 2016-06-02 Dish DBS Corporation +// phone : Dish DBS Corporation +// https://www.iana.org/domains/root/db/phone.html phone -// photo : 2013-11-14 Registry Services, LLC +// photo : Registry Services, LLC +// https://www.iana.org/domains/root/db/photo.html photo -// photography : 2013-09-20 Binky Moon, LLC +// photography : Binky Moon, LLC +// https://www.iana.org/domains/root/db/photography.html photography -// photos : 2013-10-17 Binky Moon, LLC +// photos : Binky Moon, LLC +// https://www.iana.org/domains/root/db/photos.html photos -// physio : 2014-05-01 PhysBiz Pty Ltd +// physio : PhysBiz Pty Ltd +// https://www.iana.org/domains/root/db/physio.html physio -// pics : 2013-11-14 XYZ.COM LLC +// pics : XYZ.COM LLC +// https://www.iana.org/domains/root/db/pics.html pics -// pictet : 2014-06-26 Pictet Europe S.A. +// pictet : Pictet Europe S.A. +// https://www.iana.org/domains/root/db/pictet.html pictet -// pictures : 2014-03-06 Binky Moon, LLC +// pictures : Binky Moon, LLC +// https://www.iana.org/domains/root/db/pictures.html pictures -// pid : 2015-01-08 Top Level Spectrum, Inc. +// pid : Top Level Spectrum, Inc. +// https://www.iana.org/domains/root/db/pid.html pid -// pin : 2014-12-18 Amazon Registry Services, Inc. +// pin : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/pin.html pin -// ping : 2015-06-11 Ping Registry Provider, Inc. +// ping : Ping Registry Provider, Inc. +// https://www.iana.org/domains/root/db/ping.html ping -// pink : 2013-10-01 Identity Digital Limited +// pink : Identity Digital Limited +// https://www.iana.org/domains/root/db/pink.html pink -// pioneer : 2015-07-16 Pioneer Corporation +// pioneer : Pioneer Corporation +// https://www.iana.org/domains/root/db/pioneer.html pioneer -// pizza : 2014-06-26 Binky Moon, LLC +// pizza : Binky Moon, LLC +// https://www.iana.org/domains/root/db/pizza.html pizza -// place : 2014-04-24 Binky Moon, LLC +// place : Binky Moon, LLC +// https://www.iana.org/domains/root/db/place.html place -// play : 2015-03-05 Charleston Road Registry Inc. +// play : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/play.html play -// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +// playstation : Sony Interactive Entertainment Inc. +// https://www.iana.org/domains/root/db/playstation.html playstation -// plumbing : 2013-09-10 Binky Moon, LLC +// plumbing : Binky Moon, LLC +// https://www.iana.org/domains/root/db/plumbing.html plumbing -// plus : 2015-02-05 Binky Moon, LLC +// plus : Binky Moon, LLC +// https://www.iana.org/domains/root/db/plus.html plus -// pnc : 2015-07-02 PNC Domain Co., LLC +// pnc : PNC Domain Co., LLC +// https://www.iana.org/domains/root/db/pnc.html pnc -// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +// pohl : Deutsche Vermögensberatung Aktiengesellschaft DVAG +// https://www.iana.org/domains/root/db/pohl.html pohl -// poker : 2014-07-03 Identity Digital Limited +// poker : Identity Digital Limited +// https://www.iana.org/domains/root/db/poker.html poker -// politie : 2015-08-20 Politie Nederland +// politie : Politie Nederland +// https://www.iana.org/domains/root/db/politie.html politie -// porn : 2014-10-16 ICM Registry PN LLC +// porn : ICM Registry PN LLC +// https://www.iana.org/domains/root/db/porn.html porn -// pramerica : 2015-07-30 Prudential Financial, Inc. +// pramerica : Prudential Financial, Inc. +// https://www.iana.org/domains/root/db/pramerica.html pramerica -// praxi : 2013-12-05 Praxi S.p.A. +// praxi : Praxi S.p.A. +// https://www.iana.org/domains/root/db/praxi.html praxi -// press : 2014-04-03 Radix FZC +// press : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/press.html press -// prime : 2015-06-25 Amazon Registry Services, Inc. +// prime : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/prime.html prime -// prod : 2014-01-23 Charleston Road Registry Inc. +// prod : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/prod.html prod -// productions : 2013-12-05 Binky Moon, LLC +// productions : Binky Moon, LLC +// https://www.iana.org/domains/root/db/productions.html productions -// prof : 2014-07-24 Charleston Road Registry Inc. +// prof : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/prof.html prof -// progressive : 2015-07-23 Progressive Casualty Insurance Company +// progressive : Progressive Casualty Insurance Company +// https://www.iana.org/domains/root/db/progressive.html progressive -// promo : 2014-12-18 Identity Digital Limited +// promo : Identity Digital Limited +// https://www.iana.org/domains/root/db/promo.html promo -// properties : 2013-12-05 Binky Moon, LLC +// properties : Binky Moon, LLC +// https://www.iana.org/domains/root/db/properties.html properties -// property : 2014-05-22 Internet Naming Company LLC +// property : Digital Property Infrastructure Limited +// https://www.iana.org/domains/root/db/property.html property -// protection : 2015-04-23 XYZ.COM LLC +// protection : XYZ.COM LLC +// https://www.iana.org/domains/root/db/protection.html protection -// pru : 2015-07-30 Prudential Financial, Inc. +// pru : Prudential Financial, Inc. +// https://www.iana.org/domains/root/db/pru.html pru -// prudential : 2015-07-30 Prudential Financial, Inc. +// prudential : Prudential Financial, Inc. +// https://www.iana.org/domains/root/db/prudential.html prudential -// pub : 2013-12-12 Dog Beach, LLC +// pub : Dog Beach, LLC +// https://www.iana.org/domains/root/db/pub.html pub -// pwc : 2015-10-29 PricewaterhouseCoopers LLP +// pwc : PricewaterhouseCoopers LLP +// https://www.iana.org/domains/root/db/pwc.html pwc -// qpon : 2013-11-14 dotQPON LLC +// qpon : dotQPON LLC +// https://www.iana.org/domains/root/db/qpon.html qpon -// quebec : 2013-12-19 PointQuébec Inc +// quebec : PointQuébec Inc +// https://www.iana.org/domains/root/db/quebec.html quebec -// quest : 2015-03-26 XYZ.COM LLC +// quest : XYZ.COM LLC +// https://www.iana.org/domains/root/db/quest.html quest -// racing : 2014-12-04 Premier Registry Limited +// racing : Premier Registry Limited +// https://www.iana.org/domains/root/db/racing.html racing -// radio : 2016-07-21 European Broadcasting Union (EBU) +// radio : European Broadcasting Union (EBU) +// https://www.iana.org/domains/root/db/radio.html radio -// read : 2014-12-18 Amazon Registry Services, Inc. +// read : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/read.html read -// realestate : 2015-09-11 dotRealEstate LLC +// realestate : dotRealEstate LLC +// https://www.iana.org/domains/root/db/realestate.html realestate -// realtor : 2014-05-29 Real Estate Domains LLC +// realtor : Real Estate Domains LLC +// https://www.iana.org/domains/root/db/realtor.html realtor -// realty : 2015-03-19 Dog Beach, LLC +// realty : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/realty.html realty -// recipes : 2013-10-17 Binky Moon, LLC +// recipes : Binky Moon, LLC +// https://www.iana.org/domains/root/db/recipes.html recipes -// red : 2013-11-07 Identity Digital Limited +// red : Identity Digital Limited +// https://www.iana.org/domains/root/db/red.html red -// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +// redstone : Redstone Haute Couture Co., Ltd. +// https://www.iana.org/domains/root/db/redstone.html redstone -// redumbrella : 2015-03-26 Travelers TLD, LLC +// redumbrella : Travelers TLD, LLC +// https://www.iana.org/domains/root/db/redumbrella.html redumbrella -// rehab : 2014-03-06 Dog Beach, LLC +// rehab : Dog Beach, LLC +// https://www.iana.org/domains/root/db/rehab.html rehab -// reise : 2014-03-13 Binky Moon, LLC +// reise : Binky Moon, LLC +// https://www.iana.org/domains/root/db/reise.html reise -// reisen : 2014-03-06 Binky Moon, LLC +// reisen : Binky Moon, LLC +// https://www.iana.org/domains/root/db/reisen.html reisen -// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +// reit : National Association of Real Estate Investment Trusts, Inc. +// https://www.iana.org/domains/root/db/reit.html reit -// reliance : 2015-04-02 Reliance Industries Limited +// reliance : Reliance Industries Limited +// https://www.iana.org/domains/root/db/reliance.html reliance -// ren : 2013-12-12 ZDNS International Limited +// ren : ZDNS International Limited +// https://www.iana.org/domains/root/db/ren.html ren -// rent : 2014-12-04 XYZ.COM LLC +// rent : XYZ.COM LLC +// https://www.iana.org/domains/root/db/rent.html rent -// rentals : 2013-12-05 Binky Moon, LLC +// rentals : Binky Moon, LLC +// https://www.iana.org/domains/root/db/rentals.html rentals -// repair : 2013-11-07 Binky Moon, LLC +// repair : Binky Moon, LLC +// https://www.iana.org/domains/root/db/repair.html repair -// report : 2013-12-05 Binky Moon, LLC +// report : Binky Moon, LLC +// https://www.iana.org/domains/root/db/report.html report -// republican : 2014-03-20 Dog Beach, LLC +// republican : Dog Beach, LLC +// https://www.iana.org/domains/root/db/republican.html republican -// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +// rest : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +// https://www.iana.org/domains/root/db/rest.html rest -// restaurant : 2014-07-03 Binky Moon, LLC +// restaurant : Binky Moon, LLC +// https://www.iana.org/domains/root/db/restaurant.html restaurant -// review : 2014-11-20 dot Review Limited +// review : dot Review Limited +// https://www.iana.org/domains/root/db/review.html review -// reviews : 2013-09-13 Dog Beach, LLC +// reviews : Dog Beach, LLC +// https://www.iana.org/domains/root/db/reviews.html reviews -// rexroth : 2015-06-18 Robert Bosch GMBH +// rexroth : Robert Bosch GMBH +// https://www.iana.org/domains/root/db/rexroth.html rexroth -// rich : 2013-11-21 iRegistry GmbH +// rich : iRegistry GmbH +// https://www.iana.org/domains/root/db/rich.html rich -// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +// richardli : Pacific Century Asset Management (HK) Limited +// https://www.iana.org/domains/root/db/richardli.html richardli -// ricoh : 2014-11-20 Ricoh Company, Ltd. +// ricoh : Ricoh Company, Ltd. +// https://www.iana.org/domains/root/db/ricoh.html ricoh -// ril : 2015-04-02 Reliance Industries Limited +// ril : Reliance Industries Limited +// https://www.iana.org/domains/root/db/ril.html ril -// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +// rio : Empresa Municipal de Informática SA - IPLANRIO +// https://www.iana.org/domains/root/db/rio.html rio -// rip : 2014-07-10 Dog Beach, LLC +// rip : Dog Beach, LLC +// https://www.iana.org/domains/root/db/rip.html rip -// rocher : 2014-12-18 Ferrero Trading Lux S.A. -rocher - -// rocks : 2013-11-14 Dog Beach, LLC +// rocks : Dog Beach, LLC +// https://www.iana.org/domains/root/db/rocks.html rocks -// rodeo : 2013-12-19 Registry Services, LLC +// rodeo : Registry Services, LLC +// https://www.iana.org/domains/root/db/rodeo.html rodeo -// rogers : 2015-08-06 Rogers Communications Canada Inc. +// rogers : Rogers Communications Canada Inc. +// https://www.iana.org/domains/root/db/rogers.html rogers -// room : 2014-12-18 Amazon Registry Services, Inc. +// room : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/room.html room -// rsvp : 2014-05-08 Charleston Road Registry Inc. +// rsvp : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/rsvp.html rsvp -// rugby : 2016-12-15 World Rugby Strategic Developments Limited +// rugby : World Rugby Strategic Developments Limited +// https://www.iana.org/domains/root/db/rugby.html rugby -// ruhr : 2013-10-02 dotSaarland GmbH +// ruhr : dotSaarland GmbH +// https://www.iana.org/domains/root/db/ruhr.html ruhr -// run : 2015-03-19 Binky Moon, LLC +// run : Binky Moon, LLC +// https://www.iana.org/domains/root/db/run.html run -// rwe : 2015-04-02 RWE AG +// rwe : RWE AG +// https://www.iana.org/domains/root/db/rwe.html rwe -// ryukyu : 2014-01-09 BRregistry, Inc. +// ryukyu : BRregistry, Inc. +// https://www.iana.org/domains/root/db/ryukyu.html ryukyu -// saarland : 2013-12-12 dotSaarland GmbH +// saarland : dotSaarland GmbH +// https://www.iana.org/domains/root/db/saarland.html saarland -// safe : 2014-12-18 Amazon Registry Services, Inc. +// safe : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/safe.html safe -// safety : 2015-01-08 Safety Registry Services, LLC. +// safety : Safety Registry Services, LLC. +// https://www.iana.org/domains/root/db/safety.html safety -// sakura : 2014-12-18 SAKURA Internet Inc. +// sakura : SAKURA Internet Inc. +// https://www.iana.org/domains/root/db/sakura.html sakura -// sale : 2014-10-16 Dog Beach, LLC +// sale : Dog Beach, LLC +// https://www.iana.org/domains/root/db/sale.html sale -// salon : 2014-12-11 Binky Moon, LLC +// salon : Binky Moon, LLC +// https://www.iana.org/domains/root/db/salon.html salon -// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +// samsclub : Wal-Mart Stores, Inc. +// https://www.iana.org/domains/root/db/samsclub.html samsclub -// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +// samsung : SAMSUNG SDS CO., LTD +// https://www.iana.org/domains/root/db/samsung.html samsung -// sandvik : 2014-11-13 Sandvik AB +// sandvik : Sandvik AB +// https://www.iana.org/domains/root/db/sandvik.html sandvik -// sandvikcoromant : 2014-11-07 Sandvik AB +// sandvikcoromant : Sandvik AB +// https://www.iana.org/domains/root/db/sandvikcoromant.html sandvikcoromant -// sanofi : 2014-10-09 Sanofi +// sanofi : Sanofi +// https://www.iana.org/domains/root/db/sanofi.html sanofi -// sap : 2014-03-27 SAP AG +// sap : SAP AG +// https://www.iana.org/domains/root/db/sap.html sap -// sarl : 2014-07-03 Binky Moon, LLC +// sarl : Binky Moon, LLC +// https://www.iana.org/domains/root/db/sarl.html sarl -// sas : 2015-04-02 Research IP LLC +// sas : Research IP LLC +// https://www.iana.org/domains/root/db/sas.html sas -// save : 2015-06-25 Amazon Registry Services, Inc. +// save : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/save.html save -// saxo : 2014-10-31 Saxo Bank A/S +// saxo : Saxo Bank A/S +// https://www.iana.org/domains/root/db/saxo.html saxo -// sbi : 2015-03-12 STATE BANK OF INDIA +// sbi : STATE BANK OF INDIA +// https://www.iana.org/domains/root/db/sbi.html sbi -// sbs : 2014-11-07 ShortDot SA +// sbs : ShortDot SA +// https://www.iana.org/domains/root/db/sbs.html sbs -// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) -sca - -// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +// scb : The Siam Commercial Bank Public Company Limited ("SCB") +// https://www.iana.org/domains/root/db/scb.html scb -// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +// schaeffler : Schaeffler Technologies AG & Co. KG +// https://www.iana.org/domains/root/db/schaeffler.html schaeffler -// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +// schmidt : SCHMIDT GROUPE S.A.S. +// https://www.iana.org/domains/root/db/schmidt.html schmidt -// scholarships : 2014-04-24 Scholarships.com, LLC +// scholarships : Scholarships.com, LLC +// https://www.iana.org/domains/root/db/scholarships.html scholarships -// school : 2014-12-18 Binky Moon, LLC +// school : Binky Moon, LLC +// https://www.iana.org/domains/root/db/school.html school -// schule : 2014-03-06 Binky Moon, LLC +// schule : Binky Moon, LLC +// https://www.iana.org/domains/root/db/schule.html schule -// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +// schwarz : Schwarz Domains und Services GmbH & Co. KG +// https://www.iana.org/domains/root/db/schwarz.html schwarz -// science : 2014-09-11 dot Science Limited +// science : dot Science Limited +// https://www.iana.org/domains/root/db/science.html science -// scot : 2014-01-23 Dot Scot Registry Limited +// scot : Dot Scot Registry Limited +// https://www.iana.org/domains/root/db/scot.html scot -// search : 2016-06-09 Charleston Road Registry Inc. +// search : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/search.html search -// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +// seat : SEAT, S.A. (Sociedad Unipersonal) +// https://www.iana.org/domains/root/db/seat.html seat -// secure : 2015-08-27 Amazon Registry Services, Inc. +// secure : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/secure.html secure -// security : 2015-05-14 XYZ.COM LLC +// security : XYZ.COM LLC +// https://www.iana.org/domains/root/db/security.html security -// seek : 2014-12-04 Seek Limited +// seek : Seek Limited +// https://www.iana.org/domains/root/db/seek.html seek -// select : 2015-10-08 Registry Services, LLC +// select : Registry Services, LLC +// https://www.iana.org/domains/root/db/select.html select -// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +// sener : Sener Ingeniería y Sistemas, S.A. +// https://www.iana.org/domains/root/db/sener.html sener -// services : 2014-02-27 Binky Moon, LLC +// services : Binky Moon, LLC +// https://www.iana.org/domains/root/db/services.html services -// seven : 2015-08-06 Seven West Media Ltd +// seven : Seven West Media Ltd +// https://www.iana.org/domains/root/db/seven.html seven -// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +// sew : SEW-EURODRIVE GmbH & Co KG +// https://www.iana.org/domains/root/db/sew.html sew -// sex : 2014-11-13 ICM Registry SX LLC +// sex : ICM Registry SX LLC +// https://www.iana.org/domains/root/db/sex.html sex -// sexy : 2013-09-11 Internet Naming Company LLC +// sexy : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/sexy.html sexy -// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +// sfr : Societe Francaise du Radiotelephone - SFR +// https://www.iana.org/domains/root/db/sfr.html sfr -// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +// shangrila : Shangri‐La International Hotel Management Limited +// https://www.iana.org/domains/root/db/shangrila.html shangrila -// sharp : 2014-05-01 Sharp Corporation +// sharp : Sharp Corporation +// https://www.iana.org/domains/root/db/sharp.html sharp -// shaw : 2015-04-23 Shaw Cablesystems G.P. +// shaw : Shaw Cablesystems G.P. +// https://www.iana.org/domains/root/db/shaw.html shaw -// shell : 2015-07-30 Shell Information Technology International Inc +// shell : Shell Information Technology International Inc +// https://www.iana.org/domains/root/db/shell.html shell -// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// shia : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// https://www.iana.org/domains/root/db/shia.html shia -// shiksha : 2013-11-14 Identity Digital Limited +// shiksha : Identity Digital Limited +// https://www.iana.org/domains/root/db/shiksha.html shiksha -// shoes : 2013-10-02 Binky Moon, LLC +// shoes : Binky Moon, LLC +// https://www.iana.org/domains/root/db/shoes.html shoes -// shop : 2016-04-08 GMO Registry, Inc. +// shop : GMO Registry, Inc. +// https://www.iana.org/domains/root/db/shop.html shop -// shopping : 2016-03-31 Binky Moon, LLC +// shopping : Binky Moon, LLC +// https://www.iana.org/domains/root/db/shopping.html shopping -// shouji : 2015-01-08 Beijing Qihu Keji Co., Ltd. +// shouji : Beijing Qihu Keji Co., Ltd. +// https://www.iana.org/domains/root/db/shouji.html shouji -// show : 2015-03-05 Binky Moon, LLC +// show : Binky Moon, LLC +// https://www.iana.org/domains/root/db/show.html show -// showtime : 2015-08-06 CBS Domains Inc. -showtime - -// silk : 2015-06-25 Amazon Registry Services, Inc. +// silk : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/silk.html silk -// sina : 2015-03-12 Sina Corporation +// sina : Sina Corporation +// https://www.iana.org/domains/root/db/sina.html sina -// singles : 2013-08-27 Binky Moon, LLC +// singles : Binky Moon, LLC +// https://www.iana.org/domains/root/db/singles.html singles -// site : 2015-01-15 Radix FZC +// site : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/site.html site -// ski : 2015-04-09 Identity Digital Limited +// ski : Identity Digital Limited +// https://www.iana.org/domains/root/db/ski.html ski -// skin : 2015-01-15 XYZ.COM LLC +// skin : XYZ.COM LLC +// https://www.iana.org/domains/root/db/skin.html skin -// sky : 2014-06-19 Sky International AG +// sky : Sky International AG +// https://www.iana.org/domains/root/db/sky.html sky -// skype : 2014-12-18 Microsoft Corporation +// skype : Microsoft Corporation +// https://www.iana.org/domains/root/db/skype.html skype -// sling : 2015-07-30 DISH Technologies L.L.C. +// sling : DISH Technologies L.L.C. +// https://www.iana.org/domains/root/db/sling.html sling -// smart : 2015-07-09 Smart Communications, Inc. (SMART) +// smart : Smart Communications, Inc. (SMART) +// https://www.iana.org/domains/root/db/smart.html smart -// smile : 2014-12-18 Amazon Registry Services, Inc. +// smile : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/smile.html smile -// sncf : 2015-02-19 Société Nationale SNCF +// sncf : Société Nationale SNCF +// https://www.iana.org/domains/root/db/sncf.html sncf -// soccer : 2015-03-26 Binky Moon, LLC +// soccer : Binky Moon, LLC +// https://www.iana.org/domains/root/db/soccer.html soccer -// social : 2013-11-07 Dog Beach, LLC +// social : Dog Beach, LLC +// https://www.iana.org/domains/root/db/social.html social -// softbank : 2015-07-02 SoftBank Group Corp. +// softbank : SoftBank Group Corp. +// https://www.iana.org/domains/root/db/softbank.html softbank -// software : 2014-03-20 Dog Beach, LLC +// software : Dog Beach, LLC +// https://www.iana.org/domains/root/db/software.html software -// sohu : 2013-12-19 Sohu.com Limited +// sohu : Sohu.com Limited +// https://www.iana.org/domains/root/db/sohu.html sohu -// solar : 2013-11-07 Binky Moon, LLC +// solar : Binky Moon, LLC +// https://www.iana.org/domains/root/db/solar.html solar -// solutions : 2013-11-07 Binky Moon, LLC +// solutions : Binky Moon, LLC +// https://www.iana.org/domains/root/db/solutions.html solutions -// song : 2015-02-26 Amazon Registry Services, Inc. +// song : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/song.html song -// sony : 2015-01-08 Sony Corporation +// sony : Sony Corporation +// https://www.iana.org/domains/root/db/sony.html sony -// soy : 2014-01-23 Charleston Road Registry Inc. +// soy : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/soy.html soy -// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +// spa : Asia Spa and Wellness Promotion Council Limited +// https://www.iana.org/domains/root/db/spa.html spa -// space : 2014-04-03 Radix FZC +// space : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/space.html space -// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +// sport : SportAccord +// https://www.iana.org/domains/root/db/sport.html sport -// spot : 2015-02-26 Amazon Registry Services, Inc. +// spot : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/spot.html spot -// srl : 2015-05-07 InterNetX, Corp +// srl : InterNetX, Corp +// https://www.iana.org/domains/root/db/srl.html srl -// stada : 2014-11-13 STADA Arzneimittel AG +// stada : STADA Arzneimittel AG +// https://www.iana.org/domains/root/db/stada.html stada -// staples : 2015-07-30 Staples, Inc. +// staples : Staples, Inc. +// https://www.iana.org/domains/root/db/staples.html staples -// star : 2015-01-08 Star India Private Limited +// star : Star India Private Limited +// https://www.iana.org/domains/root/db/star.html star -// statebank : 2015-03-12 STATE BANK OF INDIA +// statebank : STATE BANK OF INDIA +// https://www.iana.org/domains/root/db/statebank.html statebank -// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +// statefarm : State Farm Mutual Automobile Insurance Company +// https://www.iana.org/domains/root/db/statefarm.html statefarm -// stc : 2014-10-09 Saudi Telecom Company +// stc : Saudi Telecom Company +// https://www.iana.org/domains/root/db/stc.html stc -// stcgroup : 2014-10-09 Saudi Telecom Company +// stcgroup : Saudi Telecom Company +// https://www.iana.org/domains/root/db/stcgroup.html stcgroup -// stockholm : 2014-12-18 Stockholms kommun +// stockholm : Stockholms kommun +// https://www.iana.org/domains/root/db/stockholm.html stockholm -// storage : 2014-12-22 XYZ.COM LLC +// storage : XYZ.COM LLC +// https://www.iana.org/domains/root/db/storage.html storage -// store : 2015-04-09 Radix FZC +// store : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/store.html store -// stream : 2016-01-08 dot Stream Limited +// stream : dot Stream Limited +// https://www.iana.org/domains/root/db/stream.html stream -// studio : 2015-02-11 Dog Beach, LLC +// studio : Dog Beach, LLC +// https://www.iana.org/domains/root/db/studio.html studio -// study : 2014-12-11 Registry Services, LLC +// study : Registry Services, LLC +// https://www.iana.org/domains/root/db/study.html study -// style : 2014-12-04 Binky Moon, LLC +// style : Binky Moon, LLC +// https://www.iana.org/domains/root/db/style.html style -// sucks : 2014-12-22 Vox Populi Registry Ltd. +// sucks : Vox Populi Registry Ltd. +// https://www.iana.org/domains/root/db/sucks.html sucks -// supplies : 2013-12-19 Binky Moon, LLC +// supplies : Binky Moon, LLC +// https://www.iana.org/domains/root/db/supplies.html supplies -// supply : 2013-12-19 Binky Moon, LLC +// supply : Binky Moon, LLC +// https://www.iana.org/domains/root/db/supply.html supply -// support : 2013-10-24 Binky Moon, LLC +// support : Binky Moon, LLC +// https://www.iana.org/domains/root/db/support.html support -// surf : 2014-01-09 Registry Services, LLC +// surf : Registry Services, LLC +// https://www.iana.org/domains/root/db/surf.html surf -// surgery : 2014-03-20 Binky Moon, LLC +// surgery : Binky Moon, LLC +// https://www.iana.org/domains/root/db/surgery.html surgery -// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +// suzuki : SUZUKI MOTOR CORPORATION +// https://www.iana.org/domains/root/db/suzuki.html suzuki -// swatch : 2015-01-08 The Swatch Group Ltd +// swatch : The Swatch Group Ltd +// https://www.iana.org/domains/root/db/swatch.html swatch -// swiss : 2014-10-16 Swiss Confederation +// swiss : Swiss Confederation +// https://www.iana.org/domains/root/db/swiss.html swiss -// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +// sydney : State of New South Wales, Department of Premier and Cabinet +// https://www.iana.org/domains/root/db/sydney.html sydney -// systems : 2013-11-07 Binky Moon, LLC +// systems : Binky Moon, LLC +// https://www.iana.org/domains/root/db/systems.html systems -// tab : 2014-12-04 Tabcorp Holdings Limited +// tab : Tabcorp Holdings Limited +// https://www.iana.org/domains/root/db/tab.html tab -// taipei : 2014-07-10 Taipei City Government +// taipei : Taipei City Government +// https://www.iana.org/domains/root/db/taipei.html taipei -// talk : 2015-04-09 Amazon Registry Services, Inc. +// talk : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/talk.html talk -// taobao : 2015-01-15 Alibaba Group Holding Limited +// taobao : Alibaba Group Holding Limited +// https://www.iana.org/domains/root/db/taobao.html taobao -// target : 2015-07-31 Target Domain Holdings, LLC +// target : Target Domain Holdings, LLC +// https://www.iana.org/domains/root/db/target.html target -// tatamotors : 2015-03-12 Tata Motors Ltd +// tatamotors : Tata Motors Ltd +// https://www.iana.org/domains/root/db/tatamotors.html tatamotors -// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +// tatar : Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +// https://www.iana.org/domains/root/db/tatar.html tatar -// tattoo : 2013-08-30 Registry Services, LLC +// tattoo : Registry Services, LLC +// https://www.iana.org/domains/root/db/tattoo.html tattoo -// tax : 2014-03-20 Binky Moon, LLC +// tax : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tax.html tax -// taxi : 2015-03-19 Binky Moon, LLC +// taxi : Binky Moon, LLC +// https://www.iana.org/domains/root/db/taxi.html taxi -// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// tci : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// https://www.iana.org/domains/root/db/tci.html tci -// tdk : 2015-06-11 TDK Corporation +// tdk : TDK Corporation +// https://www.iana.org/domains/root/db/tdk.html tdk -// team : 2015-03-05 Binky Moon, LLC +// team : Binky Moon, LLC +// https://www.iana.org/domains/root/db/team.html team -// tech : 2015-01-30 Radix FZC +// tech : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/tech.html tech -// technology : 2013-09-13 Binky Moon, LLC +// technology : Binky Moon, LLC +// https://www.iana.org/domains/root/db/technology.html technology -// temasek : 2014-08-07 Temasek Holdings (Private) Limited +// temasek : Temasek Holdings (Private) Limited +// https://www.iana.org/domains/root/db/temasek.html temasek -// tennis : 2014-12-04 Binky Moon, LLC +// tennis : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tennis.html tennis -// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +// teva : Teva Pharmaceutical Industries Limited +// https://www.iana.org/domains/root/db/teva.html teva -// thd : 2015-04-02 Home Depot Product Authority, LLC +// thd : Home Depot Product Authority, LLC +// https://www.iana.org/domains/root/db/thd.html thd -// theater : 2015-03-19 Binky Moon, LLC +// theater : Binky Moon, LLC +// https://www.iana.org/domains/root/db/theater.html theater -// theatre : 2015-05-07 XYZ.COM LLC +// theatre : XYZ.COM LLC +// https://www.iana.org/domains/root/db/theatre.html theatre -// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +// tiaa : Teachers Insurance and Annuity Association of America +// https://www.iana.org/domains/root/db/tiaa.html tiaa -// tickets : 2015-02-05 XYZ.COM LLC +// tickets : XYZ.COM LLC +// https://www.iana.org/domains/root/db/tickets.html tickets -// tienda : 2013-11-14 Binky Moon, LLC +// tienda : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tienda.html tienda -// tiffany : 2015-01-30 Tiffany and Company -tiffany - -// tips : 2013-09-20 Binky Moon, LLC +// tips : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tips.html tips -// tires : 2014-11-07 Binky Moon, LLC +// tires : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tires.html tires -// tirol : 2014-04-24 punkt Tirol GmbH +// tirol : punkt Tirol GmbH +// https://www.iana.org/domains/root/db/tirol.html tirol -// tjmaxx : 2015-07-16 The TJX Companies, Inc. +// tjmaxx : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/tjmaxx.html tjmaxx -// tjx : 2015-07-16 The TJX Companies, Inc. +// tjx : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/tjx.html tjx -// tkmaxx : 2015-07-16 The TJX Companies, Inc. +// tkmaxx : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/tkmaxx.html tkmaxx -// tmall : 2015-01-15 Alibaba Group Holding Limited +// tmall : Alibaba Group Holding Limited +// https://www.iana.org/domains/root/db/tmall.html tmall -// today : 2013-09-20 Binky Moon, LLC +// today : Binky Moon, LLC +// https://www.iana.org/domains/root/db/today.html today -// tokyo : 2013-11-13 GMO Registry, Inc. +// tokyo : GMO Registry, Inc. +// https://www.iana.org/domains/root/db/tokyo.html tokyo -// tools : 2013-11-21 Binky Moon, LLC +// tools : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tools.html tools -// top : 2014-03-20 .TOP Registry +// top : .TOP Registry +// https://www.iana.org/domains/root/db/top.html top -// toray : 2014-12-18 Toray Industries, Inc. +// toray : Toray Industries, Inc. +// https://www.iana.org/domains/root/db/toray.html toray -// toshiba : 2014-04-10 TOSHIBA Corporation +// toshiba : TOSHIBA Corporation +// https://www.iana.org/domains/root/db/toshiba.html toshiba -// total : 2015-08-06 TotalEnergies SE +// total : TotalEnergies SE +// https://www.iana.org/domains/root/db/total.html total -// tours : 2015-01-22 Binky Moon, LLC +// tours : Binky Moon, LLC +// https://www.iana.org/domains/root/db/tours.html tours -// town : 2014-03-06 Binky Moon, LLC +// town : Binky Moon, LLC +// https://www.iana.org/domains/root/db/town.html town -// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +// toyota : TOYOTA MOTOR CORPORATION +// https://www.iana.org/domains/root/db/toyota.html toyota -// toys : 2014-03-06 Binky Moon, LLC +// toys : Binky Moon, LLC +// https://www.iana.org/domains/root/db/toys.html toys -// trade : 2014-01-23 Elite Registry Limited +// trade : Elite Registry Limited +// https://www.iana.org/domains/root/db/trade.html trade -// trading : 2014-12-11 Dog Beach, LLC +// trading : Dog Beach, LLC +// https://www.iana.org/domains/root/db/trading.html trading -// training : 2013-11-07 Binky Moon, LLC +// training : Binky Moon, LLC +// https://www.iana.org/domains/root/db/training.html training -// travel : 2015-10-09 Dog Beach, LLC +// travel : Dog Beach, LLC +// https://www.iana.org/domains/root/db/travel.html travel -// travelers : 2015-03-26 Travelers TLD, LLC +// travelers : Travelers TLD, LLC +// https://www.iana.org/domains/root/db/travelers.html travelers -// travelersinsurance : 2015-03-26 Travelers TLD, LLC +// travelersinsurance : Travelers TLD, LLC +// https://www.iana.org/domains/root/db/travelersinsurance.html travelersinsurance -// trust : 2014-10-16 Internet Naming Company LLC +// trust : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/trust.html trust -// trv : 2015-03-26 Travelers TLD, LLC +// trv : Travelers TLD, LLC +// https://www.iana.org/domains/root/db/trv.html trv -// tube : 2015-06-11 Latin American Telecom LLC +// tube : Latin American Telecom LLC +// https://www.iana.org/domains/root/db/tube.html tube -// tui : 2014-07-03 TUI AG +// tui : TUI AG +// https://www.iana.org/domains/root/db/tui.html tui -// tunes : 2015-02-26 Amazon Registry Services, Inc. +// tunes : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/tunes.html tunes -// tushu : 2014-12-18 Amazon Registry Services, Inc. +// tushu : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/tushu.html tushu -// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +// tvs : T V SUNDRAM IYENGAR & SONS LIMITED +// https://www.iana.org/domains/root/db/tvs.html tvs -// ubank : 2015-08-20 National Australia Bank Limited +// ubank : National Australia Bank Limited +// https://www.iana.org/domains/root/db/ubank.html ubank -// ubs : 2014-12-11 UBS AG +// ubs : UBS AG +// https://www.iana.org/domains/root/db/ubs.html ubs -// unicom : 2015-10-15 China United Network Communications Corporation Limited +// unicom : China United Network Communications Corporation Limited +// https://www.iana.org/domains/root/db/unicom.html unicom -// university : 2014-03-06 Binky Moon, LLC +// university : Binky Moon, LLC +// https://www.iana.org/domains/root/db/university.html university -// uno : 2013-09-11 Radix FZC +// uno : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/uno.html uno -// uol : 2014-05-01 UBN INTERNET LTDA. +// uol : UBN INTERNET LTDA. +// https://www.iana.org/domains/root/db/uol.html uol -// ups : 2015-06-25 UPS Market Driver, Inc. +// ups : UPS Market Driver, Inc. +// https://www.iana.org/domains/root/db/ups.html ups -// vacations : 2013-12-05 Binky Moon, LLC +// vacations : Binky Moon, LLC +// https://www.iana.org/domains/root/db/vacations.html vacations -// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +// vana : Internet Naming Company LLC +// https://www.iana.org/domains/root/db/vana.html vana -// vanguard : 2015-09-03 The Vanguard Group, Inc. +// vanguard : The Vanguard Group, Inc. +// https://www.iana.org/domains/root/db/vanguard.html vanguard -// vegas : 2014-01-16 Dot Vegas, Inc. +// vegas : Dot Vegas, Inc. +// https://www.iana.org/domains/root/db/vegas.html vegas -// ventures : 2013-08-27 Binky Moon, LLC +// ventures : Binky Moon, LLC +// https://www.iana.org/domains/root/db/ventures.html ventures -// verisign : 2015-08-13 VeriSign, Inc. +// verisign : VeriSign, Inc. +// https://www.iana.org/domains/root/db/verisign.html verisign -// versicherung : 2014-03-20 tldbox GmbH +// versicherung : tldbox GmbH +// https://www.iana.org/domains/root/db/versicherung.html versicherung -// vet : 2014-03-06 Dog Beach, LLC +// vet : Dog Beach, LLC +// https://www.iana.org/domains/root/db/vet.html vet -// viajes : 2013-10-17 Binky Moon, LLC +// viajes : Binky Moon, LLC +// https://www.iana.org/domains/root/db/viajes.html viajes -// video : 2014-10-16 Dog Beach, LLC +// video : Dog Beach, LLC +// https://www.iana.org/domains/root/db/video.html video -// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +// vig : VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +// https://www.iana.org/domains/root/db/vig.html vig -// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +// viking : Viking River Cruises (Bermuda) Ltd. +// https://www.iana.org/domains/root/db/viking.html viking -// villas : 2013-12-05 Binky Moon, LLC +// villas : Binky Moon, LLC +// https://www.iana.org/domains/root/db/villas.html villas -// vin : 2015-06-18 Binky Moon, LLC +// vin : Binky Moon, LLC +// https://www.iana.org/domains/root/db/vin.html vin -// vip : 2015-01-22 Registry Services, LLC +// vip : Registry Services, LLC +// https://www.iana.org/domains/root/db/vip.html vip -// virgin : 2014-09-25 Virgin Enterprises Limited +// virgin : Virgin Enterprises Limited +// https://www.iana.org/domains/root/db/virgin.html virgin -// visa : 2015-07-30 Visa Worldwide Pte. Limited +// visa : Visa Worldwide Pte. Limited +// https://www.iana.org/domains/root/db/visa.html visa -// vision : 2013-12-05 Binky Moon, LLC +// vision : Binky Moon, LLC +// https://www.iana.org/domains/root/db/vision.html vision -// viva : 2014-11-07 Saudi Telecom Company +// viva : Saudi Telecom Company +// https://www.iana.org/domains/root/db/viva.html viva -// vivo : 2015-07-31 Telefonica Brasil S.A. +// vivo : Telefonica Brasil S.A. +// https://www.iana.org/domains/root/db/vivo.html vivo -// vlaanderen : 2014-02-06 DNS.be vzw +// vlaanderen : DNS.be vzw +// https://www.iana.org/domains/root/db/vlaanderen.html vlaanderen -// vodka : 2013-12-19 Registry Services, LLC +// vodka : Registry Services, LLC +// https://www.iana.org/domains/root/db/vodka.html vodka -// volkswagen : 2015-05-14 Volkswagen Group of America Inc. -volkswagen - -// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +// volvo : Volvo Holding Sverige Aktiebolag +// https://www.iana.org/domains/root/db/volvo.html volvo -// vote : 2013-11-21 Monolith Registry LLC +// vote : Monolith Registry LLC +// https://www.iana.org/domains/root/db/vote.html vote -// voting : 2013-11-13 Valuetainment Corp. +// voting : Valuetainment Corp. +// https://www.iana.org/domains/root/db/voting.html voting -// voto : 2013-11-21 Monolith Registry LLC +// voto : Monolith Registry LLC +// https://www.iana.org/domains/root/db/voto.html voto -// voyage : 2013-08-27 Binky Moon, LLC +// voyage : Binky Moon, LLC +// https://www.iana.org/domains/root/db/voyage.html voyage -// vuelos : 2015-03-05 Travel Reservations SRL -vuelos - -// wales : 2014-05-08 Nominet UK +// wales : Nominet UK +// https://www.iana.org/domains/root/db/wales.html wales -// walmart : 2015-07-31 Wal-Mart Stores, Inc. +// walmart : Wal-Mart Stores, Inc. +// https://www.iana.org/domains/root/db/walmart.html walmart -// walter : 2014-11-13 Sandvik AB +// walter : Sandvik AB +// https://www.iana.org/domains/root/db/walter.html walter -// wang : 2013-10-24 Zodiac Wang Limited +// wang : Zodiac Wang Limited +// https://www.iana.org/domains/root/db/wang.html wang -// wanggou : 2014-12-18 Amazon Registry Services, Inc. +// wanggou : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/wanggou.html wanggou -// watch : 2013-11-14 Binky Moon, LLC +// watch : Binky Moon, LLC +// https://www.iana.org/domains/root/db/watch.html watch -// watches : 2014-12-22 Identity Digital Limited +// watches : Identity Digital Limited +// https://www.iana.org/domains/root/db/watches.html watches -// weather : 2015-01-08 International Business Machines Corporation +// weather : International Business Machines Corporation +// https://www.iana.org/domains/root/db/weather.html weather -// weatherchannel : 2015-03-12 International Business Machines Corporation +// weatherchannel : International Business Machines Corporation +// https://www.iana.org/domains/root/db/weatherchannel.html weatherchannel -// webcam : 2014-01-23 dot Webcam Limited +// webcam : dot Webcam Limited +// https://www.iana.org/domains/root/db/webcam.html webcam -// weber : 2015-06-04 Saint-Gobain Weber SA +// weber : Saint-Gobain Weber SA +// https://www.iana.org/domains/root/db/weber.html weber -// website : 2014-04-03 Radix FZC +// website : Radix Technologies Inc. +// https://www.iana.org/domains/root/db/website.html website -// wedding : 2014-04-24 Registry Services, LLC +// wed +// https://www.iana.org/domains/root/db/wed.html +wed + +// wedding : Registry Services, LLC +// https://www.iana.org/domains/root/db/wedding.html wedding -// weibo : 2015-03-05 Sina Corporation +// weibo : Sina Corporation +// https://www.iana.org/domains/root/db/weibo.html weibo -// weir : 2015-01-29 Weir Group IP Limited +// weir : Weir Group IP Limited +// https://www.iana.org/domains/root/db/weir.html weir -// whoswho : 2014-02-20 Who's Who Registry +// whoswho : Who's Who Registry +// https://www.iana.org/domains/root/db/whoswho.html whoswho -// wien : 2013-10-28 punkt.wien GmbH +// wien : punkt.wien GmbH +// https://www.iana.org/domains/root/db/wien.html wien -// wiki : 2013-11-07 Registry Services, LLC +// wiki : Registry Services, LLC +// https://www.iana.org/domains/root/db/wiki.html wiki -// williamhill : 2014-03-13 William Hill Organization Limited +// williamhill : William Hill Organization Limited +// https://www.iana.org/domains/root/db/williamhill.html williamhill -// win : 2014-11-20 First Registry Limited +// win : First Registry Limited +// https://www.iana.org/domains/root/db/win.html win -// windows : 2014-12-18 Microsoft Corporation +// windows : Microsoft Corporation +// https://www.iana.org/domains/root/db/windows.html windows -// wine : 2015-06-18 Binky Moon, LLC +// wine : Binky Moon, LLC +// https://www.iana.org/domains/root/db/wine.html wine -// winners : 2015-07-16 The TJX Companies, Inc. +// winners : The TJX Companies, Inc. +// https://www.iana.org/domains/root/db/winners.html winners -// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +// wme : William Morris Endeavor Entertainment, LLC +// https://www.iana.org/domains/root/db/wme.html wme -// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +// wolterskluwer : Wolters Kluwer N.V. +// https://www.iana.org/domains/root/db/wolterskluwer.html wolterskluwer -// woodside : 2015-07-09 Woodside Petroleum Limited +// woodside : Woodside Petroleum Limited +// https://www.iana.org/domains/root/db/woodside.html woodside -// work : 2013-12-19 Registry Services, LLC +// work : Registry Services, LLC +// https://www.iana.org/domains/root/db/work.html work -// works : 2013-11-14 Binky Moon, LLC +// works : Binky Moon, LLC +// https://www.iana.org/domains/root/db/works.html works -// world : 2014-06-12 Binky Moon, LLC +// world : Binky Moon, LLC +// https://www.iana.org/domains/root/db/world.html world -// wow : 2015-10-08 Amazon Registry Services, Inc. +// wow : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/wow.html wow -// wtc : 2013-12-19 World Trade Centers Association, Inc. +// wtc : World Trade Centers Association, Inc. +// https://www.iana.org/domains/root/db/wtc.html wtc -// wtf : 2014-03-06 Binky Moon, LLC +// wtf : Binky Moon, LLC +// https://www.iana.org/domains/root/db/wtf.html wtf -// xbox : 2014-12-18 Microsoft Corporation +// xbox : Microsoft Corporation +// https://www.iana.org/domains/root/db/xbox.html xbox -// xerox : 2014-10-24 Xerox DNHC LLC +// xerox : Xerox DNHC LLC +// https://www.iana.org/domains/root/db/xerox.html xerox -// xfinity : 2015-07-09 Comcast IP Holdings I, LLC -xfinity - -// xihuan : 2015-01-08 Beijing Qihu Keji Co., Ltd. +// xihuan : Beijing Qihu Keji Co., Ltd. +// https://www.iana.org/domains/root/db/xihuan.html xihuan -// xin : 2014-12-11 Elegant Leader Limited +// xin : Elegant Leader Limited +// https://www.iana.org/domains/root/db/xin.html xin -// xn--11b4c3d : 2015-01-15 VeriSign Sarl +// xn--11b4c3d : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--11b4c3d.html कॉम -// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +// xn--1ck2e1b : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--1ck2e1b.html セール -// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +// xn--1qqw23a : Guangzhou YU Wei Information Technology Co., Ltd. +// https://www.iana.org/domains/root/db/xn--1qqw23a.html 佛山 -// xn--30rr7y : 2014-06-12 Excellent First Limited +// xn--30rr7y : Excellent First Limited +// https://www.iana.org/domains/root/db/xn--30rr7y.html 慈善 -// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +// xn--3bst00m : Eagle Horizon Limited +// https://www.iana.org/domains/root/db/xn--3bst00m.html 集团 -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +// xn--3ds443g : TLD REGISTRY LIMITED OY +// https://www.iana.org/domains/root/db/xn--3ds443g.html 在线 -// xn--3pxu8k : 2015-01-15 VeriSign Sarl +// xn--3pxu8k : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--3pxu8k.html 点看 -// xn--42c2d9a : 2015-01-15 VeriSign Sarl +// xn--42c2d9a : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--42c2d9a.html คอม -// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +// xn--45q11c : Zodiac Gemini Ltd +// https://www.iana.org/domains/root/db/xn--45q11c.html 八卦 -// xn--4gbrim : 2013-10-04 Helium TLDs Ltd +// xn--4gbrim : Helium TLDs Ltd +// https://www.iana.org/domains/root/db/xn--4gbrim.html موقع -// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +// xn--55qw42g : China Organizational Name Administration Center +// https://www.iana.org/domains/root/db/xn--55qw42g.html 公益 -// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +// xn--55qx5d : China Internet Network Information Center (CNNIC) +// https://www.iana.org/domains/root/db/xn--55qx5d.html 公司 -// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +// xn--5su34j936bgsg : Shangri‐La International Hotel Management Limited +// https://www.iana.org/domains/root/db/xn--5su34j936bgsg.html 香格里拉 -// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +// xn--5tzm5g : Global Website TLD Asia Limited +// https://www.iana.org/domains/root/db/xn--5tzm5g.html 网站 -// xn--6frz82g : 2013-09-23 Identity Digital Limited +// xn--6frz82g : Identity Digital Limited +// https://www.iana.org/domains/root/db/xn--6frz82g.html 移动 -// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +// xn--6qq986b3xl : Tycoon Treasure Limited +// https://www.iana.org/domains/root/db/xn--6qq986b3xl.html 我爱你 -// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +// xn--80adxhks : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +// https://www.iana.org/domains/root/db/xn--80adxhks.html москва -// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// xn--80aqecdr1a : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// https://www.iana.org/domains/root/db/xn--80aqecdr1a.html католик -// xn--80asehdb : 2013-07-14 CORE Association +// xn--80asehdb : CORE Association +// https://www.iana.org/domains/root/db/xn--80asehdb.html онлайн -// xn--80aswg : 2013-07-14 CORE Association +// xn--80aswg : CORE Association +// https://www.iana.org/domains/root/db/xn--80aswg.html сайт -// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +// xn--8y0a063a : China United Network Communications Corporation Limited +// https://www.iana.org/domains/root/db/xn--8y0a063a.html 联通 -// xn--9dbq2a : 2015-01-15 VeriSign Sarl +// xn--9dbq2a : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--9dbq2a.html קום -// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +// xn--9et52u : RISE VICTORY LIMITED +// https://www.iana.org/domains/root/db/xn--9et52u.html 时尚 -// xn--9krt00a : 2015-03-12 Sina Corporation +// xn--9krt00a : Sina Corporation +// https://www.iana.org/domains/root/db/xn--9krt00a.html 微博 -// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +// xn--b4w605ferd : Temasek Holdings (Private) Limited +// https://www.iana.org/domains/root/db/xn--b4w605ferd.html 淡马锡 -// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +// xn--bck1b9a5dre4c : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--bck1b9a5dre4c.html ファッション -// xn--c1avg : 2013-11-14 Public Interest Registry +// xn--c1avg : Public Interest Registry +// https://www.iana.org/domains/root/db/xn--c1avg.html орг -// xn--c2br7g : 2015-01-15 VeriSign Sarl +// xn--c2br7g : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--c2br7g.html नेट -// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +// xn--cck2b3b : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--cck2b3b.html ストア -// xn--cckwcxetd : 2019-12-19 Amazon Registry Services, Inc. +// xn--cckwcxetd : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--cckwcxetd.html アマゾン -// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +// xn--cg4bki : SAMSUNG SDS CO., LTD +// https://www.iana.org/domains/root/db/xn--cg4bki.html 삼성 -// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +// xn--czr694b : Internet DotTrademark Organisation Limited +// https://www.iana.org/domains/root/db/xn--czr694b.html 商标 -// xn--czrs0t : 2013-12-19 Binky Moon, LLC +// xn--czrs0t : Binky Moon, LLC +// https://www.iana.org/domains/root/db/xn--czrs0t.html 商店 -// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +// xn--czru2d : Zodiac Aquarius Limited +// https://www.iana.org/domains/root/db/xn--czru2d.html 商城 -// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +// xn--d1acj3b : The Foundation for Network Initiatives “The Smart Internet” +// https://www.iana.org/domains/root/db/xn--d1acj3b.html дети -// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +// xn--eckvdtc9d : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--eckvdtc9d.html ポイント -// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +// xn--efvy88h : Guangzhou YU Wei Information Technology Co., Ltd. +// https://www.iana.org/domains/root/db/xn--efvy88h.html 新闻 -// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +// xn--fct429k : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--fct429k.html 家電 -// xn--fhbei : 2015-01-15 VeriSign Sarl +// xn--fhbei : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--fhbei.html كوم -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +// xn--fiq228c5hs : TLD REGISTRY LIMITED OY +// https://www.iana.org/domains/root/db/xn--fiq228c5hs.html 中文网 -// xn--fiq64b : 2013-10-14 CITIC Group Corporation +// xn--fiq64b : CITIC Group Corporation +// https://www.iana.org/domains/root/db/xn--fiq64b.html 中信 -// xn--fjq720a : 2014-05-22 Binky Moon, LLC +// xn--fjq720a : Binky Moon, LLC +// https://www.iana.org/domains/root/db/xn--fjq720a.html 娱乐 -// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +// xn--flw351e : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/xn--flw351e.html 谷歌 -// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +// xn--fzys8d69uvgm : PCCW Enterprises Limited +// https://www.iana.org/domains/root/db/xn--fzys8d69uvgm.html 電訊盈科 -// xn--g2xx48c : 2015-01-30 Nawang Heli(Xiamen) Network Service Co., LTD. +// xn--g2xx48c : Nawang Heli(Xiamen) Network Service Co., LTD. +// https://www.iana.org/domains/root/db/xn--g2xx48c.html 购物 -// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +// xn--gckr3f0f : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--gckr3f0f.html クラウド -// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +// xn--gk3at1e : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--gk3at1e.html 通販 -// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +// xn--hxt814e : Zodiac Taurus Limited +// https://www.iana.org/domains/root/db/xn--hxt814e.html 网店 -// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +// xn--i1b6b1a6a2e : Public Interest Registry +// https://www.iana.org/domains/root/db/xn--i1b6b1a6a2e.html संगठन -// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +// xn--imr513n : Internet DotTrademark Organisation Limited +// https://www.iana.org/domains/root/db/xn--imr513n.html 餐厅 -// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +// xn--io0a7i : China Internet Network Information Center (CNNIC) +// https://www.iana.org/domains/root/db/xn--io0a7i.html 网络 -// xn--j1aef : 2015-01-15 VeriSign Sarl +// xn--j1aef : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--j1aef.html ком -// xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. +// xn--jlq480n2rg : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--jlq480n2rg.html 亚马逊 -// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +// xn--jvr189m : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--jvr189m.html 食品 -// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +// xn--kcrx77d1x4a : Koninklijke Philips N.V. +// https://www.iana.org/domains/root/db/xn--kcrx77d1x4a.html 飞利浦 -// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +// xn--kput3i : Beijing RITT-Net Technology Development Co., Ltd +// https://www.iana.org/domains/root/db/xn--kput3i.html 手机 -// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +// xn--mgba3a3ejt : Aramco Services Company +// https://www.iana.org/domains/root/db/xn--mgba3a3ejt.html ارامكو -// xn--mgba7c0bbn0a : 2015-05-14 Competrol (Luxembourg) Sarl +// xn--mgba7c0bbn0a : Competrol (Luxembourg) Sarl +// https://www.iana.org/domains/root/db/xn--mgba7c0bbn0a.html العليان -// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -اتصالات - -// xn--mgbab2bd : 2013-10-31 CORE Association +// xn--mgbab2bd : CORE Association +// https://www.iana.org/domains/root/db/xn--mgbab2bd.html بازار -// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +// xn--mgbca7dzdo : Abu Dhabi Systems and Information Centre +// https://www.iana.org/domains/root/db/xn--mgbca7dzdo.html ابوظبي -// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// xn--mgbi4ecexp : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// https://www.iana.org/domains/root/db/xn--mgbi4ecexp.html كاثوليك -// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// xn--mgbt3dhd : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +// https://www.iana.org/domains/root/db/xn--mgbt3dhd.html همراه -// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +// xn--mk1bu44c : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--mk1bu44c.html 닷컴 -// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +// xn--mxtq1m : Net-Chinese Co., Ltd. +// https://www.iana.org/domains/root/db/xn--mxtq1m.html 政府 -// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +// xn--ngbc5azd : International Domain Registry Pty. Ltd. +// https://www.iana.org/domains/root/db/xn--ngbc5azd.html شبكة -// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +// xn--ngbe9e0a : Kuwait Finance House +// https://www.iana.org/domains/root/db/xn--ngbe9e0a.html بيتك -// xn--ngbrx : 2015-11-12 League of Arab States +// xn--ngbrx : League of Arab States +// https://www.iana.org/domains/root/db/xn--ngbrx.html عرب -// xn--nqv7f : 2013-11-14 Public Interest Registry +// xn--nqv7f : Public Interest Registry +// https://www.iana.org/domains/root/db/xn--nqv7f.html 机构 -// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +// xn--nqv7fs00ema : Public Interest Registry +// https://www.iana.org/domains/root/db/xn--nqv7fs00ema.html 组织机构 -// xn--nyqy26a : 2014-11-07 Stable Tone Limited +// xn--nyqy26a : Stable Tone Limited +// https://www.iana.org/domains/root/db/xn--nyqy26a.html 健康 -// xn--otu796d : 2017-08-06 Jiang Yu Liang Cai Technology Company Limited +// xn--otu796d : Jiang Yu Liang Cai Technology Company Limited +// https://www.iana.org/domains/root/db/xn--otu796d.html 招聘 -// xn--p1acf : 2013-12-12 Rusnames Limited +// xn--p1acf : Rusnames Limited +// https://www.iana.org/domains/root/db/xn--p1acf.html рус -// xn--pssy2u : 2015-01-15 VeriSign Sarl +// xn--pssy2u : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--pssy2u.html 大拿 -// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +// xn--q9jyb4c : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/xn--q9jyb4c.html みんな -// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +// xn--qcka1pmc : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/xn--qcka1pmc.html グーグル -// xn--rhqv96g : 2013-09-11 Stable Tone Limited +// xn--rhqv96g : Stable Tone Limited +// https://www.iana.org/domains/root/db/xn--rhqv96g.html 世界 -// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +// xn--rovu88b : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/xn--rovu88b.html 書籍 -// xn--ses554g : 2014-01-16 KNET Co., Ltd. +// xn--ses554g : KNET Co., Ltd. +// https://www.iana.org/domains/root/db/xn--ses554g.html 网址 -// xn--t60b56a : 2015-01-15 VeriSign Sarl +// xn--t60b56a : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--t60b56a.html 닷넷 -// xn--tckwe : 2015-01-15 VeriSign Sarl +// xn--tckwe : VeriSign Sarl +// https://www.iana.org/domains/root/db/xn--tckwe.html コム -// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// xn--tiq49xqyj : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +// https://www.iana.org/domains/root/db/xn--tiq49xqyj.html 天主教 -// xn--unup4y : 2013-07-14 Binky Moon, LLC +// xn--unup4y : Binky Moon, LLC +// https://www.iana.org/domains/root/db/xn--unup4y.html 游戏 -// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +// xn--vermgensberater-ctb : Deutsche Vermögensberatung Aktiengesellschaft DVAG +// https://www.iana.org/domains/root/db/xn--vermgensberater-ctb.html vermögensberater -// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +// xn--vermgensberatung-pwb : Deutsche Vermögensberatung Aktiengesellschaft DVAG +// https://www.iana.org/domains/root/db/xn--vermgensberatung-pwb.html vermögensberatung -// xn--vhquv : 2013-08-27 Binky Moon, LLC +// xn--vhquv : Binky Moon, LLC +// https://www.iana.org/domains/root/db/xn--vhquv.html 企业 -// xn--vuq861b : 2014-10-16 Beijing Tele-info Technology Co., Ltd. +// xn--vuq861b : Beijing Tele-info Technology Co., Ltd. +// https://www.iana.org/domains/root/db/xn--vuq861b.html 信息 -// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +// xn--w4r85el8fhu5dnra : Kerry Trading Co. Limited +// https://www.iana.org/domains/root/db/xn--w4r85el8fhu5dnra.html 嘉里大酒店 -// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +// xn--w4rs40l : Kerry Trading Co. Limited +// https://www.iana.org/domains/root/db/xn--w4rs40l.html 嘉里 -// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +// xn--xhq521b : Guangzhou YU Wei Information Technology Co., Ltd. +// https://www.iana.org/domains/root/db/xn--xhq521b.html 广东 -// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +// xn--zfr164b : China Organizational Name Administration Center +// https://www.iana.org/domains/root/db/xn--zfr164b.html 政务 -// xyz : 2013-12-05 XYZ.COM LLC +// xyz : XYZ.COM LLC +// https://www.iana.org/domains/root/db/xyz.html xyz -// yachts : 2014-01-09 XYZ.COM LLC +// yachts : XYZ.COM LLC +// https://www.iana.org/domains/root/db/yachts.html yachts -// yahoo : 2015-04-02 Oath Inc. +// yahoo : Oath Inc. +// https://www.iana.org/domains/root/db/yahoo.html yahoo -// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +// yamaxun : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/yamaxun.html yamaxun -// yandex : 2014-04-10 Yandex Europe B.V. +// yandex : Yandex Europe B.V. +// https://www.iana.org/domains/root/db/yandex.html yandex -// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +// yodobashi : YODOBASHI CAMERA CO.,LTD. +// https://www.iana.org/domains/root/db/yodobashi.html yodobashi -// yoga : 2014-05-29 Registry Services, LLC +// yoga : Registry Services, LLC +// https://www.iana.org/domains/root/db/yoga.html yoga -// yokohama : 2013-12-12 GMO Registry, Inc. +// yokohama : GMO Registry, Inc. +// https://www.iana.org/domains/root/db/yokohama.html yokohama -// you : 2015-04-09 Amazon Registry Services, Inc. +// you : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/you.html you -// youtube : 2014-05-01 Charleston Road Registry Inc. +// youtube : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/youtube.html youtube -// yun : 2015-01-08 Beijing Qihu Keji Co., Ltd. +// yun : Beijing Qihu Keji Co., Ltd. +// https://www.iana.org/domains/root/db/yun.html yun -// zappos : 2015-06-25 Amazon Registry Services, Inc. +// zappos : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/zappos.html zappos -// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +// zara : Industria de Diseño Textil, S.A. (INDITEX, S.A.) +// https://www.iana.org/domains/root/db/zara.html zara -// zero : 2014-12-18 Amazon Registry Services, Inc. +// zero : Amazon Registry Services, Inc. +// https://www.iana.org/domains/root/db/zero.html zero -// zip : 2014-05-08 Charleston Road Registry Inc. +// zip : Charleston Road Registry Inc. +// https://www.iana.org/domains/root/db/zip.html zip -// zone : 2013-11-14 Binky Moon, LLC +// zone : Binky Moon, LLC +// https://www.iana.org/domains/root/db/zone.html zone -// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +// zuerich : Kanton Zürich (Canton of Zurich) +// https://www.iana.org/domains/root/db/zuerich.html zuerich @@ -10140,6 +11189,12 @@ zuerich // ===BEGIN PRIVATE DOMAINS=== // (Note: these are in alphabetical order by company name) +// 12CHARS: https://12chars.com +// Submitted by Kenny Niehage <psl@12chars.com> +12chars.dev +12chars.it +12chars.pro + // 1GB LLC : https://www.1gb.ua/ // Submitted by 1GB LLC <noc@1gb.com.ua> cc.ua @@ -10149,6 +11204,11 @@ ltd.ua // 611coin : https://611project.org/ 611.to +// A2 Hosting +// Submitted by Tyler Hall <sysadmin@a2hosting.com> +a2hosted.com +cpserver.com + // Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za // Submitted by Aaron Marais <its_me@aaronleem.co.za> graphox.us @@ -10165,12 +11225,18 @@ graphox.us // Submitted by Ofer Kalaora <postmaster@activetrail.com> activetrail.biz +// Adaptable.io : https://adaptable.io +// Submitted by Mark Terrel <support@adaptable.io> +adaptable.app + // Adobe : https://www.adobe.com/ // Submitted by Ian Boston <boston@adobe.com> and Lars Trieloff <trieloff@adobe.com> adobeaemcloud.com *.dev.adobeaemcloud.com +aem.live hlx.live adobeaemcloud.net +aem.page hlx.page hlx3.page @@ -10240,11 +11306,79 @@ myamaze.net // Submitted by AWS Security <psl-maintainers@amazon.com> // Subsections of Amazon/subsidiaries will appear until "concludes" tag +// Amazon API Gateway +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 9e37648f-a66c-4655-9ab1-5981f8737197 +execute-api.cn-north-1.amazonaws.com.cn +execute-api.cn-northwest-1.amazonaws.com.cn +execute-api.af-south-1.amazonaws.com +execute-api.ap-east-1.amazonaws.com +execute-api.ap-northeast-1.amazonaws.com +execute-api.ap-northeast-2.amazonaws.com +execute-api.ap-northeast-3.amazonaws.com +execute-api.ap-south-1.amazonaws.com +execute-api.ap-south-2.amazonaws.com +execute-api.ap-southeast-1.amazonaws.com +execute-api.ap-southeast-2.amazonaws.com +execute-api.ap-southeast-3.amazonaws.com +execute-api.ap-southeast-4.amazonaws.com +execute-api.ca-central-1.amazonaws.com +execute-api.ca-west-1.amazonaws.com +execute-api.eu-central-1.amazonaws.com +execute-api.eu-central-2.amazonaws.com +execute-api.eu-north-1.amazonaws.com +execute-api.eu-south-1.amazonaws.com +execute-api.eu-south-2.amazonaws.com +execute-api.eu-west-1.amazonaws.com +execute-api.eu-west-2.amazonaws.com +execute-api.eu-west-3.amazonaws.com +execute-api.il-central-1.amazonaws.com +execute-api.me-central-1.amazonaws.com +execute-api.me-south-1.amazonaws.com +execute-api.sa-east-1.amazonaws.com +execute-api.us-east-1.amazonaws.com +execute-api.us-east-2.amazonaws.com +execute-api.us-gov-east-1.amazonaws.com +execute-api.us-gov-west-1.amazonaws.com +execute-api.us-west-1.amazonaws.com +execute-api.us-west-2.amazonaws.com + // Amazon CloudFront // Submitted by Donavan Miller <donavanm@amazon.com> // Reference: 54144616-fd49-4435-8535-19c6a601bdb3 cloudfront.net +// Amazon Cognito +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 7bee1013-f456-47df-bfe8-03c78d946d61 +auth.af-south-1.amazoncognito.com +auth.ap-northeast-1.amazoncognito.com +auth.ap-northeast-2.amazoncognito.com +auth.ap-northeast-3.amazoncognito.com +auth.ap-south-1.amazoncognito.com +auth.ap-southeast-1.amazoncognito.com +auth.ap-southeast-2.amazoncognito.com +auth.ap-southeast-3.amazoncognito.com +auth.ca-central-1.amazoncognito.com +auth.eu-central-1.amazoncognito.com +auth.eu-north-1.amazoncognito.com +auth.eu-south-1.amazoncognito.com +auth.eu-west-1.amazoncognito.com +auth.eu-west-2.amazoncognito.com +auth.eu-west-3.amazoncognito.com +auth.il-central-1.amazoncognito.com +auth.me-south-1.amazoncognito.com +auth.sa-east-1.amazoncognito.com +auth.us-east-1.amazoncognito.com +auth-fips.us-east-1.amazoncognito.com +auth.us-east-2.amazoncognito.com +auth-fips.us-east-2.amazoncognito.com +auth-fips.us-gov-west-1.amazoncognito.com +auth.us-west-1.amazoncognito.com +auth-fips.us-west-1.amazoncognito.com +auth.us-west-2.amazoncognito.com +auth-fips.us-west-2.amazoncognito.com + // Amazon EC2 // Submitted by Luke Wells <psl-maintainers@amazon.com> // Reference: 4c38fa71-58ac-4768-99e5-689c1767e537 @@ -10253,47 +11387,317 @@ cloudfront.net *.compute.amazonaws.com.cn us-east-1.amazonaws.com +// Amazon EMR +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 597f3f8e-9283-4e48-8e32-7ee25a1ff6ab +emrappui-prod.cn-north-1.amazonaws.com.cn +emrnotebooks-prod.cn-north-1.amazonaws.com.cn +emrstudio-prod.cn-north-1.amazonaws.com.cn +emrappui-prod.cn-northwest-1.amazonaws.com.cn +emrnotebooks-prod.cn-northwest-1.amazonaws.com.cn +emrstudio-prod.cn-northwest-1.amazonaws.com.cn +emrappui-prod.af-south-1.amazonaws.com +emrnotebooks-prod.af-south-1.amazonaws.com +emrstudio-prod.af-south-1.amazonaws.com +emrappui-prod.ap-east-1.amazonaws.com +emrnotebooks-prod.ap-east-1.amazonaws.com +emrstudio-prod.ap-east-1.amazonaws.com +emrappui-prod.ap-northeast-1.amazonaws.com +emrnotebooks-prod.ap-northeast-1.amazonaws.com +emrstudio-prod.ap-northeast-1.amazonaws.com +emrappui-prod.ap-northeast-2.amazonaws.com +emrnotebooks-prod.ap-northeast-2.amazonaws.com +emrstudio-prod.ap-northeast-2.amazonaws.com +emrappui-prod.ap-northeast-3.amazonaws.com +emrnotebooks-prod.ap-northeast-3.amazonaws.com +emrstudio-prod.ap-northeast-3.amazonaws.com +emrappui-prod.ap-south-1.amazonaws.com +emrnotebooks-prod.ap-south-1.amazonaws.com +emrstudio-prod.ap-south-1.amazonaws.com +emrappui-prod.ap-southeast-1.amazonaws.com +emrnotebooks-prod.ap-southeast-1.amazonaws.com +emrstudio-prod.ap-southeast-1.amazonaws.com +emrappui-prod.ap-southeast-2.amazonaws.com +emrnotebooks-prod.ap-southeast-2.amazonaws.com +emrstudio-prod.ap-southeast-2.amazonaws.com +emrappui-prod.ap-southeast-3.amazonaws.com +emrnotebooks-prod.ap-southeast-3.amazonaws.com +emrstudio-prod.ap-southeast-3.amazonaws.com +emrappui-prod.ca-central-1.amazonaws.com +emrnotebooks-prod.ca-central-1.amazonaws.com +emrstudio-prod.ca-central-1.amazonaws.com +emrappui-prod.eu-central-1.amazonaws.com +emrnotebooks-prod.eu-central-1.amazonaws.com +emrstudio-prod.eu-central-1.amazonaws.com +emrappui-prod.eu-north-1.amazonaws.com +emrnotebooks-prod.eu-north-1.amazonaws.com +emrstudio-prod.eu-north-1.amazonaws.com +emrappui-prod.eu-south-1.amazonaws.com +emrnotebooks-prod.eu-south-1.amazonaws.com +emrstudio-prod.eu-south-1.amazonaws.com +emrappui-prod.eu-west-1.amazonaws.com +emrnotebooks-prod.eu-west-1.amazonaws.com +emrstudio-prod.eu-west-1.amazonaws.com +emrappui-prod.eu-west-2.amazonaws.com +emrnotebooks-prod.eu-west-2.amazonaws.com +emrstudio-prod.eu-west-2.amazonaws.com +emrappui-prod.eu-west-3.amazonaws.com +emrnotebooks-prod.eu-west-3.amazonaws.com +emrstudio-prod.eu-west-3.amazonaws.com +emrappui-prod.me-central-1.amazonaws.com +emrnotebooks-prod.me-central-1.amazonaws.com +emrstudio-prod.me-central-1.amazonaws.com +emrappui-prod.me-south-1.amazonaws.com +emrnotebooks-prod.me-south-1.amazonaws.com +emrstudio-prod.me-south-1.amazonaws.com +emrappui-prod.sa-east-1.amazonaws.com +emrnotebooks-prod.sa-east-1.amazonaws.com +emrstudio-prod.sa-east-1.amazonaws.com +emrappui-prod.us-east-1.amazonaws.com +emrnotebooks-prod.us-east-1.amazonaws.com +emrstudio-prod.us-east-1.amazonaws.com +emrappui-prod.us-east-2.amazonaws.com +emrnotebooks-prod.us-east-2.amazonaws.com +emrstudio-prod.us-east-2.amazonaws.com +emrappui-prod.us-gov-east-1.amazonaws.com +emrnotebooks-prod.us-gov-east-1.amazonaws.com +emrstudio-prod.us-gov-east-1.amazonaws.com +emrappui-prod.us-gov-west-1.amazonaws.com +emrnotebooks-prod.us-gov-west-1.amazonaws.com +emrstudio-prod.us-gov-west-1.amazonaws.com +emrappui-prod.us-west-1.amazonaws.com +emrnotebooks-prod.us-west-1.amazonaws.com +emrstudio-prod.us-west-1.amazonaws.com +emrappui-prod.us-west-2.amazonaws.com +emrnotebooks-prod.us-west-2.amazonaws.com +emrstudio-prod.us-west-2.amazonaws.com + +// Amazon Managed Workflows for Apache Airflow +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 4ab55e6f-90c0-4a8d-b6a0-52ca5dbb1c2e +*.cn-north-1.airflow.amazonaws.com.cn +*.cn-northwest-1.airflow.amazonaws.com.cn +*.ap-northeast-1.airflow.amazonaws.com +*.ap-northeast-2.airflow.amazonaws.com +*.ap-south-1.airflow.amazonaws.com +*.ap-southeast-1.airflow.amazonaws.com +*.ap-southeast-2.airflow.amazonaws.com +*.ca-central-1.airflow.amazonaws.com +*.eu-central-1.airflow.amazonaws.com +*.eu-north-1.airflow.amazonaws.com +*.eu-west-1.airflow.amazonaws.com +*.eu-west-2.airflow.amazonaws.com +*.eu-west-3.airflow.amazonaws.com +*.sa-east-1.airflow.amazonaws.com +*.us-east-1.airflow.amazonaws.com +*.us-east-2.airflow.amazonaws.com +*.us-west-2.airflow.amazonaws.com + // Amazon S3 -// Submitted by Luke Wells <psl-maintainers@amazon.com> -// Reference: d068bd97-f0a9-4838-a6d8-954b622ef4ae +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: cd5c8b3a-67b7-4b40-9236-c87ce81a3d10 +s3.dualstack.cn-north-1.amazonaws.com.cn +s3-accesspoint.dualstack.cn-north-1.amazonaws.com.cn +s3-website.dualstack.cn-north-1.amazonaws.com.cn s3.cn-north-1.amazonaws.com.cn +s3-accesspoint.cn-north-1.amazonaws.com.cn +s3-deprecated.cn-north-1.amazonaws.com.cn +s3-object-lambda.cn-north-1.amazonaws.com.cn +s3-website.cn-north-1.amazonaws.com.cn +s3.dualstack.cn-northwest-1.amazonaws.com.cn +s3-accesspoint.dualstack.cn-northwest-1.amazonaws.com.cn +s3.cn-northwest-1.amazonaws.com.cn +s3-accesspoint.cn-northwest-1.amazonaws.com.cn +s3-object-lambda.cn-northwest-1.amazonaws.com.cn +s3-website.cn-northwest-1.amazonaws.com.cn +s3.dualstack.af-south-1.amazonaws.com +s3-accesspoint.dualstack.af-south-1.amazonaws.com +s3-website.dualstack.af-south-1.amazonaws.com +s3.af-south-1.amazonaws.com +s3-accesspoint.af-south-1.amazonaws.com +s3-object-lambda.af-south-1.amazonaws.com +s3-website.af-south-1.amazonaws.com +s3.dualstack.ap-east-1.amazonaws.com +s3-accesspoint.dualstack.ap-east-1.amazonaws.com +s3.ap-east-1.amazonaws.com +s3-accesspoint.ap-east-1.amazonaws.com +s3-object-lambda.ap-east-1.amazonaws.com +s3-website.ap-east-1.amazonaws.com s3.dualstack.ap-northeast-1.amazonaws.com +s3-accesspoint.dualstack.ap-northeast-1.amazonaws.com +s3-website.dualstack.ap-northeast-1.amazonaws.com +s3.ap-northeast-1.amazonaws.com +s3-accesspoint.ap-northeast-1.amazonaws.com +s3-object-lambda.ap-northeast-1.amazonaws.com +s3-website.ap-northeast-1.amazonaws.com s3.dualstack.ap-northeast-2.amazonaws.com +s3-accesspoint.dualstack.ap-northeast-2.amazonaws.com +s3-website.dualstack.ap-northeast-2.amazonaws.com s3.ap-northeast-2.amazonaws.com +s3-accesspoint.ap-northeast-2.amazonaws.com +s3-object-lambda.ap-northeast-2.amazonaws.com s3-website.ap-northeast-2.amazonaws.com +s3.dualstack.ap-northeast-3.amazonaws.com +s3-accesspoint.dualstack.ap-northeast-3.amazonaws.com +s3-website.dualstack.ap-northeast-3.amazonaws.com +s3.ap-northeast-3.amazonaws.com +s3-accesspoint.ap-northeast-3.amazonaws.com +s3-object-lambda.ap-northeast-3.amazonaws.com +s3-website.ap-northeast-3.amazonaws.com s3.dualstack.ap-south-1.amazonaws.com +s3-accesspoint.dualstack.ap-south-1.amazonaws.com +s3-website.dualstack.ap-south-1.amazonaws.com s3.ap-south-1.amazonaws.com +s3-accesspoint.ap-south-1.amazonaws.com +s3-object-lambda.ap-south-1.amazonaws.com s3-website.ap-south-1.amazonaws.com +s3.dualstack.ap-south-2.amazonaws.com +s3-accesspoint.dualstack.ap-south-2.amazonaws.com +s3.ap-south-2.amazonaws.com +s3-accesspoint.ap-south-2.amazonaws.com +s3-object-lambda.ap-south-2.amazonaws.com +s3-website.ap-south-2.amazonaws.com s3.dualstack.ap-southeast-1.amazonaws.com +s3-accesspoint.dualstack.ap-southeast-1.amazonaws.com +s3-website.dualstack.ap-southeast-1.amazonaws.com +s3.ap-southeast-1.amazonaws.com +s3-accesspoint.ap-southeast-1.amazonaws.com +s3-object-lambda.ap-southeast-1.amazonaws.com +s3-website.ap-southeast-1.amazonaws.com s3.dualstack.ap-southeast-2.amazonaws.com +s3-accesspoint.dualstack.ap-southeast-2.amazonaws.com +s3-website.dualstack.ap-southeast-2.amazonaws.com +s3.ap-southeast-2.amazonaws.com +s3-accesspoint.ap-southeast-2.amazonaws.com +s3-object-lambda.ap-southeast-2.amazonaws.com +s3-website.ap-southeast-2.amazonaws.com +s3.dualstack.ap-southeast-3.amazonaws.com +s3-accesspoint.dualstack.ap-southeast-3.amazonaws.com +s3.ap-southeast-3.amazonaws.com +s3-accesspoint.ap-southeast-3.amazonaws.com +s3-object-lambda.ap-southeast-3.amazonaws.com +s3-website.ap-southeast-3.amazonaws.com +s3.dualstack.ap-southeast-4.amazonaws.com +s3-accesspoint.dualstack.ap-southeast-4.amazonaws.com +s3.ap-southeast-4.amazonaws.com +s3-accesspoint.ap-southeast-4.amazonaws.com +s3-object-lambda.ap-southeast-4.amazonaws.com +s3-website.ap-southeast-4.amazonaws.com s3.dualstack.ca-central-1.amazonaws.com +s3-accesspoint.dualstack.ca-central-1.amazonaws.com +s3-accesspoint-fips.dualstack.ca-central-1.amazonaws.com +s3-fips.dualstack.ca-central-1.amazonaws.com +s3-website.dualstack.ca-central-1.amazonaws.com s3.ca-central-1.amazonaws.com +s3-accesspoint.ca-central-1.amazonaws.com +s3-accesspoint-fips.ca-central-1.amazonaws.com +s3-fips.ca-central-1.amazonaws.com +s3-object-lambda.ca-central-1.amazonaws.com s3-website.ca-central-1.amazonaws.com +s3.dualstack.ca-west-1.amazonaws.com +s3-accesspoint.dualstack.ca-west-1.amazonaws.com +s3-accesspoint-fips.dualstack.ca-west-1.amazonaws.com +s3-fips.dualstack.ca-west-1.amazonaws.com +s3-website.dualstack.ca-west-1.amazonaws.com +s3.ca-west-1.amazonaws.com +s3-accesspoint.ca-west-1.amazonaws.com +s3-accesspoint-fips.ca-west-1.amazonaws.com +s3-fips.ca-west-1.amazonaws.com +s3-website.ca-west-1.amazonaws.com s3.dualstack.eu-central-1.amazonaws.com +s3-accesspoint.dualstack.eu-central-1.amazonaws.com +s3-website.dualstack.eu-central-1.amazonaws.com s3.eu-central-1.amazonaws.com +s3-accesspoint.eu-central-1.amazonaws.com +s3-object-lambda.eu-central-1.amazonaws.com s3-website.eu-central-1.amazonaws.com +s3.dualstack.eu-central-2.amazonaws.com +s3-accesspoint.dualstack.eu-central-2.amazonaws.com +s3.eu-central-2.amazonaws.com +s3-accesspoint.eu-central-2.amazonaws.com +s3-object-lambda.eu-central-2.amazonaws.com +s3-website.eu-central-2.amazonaws.com +s3.dualstack.eu-north-1.amazonaws.com +s3-accesspoint.dualstack.eu-north-1.amazonaws.com +s3.eu-north-1.amazonaws.com +s3-accesspoint.eu-north-1.amazonaws.com +s3-object-lambda.eu-north-1.amazonaws.com +s3-website.eu-north-1.amazonaws.com +s3.dualstack.eu-south-1.amazonaws.com +s3-accesspoint.dualstack.eu-south-1.amazonaws.com +s3-website.dualstack.eu-south-1.amazonaws.com +s3.eu-south-1.amazonaws.com +s3-accesspoint.eu-south-1.amazonaws.com +s3-object-lambda.eu-south-1.amazonaws.com +s3-website.eu-south-1.amazonaws.com +s3.dualstack.eu-south-2.amazonaws.com +s3-accesspoint.dualstack.eu-south-2.amazonaws.com +s3.eu-south-2.amazonaws.com +s3-accesspoint.eu-south-2.amazonaws.com +s3-object-lambda.eu-south-2.amazonaws.com +s3-website.eu-south-2.amazonaws.com s3.dualstack.eu-west-1.amazonaws.com +s3-accesspoint.dualstack.eu-west-1.amazonaws.com +s3-website.dualstack.eu-west-1.amazonaws.com +s3.eu-west-1.amazonaws.com +s3-accesspoint.eu-west-1.amazonaws.com +s3-deprecated.eu-west-1.amazonaws.com +s3-object-lambda.eu-west-1.amazonaws.com +s3-website.eu-west-1.amazonaws.com s3.dualstack.eu-west-2.amazonaws.com +s3-accesspoint.dualstack.eu-west-2.amazonaws.com s3.eu-west-2.amazonaws.com +s3-accesspoint.eu-west-2.amazonaws.com +s3-object-lambda.eu-west-2.amazonaws.com s3-website.eu-west-2.amazonaws.com s3.dualstack.eu-west-3.amazonaws.com +s3-accesspoint.dualstack.eu-west-3.amazonaws.com +s3-website.dualstack.eu-west-3.amazonaws.com s3.eu-west-3.amazonaws.com +s3-accesspoint.eu-west-3.amazonaws.com +s3-object-lambda.eu-west-3.amazonaws.com s3-website.eu-west-3.amazonaws.com +s3.dualstack.il-central-1.amazonaws.com +s3-accesspoint.dualstack.il-central-1.amazonaws.com +s3.il-central-1.amazonaws.com +s3-accesspoint.il-central-1.amazonaws.com +s3-object-lambda.il-central-1.amazonaws.com +s3-website.il-central-1.amazonaws.com +s3.dualstack.me-central-1.amazonaws.com +s3-accesspoint.dualstack.me-central-1.amazonaws.com +s3.me-central-1.amazonaws.com +s3-accesspoint.me-central-1.amazonaws.com +s3-object-lambda.me-central-1.amazonaws.com +s3-website.me-central-1.amazonaws.com +s3.dualstack.me-south-1.amazonaws.com +s3-accesspoint.dualstack.me-south-1.amazonaws.com +s3.me-south-1.amazonaws.com +s3-accesspoint.me-south-1.amazonaws.com +s3-object-lambda.me-south-1.amazonaws.com +s3-website.me-south-1.amazonaws.com s3.amazonaws.com +s3-1.amazonaws.com +s3-ap-east-1.amazonaws.com s3-ap-northeast-1.amazonaws.com s3-ap-northeast-2.amazonaws.com +s3-ap-northeast-3.amazonaws.com s3-ap-south-1.amazonaws.com s3-ap-southeast-1.amazonaws.com s3-ap-southeast-2.amazonaws.com s3-ca-central-1.amazonaws.com s3-eu-central-1.amazonaws.com +s3-eu-north-1.amazonaws.com s3-eu-west-1.amazonaws.com s3-eu-west-2.amazonaws.com s3-eu-west-3.amazonaws.com s3-external-1.amazonaws.com +s3-fips-us-gov-east-1.amazonaws.com s3-fips-us-gov-west-1.amazonaws.com +mrap.accesspoint.s3-global.amazonaws.com +s3-me-south-1.amazonaws.com s3-sa-east-1.amazonaws.com s3-us-east-2.amazonaws.com +s3-us-gov-east-1.amazonaws.com s3-us-gov-west-1.amazonaws.com s3-us-west-1.amazonaws.com s3-us-west-2.amazonaws.com @@ -10303,80 +11707,282 @@ s3-website-ap-southeast-2.amazonaws.com s3-website-eu-west-1.amazonaws.com s3-website-sa-east-1.amazonaws.com s3-website-us-east-1.amazonaws.com +s3-website-us-gov-west-1.amazonaws.com s3-website-us-west-1.amazonaws.com s3-website-us-west-2.amazonaws.com s3.dualstack.sa-east-1.amazonaws.com +s3-accesspoint.dualstack.sa-east-1.amazonaws.com +s3-website.dualstack.sa-east-1.amazonaws.com +s3.sa-east-1.amazonaws.com +s3-accesspoint.sa-east-1.amazonaws.com +s3-object-lambda.sa-east-1.amazonaws.com +s3-website.sa-east-1.amazonaws.com s3.dualstack.us-east-1.amazonaws.com +s3-accesspoint.dualstack.us-east-1.amazonaws.com +s3-accesspoint-fips.dualstack.us-east-1.amazonaws.com +s3-fips.dualstack.us-east-1.amazonaws.com +s3-website.dualstack.us-east-1.amazonaws.com +s3.us-east-1.amazonaws.com +s3-accesspoint.us-east-1.amazonaws.com +s3-accesspoint-fips.us-east-1.amazonaws.com +s3-deprecated.us-east-1.amazonaws.com +s3-fips.us-east-1.amazonaws.com +s3-object-lambda.us-east-1.amazonaws.com +s3-website.us-east-1.amazonaws.com s3.dualstack.us-east-2.amazonaws.com +s3-accesspoint.dualstack.us-east-2.amazonaws.com +s3-accesspoint-fips.dualstack.us-east-2.amazonaws.com +s3-fips.dualstack.us-east-2.amazonaws.com s3.us-east-2.amazonaws.com +s3-accesspoint.us-east-2.amazonaws.com +s3-accesspoint-fips.us-east-2.amazonaws.com +s3-deprecated.us-east-2.amazonaws.com +s3-fips.us-east-2.amazonaws.com +s3-object-lambda.us-east-2.amazonaws.com s3-website.us-east-2.amazonaws.com +s3.dualstack.us-gov-east-1.amazonaws.com +s3-accesspoint.dualstack.us-gov-east-1.amazonaws.com +s3-accesspoint-fips.dualstack.us-gov-east-1.amazonaws.com +s3-fips.dualstack.us-gov-east-1.amazonaws.com +s3.us-gov-east-1.amazonaws.com +s3-accesspoint.us-gov-east-1.amazonaws.com +s3-accesspoint-fips.us-gov-east-1.amazonaws.com +s3-fips.us-gov-east-1.amazonaws.com +s3-object-lambda.us-gov-east-1.amazonaws.com +s3-website.us-gov-east-1.amazonaws.com +s3.dualstack.us-gov-west-1.amazonaws.com +s3-accesspoint.dualstack.us-gov-west-1.amazonaws.com +s3-accesspoint-fips.dualstack.us-gov-west-1.amazonaws.com +s3-fips.dualstack.us-gov-west-1.amazonaws.com +s3.us-gov-west-1.amazonaws.com +s3-accesspoint.us-gov-west-1.amazonaws.com +s3-accesspoint-fips.us-gov-west-1.amazonaws.com +s3-fips.us-gov-west-1.amazonaws.com +s3-object-lambda.us-gov-west-1.amazonaws.com +s3-website.us-gov-west-1.amazonaws.com +s3.dualstack.us-west-1.amazonaws.com +s3-accesspoint.dualstack.us-west-1.amazonaws.com +s3-accesspoint-fips.dualstack.us-west-1.amazonaws.com +s3-fips.dualstack.us-west-1.amazonaws.com +s3-website.dualstack.us-west-1.amazonaws.com +s3.us-west-1.amazonaws.com +s3-accesspoint.us-west-1.amazonaws.com +s3-accesspoint-fips.us-west-1.amazonaws.com +s3-fips.us-west-1.amazonaws.com +s3-object-lambda.us-west-1.amazonaws.com +s3-website.us-west-1.amazonaws.com +s3.dualstack.us-west-2.amazonaws.com +s3-accesspoint.dualstack.us-west-2.amazonaws.com +s3-accesspoint-fips.dualstack.us-west-2.amazonaws.com +s3-fips.dualstack.us-west-2.amazonaws.com +s3-website.dualstack.us-west-2.amazonaws.com +s3.us-west-2.amazonaws.com +s3-accesspoint.us-west-2.amazonaws.com +s3-accesspoint-fips.us-west-2.amazonaws.com +s3-deprecated.us-west-2.amazonaws.com +s3-fips.us-west-2.amazonaws.com +s3-object-lambda.us-west-2.amazonaws.com +s3-website.us-west-2.amazonaws.com + +// Amazon SageMaker Notebook Instances +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: ce8ae0b1-0070-496d-be88-37c31837af9d +notebook.af-south-1.sagemaker.aws +notebook.ap-east-1.sagemaker.aws +notebook.ap-northeast-1.sagemaker.aws +notebook.ap-northeast-2.sagemaker.aws +notebook.ap-northeast-3.sagemaker.aws +notebook.ap-south-1.sagemaker.aws +notebook.ap-south-2.sagemaker.aws +notebook.ap-southeast-1.sagemaker.aws +notebook.ap-southeast-2.sagemaker.aws +notebook.ap-southeast-3.sagemaker.aws +notebook.ap-southeast-4.sagemaker.aws +notebook.ca-central-1.sagemaker.aws +notebook-fips.ca-central-1.sagemaker.aws +notebook.ca-west-1.sagemaker.aws +notebook-fips.ca-west-1.sagemaker.aws +notebook.eu-central-1.sagemaker.aws +notebook.eu-central-2.sagemaker.aws +notebook.eu-north-1.sagemaker.aws +notebook.eu-south-1.sagemaker.aws +notebook.eu-south-2.sagemaker.aws +notebook.eu-west-1.sagemaker.aws +notebook.eu-west-2.sagemaker.aws +notebook.eu-west-3.sagemaker.aws +notebook.il-central-1.sagemaker.aws +notebook.me-central-1.sagemaker.aws +notebook.me-south-1.sagemaker.aws +notebook.sa-east-1.sagemaker.aws +notebook.us-east-1.sagemaker.aws +notebook-fips.us-east-1.sagemaker.aws +notebook.us-east-2.sagemaker.aws +notebook-fips.us-east-2.sagemaker.aws +notebook.us-gov-east-1.sagemaker.aws +notebook-fips.us-gov-east-1.sagemaker.aws +notebook.us-gov-west-1.sagemaker.aws +notebook-fips.us-gov-west-1.sagemaker.aws +notebook.us-west-1.sagemaker.aws +notebook.us-west-2.sagemaker.aws +notebook-fips.us-west-2.sagemaker.aws +notebook.cn-north-1.sagemaker.com.cn +notebook.cn-northwest-1.sagemaker.com.cn + +// Amazon SageMaker Studio +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 057ee397-6bf8-4f20-b807-d7bc145ac980 +studio.af-south-1.sagemaker.aws +studio.ap-east-1.sagemaker.aws +studio.ap-northeast-1.sagemaker.aws +studio.ap-northeast-2.sagemaker.aws +studio.ap-northeast-3.sagemaker.aws +studio.ap-south-1.sagemaker.aws +studio.ap-southeast-1.sagemaker.aws +studio.ap-southeast-2.sagemaker.aws +studio.ap-southeast-3.sagemaker.aws +studio.ca-central-1.sagemaker.aws +studio.eu-central-1.sagemaker.aws +studio.eu-north-1.sagemaker.aws +studio.eu-south-1.sagemaker.aws +studio.eu-west-1.sagemaker.aws +studio.eu-west-2.sagemaker.aws +studio.eu-west-3.sagemaker.aws +studio.il-central-1.sagemaker.aws +studio.me-central-1.sagemaker.aws +studio.me-south-1.sagemaker.aws +studio.sa-east-1.sagemaker.aws +studio.us-east-1.sagemaker.aws +studio.us-east-2.sagemaker.aws +studio.us-gov-east-1.sagemaker.aws +studio-fips.us-gov-east-1.sagemaker.aws +studio.us-gov-west-1.sagemaker.aws +studio-fips.us-gov-west-1.sagemaker.aws +studio.us-west-1.sagemaker.aws +studio.us-west-2.sagemaker.aws +studio.cn-north-1.sagemaker.com.cn +studio.cn-northwest-1.sagemaker.com.cn + +// Analytics on AWS +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 955f9f40-a495-4e73-ae85-67b77ac9cadd +analytics-gateway.ap-northeast-1.amazonaws.com +analytics-gateway.ap-northeast-2.amazonaws.com +analytics-gateway.ap-south-1.amazonaws.com +analytics-gateway.ap-southeast-1.amazonaws.com +analytics-gateway.ap-southeast-2.amazonaws.com +analytics-gateway.eu-central-1.amazonaws.com +analytics-gateway.eu-west-1.amazonaws.com +analytics-gateway.us-east-1.amazonaws.com +analytics-gateway.us-east-2.amazonaws.com +analytics-gateway.us-west-2.amazonaws.com + +// AWS Amplify +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 5ecce854-c033-4fc4-a755-1a9916d9a9bb +*.amplifyapp.com + +// AWS App Runner +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 6828c008-ba5d-442f-ade5-48da4e7c2316 +*.awsapprunner.com // AWS Cloud9 // Submitted by: AWS Security <psl-maintainers@amazon.com> -// Reference: 2b6dfa9a-3a7f-4367-b2e7-0321e77c0d59 +// Reference: 30717f72-4007-4f0f-8ed4-864c6f2efec9 +webview-assets.aws-cloud9.af-south-1.amazonaws.com vfs.cloud9.af-south-1.amazonaws.com webview-assets.cloud9.af-south-1.amazonaws.com +webview-assets.aws-cloud9.ap-east-1.amazonaws.com vfs.cloud9.ap-east-1.amazonaws.com webview-assets.cloud9.ap-east-1.amazonaws.com +webview-assets.aws-cloud9.ap-northeast-1.amazonaws.com vfs.cloud9.ap-northeast-1.amazonaws.com webview-assets.cloud9.ap-northeast-1.amazonaws.com +webview-assets.aws-cloud9.ap-northeast-2.amazonaws.com vfs.cloud9.ap-northeast-2.amazonaws.com webview-assets.cloud9.ap-northeast-2.amazonaws.com +webview-assets.aws-cloud9.ap-northeast-3.amazonaws.com vfs.cloud9.ap-northeast-3.amazonaws.com webview-assets.cloud9.ap-northeast-3.amazonaws.com +webview-assets.aws-cloud9.ap-south-1.amazonaws.com vfs.cloud9.ap-south-1.amazonaws.com webview-assets.cloud9.ap-south-1.amazonaws.com +webview-assets.aws-cloud9.ap-southeast-1.amazonaws.com vfs.cloud9.ap-southeast-1.amazonaws.com webview-assets.cloud9.ap-southeast-1.amazonaws.com +webview-assets.aws-cloud9.ap-southeast-2.amazonaws.com vfs.cloud9.ap-southeast-2.amazonaws.com webview-assets.cloud9.ap-southeast-2.amazonaws.com +webview-assets.aws-cloud9.ca-central-1.amazonaws.com vfs.cloud9.ca-central-1.amazonaws.com webview-assets.cloud9.ca-central-1.amazonaws.com +webview-assets.aws-cloud9.eu-central-1.amazonaws.com vfs.cloud9.eu-central-1.amazonaws.com webview-assets.cloud9.eu-central-1.amazonaws.com +webview-assets.aws-cloud9.eu-north-1.amazonaws.com vfs.cloud9.eu-north-1.amazonaws.com webview-assets.cloud9.eu-north-1.amazonaws.com +webview-assets.aws-cloud9.eu-south-1.amazonaws.com vfs.cloud9.eu-south-1.amazonaws.com webview-assets.cloud9.eu-south-1.amazonaws.com +webview-assets.aws-cloud9.eu-west-1.amazonaws.com vfs.cloud9.eu-west-1.amazonaws.com webview-assets.cloud9.eu-west-1.amazonaws.com +webview-assets.aws-cloud9.eu-west-2.amazonaws.com vfs.cloud9.eu-west-2.amazonaws.com webview-assets.cloud9.eu-west-2.amazonaws.com +webview-assets.aws-cloud9.eu-west-3.amazonaws.com vfs.cloud9.eu-west-3.amazonaws.com webview-assets.cloud9.eu-west-3.amazonaws.com +webview-assets.aws-cloud9.il-central-1.amazonaws.com +vfs.cloud9.il-central-1.amazonaws.com +webview-assets.aws-cloud9.me-south-1.amazonaws.com vfs.cloud9.me-south-1.amazonaws.com webview-assets.cloud9.me-south-1.amazonaws.com +webview-assets.aws-cloud9.sa-east-1.amazonaws.com vfs.cloud9.sa-east-1.amazonaws.com webview-assets.cloud9.sa-east-1.amazonaws.com +webview-assets.aws-cloud9.us-east-1.amazonaws.com vfs.cloud9.us-east-1.amazonaws.com webview-assets.cloud9.us-east-1.amazonaws.com +webview-assets.aws-cloud9.us-east-2.amazonaws.com vfs.cloud9.us-east-2.amazonaws.com webview-assets.cloud9.us-east-2.amazonaws.com +webview-assets.aws-cloud9.us-west-1.amazonaws.com vfs.cloud9.us-west-1.amazonaws.com webview-assets.cloud9.us-west-1.amazonaws.com +webview-assets.aws-cloud9.us-west-2.amazonaws.com vfs.cloud9.us-west-2.amazonaws.com webview-assets.cloud9.us-west-2.amazonaws.com // AWS Elastic Beanstalk -// Submitted by Luke Wells <psl-maintainers@amazon.com> -// Reference: aa202394-43a0-4857-b245-8db04549137e +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: bb5a965c-dec3-4967-aa22-e306ad064797 cn-north-1.eb.amazonaws.com.cn cn-northwest-1.eb.amazonaws.com.cn elasticbeanstalk.com +af-south-1.elasticbeanstalk.com +ap-east-1.elasticbeanstalk.com ap-northeast-1.elasticbeanstalk.com ap-northeast-2.elasticbeanstalk.com ap-northeast-3.elasticbeanstalk.com ap-south-1.elasticbeanstalk.com ap-southeast-1.elasticbeanstalk.com ap-southeast-2.elasticbeanstalk.com +ap-southeast-3.elasticbeanstalk.com ca-central-1.elasticbeanstalk.com eu-central-1.elasticbeanstalk.com +eu-north-1.elasticbeanstalk.com +eu-south-1.elasticbeanstalk.com eu-west-1.elasticbeanstalk.com eu-west-2.elasticbeanstalk.com eu-west-3.elasticbeanstalk.com +il-central-1.elasticbeanstalk.com +me-south-1.elasticbeanstalk.com sa-east-1.elasticbeanstalk.com us-east-1.elasticbeanstalk.com us-east-2.elasticbeanstalk.com +us-gov-east-1.elasticbeanstalk.com us-gov-west-1.elasticbeanstalk.com us-west-1.elasticbeanstalk.com us-west-2.elasticbeanstalk.com @@ -10392,6 +11998,11 @@ us-west-2.elasticbeanstalk.com // Reference: d916759d-a08b-4241-b536-4db887383a6a awsglobalaccelerator.com +// AWS re:Post Private +// Submitted by AWS Security <psl-maintainers@amazon.com> +// Reference: 83385945-225f-416e-9aa0-ad0632bfdcee +*.private.repost.aws + // eero // Submitted by Yue Kang <eero-dynamic-dns@amazon.com> // Reference: 264afe70-f62c-4c02-8ab9-b5281ed24461 @@ -10409,6 +12020,10 @@ tele.amune.org // Submitted by Apigee Security Team <security@apigee.com> apigee.io +// Apis Networks: https://apisnetworks.com +// Submitted by Matt Saladna <matt@apisnetworks.com> +panel.dev + // Apphud : https://apphud.com // Submitted by Alexander Selivanov <alex@apphud.com> siiites.com @@ -10426,6 +12041,10 @@ appudo.net // Submitted by Thomas Orozco <thomas@aptible.com> on-aptible.com +// Aquapal : https://aquapal.net/ +// Submitted by Aki Ueno <admin@aquapal.net> +f5.si + // ASEINet : https://www.aseinet.com/ // Submitted by Asei SEKIGUCHI <mail@aseinet.com> user.aseinet.ne.jp @@ -10520,6 +12139,10 @@ beagleboard.io // Submitted by Lev Nekrasov <lnekrasov@beget.com> *.beget.app +// Besties : https://besties.house +// Submitted by Hazel Cora <hazy@besties.house> +pages.gay + // BetaInABox // Submitted by Adrian <adrian@betainabox.com> betainabox.com @@ -10565,6 +12188,10 @@ square7.de bplaced.net square7.net +// Brave : https://brave.com +// Submitted by Andrea Brancaleoni <abrancaleoni@brave.com> +*.s.brave.io + // Brendly : https://brendly.rs // Submitted by Dusan Radovanovic <dusan.radovanovic@brendly.rs> shop.brendly.rs @@ -10590,7 +12217,9 @@ mycd.eu // Canva Pty Ltd : https://canva.com/ // Submitted by Joel Aquilina <publicsuffixlist@canva.com> canva-apps.cn +*.my.canvasite.cn canva-apps.com +*.my.canva.site // Carrd : https://carrd.co // Submitted by AJ <aj@carrd.co> @@ -10782,6 +12411,10 @@ co.no webhosting.be hosting-cluster.nl +// Convex : https://convex.dev/ +// Submitted by James Cowling <security@convex.dev> +convex.site + // Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ // Submitted by George Georgievsky <gug@cctld.ru> ac.ru @@ -10803,10 +12436,18 @@ feste-ip.net knx-server.net static-access.net +// cPanel L.L.C. : https://www.cpanel.net/ +// Submitted by Dustin Scherer <public.suffix@cpanel.net> +*.cprapid.com + // Craynic, s.r.o. : http://www.craynic.com/ // Submitted by Ales Krajnik <ales.krajnik@craynic.com> realm.cz +// Crisp IM SAS : https://crisp.chat/ +// Submitted by Baptiste Jamin <hostmaster@crisp.chat> +on.crisp.email + // Cryptonomic : https://cryptonomic.net/ // Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> *.cryptonomic.net @@ -10827,6 +12468,13 @@ curv.dev *.ocp.customer-oci.com *.ocs.customer-oci.com +// Cyclic Software : https://www.cyclic.sh +// Submitted by Kam Lasater <dns-admin@cyclic.sh> +cyclic.app +cyclic.cloud +cyclic-app.com +cyclic.co.in + // cyon GmbH : https://www.cyon.ch/ // Submitted by Dominic Luechinger <dol@cyon.ch> cyon.link @@ -11307,6 +12955,10 @@ e4.cz easypanel.app easypanel.host +// EasyWP : https://www.easywp.com +// Submitted by <infracloudteam@namecheap.com> +*.ewp.live + // Elementor : Elementor Ltd. // Submitted by Anton Barkan <antonb@elementor.com> elementor.cloud @@ -11421,10 +13073,6 @@ url.tw // Submitted by Eric Jiang <eric@fabrica.dev> onfabrica.com -// Facebook, Inc. -// Submitted by Peter Ruibal <public-suffix@fb.com> -apps.fbsbx.com - // FAITID : https://faitid.org/ // Submitted by Maxim Alzoba <tech.contact@faitid.org> // https://www.flexireg.net/stat_info @@ -11582,6 +13230,10 @@ flap.id onflashdrive.app fldrv.com +// FlutterFlow : https://flutterflow.io +// Submitted by Anton Emelyanov <anton@flutterflow.io> +flutterflow.app + // fly.io: https://fly.io // Submitted by Kurt Mackey <kurt@fly.io> fly.dev @@ -11592,7 +13244,7 @@ shw.io // Submitted by Jonathan Rudenberg <jonathan@flynn.io> flynnhosting.net -// Forgerock : https://www.forgerock.com +// Forgerock : https://www.forgerock.com // Submitted by Roderick Parr <roderick.parr@forgerock.com> forgeblocks.com id.forgerock.io @@ -11639,7 +13291,7 @@ freemyip.com // Submitted by Daniel A. Maierhofer <vorstand@funkfeuer.at> wien.funkfeuer.at -// Futureweb OG : http://www.futureweb.at +// Futureweb GmbH : https://www.futureweb.at // Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> *.futurecms.at *.ex.futurecms.at @@ -11650,6 +13302,10 @@ futuremailing.at *.kunden.ortsinfo.at *.statics.cloud +// GCom Internet : https://www.gcom.net.au +// Submitted by Leo Julius <support@gcom.net.au> +aliases121.com + // GDS : https://www.gov.uk/service-manual/technology/managing-domain-names // Submitted by Stephen Ford <hostmaster@digital.cabinet-office.gov.uk> independent-commission.uk @@ -11833,10 +13489,6 @@ london.cloudapps.digital // Submitted by Richard Baker <richard.baker@digital.cabinet-office.gov.uk> pymnt.uk -// UKHomeOffice : https://www.gov.uk/government/organisations/home-office -// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> -homeoffice.gov.uk - // GlobeHosting, Inc. // Submitted by Zoltan Egresi <egresi@globehosting.com> ro.im @@ -11847,8 +13499,7 @@ goip.de // Google, Inc. // Submitted by Eduardo Vela <evn@google.com> -run.app -a.run.app +*.run.app web.app *.0emm.com appspot.com @@ -12003,6 +13654,12 @@ ravendb.run // Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu> homesklep.pl +// Homebase : https://homebase.id/ +// Submitted by Jason Babo <info@homebase.id> +*.kin.one +*.id.pub +*.kin.pub + // Hong Kong Productivity Council: https://www.hkpc.org/ // Submitted by SECaaS Team <summchan@hkpc.org> secaas.hk @@ -12146,7 +13803,6 @@ iobb.net // Submitted by Ihor Kolodyuk <ik@jelastic.com> mel.cloudlets.com.au cloud.interhostsolutions.be -users.scale.virtualcloud.com.br mycloud.by alp1.ae.flow.ch appengine.flow.ch @@ -12170,9 +13826,7 @@ ch.trendhosting.cloud de.trendhosting.cloud jele.club amscompute.com -clicketcloud.com dopaas.com -hidora.com paas.hosted-by-previder.com rag-cloud.hosteur.com rag-cloud-ch.hosteur.com @@ -12459,6 +14113,11 @@ memset.net // Submitted by Ruben Schmidmeister <psl-maintainers@messerli.ch> messerli.app +// Meta Platforms, Inc. : https://meta.com/ +// Submitted by Jacob Cordero <public-suffix@meta.com> +atmeta.com +apps.fbsbx.com + // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ // Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz> *.cloud.metacentrum.cz @@ -12479,19 +14138,32 @@ co.pl // Microsoft Corporation : http://microsoft.com // Submitted by Public Suffix List Admin <msftpsladmin@microsoft.com> +// Managed by Corporate Domains +// Microsoft Azure : https://home.azure *.azurecontainer.io +cloudapp.azure.com +azure-api.net +azureedge.net +azurefd.net azurewebsites.net azure-mobile.net -cloudapp.net azurestaticapps.net 1.azurestaticapps.net 2.azurestaticapps.net 3.azurestaticapps.net +4.azurestaticapps.net +5.azurestaticapps.net +6.azurestaticapps.net +7.azurestaticapps.net centralus.azurestaticapps.net eastasia.azurestaticapps.net eastus2.azurestaticapps.net westeurope.azurestaticapps.net westus2.azurestaticapps.net +cloudapp.net +trafficmanager.net +blob.core.windows.net +servicebus.windows.net // minion.systems : http://minion.systems // Submitted by Robert Böttinger <r@minion.systems> @@ -12505,6 +14177,10 @@ mintere.site // Submitted by Grayson Martin <grayson.martin@mobileeducation.us> forte.id +// MODX Systems LLC : https://modx.com +// Submitted by Elizabeth Southwell <elizabeth@modx.com> +modx.dev + // Mozilla Corporation : https://mozilla.com // Submitted by Ben Francis <bfrancis@mozilla.com> mozilla-iot.org @@ -12566,6 +14242,10 @@ jp.ngrok.io sa.ngrok.io us.ngrok.io ngrok.pizza +ngrok.pro + +// Nicolaus Copernicus University in Torun - MSK TORMAN (https://www.man.torun.pl) +torun.pl // Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ // Submitted by Nicholas Ford <nick@nimbushosting.co.uk> @@ -12878,7 +14558,8 @@ on-web.fr // Platform.sh : https://platform.sh // Submitted by Nikola Kotur <nikola@platform.sh> -bc.platform.sh +*.upsun.app +upsunapp.com ent.platform.sh eu.platform.sh us.platform.sh @@ -12897,6 +14578,10 @@ pdns.page plesk.page pleskns.com +// Pley AB : https://www.pley.com/ +// Submitted by Henning Pohl <infra@pley.com> +pley.games + // Port53 : https://port53.io/ // Submitted by Maximilian Schieder <maxi@zeug.co> dyn53.io @@ -12973,6 +14658,8 @@ qbuser.com // Rad Web Hosting: https://radwebhosting.com // Submitted by Scott Claeys <s.claeys@radwebhosting.com> cloudsite.builders +myradweb.net +servername.us // Redgate Software: https://red-gate.com // Submitted by Andrew Farries <andrew.farries@red-gate.com> @@ -13039,11 +14726,40 @@ app.render.com onrender.com // Repl.it : https://repl.it -// Submitted by Lincoln Bergeson <lincoln@replit.com> +// Submitted by Lincoln Bergeson <psl@repl.it> +replit.app +id.replit.app firewalledreplit.co id.firewalledreplit.co repl.co id.repl.co +replit.dev +archer.replit.dev +bones.replit.dev +canary.replit.dev +global.replit.dev +hacker.replit.dev +id.replit.dev +janeway.replit.dev +kim.replit.dev +kira.replit.dev +kirk.replit.dev +odo.replit.dev +paris.replit.dev +picard.replit.dev +pike.replit.dev +prerelease.replit.dev +reed.replit.dev +riker.replit.dev +sisko.replit.dev +spock.replit.dev +staging.replit.dev +sulu.replit.dev +tarpit.replit.dev +teams.replit.dev +tucker.replit.dev +wesley.replit.dev +worf.replit.dev repl.run // Resin.io : https://resin.io @@ -13140,10 +14856,11 @@ from.tv sakura.tv // Salesforce.com, Inc. https://salesforce.com/ -// Submitted by Michael Biven <mbiven@salesforce.com> +// Submitted by Michael Biven <mbiven@salesforce.com> and Aaron Romeo <aaron.romeo@salesforce.com> *.builder.code.com *.dev-builder.code.com *.stg-builder.code.com +*.001.test.code-builder-stg.platform.salesforce.com // Sandstorm Development Group, Inc. : https://sandcats.io/ // Submitted by Asheesh Laroia <asheesh@sandstorm.io> @@ -13159,6 +14876,7 @@ logoip.com fr-par-1.baremetal.scw.cloud fr-par-2.baremetal.scw.cloud nl-ams-1.baremetal.scw.cloud +cockpit.fr-par.scw.cloud fnc.fr-par.scw.cloud functions.fnc.fr-par.scw.cloud k8s.fr-par.scw.cloud @@ -13169,11 +14887,13 @@ whm.fr-par.scw.cloud priv.instances.scw.cloud pub.instances.scw.cloud k8s.scw.cloud +cockpit.nl-ams.scw.cloud k8s.nl-ams.scw.cloud nodes.k8s.nl-ams.scw.cloud s3.nl-ams.scw.cloud s3-website.nl-ams.scw.cloud whm.nl-ams.scw.cloud +cockpit.pl-waw.scw.cloud k8s.pl-waw.scw.cloud nodes.k8s.pl-waw.scw.cloud s3.pl-waw.scw.cloud @@ -13281,6 +15001,20 @@ bounty-full.com alpha.bounty-full.com beta.bounty-full.com +// Smallregistry by Promopixel SARL: https://www.smallregistry.net +// Former AFNIC's SLDs +// Submitted by Jérôme Lipowicz <support@promopixel.com> +aeroport.fr +avocat.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + // Small Technology Foundation : https://small-tech.org // Submitted by Aral Balkan <aral@small-tech.org> small-web.org @@ -13308,6 +15042,14 @@ srht.site // Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io> stackhero-network.com +// STACKIT : https://www.stackit.de/en/ +// Submitted by STACKIT-DNS Team (Simon Stier) <stackit-dns@mail.schwarz> +runs.onstackit.cloud +stackit.gg +stackit.rocks +stackit.run +stackit.zone + // Staclar : https://staclar.com // Submitted by Q Misell <q@staclar.com> musician.io @@ -13374,10 +15116,33 @@ myspreadshop.co.uk // Submitted by Jacob Lee <jacob@stdlib.com> api.stdlib.com +// stereosense GmbH : https://www.involve.me +// Submitted by Florian Burmann <publicsuffix@involve.me> +feedback.ac +forms.ac +assessments.cx +calculators.cx +funnels.cx +paynow.cx +quizzes.cx +researched.cx +tests.cx +surveys.so + +// Storipress : https://storipress.com +// Submitted by Benno Liu <benno@storipress.com> +storipress.app + // Storj Labs Inc. : https://storj.io/ // Submitted by Philip Hutchins <hostmaster@storj.io> storj.farm +// Streak : https://streak.com +// Submitted by Blake Kadatz <eng@streak.com> +streak-link.com +streaklinks.com +streakusercontent.com + // Studenten Net Twente : http://www.snt.utwente.nl/ // Submitted by Silke Hofstra <syscom@snt.utwente.nl> utwente.io @@ -13440,6 +15205,7 @@ taifun-dns.de // Submitted by David Anderson <danderson@tailscale.com> beta.tailscale.net ts.net +*.c.ts.net // TASK geographical domains (www.task.gda.pl/uslugi/dns) gda.pl @@ -13642,7 +15408,6 @@ de.gt to.gt be.gy cc.hn -blog.kg io.kg jp.kg tv.kg @@ -13676,6 +15441,11 @@ v.ua // Submitted by Masayuki Note <masa@blade.wafflecell.com> wafflecell.com +// Webflow, Inc. : https://www.webflow.com +// Submitted by Webflow Security Team <security@webflow.com> +webflow.io +webflowtest.io + // WebHare bv: https://www.webhare.com/ // Submitted by Arnold Hendriks <info@webhare.com> *.webhare.dev @@ -13741,6 +15511,8 @@ js.wpenginepowered.com // Submitted by Shahar Talmi <shahar@wix.com> wixsite.com editorx.io +wixstudio.io +wix.run // XenonCloud GbR: https://xenoncloud.net // Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net> @@ -13793,6 +15565,10 @@ noho.st za.net za.org +// ZAP-Hosting GmbH & Co. KG : https://zap-hosting.com +// Submitted by Julian Alker <security@zap-hosting.com> +zap.cloud + // Zine EOOD : https://zine.bg/ // Submitted by Martin Angelov <martin@zine.bg> bss.design diff --git a/ansible_collections/community/dns/tests/ee/roles/wait_for_txt/tasks/main.yml b/ansible_collections/community/dns/tests/ee/roles/wait_for_txt/tasks/main.yml index 43941d042..7c7de6b70 100644 --- a/ansible_collections/community/dns/tests/ee/roles/wait_for_txt/tasks/main.yml +++ b/ansible_collections/community/dns/tests/ee/roles/wait_for_txt/tasks/main.yml @@ -3,16 +3,12 @@ # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later -- name: Get TXT records for github.com - shell: | - dig -t TXT github.com +short | sed -e 's/" "//g' -e 's/"//g' - register: dig - - name: Wait for existing TXT entry community.dns.wait_for_txt: records: - name: github.com - values: "{{ dig.stdout_lines }}" + values: | + {{ query('community.dns.lookup_as_dict', 'github.com', type='TXT') | map(attribute='value') | list }} - name: github.io values: [] query_timeout: 20 diff --git a/ansible_collections/community/dns/tests/integration/replace-requirements.sh b/ansible_collections/community/dns/tests/integration/replace-requirements.sh new file mode 100755 index 000000000..c3a52f5d1 --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/replace-requirements.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +DIRECTORY="$(dirname "$0")" + +if [ -e "${DIRECTORY}/$1" ]; then + cp "${DIRECTORY}/$1" "${DIRECTORY}/requirements.txt" +fi diff --git a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/runme.yml b/ansible_collections/community/dns/tests/integration/requirements-stable-2.10.txt index bcecb88e9..af90be668 100644 --- a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/runme.yml +++ b/ansible_collections/community/dns/tests/integration/requirements-stable-2.10.txt @@ -1,8 +1,7 @@ ---- # Copyright (c) Ansible Project # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later -- hosts: localhost - roles: - - { role: wait_for_txt } +ipaddress ; python_version < '3.3' + +dnspython < 2.4.0 diff --git a/ansible_collections/community/dns/tests/integration/requirements-stable-2.9.txt b/ansible_collections/community/dns/tests/integration/requirements-stable-2.9.txt new file mode 100644 index 000000000..af90be668 --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/requirements-stable-2.9.txt @@ -0,0 +1,7 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +ipaddress ; python_version < '3.3' + +dnspython < 2.4.0 diff --git a/ansible_collections/community/dns/tests/integration/requirements.txt b/ansible_collections/community/dns/tests/integration/requirements.txt new file mode 100644 index 000000000..5e4bca63f --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/requirements.txt @@ -0,0 +1,7 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +ipaddress ; python_version < '3.3' + +dnspython diff --git a/ansible_collections/community/dns/tests/integration/targets/lookup_lookup/aliases b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup/aliases new file mode 100644 index 000000000..abc0d5476 --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup/aliases @@ -0,0 +1,5 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +shippable/posix/group1 diff --git a/ansible_collections/community/dns/tests/integration/targets/lookup_lookup/tasks/main.yml b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup/tasks/main.yml new file mode 100644 index 000000000..52ba9a46c --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup/tasks/main.yml @@ -0,0 +1,26 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Look up some records + ansible.builtin.set_fact: + ansible_a: >- + {{ query('community.dns.lookup', 'ansible.com', type='A') }} + ansible_aaaa: >- + {{ query('community.dns.lookup', 'ansible.com', type='AAAA', server='9.9.9.9') }} + ansible_txt: >- + {{ query('community.dns.lookup', 'ansible.com', type='TXT', server=['1.1.1.1', '8.8.8.8', 'dns9.quad9.net.']) }} + ansible_empty: >- + {{ query('community.dns.lookup', 'does-not-exist.ansible.com') }} + +- name: Check results + assert: + that: + - ansible_a | length > 0 + - ansible_a[0] is regex("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$") + - ansible_aaaa | length > 0 + - ansible_aaaa[0] is regex("^[0-9a-fA-F:]+$") + - ansible_txt | length > 0 + - ansible_txt[0] is string + - ansible_empty | length == 0 diff --git a/ansible_collections/community/dns/tests/integration/targets/lookup_lookup_as_dict/aliases b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup_as_dict/aliases new file mode 100644 index 000000000..abc0d5476 --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup_as_dict/aliases @@ -0,0 +1,5 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +shippable/posix/group1 diff --git a/ansible_collections/community/dns/tests/integration/targets/lookup_lookup_as_dict/tasks/main.yml b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup_as_dict/tasks/main.yml new file mode 100644 index 000000000..3ba6f52f0 --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/targets/lookup_lookup_as_dict/tasks/main.yml @@ -0,0 +1,31 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Look up some records + ansible.builtin.set_fact: + ansible_a: >- + {{ query('community.dns.lookup_as_dict', 'ansible.com', type='A') }} + ansible_aaaa: >- + {{ query('community.dns.lookup_as_dict', 'ansible.com', type='AAAA', server='9.9.9.9') }} + ansible_txt: >- + {{ query('community.dns.lookup_as_dict', 'ansible.com', type='TXT', server=['1.1.1.1', '8.8.8.8', 'dns9.quad9.net.']) }} + ansible_empty: >- + {{ query('community.dns.lookup_as_dict', 'does-not-exist.ansible.com') }} + +- name: Check results + assert: + that: + - ansible_a | length > 0 + - ansible_a[0].address is string + - ansible_a[0].address is regex("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$") + - ansible_aaaa | length > 0 + - ansible_aaaa[0].address is string + - ansible_aaaa[0].address is regex("^[0-9a-fA-F:]+$") + - ansible_txt | length > 0 + - ansible_txt[0].strings is sequence + - ansible_txt[0].strings[0] is string + - ansible_txt[0].value is string + - ansible_txt | map(attribute='strings') | map('join') | list == ansible_txt | map(attribute='value') | list + - ansible_empty | length == 0 diff --git a/ansible_collections/community/dns/tests/integration/targets/nameserver_info/tasks/main.yml b/ansible_collections/community/dns/tests/integration/targets/nameserver_info/tasks/main.yml new file mode 100644 index 000000000..0b074df5a --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/targets/nameserver_info/tasks/main.yml @@ -0,0 +1,78 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Retrieve name servers of two DNS names + community.dns.nameserver_info: + name: + - www.example.com + - example.org + register: result + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result }}' + +- name: Show nameservers for www.example.com + ansible.builtin.debug: + msg: '{{ result.results[0].nameservers }}' + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result.results[0].nameservers[0] }}' + +- name: Validate results + assert: + that: + - result.results[0].nameservers[0] == 'a.iana-servers.net.' + - result.results[0].nameservers[1] == 'b.iana-servers.net.' + - result.results[0].nameservers[0] != 'b.iana-servers.net.' + +- name: Retrieve name servers of two DNS names using custom DNS servers + community.dns.nameserver_info: + name: + - www.example.com + - example.org + server: + # Quad9 servers (https://en.wikipedia.org/wiki/Quad9#Service) + - 9.9.9.9 + - 149.112.112.112 + - 2620:fe::9 + - 2620:fe::fe + register: result + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result }}' + +- name: Show nameservers for www.example.com + ansible.builtin.debug: + msg: '{{ result.results[0].nameservers }}' + +- name: Show TXT values for www.example.com for first nameserver + ansible.builtin.debug: + msg: '{{ result.results[0].nameservers[0] }}' + +- name: Validate results + assert: + that: + - result.results[0].nameservers[0] == 'a.iana-servers.net.' + - result.results[0].nameservers[1] == 'b.iana-servers.net.' + - result.results[0].nameservers[0] != 'b.iana-servers.net.' + +- name: Retrieve name servers of a DNS name that do not exist + community.dns.nameserver_info: + name: + - foo.bar.example.com + register: result + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result }}' + +- name: Validate results + assert: + that: + - result.results[0].nameservers[0] == 'a.iana-servers.net.' + - result.results[0].nameservers[1] == 'b.iana-servers.net.' diff --git a/ansible_collections/community/dns/tests/integration/targets/nameserver_record_info/tasks/main.yml b/ansible_collections/community/dns/tests/integration/targets/nameserver_record_info/tasks/main.yml new file mode 100644 index 000000000..b03b641fe --- /dev/null +++ b/ansible_collections/community/dns/tests/integration/targets/nameserver_record_info/tasks/main.yml @@ -0,0 +1,56 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Retrieve TXT values from all nameservers for two DNS names + community.dns.nameserver_record_info: + name: + - www.example.com + - example.org + type: TXT + register: result + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result }}' + +- name: Show TXT values for www.example.com for first nameserver + ansible.builtin.debug: + msg: '{{ result.results[0].result[0].nameserver }}' + +- name: Validate results + assert: + that: + - result.results[0].result[0].nameserver == 'a.iana-servers.net.' + - result.results[0].result[1].nameserver == 'b.iana-servers.net.' + - result.results[0].result[0].nameserver != 'b.iana-servers.net.' + +- name: Retrieve TXT values from all nameservers for two DNS names using custom DNS servers + community.dns.nameserver_record_info: + name: + - www.example.com + - example.org + type: TXT + server: + # Quad9 servers (https://en.wikipedia.org/wiki/Quad9#Service) + - 9.9.9.9 + - 149.112.112.112 + - 2620:fe::9 + - 2620:fe::fe + register: result + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result }}' + +- name: Show TXT values for www.example.com for all nameservers + ansible.builtin.debug: + msg: '{{ result.results[0].result[0].nameserver }}' + +- name: Validate results + assert: + that: + - result.results[0].result[0].nameserver == 'a.iana-servers.net.' + - result.results[0].result[1].nameserver == 'b.iana-servers.net.' + - result.results[0].result[0].nameserver != 'b.iana-servers.net.' diff --git a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/aliases b/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/aliases index 34334fd82..abc0d5476 100644 --- a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/aliases +++ b/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/aliases @@ -3,4 +3,3 @@ # SPDX-License-Identifier: GPL-3.0-or-later shippable/posix/group1 -destructive diff --git a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/runme.sh b/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/runme.sh deleted file mode 100755 index 9265e7ee1..000000000 --- a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/runme.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later - -set -eux - -export ANSIBLE_TEST_PREFER_VENV=1 # see https://github.com/ansible/ansible/pull/73000#issuecomment-757012395; can be removed once Ansible 2.9 and ansible-base 2.10 support has been dropped -source virtualenv.sh - -# Requirements have to be installed prior to running ansible-playbook -# because plugins and requirements are loaded before the task runs - -pip install dnspython - -ANSIBLE_ROLES_PATH=../ ansible-playbook runme.yml "$@" diff --git a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/tasks/main.yml b/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/tasks/main.yml index fce443423..b706cfcae 100644 --- a/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/tasks/main.yml +++ b/ansible_collections/community/dns/tests/integration/targets/wait_for_txt/tasks/main.yml @@ -8,7 +8,7 @@ records: - name: github.com values: | - {{ query('community.general.dig', 'github.com', 'qtype=TXT') | map('regex_replace', '" "', '') | list }} + {{ query('community.dns.lookup_as_dict', 'github.com', type='TXT') | map(attribute='value') | list }} - name: github.io values: [] query_timeout: 20 diff --git a/ansible_collections/community/dns/tests/sanity/extra/extra-docs.py b/ansible_collections/community/dns/tests/sanity/extra/extra-docs.py index c636beb08..251e6d70f 100755 --- a/ansible_collections/community/dns/tests/sanity/extra/extra-docs.py +++ b/ansible_collections/community/dns/tests/sanity/extra/extra-docs.py @@ -17,7 +17,7 @@ def main(): suffix = ':{env}'.format(env=env["ANSIBLE_COLLECTIONS_PATH"]) if 'ANSIBLE_COLLECTIONS_PATH' in env else '' env['ANSIBLE_COLLECTIONS_PATH'] = '{root}{suffix}'.format(root=os.path.dirname(os.path.dirname(os.path.dirname(os.getcwd()))), suffix=suffix) p = subprocess.run( - ['antsibull-docs', 'lint-collection-docs', '--plugin-docs', '--disallow-semantic-markup', '--skip-rstcheck', '.'], + ['antsibull-docs', 'lint-collection-docs', '--plugin-docs', '--skip-rstcheck', '.'], env=env, check=False, ) diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.10.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.10.txt index dc9da1161..14ec3bedc 100644 --- a/ansible_collections/community/dns/tests/sanity/ignore-2.10.txt +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.10.txt @@ -1 +1,8 @@ +docs/docsite/rst/filter_guide.rst rstcheck +docs/docsite/rst/hosttech_guide.rst rstcheck +docs/docsite/rst/hetzner_guide.rst rstcheck +plugins/modules/hetzner_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hetzner_dns_record_set_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_set_info.py validate-modules:invalid-documentation plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.11.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.11.txt index dc9da1161..593a5082f 100644 --- a/ansible_collections/community/dns/tests/sanity/ignore-2.11.txt +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.11.txt @@ -1 +1,5 @@ +plugins/modules/hetzner_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hetzner_dns_record_set_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_set_info.py validate-modules:invalid-documentation plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.12.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.12.txt index dc9da1161..593a5082f 100644 --- a/ansible_collections/community/dns/tests/sanity/ignore-2.12.txt +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.12.txt @@ -1 +1,5 @@ +plugins/modules/hetzner_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hetzner_dns_record_set_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_set_info.py validate-modules:invalid-documentation plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.13.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.13.txt index dc9da1161..593a5082f 100644 --- a/ansible_collections/community/dns/tests/sanity/ignore-2.13.txt +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.13.txt @@ -1 +1,5 @@ +plugins/modules/hetzner_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hetzner_dns_record_set_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_set_info.py validate-modules:invalid-documentation plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.14.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.14.txt index dc9da1161..593a5082f 100644 --- a/ansible_collections/community/dns/tests/sanity/ignore-2.14.txt +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.14.txt @@ -1 +1,5 @@ +plugins/modules/hetzner_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hetzner_dns_record_set_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_set_info.py validate-modules:invalid-documentation plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.17.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.17.txt new file mode 100644 index 000000000..dc9da1161 --- /dev/null +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.17.txt @@ -0,0 +1 @@ +plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.17.txt.license b/ansible_collections/community/dns/tests/sanity/ignore-2.17.txt.license new file mode 100644 index 000000000..edff8c768 --- /dev/null +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.17.txt.license @@ -0,0 +1,3 @@ +GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: Ansible Project diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.9.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.9.txt index dc9da1161..14ec3bedc 100644 --- a/ansible_collections/community/dns/tests/sanity/ignore-2.9.txt +++ b/ansible_collections/community/dns/tests/sanity/ignore-2.9.txt @@ -1 +1,8 @@ +docs/docsite/rst/filter_guide.rst rstcheck +docs/docsite/rst/hosttech_guide.rst rstcheck +docs/docsite/rst/hetzner_guide.rst rstcheck +plugins/modules/hetzner_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hetzner_dns_record_set_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_info.py validate-modules:invalid-documentation +plugins/modules/hosttech_dns_record_set_info.py validate-modules:invalid-documentation plugins/public_suffix_list.dat no-smart-quotes diff --git a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py index 3b01de586..bfaa4886d 100644 --- a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py +++ b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py @@ -12,6 +12,7 @@ import textwrap from ansible import constants as C from ansible.inventory.manager import InventoryManager from ansible.module_utils.common.text.converters import to_native +from ansible.utils.unsafe_proxy import AnsibleUnsafe from ansible_collections.community.internal_test_tools.tests.unit.mock.path import mock_unfrackpath_noop from ansible_collections.community.internal_test_tools.tests.unit.mock.loader import DictDataLoader @@ -208,6 +209,8 @@ def test_inventory_file_simple(mocker): assert im._inventory.get_host('*.example.com') in im._inventory.groups['ungrouped'].hosts assert im._inventory.get_host('example.com').get_vars()['ansible_host'] == '1.2.3.4' assert im._inventory.get_host('*.example.com').get_vars()['ansible_host'] == '1.2.3.5' + assert isinstance(im._inventory.get_host('example.com').get_vars()['ansible_host'], AnsibleUnsafe) + assert isinstance(im._inventory.get_host('*.example.com').get_vars()['ansible_host'], AnsibleUnsafe) assert len(im._inventory.groups['ungrouped'].hosts) == 2 assert len(im._inventory.groups['all'].hosts) == 0 diff --git a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py index a7adb2c09..cefd02a06 100644 --- a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py +++ b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py @@ -12,6 +12,7 @@ import textwrap from ansible import constants as C from ansible.inventory.manager import InventoryManager from ansible.module_utils.common.text.converters import to_native +from ansible.utils.unsafe_proxy import AnsibleUnsafe from ansible_collections.community.internal_test_tools.tests.unit.mock.path import mock_unfrackpath_noop from ansible_collections.community.internal_test_tools.tests.unit.mock.loader import DictDataLoader @@ -185,6 +186,8 @@ def test_inventory_file_simple(mocker): assert im._inventory.get_host('*.example.com') in im._inventory.groups['ungrouped'].hosts assert im._inventory.get_host('example.com').get_vars()['ansible_host'] == '1.2.3.4' assert im._inventory.get_host('*.example.com').get_vars()['ansible_host'] == '1.2.3.5' + assert isinstance(im._inventory.get_host('example.com').get_vars()['ansible_host'], AnsibleUnsafe) + assert isinstance(im._inventory.get_host('*.example.com').get_vars()['ansible_host'], AnsibleUnsafe) assert len(im._inventory.groups['ungrouped'].hosts) == 2 assert len(im._inventory.groups['all'].hosts) == 0 diff --git a/ansible_collections/community/dns/tests/unit/plugins/lookup/test_lookup.py b/ansible_collections/community/dns/tests/unit/plugins/lookup/test_lookup.py new file mode 100644 index 000000000..0982d8704 --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/lookup/test_lookup.py @@ -0,0 +1,498 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible.errors import AnsibleLookupError +from ansible.plugins.loader import lookup_loader + +from ansible_collections.community.internal_test_tools.tests.unit.compat.unittest import TestCase +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import patch, MagicMock + +from ..module_utils.resolver_helper import ( + mock_resolver, + mock_query_udp, + create_mock_answer, +) + +# We need dnspython +dns = pytest.importorskip('dns') + + +class TestLookup(TestCase): + def setUp(self): + self.lookup = lookup_loader.get("community.dns.lookup") + + def test_simple(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'www.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.1'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.2'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com']) + + print(result) + assert len(result) == 2 + assert result[0] == '127.0.0.1' + assert result[1] == '127.0.0.2' + + def test_retry_success(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'www.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.1'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.2'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com']) + + print(result) + assert len(result) == 2 + assert result[0] == '127.0.0.1' + assert result[1] == '127.0.0.2' + + def test_retry_fail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0].startswith('Unexpected DNS error for www.example.com: The DNS operation timed out after 10') + + def test_simple_nxdomain(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com']) + + print(result) + assert len(result) == 0 + + def test_simple_nxdomain(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com']) + + print(result) + assert len(result) == 0 + + def test_simple_nxdomain_empty(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com'], nxdomain_handling='empty') + + print(result) + assert len(result) == 0 + + def test_simple_nxdomain_message(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com'], nxdomain_handling='message') + + print(result) + assert len(result) == 1 + assert result[0] == 'NXDOMAIN' + + def test_simple_nxdomain_fail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], nxdomain_handling='fail') + + print(exc.value.args[0]) + assert exc.value.args[0] == 'Got NXDOMAIN when querying www.example.com' + + def test_simple_servfail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0] == "Unexpected resolving error for www.example.com: Error SERVFAIL while querying ['1.1.1.1']" + + def test_retry_servfail_success(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com'], servfail_retries=2) + + print(result) + assert len(result) == 0 + + def test_retry_servfail_fail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], servfail_retries=2) + + print(exc.value.args[0]) + assert exc.value.args[0] == "Unexpected resolving error for www.example.com: Error SERVFAIL while querying ['1.1.1.1']" + + def test_type(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, '"foo bar"'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'baz bam'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'bar'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['example.com'], type='TXT') + + print(result) + assert len(result) == 3 + assert result[0] == '"foo bar"' + assert result[1] == '"baz" "bam"' + assert result[2] == '"bar"' + + def test_server(self): + resolver = mock_resolver(['1.1.1.1'], { + ('2.2.2.2', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '::1'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['example.org'], type='AAAA', server=['2.2.2.2', '3.3.3.3']) + + print(result) + assert len(result) == 1 + assert result[0] == '::1' + + def test_server_resolve(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '1.2.3.4'), + )), + }, + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1::2'), + )), + }, + ], + ('1.2.3.4', '1::2', '2.2.2.2', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '::1'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['example.org'], type='AAAA', server=['2.2.2.2', 'ns.example.com', '3.3.3.3']) + + print(result) + assert len(result) == 1 + assert result[0] == '::1' + + def test_server_resolve_nxdomain(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], server=['2.2.2.2', 'ns.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0] == 'Unexpected DNS error for ns.example.com: The DNS query name does not exist: ns.example.com.' + + def test_server_resolve_servfail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], server=['2.2.2.2', 'ns.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0] == "Unexpected resolving error for ns.example.com: Error SERVFAIL while querying ['1.1.1.1']" + + def test_server_resolve_empty_lifetime(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 5, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 5, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + ('3.3.3.3', ): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 5, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run( + ['example.org'], + type='AAAA', + server=['ns.example.com', '3.3.3.3'], + query_timeout=5, + ) + + print(result) + assert len(result) == 0 diff --git a/ansible_collections/community/dns/tests/unit/plugins/lookup/test_lookup_as_dict.py b/ansible_collections/community/dns/tests/unit/plugins/lookup/test_lookup_as_dict.py new file mode 100644 index 000000000..f29d73143 --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/lookup/test_lookup_as_dict.py @@ -0,0 +1,461 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible.errors import AnsibleLookupError +from ansible.plugins.loader import lookup_loader + +from ansible_collections.community.internal_test_tools.tests.unit.compat.unittest import TestCase +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import patch, MagicMock + +from ..module_utils.resolver_helper import ( + mock_resolver, + mock_query_udp, + create_mock_answer, +) + +# We need dnspython +dns = pytest.importorskip('dns') + + +class TestLookupAsDict(TestCase): + def setUp(self): + self.lookup = lookup_loader.get("community.dns.lookup_as_dict") + + def test_simple(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'www.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.1'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.2'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com']) + + print(result) + assert len(result) == 2 + assert result[0] == { + 'address': '127.0.0.1', + } + assert result[1] == { + 'address': '127.0.0.2', + } + + def test_retry_success(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'www.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.1'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '127.0.0.2'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com']) + + print(result) + assert len(result) == 2 + assert result[0] == { + 'address': '127.0.0.1', + } + assert result[1] == { + 'address': '127.0.0.2', + } + + def test_retry_fail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'raise': dns.exception.Timeout(timeout=10), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0].startswith('Unexpected DNS error for www.example.com: The DNS operation timed out after 10') + + def test_simple_nxdomain_empty(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com'], nxdomain_handling='empty') + + print(result) + assert len(result) == 0 + + def test_simple_nxdomain_fail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], nxdomain_handling='fail') + + print(exc.value.args[0]) + assert exc.value.args[0] == 'Got NXDOMAIN when querying www.example.com' + + def test_simple_servfail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0] == "Unexpected resolving error for www.example.com: Error SERVFAIL while querying ['1.1.1.1']" + + def test_retry_servfail_success(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['www.example.com'], servfail_retries=2) + + print(result) + assert len(result) == 0 + + def test_retry_servfail_fail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], servfail_retries=2) + + print(exc.value.args[0]) + assert exc.value.args[0] == "Unexpected resolving error for www.example.com: Error SERVFAIL while querying ['1.1.1.1']" + + def test_type(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, '"foo bar"'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'baz bam'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'bar'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['example.com'], type='TXT') + + print(result) + assert len(result) == 3 + assert result[0] == { + 'strings': ['foo bar'], + 'value': 'foo bar', + } + assert result[1] == { + 'strings': ['baz', 'bam'], + 'value': 'bazbam', + } + assert result[2] == { + 'strings': ['bar'], + 'value': 'bar', + } + + def test_server(self): + resolver = mock_resolver(['1.1.1.1'], { + ('2.2.2.2', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '::1'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['example.org'], type='AAAA', server=['2.2.2.2', '3.3.3.3']) + + print(result) + assert len(result) == 1 + assert result[0] == { + 'address': '::1', + } + + def test_server_resolve(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '1.2.3.4'), + )), + }, + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1::2'), + )), + }, + ], + ('1.2.3.4', '1::2', '2.2.2.2', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '::1'), + )), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run(['example.org'], type='AAAA', server=['2.2.2.2', 'ns.example.com', '3.3.3.3']) + + print(result) + assert len(result) == 1 + assert result[0] == { + 'address': '::1', + } + + def test_server_resolve_nxdomain(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], server=['2.2.2.2', 'ns.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0] == 'Unexpected DNS error for ns.example.com: The DNS query name does not exist: ns.example.com.' + + def test_server_resolve_servfail(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + with pytest.raises(AnsibleLookupError) as exc: + self.lookup.run(['www.example.com'], server=['2.2.2.2', 'ns.example.com']) + + print(exc.value.args[0]) + assert exc.value.args[0] == "Unexpected resolving error for ns.example.com: Error SERVFAIL while querying ['1.1.1.1']" + + def test_server_resolve_empty_lifetime(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.A, + 'lifetime': 5, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + { + 'target': dns.name.from_unicode(u'ns.example.com'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 5, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + ('3.3.3.3', ): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 5, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + }) + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp([])): + result = self.lookup.run( + ['example.org'], + type='AAAA', + server=['ns.example.com', '3.3.3.3'], + query_timeout=5, + ) + + print(result) + assert len(result) == 0 diff --git a/ansible_collections/community/dns/tests/unit/plugins/module_utils/conversion/test_txt.py b/ansible_collections/community/dns/tests/unit/plugins/module_utils/conversion/test_txt.py index e5984444b..664b6db6d 100644 --- a/ansible_collections/community/dns/tests/unit/plugins/module_utils/conversion/test_txt.py +++ b/ansible_collections/community/dns/tests/unit/plugins/module_utils/conversion/test_txt.py @@ -138,6 +138,16 @@ TEST_ENCODE_DECODE = [ True, True, 'decimal' ), ( + # Avoid splitting up an escape into multiple TXT strings + u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzAB' + u'CDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123' + u'456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdef"\\', + u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzAB' + u'CDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123' + u'456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdef \\"\\\\', + False, True, 'decimal' + ), + ( # Avoid splitting up an decimal sequence into multiple TXT strings u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzAB' u'CDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123' diff --git a/ansible_collections/community/dns/tests/unit/plugins/module_utils/resolver_helper.py b/ansible_collections/community/dns/tests/unit/plugins/module_utils/resolver_helper.py index e410d2076..7fa213c9f 100644 --- a/ansible_collections/community/dns/tests/unit/plugins/module_utils/resolver_helper.py +++ b/ansible_collections/community/dns/tests/unit/plugins/module_utils/resolver_helper.py @@ -11,6 +11,11 @@ __metaclass__ = type from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import MagicMock +try: + import dns.rcode +except ImportError: + pass + def mock_resolver(default_nameservers, nameserver_resolve_sequence): def create_resolver(configure=True): @@ -59,15 +64,16 @@ def mock_query_udp(call_sequence): return udp -def create_mock_answer(rrset=None): - answer = MagicMock() - answer.rrset = rrset - return answer - - def create_mock_response(rcode, authority=None, answer=None): response = MagicMock() response.rcode = MagicMock(return_value=rcode) response.authority = authority or [] response.answer = answer or [] return response + + +def create_mock_answer(rrset=None, rcode=None): + answer = MagicMock() + answer.response = create_mock_response(dns.rcode.NOERROR if rcode is None else rcode, answer=[rrset] if rrset else None) + answer.rrset = rrset + return answer diff --git a/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_dnspython_records.py b/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_dnspython_records.py new file mode 100644 index 000000000..9594b8097 --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_dnspython_records.py @@ -0,0 +1,376 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2022, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible_collections.community.dns.plugins.module_utils.dnspython_records import ( + RDTYPE_TO_FIELDS, + convert_rdata_to_dict, +) + +# We need dnspython +dns = pytest.importorskip('dns') + +import dns.version + + +TEST_CONVERT_RDATA_TO_DICT = [ + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'address': '3.3.3.3', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'address': '1:2::3', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '::'), + {'to_unicode': False, 'add_synthetic': True}, + { + 'address': '::', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CAA, '10 issue letsencrypt.org'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'flags': 10, + 'tag': 'issue', + 'value': 'letsencrypt.org', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CNAME, 'foo.example.com.'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'target': 'foo.example.com.', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DNAME, 'foo.example.com.'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'target': 'foo.example.com.', + }, + ), + ( + dns.rdata.from_text( + dns.rdataclass.IN, + dns.rdatatype.DNSKEY, + '512 255 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRuniJDBzC7w0aR yzWZriO6i2odGWWQVucZqKVsENW91IOW4vqudngPZsY3' + ' GvQ/xVA8/7pyFj6b7Esga60zyGW6LFe9r8n6paHrlG5o jqf0BaqHT+8=', + ), + {'to_unicode': False, 'add_synthetic': False}, + { + 'flags': 512, + 'algorithm': 1, + 'protocol': 255, + 'key': ( + 'AQMFD5raczCJHViKtLYhWGz8hMY9UGRuniJDBzC7w0aRyzWZriO6i2odGWWQVucZqKVsENW9' + '1IOW4vqudngPZsY3GvQ/xVA8/7pyFj6b7Esga60zyGW6LFe9r8n6paHrlG5ojqf0BaqHT+8=' + ), + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DS, '12345 3 1 123456789abcdef67890123456789abcdef67890'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'algorithm': 3, + 'digest_type': 1, + 'key_tag': 12345, + 'digest': '123456789abcdef67890123456789abcdef67890', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.HINFO, '"Generic PC clone" "NetBSD-1.4"'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'cpu': b'Generic PC clone', + 'os': b'NetBSD-1.4', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.LOC, '60 9 0.000 N 24 39 0.000 E 10.00m 20.00m 2000.00m 20.00m'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'latitude': [60, 9, 0, 0, 1], + 'longitude': [24, 39, 0, 0, 1], + 'altitude': 1000.0, + 'size': 2000.0, + 'horizontal_precision': 200000.0, + 'vertical_precision': 2000.0, + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.MX, '10 mail.example.com'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'preference': 10, + 'exchange': 'mail.example.com', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NAPTR, '65535 65535 "text 1" "text 2" "text 3" example.com.'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'order': 65535, + 'preference': 65535, + 'flags': b'text 1', + 'service': b'text 2', + 'regexp': b'text 3', + 'replacement': 'example.com.', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.org.'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'target': 'ns.example.org.', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NSEC, 'a.secure A MX RRSIG NSEC TYPE1234'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'next': 'a.secure', + 'windows': 'A MX RRSIG NSEC TYPE1234', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NSEC3, '1 1 123 f00baa23 2t7b4g4vsa5smi47k61mv5bv1a22bojr NS SOA MX RRSIG DNSKEY NSEC3PARAM'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'algorithm': 1, + 'flags': 1, + 'iterations': 123, + 'salt': 'f00baa23', + 'next': '2t7b4g4vsa5smi47k61mv5bv1a22bojr', + 'windows': 'NS SOA MX RRSIG DNSKEY NSEC3PARAM', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NSEC3PARAM, '1 1 123 f00baa23'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'algorithm': 1, + 'flags': 1, + 'iterations': 123, + 'salt': 'f00baa23', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.PTR, 'example.com.'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'target': 'example.com.', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.RP, 'mbox-dname txt-dname'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'mbox': 'mbox-dname', + 'txt': 'txt-dname', + }, + ), + ( + dns.rdata.from_text( + dns.rdataclass.IN, + dns.rdatatype.RRSIG, + 'SOA 5 2 3600 20101127004331 20101119213831 61695 dnspython.org. sDUlltRlFTQw5ITFxOXW3TgmrHeMeNpdqcZ4EXxM9FHhIlte6V9YCnDw' + ' t6dvM9jAXdIEi03l9H/RAd9xNNW6gvGMHsBGzpvvqFQxIBR2PoiZA1mX /SWHZFdbt4xjYTtXqpyYvrMK0Dt7bUYPadyhPFCJ1B+I8Zi7B5WJEOd0 8vs=', + ), + {'to_unicode': False, 'add_synthetic': False}, + { + 'type_covered': 'SOA', + 'algorithm': 5, + 'labels': 2, + 'original_ttl': 3600, + 'expiration': 1290818611, + 'inception': 1290202711, + 'key_tag': 61695, + 'signer': 'dnspython.org.', + 'signature': ( + 'sDUlltRlFTQw5ITFxOXW3TgmrHeMeNpdqcZ4EXxM9FHhIlte6V9YCnDwt6dvM9jAXdIEi03l9H/RAd9xNNW6gv' + 'GMHsBGzpvvqFQxIBR2PoiZA1mX/SWHZFdbt4xjYTtXqpyYvrMK0Dt7bUYPadyhPFCJ1B+I8Zi7B5WJEOd08vs=' + ), + }, + ), + ( + dns.rdata.from_text( + dns.rdataclass.IN, + dns.rdatatype.RRSIG, + 'NSEC 1 3 3600 20200101000000 20030101000000 2143 foo. MxFcby9k/yvedMfQgKzhH5er0Mu/vILz' + ' 45IkskceFGgiWCn/GxHhai6VAuHAoNUz 4YoU1tVfSCSqQYn6//11U6Nld80jEeC8 aTrO+KKmCaY=', + ), + {'to_unicode': False, 'add_synthetic': False}, + { + 'type_covered': 'NSEC', + 'algorithm': 1, + 'labels': 3, + 'original_ttl': 3600, + 'expiration': 1577836800, + 'inception': 1041379200, + 'key_tag': 2143, + 'signer': 'foo.', + 'signature': 'MxFcby9k/yvedMfQgKzhH5er0Mu/vILz45IkskceFGgiWCn/GxHhai6VAuHAoNUz4YoU1tVfSCSqQYn6//11U6Nld80jEeC8aTrO+KKmCaY=', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.org. 1 7200 900 1209600 86400'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'mname': 'ns.example.com.', + 'rname': 'ns.example.org.', + 'serial': 1, + 'refresh': 7200, + 'retry': 900, + 'expire': 1209600, + 'minimum': 86400, + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SPF, '"v=spf1 a mx" " -all"'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'strings': [b'v=spf1 a mx', b' -all'], + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SPF, '"v=spf1 a mx" " -all"'), + {'to_unicode': False, 'add_synthetic': True}, + { + 'strings': [b'v=spf1 a mx', b' -all'], + 'value': b'v=spf1 a mx -all', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SRV, r'0 1 443 exchange.example.com'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'priority': 0, + 'weight': 1, + 'port': 443, + 'target': 'exchange.example.com', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SSHFP, r'1 1 aa549bfe898489c02d1715d97d79c57ba2fa76ab'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'algorithm': 1, + 'fp_type': 1, + 'fingerprint': 'aa549bfe898489c02d1715d97d79c57ba2fa76ab', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TLSA, r'3 1 1 a9cdf989b504fe5dca90c0d2167b6550570734f7c763e09fdf88904e06157065'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'usage': 3, + 'selector': 1, + 'mtype': 1, + 'cert': 'a9cdf989b504fe5dca90c0d2167b6550570734f7c763e09fdf88904e06157065', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo bar"'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'strings': [b'asdf', b'foo bar'], + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo bar"'), + {'to_unicode': False, 'add_synthetic': True}, + { + 'strings': [b'asdf', b'foo bar'], + 'value': b'asdffoo bar', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo bar"'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'strings': [u'asdf', u'foo bar'], + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo bar"'), + {'to_unicode': True, 'add_synthetic': True}, + { + 'strings': [u'asdf', u'foo bar'], + 'value': u'asdffoo bar', + }, + ), +] + + +if dns.version.MAJOR >= 2: + # https://github.com/rthalley/dnspython/issues/321 makes this not working on dnspython < 2.0.0, + # which affects Python 3.5 and 2.x since these are only supported by dnspython < 2.0.0. + TEST_CONVERT_RDATA_TO_DICT.extend([ + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo \195\164"'), + {'to_unicode': False, 'add_synthetic': False}, + { + 'strings': [b'asdf', b'foo \xC3\xA4'], + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo \195\164"'), + {'to_unicode': False, 'add_synthetic': True}, + { + 'strings': [b'asdf', b'foo \xC3\xA4'], + 'value': b'asdffoo \xC3\xA4', + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo \195\164"'), + {'to_unicode': True, 'add_synthetic': False}, + { + 'strings': [u'asdf', u'foo ä'], + }, + ), + ( + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, r'asdf "foo \195\164"'), + {'to_unicode': True, 'add_synthetic': True}, + { + 'strings': [u'asdf', u'foo ä'], + 'value': u'asdffoo ä', + }, + ), + ]) + + +@pytest.mark.parametrize("rdata, kwarg, expected_result", TEST_CONVERT_RDATA_TO_DICT) +def test_convert_rdata_to_dict(rdata, kwarg, expected_result): + result = convert_rdata_to_dict(rdata, **kwarg) + print(expected_result) + print(result) + assert expected_result == result + + +def test_error(): + v = RDTYPE_TO_FIELDS.pop(dns.rdatatype.A) + try: + with pytest.raises(ValueError) as exc: + convert_rdata_to_dict(dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3')) + finally: + RDTYPE_TO_FIELDS[dns.rdatatype.A] = v + print(exc.value.args) + assert exc.value.args == ('Unsupported record type 1', ) diff --git a/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_ips.py b/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_ips.py new file mode 100644 index 000000000..660f9adc1 --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_ips.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible_collections.community.dns.plugins.module_utils import ips + +from ansible_collections.community.dns.plugins.module_utils.ips import ( + assert_requirements_present, + is_ip_address, +) + +# We need ipaddress +ipaddress = pytest.importorskip('ipaddress') + + +def test_assert_requirements_present(): + class ModuleFailException(Exception): + pass + + class FakeModule(object): + def fail_json(self, **kwargs): + raise ModuleFailException(kwargs) + + module = FakeModule() + + orig_importerror = ips.IPADDRESS_IMPORT_EXC + try: + ips.IPADDRESS_IMPORT_EXC = None + assert_requirements_present(module) + + ips.IPADDRESS_IMPORT_EXC = 'asdf' + with pytest.raises(ModuleFailException) as exc: + assert_requirements_present(module) + + assert 'ipaddress' in exc.value.args[0]['msg'] + assert 'asdf' == exc.value.args[0]['exception'] + + finally: + ips.IPADDRESS_IMPORT_EXC = orig_importerror + + +IS_IP_ADDRESS_DATA = [ + ('foo.bar', False), + ('foo', False), + ('123', False), + ('1.2.3.4', True), + ('::', True), +] + + +@pytest.mark.parametrize("input, output", IS_IP_ADDRESS_DATA) +def test_is_ip_address(input, output): + assert is_ip_address(input) == output diff --git a/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_resolver.py b/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_resolver.py index 1f51601e0..cea7fb1d6 100644 --- a/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_resolver.py +++ b/ansible_collections/community/dns/tests/unit/plugins/module_utils/test_resolver.py @@ -36,24 +36,26 @@ def test_assert_requirements_present(): class ModuleFailException(Exception): pass - def fail_json(**kwargs): - raise ModuleFailException(kwargs) + class FakeModule(object): + def fail_json(self, **kwargs): + raise ModuleFailException(kwargs) - module = MagicMock() - module.fail_json = MagicMock(side_effect=fail_json) + module = FakeModule() orig_importerror = resolver.DNSPYTHON_IMPORTERROR - resolver.DNSPYTHON_IMPORTERROR = None - assert_requirements_present(module) - - resolver.DNSPYTHON_IMPORTERROR = 'asdf' - with pytest.raises(ModuleFailException) as exc: + try: + resolver.DNSPYTHON_IMPORTERROR = None assert_requirements_present(module) - assert 'dnspython' in exc.value.args[0]['msg'] - assert 'asdf' == exc.value.args[0]['exception'] + resolver.DNSPYTHON_IMPORTERROR = 'asdf' + with pytest.raises(ModuleFailException) as exc: + assert_requirements_present(module) + + assert 'dnspython' in exc.value.args[0]['msg'] + assert 'asdf' == exc.value.args[0]['exception'] - resolver.DNSPYTHON_IMPORTERROR = orig_importerror + finally: + resolver.DNSPYTHON_IMPORTERROR = orig_importerror def test_lookup_ns_names(): @@ -449,7 +451,69 @@ def test_timeout_failure(): assert exc.value.kwargs['timeout'] == 4 -def test_error_nxdomain(): +def test_error_nameserver_nxdomain_none(): + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers() + assert resolver.resolve_nameservers('example.com') == [] + + +def test_error_nameserver_nxdomain_partial_first(): + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers() + assert resolver.resolve_nameservers('example.com') == ['ns.com'] + + +def test_error_nameserver_nxdomain_partial_second(): resolver = mock_resolver(['1.1.1.1'], {}) udp_sequence = [ { @@ -461,14 +525,159 @@ def test_error_nxdomain(): }, 'result': create_mock_response(dns.rcode.NXDOMAIN), }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, ] with patch('dns.resolver.get_default_resolver', resolver): with patch('dns.resolver.Resolver', resolver): with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers() + assert resolver.resolve_nameservers('example.com') == ['ns.com'] + + +def test_error_nxdomain_ok(): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '2:3::4'), + )), + }, + ], + ('1:2::3', '2:3::4', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.com'), + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers() + rrset_dict = resolver.resolve('example.com', nxdomain_is_empty=True) + print(rrset_dict) + assert sorted(rrset_dict.keys()) == ['ns.com'] + assert rrset_dict['ns.com'] == [] + + +def test_error_nxdomain_fail(): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '2:3::4'), + )), + }, + ], + ('1:2::3', '2:3::4', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.com'), + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers() with pytest.raises(dns.resolver.NXDOMAIN) as exc: - resolver = ResolveDirectlyFromNameServers() - resolver.resolve_nameservers('example.com') - assert exc.value.kwargs['qnames'] == [dns.name.from_unicode(u'com')] + resolver.resolve('example.com', nxdomain_is_empty=False) + print(exc.value.args[0]) + assert exc.value.args[0] == 'The DNS query name does not exist: example.com.' def test_error_servfail(): @@ -493,6 +702,306 @@ def test_error_servfail(): assert exc.value.args[0] == 'Error SERVFAIL while querying 1.1.1.1 with query get NS for "com."' +def test_error_servfail_retry_success(): + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, authority=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers(servfail_retries=2) + assert resolver.resolve_nameservers('com') == ['ns.com'] + + +def test_error_servfail_retry_fail(): + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(ResolverError) as exc: + resolver = ResolveDirectlyFromNameServers(servfail_retries=2) + resolver.resolve_nameservers('example.com') + assert exc.value.args[0] == 'Error SERVFAIL while querying 1.1.1.1 with query get NS for "com."' + + +def test_servfail_handling(): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '2.2.2.2'), + )), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, authority=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers(servfail_retries=2) + assert resolver.resolve_nameservers('example.com', resolve_addresses=True) == ['3.3.3.3'] + # The following results should be cached: + assert resolver.resolve_nameservers('com') == ['ns.com'] + assert resolver.resolve_nameservers('com', resolve_addresses=True) == ['2.2.2.2'] + assert resolver.resolve_nameservers('example.com') == ['ns.example.com'] + assert resolver.resolve_nameservers('example.com', resolve_addresses=True) == ['3.3.3.3'] + + +def test_servfail_failing(): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '2.2.2.2'), + )), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + { + 'target': 'ns.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.SERVFAIL), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, authority=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + resolver = ResolveDirectlyFromNameServers(servfail_retries=2) + assert resolver.resolve_nameservers('example.com', resolve_addresses=True) == ['3.3.3.3'] + # The following results should be cached: + assert resolver.resolve_nameservers('com') == ['ns.com'] + with pytest.raises(ResolverError) as exc: + resolver.resolve_nameservers('com', resolve_addresses=True) + assert exc.value.args[0] == "Error SERVFAIL while querying ['1.1.1.1']" + + def test_no_response(): fake_query = MagicMock() fake_query.question = 'Doctor Who?' diff --git a/ansible_collections/community/dns/tests/unit/plugins/modules/test_nameserver_info.py b/ansible_collections/community/dns/tests/unit/plugins/modules/test_nameserver_info.py new file mode 100644 index 000000000..e8fd4a6ed --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/modules/test_nameserver_info.py @@ -0,0 +1,395 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2022, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import MagicMock, patch + +from ansible_collections.community.internal_test_tools.tests.unit.plugins.modules.utils import ( + set_module_args, + ModuleTestCase, + AnsibleExitJson, + AnsibleFailJson, +) + +from ansible_collections.community.dns.plugins.modules import nameserver_info + +from ..module_utils.resolver_helper import ( + mock_resolver, + mock_query_udp, + create_mock_answer, + create_mock_response, +) + +# We need dnspython +dns = pytest.importorskip('dns') + + +class TestNameserverInfo(ModuleTestCase): + def test_single(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + ), dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CNAME, 'example.org') + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleExitJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + }) + nameserver_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['changed'] is False + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['nameservers'] == [ + 'ns.example.com', + ] + + def test_single_ips(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + )), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + ), dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CNAME, 'example.org') + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleExitJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + 'resolve_addresses': True, + }) + nameserver_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['changed'] is False + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['nameservers'] == [ + '1:2::3', + '3.3.3.3', + ] + + def test_timeout(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'raise': dns.exception.Timeout(timeout=9), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, authority=[dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'mail.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'raise': dns.exception.Timeout(timeout=9), + }, + { + 'query_target': dns.name.from_unicode(u'mail.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'raise': dns.exception.Timeout(timeout=9), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleFailJson) as exc: + set_module_args({ + 'name': ['www.example.com', 'mail.example.com'], + 'query_timeout': 9, + 'query_retry': 1, + }) + nameserver_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['msg'] in ( + 'Unexpected DNS error: The DNS operation timed out after 9 seconds', + 'Unexpected DNS error: The DNS operation timed out after 9.000 seconds', + ) + assert len(exc.value.args[0]['results']) == 2 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['nameservers'] == ['ns.example.com'] + assert exc.value.args[0]['results'][1]['name'] == 'mail.example.com' + assert 'nameservers' not in exc.value.args[0]['results'][1] + + def test_nxdomain(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + )), + }, + ], + ('1:2::3', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleExitJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + }) + nameserver_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['changed'] is False + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['nameservers'] == ['ns.example.com'] + + def test_servfail(self): + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleFailJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + }) + nameserver_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['msg'] == 'Unexpected resolving error: Error SERVFAIL while querying 1.1.1.1 with query get NS for "com."' + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert 'nameservers' not in exc.value.args[0]['results'][0] diff --git a/ansible_collections/community/dns/tests/unit/plugins/modules/test_nameserver_record_info.py b/ansible_collections/community/dns/tests/unit/plugins/modules/test_nameserver_record_info.py new file mode 100644 index 000000000..ee68586ff --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/modules/test_nameserver_record_info.py @@ -0,0 +1,592 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2022, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import MagicMock, patch + +from ansible_collections.community.internal_test_tools.tests.unit.plugins.modules.utils import ( + set_module_args, + ModuleTestCase, + AnsibleExitJson, + AnsibleFailJson, +) + +from ansible_collections.community.dns.plugins.modules import nameserver_record_info + +from ..module_utils.resolver_helper import ( + mock_resolver, + mock_query_udp, + create_mock_answer, + create_mock_response, +) + +# We need dnspython +dns = pytest.importorskip('dns') + + +class TestNameserverRecordInfo(ModuleTestCase): + def test_single(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + )), + }, + { + 'target': 'ns.example.org', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '4.4.4.4'), + )), + }, + { + 'target': 'ns.example.org', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + ('1:2::3', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'asdf'), + )), + }, + ], + ('4.4.4.4', ): [ + { + 'target': dns.name.from_unicode(u'example.org'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'asdf'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'fdsa'), + )), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + ), dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CNAME, 'example.org') + )]), + }, + { + 'query_target': dns.name.from_unicode(u'org'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'org', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.org'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.org'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.org', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.org'), + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleExitJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + 'type': 'TXT', + }) + nameserver_record_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['changed'] is False + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert len(exc.value.args[0]['results'][0]['result']) == 2 + assert exc.value.args[0]['results'][0]['result'][0]['nameserver'] == 'ns.example.com' + assert exc.value.args[0]['results'][0]['result'][0]['values'] == [ + { + 'strings': ['asdf'], + 'value': 'asdf', + } + ] + assert exc.value.args[0]['results'][0]['result'][1]['nameserver'] == 'ns.example.org' + assert exc.value.args[0]['results'][0]['result'][1]['values'] == [ + { + 'strings': ['asdf'], + 'value': 'asdf', + }, + { + 'strings': ['fdsa'], + 'value': 'fdsa', + }, + ] + + def test_timeout(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 9, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 9, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + ('3.3.3.3', ): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 9, + 'raise': dns.exception.Timeout(timeout=9), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 9, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'www.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.TXT, 'fdsa asdf'), + )), + }, + { + 'target': dns.name.from_unicode(u'mail.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 9, + 'raise': dns.exception.Timeout(timeout=9), + }, + { + 'target': dns.name.from_unicode(u'mail.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 9, + 'raise': dns.exception.Timeout(timeout=9), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, authority=[dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'mail.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 9, + }, + 'result': create_mock_response(dns.rcode.NOERROR, authority=[dns.rrset.from_rdata( + 'mail.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleFailJson) as exc: + set_module_args({ + 'name': ['www.example.com', 'mail.example.com'], + 'type': 'TXT', + 'query_timeout': 9, + 'query_retry': 1, + }) + nameserver_record_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['msg'] in ( + 'Unexpected DNS error: The DNS operation timed out after 9 seconds', + 'Unexpected DNS error: The DNS operation timed out after 9.000 seconds', + ) + assert len(exc.value.args[0]['results']) == 2 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['result'] == [ + { + 'nameserver': 'ns.example.com', + 'values': [ + { + 'strings': ['fdsa', 'asdf'], + 'value': 'fdsaasdf', + } + ], + } + ] + assert exc.value.args[0]['results'][1]['name'] == 'mail.example.com' + assert exc.value.args[0]['results'][1]['result'] == [] + + def test_nxdomain(self): + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + )), + }, + ], + ('1:2::3', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NXDOMAIN), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleExitJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + 'type': 'TXT', + }) + nameserver_record_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['changed'] is False + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert len(exc.value.args[0]['results'][0]['result']) == 1 + assert exc.value.args[0]['results'][0]['result'][0]['nameserver'] == 'ns.example.com' + assert exc.value.args[0]['results'][0]['result'][0]['values'] == [] + + def test_servfail(self): + resolver = mock_resolver(['1.1.1.1'], {}) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.SERVFAIL), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleFailJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + 'type': 'TXT', + }) + nameserver_record_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['msg'] == 'Unexpected resolving error: Error SERVFAIL while querying 1.1.1.1 with query get NS for "com."' + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['result'] == [] + + def test_cname_loop(self): + fake_query = MagicMock() + fake_query.question = 'Doctor Who?' + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + { + 'target': 'ns.example.org', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.org', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '4.4.4.4'), + )), + }, + { + 'target': 'ns.example.org', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'raise': dns.resolver.NoAnswer(response=fake_query), + }, + ], + }) + udp_sequence = [ + { + 'query_target': dns.name.from_unicode(u'com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, 'ns.example.com. ns.example.com. 12345 7200 120 2419200 10800'), + ), dns.rrset.from_rdata( + 'www.example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CNAME, 'example.org') + )]), + }, + { + 'query_target': dns.name.from_unicode(u'org'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'org', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.org'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'example.org'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.org', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.org'), + ), dns.rrset.from_rdata( + 'example.org', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CNAME, 'www.example.com') + )]), + }, + ] + with patch('dns.resolver.get_default_resolver', resolver): + with patch('dns.resolver.Resolver', resolver): + with patch('dns.query.udp', mock_query_udp(udp_sequence)): + with pytest.raises(AnsibleFailJson) as exc: + set_module_args({ + 'name': ['www.example.com'], + 'type': 'TXT', + }) + nameserver_record_info.main() + + print(exc.value.args[0]) + assert exc.value.args[0]['msg'] == 'Unexpected resolving error: Found CNAME loop starting at www.example.com' + assert len(exc.value.args[0]['results']) == 1 + assert exc.value.args[0]['results'][0]['name'] == 'www.example.com' + assert exc.value.args[0]['results'][0]['result'] == [] diff --git a/ansible_collections/community/dns/tests/unit/plugins/modules/test_wait_for_txt.py b/ansible_collections/community/dns/tests/unit/plugins/modules/test_wait_for_txt.py index 829d6465e..9ee935ba0 100644 --- a/ansible_collections/community/dns/tests/unit/plugins/modules/test_wait_for_txt.py +++ b/ansible_collections/community/dns/tests/unit/plugins/modules/test_wait_for_txt.py @@ -1195,7 +1195,44 @@ class TestWaitForTXT(ModuleTestCase): assert exc.value.args[0]['records'][1]['check_count'] == 1 def test_nxdomain(self): - resolver = mock_resolver(['1.1.1.1'], {}) + resolver = mock_resolver(['1.1.1.1'], { + ('1.1.1.1', ): [ + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.A, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, '3.3.3.3'), + )), + }, + { + 'target': 'ns.example.com', + 'rdtype': dns.rdatatype.AAAA, + 'lifetime': 10, + 'result': create_mock_answer(dns.rrset.from_rdata( + 'ns.example.com', + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, '1:2::3'), + )), + }, + ], + ('1:2::3', '3.3.3.3'): [ + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + { + 'target': dns.name.from_unicode(u'www.example.com'), + 'rdtype': dns.rdatatype.TXT, + 'lifetime': 10, + 'result': create_mock_answer(rcode=dns.rcode.NXDOMAIN), + }, + ], + }) udp_sequence = [ { 'query_target': dns.name.from_unicode(u'com'), @@ -1207,7 +1244,20 @@ class TestWaitForTXT(ModuleTestCase): 'result': create_mock_response(dns.rcode.NXDOMAIN), }, { - 'query_target': dns.name.from_unicode(u'com'), + 'query_target': dns.name.from_unicode(u'example.com'), + 'query_type': dns.rdatatype.NS, + 'nameserver': '1.1.1.1', + 'kwargs': { + 'timeout': 10, + }, + 'result': create_mock_response(dns.rcode.NOERROR, answer=[dns.rrset.from_rdata( + 'example.com', + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, 'ns.example.com'), + )]), + }, + { + 'query_target': dns.name.from_unicode(u'www.example.com'), 'query_type': dns.rdatatype.NS, 'nameserver': '1.1.1.1', 'kwargs': { @@ -1237,12 +1287,14 @@ class TestWaitForTXT(ModuleTestCase): wait_for_txt.main() print(exc.value.args[0]) + assert exc.value.args[0]['failed'] is True assert exc.value.args[0]['msg'] == 'Timeout (0 out of 1 check(s) passed).' assert exc.value.args[0]['completed'] == 0 assert len(exc.value.args[0]['records']) == 1 assert exc.value.args[0]['records'][0]['name'] == 'www.example.com' assert exc.value.args[0]['records'][0]['done'] is False - assert exc.value.args[0]['records'][0]['values'] == {} + assert len(exc.value.args[0]['records'][0]['values']) == 1 + assert exc.value.args[0]['records'][0]['values']['ns.example.com'] == [] assert exc.value.args[0]['records'][0]['check_count'] == 2 def test_servfail(self): diff --git a/ansible_collections/community/dns/tests/unit/plugins/plugin_utils/test_ips.py b/ansible_collections/community/dns/tests/unit/plugins/plugin_utils/test_ips.py new file mode 100644 index 000000000..211bad1bf --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/plugin_utils/test_ips.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible.errors import AnsibleError + +from ansible_collections.community.dns.plugins.plugin_utils import ips + +from ansible_collections.community.dns.plugins.plugin_utils.ips import ( + assert_requirements_present, +) + +# We need ipaddress +ipaddress = pytest.importorskip('ipaddress') + + +def test_assert_requirements_present(): + orig_importerror = ips.IPADDRESS_IMPORT_EXC + try: + ips.IPADDRESS_IMPORT_EXC = None + assert_requirements_present('community.dns.foo', 'lookup') + + ips.IPADDRESS_IMPORT_EXC = Exception('asdf') + with pytest.raises(AnsibleError) as exc: + assert_requirements_present('community.dns.foo', 'lookup') + + assert 'ipaddress' in exc.value.args[0] + + finally: + ips.IPADDRESS_IMPORT_EXC = orig_importerror diff --git a/ansible_collections/community/dns/tests/unit/plugins/plugin_utils/test_resolver.py b/ansible_collections/community/dns/tests/unit/plugins/plugin_utils/test_resolver.py new file mode 100644 index 000000000..578155a68 --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/plugins/plugin_utils/test_resolver.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2023, Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible.errors import AnsibleError + +from ansible_collections.community.dns.plugins.plugin_utils import resolver + +from ansible_collections.community.dns.plugins.plugin_utils.resolver import ( + assert_requirements_present, +) + + +def test_assert_requirements_present(): + orig_importerror = resolver.DNSPYTHON_IMPORTERROR + try: + resolver.DNSPYTHON_IMPORTERROR = None + assert_requirements_present('community.dns.foo', 'lookup') + + resolver.DNSPYTHON_IMPORTERROR = Exception('asdf') + with pytest.raises(AnsibleError) as exc: + assert_requirements_present('community.dns.foo', 'lookup') + + assert 'dnspython' in exc.value.args[0] + + finally: + resolver.DNSPYTHON_IMPORTERROR = orig_importerror diff --git a/ansible_collections/community/dns/tests/unit/replace-requirements.sh b/ansible_collections/community/dns/tests/unit/replace-requirements.sh new file mode 100755 index 000000000..c3a52f5d1 --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/replace-requirements.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +DIRECTORY="$(dirname "$0")" + +if [ -e "${DIRECTORY}/$1" ]; then + cp "${DIRECTORY}/$1" "${DIRECTORY}/requirements.txt" +fi diff --git a/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt b/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt new file mode 100644 index 000000000..126caabdc --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt @@ -0,0 +1,13 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +unittest2 ; python_version < '2.7' +importlib ; python_version < '2.7' + +ipaddress ; python_version < '3.3' + +dnspython < 2.4.0 + +lxml < 4.3.0 ; python_version < '2.7' # lxml 4.3.0 and later require python 2.7 or later +lxml ; python_version >= '2.7' diff --git a/ansible_collections/community/dns/tests/unit/requirements-stable-2.9.txt b/ansible_collections/community/dns/tests/unit/requirements-stable-2.9.txt new file mode 100644 index 000000000..126caabdc --- /dev/null +++ b/ansible_collections/community/dns/tests/unit/requirements-stable-2.9.txt @@ -0,0 +1,13 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +unittest2 ; python_version < '2.7' +importlib ; python_version < '2.7' + +ipaddress ; python_version < '3.3' + +dnspython < 2.4.0 + +lxml < 4.3.0 ; python_version < '2.7' # lxml 4.3.0 and later require python 2.7 or later +lxml ; python_version >= '2.7' diff --git a/ansible_collections/community/dns/tests/unit/requirements.txt b/ansible_collections/community/dns/tests/unit/requirements.txt index 8b7c7cd61..dff61418a 100644 --- a/ansible_collections/community/dns/tests/unit/requirements.txt +++ b/ansible_collections/community/dns/tests/unit/requirements.txt @@ -5,6 +5,8 @@ unittest2 ; python_version < '2.7' importlib ; python_version < '2.7' +ipaddress ; python_version < '3.3' + dnspython lxml < 4.3.0 ; python_version < '2.7' # lxml 4.3.0 and later require python 2.7 or later diff --git a/ansible_collections/community/dns/update-docs-fragments.py b/ansible_collections/community/dns/update-docs-fragments.py index 9ceba70f1..eac0aaae3 100755 --- a/ansible_collections/community/dns/update-docs-fragments.py +++ b/ansible_collections/community/dns/update-docs-fragments.py @@ -42,7 +42,7 @@ DEPENDENT_FRAGMENTS = [ ]), ]), ('RECORD_TYPE_CHOICES_RECORDS_INVENTORY', [ - ('record_type', 'options.filters.suboptions.type', [ + ('record_type', 'options.simple_filters.suboptions.type', [ 'inventory_records', ]), ]), |