From b73140cf1537694f85570cec55e4c18cbbc30996 Mon Sep 17 00:00:00 2001 From: eskimo Date: Mon, 22 Jun 2026 23:52:45 -0400 Subject: [PATCH] chore: make plugin publish-safe for PyPI Remove private git.eskimo.dev URLs (README install -> `pip install certbot-dns-yeil`; setup.py url -> docs.yeil.app/dns). Update README to the api.yeil.app/v1/dns gateway + gateway-relative paths. Flesh out setup.py metadata (long_description from README, classifiers, python_requires, project_urls, keywords). Add an MIT LICENSE file and a Python .gitignore (so build/ dist/ *.egg-info/ __pycache__ stay out of the repo). Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 15 +++++++++++++++ LICENSE | 21 +++++++++++++++++++++ README.md | 34 ++++++++++++++++++++-------------- setup.py | 27 ++++++++++++++++++++++++++- 4 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05eacfe --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class + +# Packaging / build artifacts +build/ +dist/ +*.egg-info/ +.eggs/ + +# Virtualenvs +.venv/ +venv/ +env/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bcb0bbc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 yeil + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 3f32cbb..198975e 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,21 @@ yeil DNS Authenticator plugin for [Certbot](https://certbot.eff.org/). -Authenticates to `dns.yeil.app`'s public API with a yeil **App key** -(`yk_...`) sent as a Bearer token, then adds/removes TXT records to -satisfy ACME DNS-01 challenges. Works for any yeil team with an App that -has DNS record-write permission; the certbot host just needs HTTPS -reachability to `dns.yeil.app`. +Authenticates to the yeil public DNS API (`https://api.yeil.app/v1/dns`) +with a yeil **App key** (`yk_...`) sent as a Bearer token, then +adds/removes TXT records to satisfy ACME DNS-01 challenges. Works for any +yeil team with an App that has DNS record-write permission; the certbot +host just needs HTTPS reachability to `api.yeil.app`. Wildcard certs require DNS-01, so this plugin (or another DNS authenticator) is needed for `*.example.com`. +Full API docs: . + ## Installation ```sh -pip install git+https://git.eskimo.dev/Yeil/certbot-dns-yeil.git +pip install certbot-dns-yeil ``` ## Configuration @@ -33,10 +35,10 @@ dns_yeil_api_key = yk_xxxxxxxx_yyyyyyyyyyyyyyyyyyyyyyyy > login was retired with personal app passwords. Replace those two lines > with a single `dns_yeil_api_key`. -Optional override if you're testing against a non-production host: +Optional override if you're testing against a non-production API base: ```ini -dns_yeil_base_url = https://dns.staging.example +dns_yeil_base_url = https://api.staging.example/v1/dns ``` ## Usage @@ -60,13 +62,17 @@ certbot certonly \ ## How it works -The plugin sends the App key as a Bearer token on every request. For -each requested name it asks the API which of the App's zones covers the -FQDN (`GET /api/v1/zones?suffix_of=`), creates a TXT at -`_acme-challenge.` (`POST /api/v1/zones/{id}/records`), waits for -propagation, and on cleanup deletes the record by id -(`DELETE /api/v1/zones/{id}/records/{recordId}`). +The plugin sends the App key as a Bearer token on every request to +`https://api.yeil.app/v1/dns`. For each requested name it asks the API +which of the App's zones covers the FQDN (`GET /zones?suffix_of=`), +creates a TXT at `_acme-challenge.` (`POST /zones/{id}/records`), +waits for propagation, and on cleanup deletes the record by id +(`DELETE /zones/{id}/records/{recordId}`). Revoking the App key (or disabling the App) in your team settings cuts off access cleanly. The key only carries the DNS permissions you granted the App, so scope it to record-write on just the zones you need. + +## License + +MIT. See [LICENSE](LICENSE). diff --git a/setup.py b/setup.py index 2f7babc..30fe3f1 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,25 @@ +import pathlib + from setuptools import setup, find_packages +LONG_DESCRIPTION = pathlib.Path(__file__).with_name("README.md").read_text( + encoding="utf-8" +) + setup( name="certbot-dns-yeil", version="3.1.0", description="yeil DNS Authenticator plugin for Certbot", - url="https://git.eskimo.dev/Yeil/certbot-dns-yeil", + long_description=LONG_DESCRIPTION, + long_description_content_type="text/markdown", + url="https://docs.yeil.app/dns", + project_urls={ + "Documentation": "https://docs.yeil.app/dns", + }, author="yeil", license="MIT", + keywords="certbot dns yeil acme letsencrypt dns-01 dns-authenticator", + python_requires=">=3.8", packages=find_packages(), install_requires=[ "certbot>=1.1.0", @@ -17,4 +30,16 @@ setup( "dns-yeil = certbot_dns_yeil.dns_yeil:Authenticator", ], }, + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Environment :: Plugins", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Internet :: Name Service (DNS)", + "Topic :: Security", + "Topic :: System :: Systems Administration", + ], )