105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
"""Command line interface for hbd package."""
|
|
|
|
import argparse
|
|
import getpass
|
|
import sys
|
|
|
|
from .config import load_config
|
|
from .main import run as run_server
|
|
|
|
PUSHSRVS = ["all", "pushover", "mattermost"]
|
|
|
|
|
|
def build_parser():
|
|
parser = argparse.ArgumentParser(
|
|
prog="hbd",
|
|
description="HeartBeatDaemon - Wait for heartbeat messages and act on them (or their absence)",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
)
|
|
|
|
subparsers = parser.add_subparsers(dest="command")
|
|
|
|
# --- serve (default) ---
|
|
serve_p = subparsers.add_parser("serve", help="Start the hbd server (default)")
|
|
serve_p.add_argument("-c", "--config", dest="configfile", help="Config file path (YAML)")
|
|
serve_p.add_argument("-f", "--foreground", action="store_true", help="Run in foreground")
|
|
serve_p.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
|
|
serve_p.add_argument("-p", "--pushsrv", dest="pushsrv", choices=PUSHSRVS,
|
|
help="Push service to use")
|
|
serve_p.add_argument("-x", "--debug", action="count", default=0, help="Increase debug level")
|
|
|
|
# Legacy top-level flags (no subcommand) — kept for backward compatibility
|
|
parser.add_argument("-c", "--config", dest="configfile", help="Config file path (YAML)")
|
|
parser.add_argument("-f", "--foreground", action="store_true", help="Run in foreground")
|
|
parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
|
|
parser.add_argument("-p", "--pushsrv", dest="pushsrv", choices=PUSHSRVS,
|
|
help="Push service to use")
|
|
parser.add_argument("-x", "--debug", action="count", default=0, help="Increase debug level")
|
|
|
|
# --- passwd ---
|
|
passwd_p = subparsers.add_parser(
|
|
"passwd",
|
|
help="Generate a password hash for use in the config file",
|
|
)
|
|
passwd_p.add_argument(
|
|
"username",
|
|
nargs="?",
|
|
help="Username (informational only, for display)",
|
|
)
|
|
|
|
return parser
|
|
|
|
|
|
def cmd_passwd(args):
|
|
"""Interactive password hash generator."""
|
|
from .users import hash_password
|
|
|
|
username = args.username or ""
|
|
prompt = f"New password for {username}: " if username else "New password: "
|
|
while True:
|
|
pw = getpass.getpass(prompt)
|
|
if not pw:
|
|
print("Password must not be empty.", file=sys.stderr)
|
|
continue
|
|
pw2 = getpass.getpass("Confirm password: ")
|
|
if pw != pw2:
|
|
print("Passwords do not match, try again.", file=sys.stderr)
|
|
continue
|
|
break
|
|
|
|
hashed = hash_password(pw)
|
|
if username:
|
|
print(f"\nAdd the following to your config under users: -> {username}:")
|
|
else:
|
|
print("\nPassword hash (paste into config file under the user's 'password' key):")
|
|
print(f" password: {hashed}")
|
|
|
|
|
|
def main(argv=None):
|
|
parser = build_parser()
|
|
args = parser.parse_args(argv)
|
|
|
|
if args.command == "passwd":
|
|
cmd_passwd(args)
|
|
return
|
|
|
|
# Default: run the server (supports both `hbd serve ...` and `hbd ...`)
|
|
config = load_config(args.configfile)
|
|
|
|
# Apply CLI overrides
|
|
if args.foreground:
|
|
config["foreground"] = True
|
|
if args.verbose:
|
|
config["verbose"] = True
|
|
if args.pushsrv:
|
|
config["pushsrv"] = args.pushsrv
|
|
if args.debug > 0:
|
|
config["debug"] = args.debug
|
|
|
|
# Pass config_path for reloading support
|
|
run_server(config, config_path=args.configfile)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|