#!/usr/bin/env python3 import sys,yaml,re inp,out=sys.argv[1],sys.argv[2] with open(inp) as f: c=yaml.safe_load(f) or {} rows=[] for sname,svc in (c.get('services') or {}).items(): labels=svc.get('labels') or {} if isinstance(labels,list): d={} for l in labels: if '=' in str(l):k,v=str(l).split('=',1);d[k]=v labels=d routers={} for k,v in labels.items(): m=re.match(r'traefik\.http\.routers\.([^.]+)\.(rule|entrypoints|tls|middlewares)$',k) if m: routers.setdefault(m.group(1),{})[m.group(2)]=v ports={} for k,v in labels.items(): m=re.match(r'traefik\.http\.services\.([^.]+)\.loadbalancer\.server\.port$',k) if m: ports[m.group(1)]=v for r,rv in routers.items(): rows.append((sname,r,rv.get('rule',''),rv.get('entrypoints',''),rv.get('tls',''),rv.get('middlewares',''),ports.get(r,''))) lines=["# Traefik Routes","", "| Service | Router | Rule | Entrypoints | TLS | Middlewares | Target Port |","|---|---|---|---|---|---|---|"] if not rows: lines=["# Traefik Routes","","No Traefik routes were detected."] else: for r in sorted(rows): lines.append('| '+' | '.join(str(x).replace('|','\\|') for x in r)+' |') open(out,'w').write('\n'.join(lines)+'\n')