import click from .config import Config from .dns import DNSManager from .ingress import IngressManager from .router import RouterManager import sys @click.group() @click.option('--config', help='Path to config file') @click.pass_context def cli(ctx, config): """LoopAware Infrastructure Management CLI""" try: ctx.obj = Config(config) except Exception as e: click.echo(f"Error: {e}", err=True) sys.exit(1) @cli.group() def dns(): """Manage DNS and DHCP""" pass @dns.command(name='add-host') @click.argument('mac') @click.argument('ip') @click.argument('hostname') @click.pass_obj def dns_add_host(config, mac, ip, hostname): mgr = DNSManager(config) mgr.add_host(mac, ip, hostname) click.echo(f"Added host {hostname} ({ip})") @dns.command(name='remove-host') @click.argument('mac') @click.pass_obj def dns_remove_host(config, mac): mgr = DNSManager(config) mgr.remove_host(mac) click.echo(f"Removed host {mac}") @dns.command(name='list') @click.pass_obj def dns_list(config): mgr = DNSManager(config) data = mgr.list() click.echo(data['hosts']) click.echo(data['dns']) @cli.group() def ingress(): """Manage HAProxy Ingress""" pass @ingress.command(name='add') @click.argument('domain') @click.argument('ip') @click.argument('port', type=int) @click.option('--https', is_flag=True, help='Target uses HTTPS') @click.pass_obj def ingress_add(config, domain, ip, port, https): mgr = IngressManager(config) mgr.add(domain, ip, port, https) click.echo(f"Added ingress for {domain}") @cli.group() def router(): """Manage Router Port Forwards""" pass @router.command(name='list') @click.pass_obj def router_list(config): mgr = RouterManager(config) for rule in mgr.list(): click.echo(f"[{rule['section']}] {rule['name']}: {rule['proto']} {rule['port']} -> {rule['dest']}") def main(): cli(obj={}) if __name__ == "__main__": main()