global key detect

This commit is contained in:
Mateusz Gruszczyński
2026-04-13 09:20:03 +02:00
parent fe1e731e44
commit 93a03b84c0
5 changed files with 34 additions and 7 deletions

View File

@@ -5,7 +5,8 @@
cp .env.example .env
```
# edit SECRET_KEY & DEFAULT_ADMIN_PASSWORD
edit SECRET_KEY & DEFAULT_ADMIN_PASSWORD
and run:
`bash start_prod.sh`

View File

@@ -13,9 +13,20 @@ from app.services.settings_service import settings_service
router = APIRouter()
def serialize_router(router: Router, global_ssh_key: str | None = None) -> RouterResponse:
has_router_key = bool((router.ssh_key or '').strip())
has_global_key = bool((global_ssh_key or '').strip())
payload = RouterResponse.model_validate(router, from_attributes=True).model_dump()
payload['uses_global_ssh_key'] = has_global_key and not has_router_key
payload['has_effective_ssh_key'] = has_router_key or has_global_key
return RouterResponse.model_validate(payload)
@router.get("", response_model=list[RouterResponse])
def list_routers(current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
return db.query(Router).filter(Router.owner_id == current_user.id).order_by(Router.created_at.desc()).all()
settings = settings_service.get_or_create(db)
routers = db.query(Router).filter(Router.owner_id == current_user.id).order_by(Router.created_at.desc()).all()
return [serialize_router(router, settings.global_ssh_key) for router in routers]
@router.post("", response_model=RouterResponse)
@@ -24,7 +35,8 @@ def create_router(payload: RouterCreate, current_user: User = Depends(get_curren
db.add(router)
db.commit()
db.refresh(router)
return router
settings = settings_service.get_or_create(db)
return serialize_router(router, settings.global_ssh_key)
@router.get("/{router_id}", response_model=RouterResponse)
@@ -32,7 +44,8 @@ def get_router(router_id: int, current_user: User = Depends(get_current_user), d
router = db.query(Router).filter(Router.id == router_id, Router.owner_id == current_user.id).first()
if not router:
raise HTTPException(status_code=404, detail="Router not found")
return router
settings = settings_service.get_or_create(db)
return serialize_router(router, settings.global_ssh_key)
@router.put("/{router_id}", response_model=RouterResponse)
@@ -45,7 +58,8 @@ def update_router(router_id: int, payload: RouterUpdate, current_user: User = De
db.add(router)
db.commit()
db.refresh(router)
return router
settings = settings_service.get_or_create(db)
return serialize_router(router, settings.global_ssh_key)
@router.delete("/{router_id}")

View File

@@ -38,6 +38,8 @@ class RouterUpdate(BaseModel):
class RouterResponse(RouterBase):
id: int
owner_id: int
uses_global_ssh_key: bool = False
has_effective_ssh_key: bool = False
last_connection_status: bool | None = None
last_connection_tested_at: datetime | None = None
last_connection_error: str | None = None

View File

@@ -39,7 +39,7 @@
<td>
<div class="inline-tags">
<p-tag [value]="routerItem.ssh_password ? ('routers.passwordMode' | translate) : ('routers.noPassword' | translate)" [severity]="routerItem.ssh_password ? 'warning' : 'secondary'"></p-tag>
<p-tag [value]="routerItem.ssh_key ? ('routers.keyMode' | translate) : ('routers.noKey' | translate)" [severity]="routerItem.ssh_key ? 'success' : 'secondary'"></p-tag>
<p-tag [value]="hasEffectiveSshKey(routerItem) ? ((usesGlobalSshKey(routerItem) ? 'routers.globalKeyMode' : 'routers.keyMode') | translate) : ('routers.noKey' | translate)" [severity]="hasEffectiveSshKey(routerItem) ? 'success' : 'secondary'"></p-tag>
</div>
</td>
<td>

View File

@@ -23,6 +23,8 @@ interface RouterItem {
ssh_user: string;
ssh_password?: string;
ssh_key?: string;
uses_global_ssh_key?: boolean;
has_effective_ssh_key?: boolean;
}
@Component({
@@ -58,7 +60,15 @@ export class RoutersPageComponent implements OnInit {
}
get keyCount(): number {
return this.routers.filter((item) => !!item.ssh_key).length;
return this.routers.filter((item) => this.hasEffectiveSshKey(item)).length;
}
hasEffectiveSshKey(item: RouterItem): boolean {
return !!item.has_effective_ssh_key;
}
usesGlobalSshKey(item: RouterItem): boolean {
return !!item.uses_global_ssh_key;
}