72 lines
2 KiB
Python
72 lines
2 KiB
Python
"""Config management."""
|
|
|
|
import json
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
|
|
DEFAULT_CONFIG = {
|
|
"connect_timeout": 10,
|
|
"text_width": 80,
|
|
"download_path": "",
|
|
"source_editor": ["vi"],
|
|
"command_editor": ["vi"],
|
|
"history_limit": 1000,
|
|
"external_commands": {},
|
|
"external_command_default": ["xdg-open"],
|
|
"home": "bebop:welcome",
|
|
"render_mode": "fancy",
|
|
"generate_client_cert_command": [
|
|
"openssl", "req",
|
|
"-newkey", "rsa:4096",
|
|
"-nodes",
|
|
"-keyform", "PEM",
|
|
"-keyout", "{key_path}",
|
|
"-x509",
|
|
"-days", "28140", # https://www.youtube.com/watch?v=F9L4q-0Pi4E
|
|
"-outform", "PEM",
|
|
"-out", "{cert_path}",
|
|
"-subj", "/CN={common_name}",
|
|
],
|
|
}
|
|
|
|
RENDER_MODES = ("fancy", "dumb")
|
|
|
|
|
|
def load_config(config_path: Path):
|
|
if not config_path.is_file():
|
|
create_default_config(config_path)
|
|
return DEFAULT_CONFIG
|
|
|
|
try:
|
|
with open(config_path, "rt") as config_file:
|
|
config = json.load(config_file)
|
|
except OSError as exc:
|
|
abs_path = config_path.absolute()
|
|
logging.error(f"Could not read config file {abs_path}: {exc}")
|
|
except ValueError as exc:
|
|
abs_path = config_path.absolute()
|
|
logging.error(f"Could not parse config file {abs_path}: {exc}")
|
|
else:
|
|
# Fill missing values with defaults.
|
|
for key, value in DEFAULT_CONFIG.items():
|
|
if key not in config:
|
|
config[key] = value
|
|
return config
|
|
return DEFAULT_CONFIG
|
|
|
|
|
|
def create_default_config(config_path: Path):
|
|
config_dir = config_path.parent
|
|
if not config_dir.is_dir():
|
|
try:
|
|
config_dir.mkdir(parents=True)
|
|
except OSError as exc:
|
|
logging.error(f"Could not create config dir {config_dir}: {exc}")
|
|
return
|
|
try:
|
|
with open(config_path, "wt") as config_file:
|
|
json.dump(DEFAULT_CONFIG, config_file, indent=2)
|
|
except OSError as exc:
|
|
logging.error(f"Could not create config file {config_path}: {exc}")
|