- Cliente Windows com modo silencioso e auto-start robusto - Backend Node.js + API REST - Frontend Next.js + Dashboard - Scripts PowerShell de configuração e diagnóstico - Documentação completa - Build scripts para Windows e Linux - Solução de auto-start após reinicialização Resolução do problema: Cliente não voltava ativo após reboot Solução: Registro do Windows + Task Scheduler + Modo silencioso
112 lines
4.7 KiB
JavaScript
112 lines
4.7 KiB
JavaScript
const { query } = require('./config/database');
|
|
|
|
(async () => {
|
|
try {
|
|
const deviceName = process.argv[2] || 'DESKTOP-BC16GDH';
|
|
|
|
console.log(`\n🔍 Verificando status do dispositivo: ${deviceName}\n`);
|
|
|
|
// Buscar informações do dispositivo
|
|
const deviceResult = await query(
|
|
`SELECT device_id, device_name, is_active, last_seen, created_at,
|
|
(SELECT name FROM users WHERE id = devices.user_id) as user_name
|
|
FROM devices
|
|
WHERE device_name = $1`,
|
|
[deviceName]
|
|
);
|
|
|
|
if (deviceResult.rows.length === 0) {
|
|
console.log(`❌ Dispositivo "${deviceName}" não encontrado no banco de dados\n`);
|
|
process.exit(1);
|
|
}
|
|
|
|
const device = deviceResult.rows[0];
|
|
|
|
console.log('📱 Informações do Dispositivo:');
|
|
console.log(` Nome: ${device.device_name}`);
|
|
console.log(` Device ID: ${device.device_id}`);
|
|
console.log(` Status (is_active): ${device.is_active ? '✅ Ativo' : '❌ Inativo'}`);
|
|
console.log(` Último Heartbeat: ${device.last_seen ? new Date(device.last_seen).toLocaleString('pt-BR') : '❌ Nunca'}`);
|
|
console.log(` Criado em: ${new Date(device.created_at).toLocaleString('pt-BR')}`);
|
|
console.log(` Usuário vinculado: ${device.user_name || 'Nenhum'}`);
|
|
|
|
// Calcular status real baseado em last_seen
|
|
let realStatus = false;
|
|
let statusMessage = '';
|
|
|
|
if (device.last_seen) {
|
|
const lastSeenDate = new Date(device.last_seen);
|
|
const now = new Date();
|
|
const diffMinutes = Math.floor((now - lastSeenDate) / 1000 / 60);
|
|
|
|
if (diffMinutes <= 5) {
|
|
realStatus = true;
|
|
statusMessage = `✅ ONLINE (último heartbeat há ${diffMinutes} minuto(s))`;
|
|
} else {
|
|
realStatus = false;
|
|
statusMessage = `❌ OFFLINE (último heartbeat há ${diffMinutes} minuto(s) - mais de 5 minutos)`;
|
|
}
|
|
} else {
|
|
realStatus = false;
|
|
statusMessage = '❌ OFFLINE (nunca recebeu heartbeat)';
|
|
}
|
|
|
|
console.log(`\n📊 Status Real: ${statusMessage}`);
|
|
|
|
// Verificar atividades recentes
|
|
const activitiesResult = await query(
|
|
`SELECT COUNT(*) as total,
|
|
MAX(timestamp) as ultima_atividade,
|
|
MIN(timestamp) as primeira_atividade
|
|
FROM activities
|
|
WHERE device_id = (SELECT id FROM devices WHERE device_name = $1)`,
|
|
[deviceName]
|
|
);
|
|
|
|
if (activitiesResult.rows[0].total > 0) {
|
|
const activities = activitiesResult.rows[0];
|
|
console.log(`\n📈 Atividades Registradas:`);
|
|
console.log(` Total: ${activities.total}`);
|
|
console.log(` Primeira: ${new Date(activities.primeira_atividade).toLocaleString('pt-BR')}`);
|
|
console.log(` Última: ${new Date(activities.ultima_atividade).toLocaleString('pt-BR')}`);
|
|
|
|
const lastActivityDate = new Date(activities.ultima_atividade);
|
|
const now = new Date();
|
|
const diffHours = Math.floor((now - lastActivityDate) / 1000 / 60 / 60);
|
|
const diffMinutes = Math.floor((now - lastActivityDate) / 1000 / 60) % 60;
|
|
|
|
if (diffHours > 0) {
|
|
console.log(` ⚠️ Última atividade há ${diffHours}h ${diffMinutes}min`);
|
|
} else {
|
|
console.log(` ✅ Última atividade há ${diffMinutes}min`);
|
|
}
|
|
} else {
|
|
console.log(`\n⚠️ Nenhuma atividade registrada para este dispositivo`);
|
|
}
|
|
|
|
// Verificar últimas 5 atividades
|
|
const recentActivities = await query(
|
|
`SELECT timestamp, application_name, window_title, idle_time_seconds
|
|
FROM activities
|
|
WHERE device_id = (SELECT id FROM devices WHERE device_name = $1)
|
|
ORDER BY timestamp DESC
|
|
LIMIT 5`,
|
|
[deviceName]
|
|
);
|
|
|
|
if (recentActivities.rows.length > 0) {
|
|
console.log(`\n📋 Últimas 5 Atividades:`);
|
|
recentActivities.rows.forEach((activity, index) => {
|
|
console.log(` ${index + 1}. ${new Date(activity.timestamp).toLocaleString('pt-BR')} - ${activity.application_name} - ${activity.window_title.substring(0, 50)}`);
|
|
});
|
|
}
|
|
|
|
console.log('\n');
|
|
process.exit(0);
|
|
} catch (error) {
|
|
console.error('❌ Erro:', error.message);
|
|
process.exit(1);
|
|
}
|
|
})();
|
|
|