| 30 | |
| 31 | #[get("/")] |
| 32 | async fn index(state: &State<AppState>) -> Result<RawHtml<String>, String> { |
| 33 | let public_logs = state.config().app_compose.public_logs; |
| 34 | let public_sysinfo = state.config().app_compose.public_sysinfo; |
| 35 | let public_tcbinfo = state.config().app_compose.public_tcbinfo; |
| 36 | let context = CallContext::builder().state(&**state).build(); |
| 37 | let handler = ExternalRpcHandler::construct(context.clone()) |
| 38 | .map_err(|e| format!("Failed to construct RPC handler: {}", e))?; |
| 39 | let AppInfo { |
| 40 | app_name, |
| 41 | app_id, |
| 42 | instance_id, |
| 43 | device_id, |
| 44 | mr_aggregated: _, |
| 45 | os_image_hash: _, |
| 46 | key_provider_info, |
| 47 | compose_hash: _, |
| 48 | tcb_info, |
| 49 | app_cert: _, |
| 50 | vm_config: _, |
| 51 | cloud_vendor, |
| 52 | cloud_product, |
| 53 | } = handler |
| 54 | .info() |
| 55 | .await |
| 56 | .map_err(|e| format!("Failed to get worker info: {}", e))?; |
| 57 | |
| 58 | let handler = GuestApiHandler::construct(context) |
| 59 | .map_err(|e| format!("Failed to construct RPC handler: {}", e))?; |
| 60 | let system_info = handler.sys_info().await.unwrap_or_default(); |
| 61 | |
| 62 | let containers = list_containers().await.unwrap_or_default().containers; |
| 63 | let model = crate::models::Dashboard { |
| 64 | app_name, |
| 65 | app_id, |
| 66 | instance_id, |
| 67 | device_id, |
| 68 | key_provider_info, |
| 69 | tcb_info, |
| 70 | containers, |
| 71 | system_info, |
| 72 | public_sysinfo, |
| 73 | public_logs, |
| 74 | public_tcbinfo, |
| 75 | cloud_vendor, |
| 76 | cloud_product, |
| 77 | }; |
| 78 | match model.render() { |
| 79 | Ok(html) => Ok(RawHtml(html)), |
| 80 | Err(err) => Err(format!("Failed to render template: {}", err)), |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | // Returns metrics about the guest in prometheus format if public_sysinfo is enabled |
| 85 | #[get("/metrics")] |