Skip to content

dns/ddclient: add all-inkl.com KAS API DynDNS provider - #5339

Merged
AdSchellevis merged 2 commits into
opnsense:masterfrom
cakallie:master
Apr 3, 2026
Merged

dns/ddclient: add all-inkl.com KAS API DynDNS provider#5339
AdSchellevis merged 2 commits into
opnsense:masterfrom
cakallie:master

Conversation

@cakallie

Copy link
Copy Markdown
Contributor

Adds a new Python provider for all-inkl.com hosting using the KAS SOAP API (KasApi.wsdl). Supports A and AAAA records, including root (@) and wildcard (*) entries. Credentials are passed per-request (no separate auth step).

  • allinkl.py: new provider class AllInkl, service key 'allinkl'
  • dialogAccount.xml: show Zone field for service_allinkl
  • DynDNS.xml: add allinkl to static service list (ddclient backend fallback)

Important notices
Before you submit a pull request, we ask you kindly to acknowledge the following:

If AI was used, please disclose:

  • Model used: Claude Sonnet 4.6
  • Extent of AI involvement: This change and PR text were prepared with assistance from Claude Sonnet 4.6. The result was tested against the live API of all-inkl.com and the final responsibility for the submission remains with the author.

Related issue
No prior issue — this is a self-contained new provider.


Describe the problem
all-inkl.com offers a pure DNS package without a built-in DynDNS feature. Customers who need to keep a DNS A record updated with their current public IP have no native option within OPNsense to do so via the all-inkl.com KAS API.


Describe the proposed solution
Implements a new ddclient provider (allinkl) that uses the all-inkl.com KAS SOAP API (KasApi.wsdl) to update DNS A/AAAA records directly. Authentication and DNS updates are performed in a single API call per record. The zone is automatically derived from the configured hostname if not explicitly set.


Adds a new Python provider for all-inkl.com hosting using the KAS SOAP API
(KasApi.wsdl). Supports A and AAAA records, including root (@) and wildcard (*)
entries. Credentials are passed per-request (no separate auth step).

- allinkl.py: new provider class AllInkl, service key 'allinkl'
- dialogAccount.xml: show Zone field for service_allinkl
- DynDNS.xml: add allinkl to static service list (ddclient backend fallback)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@AdSchellevis AdSchellevis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cakallie although I'm not a huge fan fan of the home grown soap string concat, but since this is rather isolated I don't mind that much adding the helper anyway. If you only need a very limited nearly static string to push to the server, it might be better to isolate that in a template file and use normal xml parsing (xml.etree.ElementTree) to parse the responses.

The DynDNS.xml change is the only one that should be applied to prevent offering the option to ddclient.

<woima>Woima</woima>
<yandex>Yandex</yandex>
<zoneedit1>Zoneedit</zoneedit1>
<allinkl>all-inkl.com (KAS API)</allinkl>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this shouldn't be needed for the python implementation as it uses known_services() to figure out the options.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review!

I've addressed both points:

  1. DynDNS.xml: Removed the allinkl entry — you're right, known_services() handles the registration automatically.
  2. XML parsing: Replaced all regex-based response parsing with xml.etree.ElementTree. The SOAP envelope construction remains as string concatenation. Specifically:
    - Fault detection in _kas_api() now uses root.find('.//{}Fault') and also catches ET.ParseError for malformed responses
    - _find_record_id() now navigates the XML tree instead of splitting on regex boundaries
    - The update success check uses findall('.//{
    }value') instead of a regex search

- Remove allinkl entry from DynDNS.xml; known_services() handles
  registration automatically for Python providers
- Replace regex-based XML parsing with xml.etree.ElementTree:
  fault detection, record lookup and update success check
- Also catches ET.ParseError for malformed responses
- Fix German comments in docstring to English

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cakallie
cakallie requested a review from AdSchellevis April 3, 2026 12:36
@AdSchellevis
AdSchellevis merged commit 2d3ee9f into opnsense:master Apr 3, 2026
@AdSchellevis

Copy link
Copy Markdown
Member

@cakallie ok, main concern is addressed, as this is a rather low risk change, let's try to add this to a release so others can test and offer feedback as well.

leandroscardua pushed a commit to leandroscardua/plugins that referenced this pull request Apr 4, 2026
* dns/ddclient: add all-inkl.com KAS API DynDNS provider

Adds a new Python provider for all-inkl.com hosting using the KAS SOAP API
(KasApi.wsdl). Supports A and AAAA records, including root (@) and wildcard (*)
entries. Credentials are passed per-request (no separate auth step).

- allinkl.py: new provider class AllInkl, service key 'allinkl'
- dialogAccount.xml: show Zone field for service_allinkl
- DynDNS.xml: add allinkl to static service list (ddclient backend fallback)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* dns/ddclient: address review feedback for all-inkl.com provider

- Remove allinkl entry from DynDNS.xml; known_services() handles
  registration automatically for Python providers
- Replace regex-based XML parsing with xml.etree.ElementTree:
  fault detection, record lookup and update success check
- Also catches ET.ParseError for malformed responses
- Fix German comments in docstring to English

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Carsten <carsten@kallies-net.de>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
maloo1 added a commit to maloo1/plugins that referenced this pull request Jul 29, 2026
maloo1 added a commit to maloo1/plugins that referenced this pull request Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants