ruvnet/RuView · error · HTTPException

Router '{router_id}' is disabled

Error message

Router '{router_id}' is disabled

What it means

validate_router_access raises 403 "Router '<router_id>' is disabled" when the router exists in domain configuration but has enabled=False. Existence was confirmed first; this is a per-router administrative kill switch.

Source

Thrown at archive/v1/src/api/dependencies.py:230

# Router access dependencies
async def validate_router_access(
    router_id: str,
    current_user: Optional[Dict[str, Any]] = Depends(get_current_user)
) -> str:
    """Validate user access to a specific router."""
    domain_config = get_domain_config()
    
    # Check if router exists
    router = domain_config.get_router(router_id)
    if not router:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Router '{router_id}' not found"
        )
    
    # Check if router is enabled
    if not router.enabled:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail=f"Router '{router_id}' is disabled"
        )
    
    # If authentication is enabled, check user access
    if current_user:
        # Admin users have access to all routers
        if current_user.get("is_admin", False):
            return router_id
        
        # Check user's router permissions
        user_routers = current_user.get("routers", [])
        if user_routers and router_id not in user_routers:
            raise HTTPException(
                status_code=status.HTTP_403_FORBIDDEN,
                detail=f"Access denied to router '{router_id}'"
            )
    

View on GitHub (pinned to 4685618388)

Solutions

  1. Set enabled=True for the router in the domain configuration and reload
  2. Update clients to stop referencing the disabled router
  3. Surface disabled vs missing distinctly in client error handling
Defensive patterns

Strategy: validation

Validate before calling

# Only target enabled routers
routers = client.get('/api/routers', headers=auth).json()
enabled = [r['id'] for r in routers if r.get('enabled', True)]
if router_id not in enabled:
    skip_or_alert(router_id)

Try / catch

try:
    r = client.get(f'/api/routers/{router_id}', headers=auth)
    r.raise_for_status()
except httpx.HTTPStatusError as e:
    if e.response.status_code == 403 and 'disabled' in e.response.text:
        mark_router_offline(router_id)  # maintenance state; stop polling
    raise

Prevention

When it happens

Trigger: A router node deliberately disabled (maintenance, decommissioned hardware) still receiving API traffic; config edits flipping enabled accidentally.

Common situations: Taking an ESP32 node offline while dashboards keep polling it; staged hardware rollouts with disabled flags; config merge mistakes.

Related errors


AI-assisted analysis of ruvnet/RuView@4685618388 (2026-08-16). Data as JSON: /api/errors/ae528f7565adaea5. Report an issue: GitHub.