Add command line document

This commit is contained in:
Matteo Bertucci
2021-01-20 18:14:17 +01:00
parent e62aae6777
commit 24f1a56ce8
3 changed files with 48 additions and 11 deletions

View File

@ -1,28 +1,61 @@
import logging import logging
from os import environ
from typing import Tuple from typing import Tuple
import click import click
from cloudflare_ddns.app import ApplicationJob from cloudflare_ddns.app import ApplicationJob
from cloudflare_ddns.constants import DEFAULT_DELAY from cloudflare_ddns.constants import BASE_ENV_VAR, DEFAULT_DELAY, DOMAINS_ENV_VAR
log = logging.getLogger("ddns") log = logging.getLogger("ddns")
@click.command() @click.command()
@click.option('--delay', '-d', default=DEFAULT_DELAY, show_default=True) @click.option(
@click.option('--token', '-k', prompt="Enter your Cloudflare Token", hide_input=True, show_envvar=True) '--delay', '-d',
@click.option('-v', '--verbose', is_flag=True, default=False) default=DEFAULT_DELAY,
@click.argument("domain", nargs=-1) show_default=True,
def start(delay: str, token: str, verbose: int, domain: Tuple[str]) -> None: show_envvar=True,
"""Main application entrypoint.""" help="Time to wait between each update."
)
@click.option(
'--token', '-k',
prompt="Enter your Cloudflare Token",
hide_input=True,
show_envvar=True,
help="Your Cloudflare Bearer token."
)
@click.option('-v', '--verbose', is_flag=True, default=False, help="Show debug logging.")
@click.argument("domains", nargs=-1)
def start(delay: str, token: str, verbose: int, domains: Tuple[str]) -> None:
"""
Update Cloudflare DNS RECORDS to your current IP every <delay> (default: 5 minutes).
The domains can be passed either as command line options, or as a space separated CF_DDNS_DOMAINS environment
variable.
Each domain can be preceded by the record type, either A or AAAA followed by a colon.
\b
The duration supports the following symbols for each unit of time:
- days: `d`, `D`, `day`, `days`
- hours: `H`, `h`, `hour`, `hours`
- minutes: `M`, `m`, `minute`, `minutes`, `min`
- seconds: `S`, `s`, `second`, `seconds`, `sec`
The units need to be provided in descending order of magnitude.
"""
# Configure logging.
logging.basicConfig( logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.DEBUG if verbose else logging.INFO level=logging.DEBUG if verbose else logging.INFO
) )
ApplicationJob(delay, token, domain).launch() # Get domains from the environment variable.
if domain_var := environ.get(DOMAINS_ENV_VAR, None):
domains = list(domains)
domains.extend(domain_var.split(" "))
ApplicationJob(delay, token, domains).launch()
# Main entrypoint # Main entrypoint
if __name__ == "__main__": if __name__ == "__main__":
start(auto_envvar_prefix="CF_DDNS") start(auto_envvar_prefix=BASE_ENV_VAR)

View File

@ -1,7 +1,7 @@
import logging import logging
import threading import threading
from dataclasses import dataclass from dataclasses import dataclass
from typing import List, Tuple from typing import List
import requests import requests
from cloudflare_ddns.constants import ACCEPTED_RECORDS, LIST_DNS, LIST_ZONES, PATCH_DNS, VERIFY_TOKEN from cloudflare_ddns.constants import ACCEPTED_RECORDS, LIST_DNS, LIST_ZONES, PATCH_DNS, VERIFY_TOKEN
@ -32,7 +32,7 @@ class Domain:
class ApplicationJob(threading.Thread): class ApplicationJob(threading.Thread):
"""Main application class.""" """Main application class."""
def __init__(self, raw_delay: str, token: str, raw_domains: Tuple[str]): def __init__(self, raw_delay: str, token: str, raw_domains: List[str]):
super().__init__() super().__init__()
self.stop_signal = threading.Event() self.stop_signal = threading.Event()

View File

@ -1,6 +1,10 @@
# App defaults # App defaults
DEFAULT_DELAY = "5 minutes" DEFAULT_DELAY = "5 minutes"
# App constants
BASE_ENV_VAR = "CF_DDNS"
DOMAINS_ENV_VAR = BASE_ENV_VAR + "_DOMAINS"
# Endpoints # Endpoints
BASE_ENDPOINT = "https://api.cloudflare.com/client/v4/" BASE_ENDPOINT = "https://api.cloudflare.com/client/v4/"