feat: Implementação completa do NoIdle - Cliente, Backend e Scripts
- 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
This commit is contained in:
111
backend/check_device_status.js
Normal file
111
backend/check_device_status.js
Normal file
@@ -0,0 +1,111 @@
|
||||
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);
|
||||
}
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user