82 lines
1.9 KiB
Python
82 lines
1.9 KiB
Python
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()
|