"""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()