Redesenho da UI de dispositivos e correcao de VRAM
- Reorganiza layout da tela de dispositivos admin - Renomeia secao "Controles do dispositivo" para "Atalhos" - Adiciona botao de Tickets com badge de quantidade - Simplifica textos de botoes (Acesso, Resetar) - Remove email da maquina do cabecalho - Move empresa e status para mesma linha - Remove chip de Build do resumo - Corrige deteccao de VRAM para GPUs >4GB usando nvidia-smi - Adiciona prefixo "VRAM" na exibicao de memoria da GPU - Documenta sincronizacao RustDesk 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
c5150fee8f
commit
23e7cf58ae
11 changed files with 863 additions and 441 deletions
|
|
@ -282,6 +282,29 @@ pub fn ensure_rustdesk(
|
|||
log_event("Dados do RustDesk salvos no machine-agent.json");
|
||||
}
|
||||
|
||||
// Sincroniza com o backend imediatamente apos provisionar
|
||||
// O Rust faz o HTTP direto, sem passar pelo CSP do webview
|
||||
if let Err(error) = sync_remote_access_with_backend(&result) {
|
||||
log_event(&format!("Aviso: falha ao sincronizar com backend: {error}"));
|
||||
} else {
|
||||
log_event("Acesso remoto sincronizado com backend");
|
||||
// Atualiza lastSyncedAt no store
|
||||
let synced_data = serde_json::json!({
|
||||
"id": final_id,
|
||||
"password": password,
|
||||
"installedVersion": version,
|
||||
"updated": freshly_installed,
|
||||
"lastProvisionedAt": last_provisioned_at,
|
||||
"lastSyncedAt": Utc::now().timestamp_millis(),
|
||||
"lastError": serde_json::Value::Null
|
||||
});
|
||||
if let Err(e) = upsert_machine_store_value("rustdesk", synced_data) {
|
||||
log_event(&format!("Aviso: falha ao atualizar lastSyncedAt: {e}"));
|
||||
} else {
|
||||
log_event("lastSyncedAt atualizado com sucesso");
|
||||
}
|
||||
}
|
||||
|
||||
log_event(&format!("Provisionamento concluído. ID final: {final_id}. Versão: {:?}", version));
|
||||
|
||||
Ok(result)
|
||||
|
|
@ -1459,3 +1482,78 @@ fn mark_acl_unlock_flag() {
|
|||
));
|
||||
}
|
||||
}
|
||||
|
||||
fn get_machine_store_path() -> Result<PathBuf, RustdeskError> {
|
||||
let base = env::var("LOCALAPPDATA")
|
||||
.map_err(|_| RustdeskError::MissingId)?;
|
||||
Ok(Path::new(&base)
|
||||
.join(APP_IDENTIFIER)
|
||||
.join(MACHINE_STORE_FILENAME))
|
||||
}
|
||||
|
||||
fn sync_remote_access_with_backend(result: &crate::RustdeskProvisioningResult) -> Result<(), RustdeskError> {
|
||||
log_event("Iniciando sincronizacao com backend...");
|
||||
|
||||
// Le token e config do store
|
||||
let store_path = get_machine_store_path()?;
|
||||
let store_content = fs::read_to_string(&store_path)
|
||||
.map_err(RustdeskError::Io)?;
|
||||
let store: serde_json::Value = serde_json::from_str(&store_content)
|
||||
.map_err(|_| RustdeskError::MissingId)?;
|
||||
|
||||
let token = store.get("token")
|
||||
.and_then(|v| v.as_str())
|
||||
.ok_or(RustdeskError::MissingId)?;
|
||||
|
||||
let config = store.get("config")
|
||||
.ok_or(RustdeskError::MissingId)?;
|
||||
|
||||
let machine_id = config.get("machineId")
|
||||
.and_then(|v| v.as_str())
|
||||
.ok_or(RustdeskError::MissingId)?;
|
||||
|
||||
let api_base_url = config.get("apiBaseUrl")
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("https://tickets.esdrasrenan.com.br");
|
||||
|
||||
log_event(&format!("Sincronizando com backend: {} (machineId: {})", api_base_url, machine_id));
|
||||
|
||||
// Monta payload conforme schema esperado pelo backend
|
||||
// Schema: { machineToken, provider, identifier, password?, url?, username?, notes? }
|
||||
let payload = serde_json::json!({
|
||||
"machineToken": token,
|
||||
"provider": "RustDesk",
|
||||
"identifier": result.id,
|
||||
"password": result.password,
|
||||
"notes": format!("Versao: {}. Provisionado em: {}",
|
||||
result.installed_version.as_deref().unwrap_or("desconhecida"),
|
||||
result.last_provisioned_at)
|
||||
});
|
||||
|
||||
// Faz POST para /api/machines/remote-access
|
||||
let client = Client::builder()
|
||||
.user_agent(USER_AGENT)
|
||||
.timeout(Duration::from_secs(30))
|
||||
.build()?;
|
||||
|
||||
let url = format!("{}/api/machines/remote-access", api_base_url);
|
||||
let response = client.post(&url)
|
||||
.header("Content-Type", "application/json")
|
||||
.header("Idempotency-Key", format!("{}:RustDesk:{}", machine_id, result.id))
|
||||
.body(payload.to_string())
|
||||
.send()?;
|
||||
|
||||
if response.status().is_success() {
|
||||
log_event(&format!("Sync com backend OK: status {}", response.status()));
|
||||
Ok(())
|
||||
} else {
|
||||
let status = response.status();
|
||||
let body = response.text().unwrap_or_default();
|
||||
let body_preview = if body.len() > 200 { &body[..200] } else { &body };
|
||||
log_event(&format!("Sync com backend falhou: {} - {}", status, body_preview));
|
||||
Err(RustdeskError::CommandFailed {
|
||||
command: "sync_remote_access".to_string(),
|
||||
status: Some(status.as_u16() as i32)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue