1
+ # modules/one_com_config.py
2
+ import os
3
+ import argparse
4
+ import requests
5
+ import logging
6
+
7
+ logger = logging .getLogger ("one_com_ddns" )
8
+
9
+ def parse_config (validate_required = True ):
10
+ """
11
+ Parses configuration for the one.com DDNS script from command-line arguments,
12
+ environment variables (ONECOM_*), and returns None as default if no value is set.
13
+
14
+ Configuration is prioritized: command-line arguments > environment variables > None (if unset).
15
+
16
+ Key configuration parameters:
17
+ - username (-u, --username): one.com username (defaults to None if unset)
18
+ - password (-p, --password): one.com password (defaults to None if unset)
19
+ - domains (-d, --domains): List of domain names (e.g.,-d example.com example2.com) (defaults to None if unset)
20
+ - ip (-i, --ip): IP address source ('AUTO', 'ARG', or IP) (defaults to None if unset)
21
+ - force-update (-f, --force-update): Force DNS update (defaults to None if unset)
22
+ - ttl (-t, --ttl): TTL for DNS records (defaults to None if unset)
23
+ - skip-confirmation (--skip-confirmation): Skip confirmation prompts (defaults to False if unset)
24
+
25
+ Returns:
26
+ argparse.Namespace: Object containing configuration parameters.
27
+
28
+ Raises:
29
+ ValueError: If validate_required is True and username, password, or domain are None
30
+ after parsing.
31
+ SystemExit: If automatic IP retrieval fails when 'AUTO' is selected
32
+ or if no IP address is provided as a command-line argument
33
+ when 'ARG' is selected.
34
+ """
35
+ parser = argparse .ArgumentParser (description = "one.com DDNS Script Configuration" )
36
+
37
+ parser .add_argument ("-u" , "--username" , help = "one.com username" , default = os .environ .get ("ONECOM_USERNAME" ))
38
+ parser .add_argument ("-p" , "--password" , help = "one.com password" , default = os .environ .get ("ONECOM_PASSWORD" ))
39
+ env_onecome_domains = os .environ .get ("ONECOM_DOMAINS" )
40
+ if env_onecome_domains is not None :
41
+ env_onecome_domains = env_onecome_domains .split (',' )
42
+
43
+ parser .add_argument ("-d" , "--domains" , nargs = "+" , help = "List of domain names (e.g.,-d example.com example2.com)" , default = env_onecome_domains )
44
+ parser .add_argument ("-i" , "--ip" , help = "IP address ('AUTO', or IP)" , default = os .environ .get ("ONECOM_IP" , "AUTO" ))
45
+
46
+ env_onecom_force = os .environ .get ("ONECOM_FORCE_DNS_UPDATE" )
47
+ if env_onecom_force is not None :
48
+ env_onecom_force = env_onecom_force .lower ()
49
+
50
+ parser .add_argument ("-f" , "--force-update" , action = "store_true" , help = "Force DNS update (skip IP check)" , default = env_onecom_force )
51
+ parser .add_argument ("-t" , "--ttl" , type = int , help = "TTL value for DNS records" , default = os .environ .get ("ONECOM_TTL" ))
52
+ parser .add_argument ("-y" , "--skip-confirmation" , action = "store_true" , help = "Skip confirmation prompts" , default = os .environ .get ("ONECOM_SKIP_CONFIRMATION" ))
53
+
54
+ args = parser .parse_args ()
55
+
56
+ # Basic validation (ONLY IF validate_required is True)
57
+ if validate_required :
58
+ if not args .username :
59
+ raise ValueError ("Username is required (command-line or ONECOM_USERNAME env var)" )
60
+ if not args .password :
61
+ raise ValueError ("Password is required (command-line or ONECOM_PASSWORD env var)" )
62
+ if not args .domains :
63
+ raise ValueError ("Domain is required (command-line or ONECOM_DOMAIN env var)" )
64
+
65
+ # Handle IP address retrieval
66
+ if args .ip == "AUTO" :
67
+ try :
68
+ args .ip = requests .get ("https://api.ipify.org/" ).text
69
+ except requests .ConnectionError :
70
+ logger .error ("Failed to get IP Address from ipify" )
71
+ raise SystemExit ("Failed to get IP Address from ipify" )
72
+ logger .info (f"Detected external IP: { args .ip } " )
73
+
74
+ return args
0 commit comments