/* * sensord - Demone per il controllo dei sensori della piastra madre * */ #define DEBUG(x) ; #define NORMAL_DELAY 3*60 // Intervallo tra i controlli #define ALARM_DELAY 30 // Intervallo tra i controlli in caso di allarme #define MAX_ALARM 5 // Numero di allarmi prima dello spegnimento #include #include #include #include #include #include /*** Prototipi delle funzioni ***/ void Alarm (char *Motivo); /*** Variabili globali ***/ int Errore; int TotErrori; /*** Inizio del programma principale ***/ main() { FILE *File; char Stringa[80]; float Minimo; float Massimo; float Critico; float Valore; /*** Rilascio la shell da cui e' stato lanciato ***/ if (fork() != 0) return(0); /*** Ciclo infinito ***/ while(1) { Errore = 0; /*** Controllo il file con la temperatura ***/ if (!(File = fopen ("/proc/sys/dev/sensors/lm78-i2c-0-2d/temp", "r"))) { fprintf(stderr, "Errore aprendo il file della temperatura!\n"); exit(1); } else { fscanf(File, "%f %f %f", &Massimo, &Critico, &Valore); fclose(File); if (Valore > Critico) { sprintf (Stringa, "Temperatura interna: %d° C (soglia %d° C)", (int)Valore, (int)Critico); Alarm(Stringa); } DEBUG ( printf ("Temperatura : %d° C %s\n", (int)Valore, (ValoreMinimo) ? "OK" : "ALLARME"); ) } /*** Controllo il file con la tensione +3.3V ***/ if (!(File = fopen ("/proc/sys/dev/sensors/lm78-i2c-0-2d/in2", "r"))) { fprintf(stderr, "Errore aprendo il file della tensione 2!\n"); exit(1); } else { fscanf(File, "%f %f %f", &Minimo, &Massimo, &Valore); fclose(File); if (Valore < Minimo || Valore > Massimo) { sprintf (Stringa, "Tensione +3.3V: %.2f V (min %.2f V, max %.2f V)", Valore, Minimo, Massimo); Alarm(Stringa); } DEBUG ( printf ("+3.3V : %.2f V %s\n", Valore, (Valore>Minimo && Valore Massimo) { sprintf (Stringa, "Tensione +5V: %.2f V (min %.2f V, max %.2f V)", Valore*1.68, Minimo*1.68, Massimo*1.68); Alarm(Stringa); } DEBUG ( printf ("+5V : %.2f V %s\n", Valore*1.68, (Valore>Minimo && Valore Massimo) { sprintf (Stringa, "Tensione +12V: %.2f V (min %.2f V, max %.2f V)", Valore*3.8, Minimo*3.8, Massimo*3.8); Alarm(Stringa); } DEBUG ( printf ("+12V : %.2f V %s\n", Valore*3.8, (Valore>Minimo && Valore Massimo) { sprintf (Stringa, "Tensione -12V: %.2f V (min %.2f V, max %.2f V)", Valore*3.4768, Minimo*3.4768, Massimo*3.4768); Alarm(Stringa); } DEBUG ( printf ("-12V : -%.2f V %s\n", Valore*3.4768, (Valore>Minimo && Valore Massimo) { sprintf (Stringa, "Tensione -5V: %.2f V (min %.2f V, max %.2f V)", Valore*1.5049, Minimo*1.5049, Massimo*1.5049); Alarm(Stringa); } DEBUG ( printf ("-5V : -%.2f V %s\n", Valore*1.5049, (Valore>Minimo && Valore 0) sleep(ALARM_DELAY); else sleep(NORMAL_DELAY); } } /*** In caso di problema tutti gli utenti vengono avvisati ***/ void Alarm (char *Motivo) { FILE *Prog; /*** Scrive nel log di sistema ***/ syslog(LOG_ERR, Motivo); /*** Avvisa tutti gli utenti collegati ***/ Prog = popen("wall","w"); if (!Prog) Prog = stderr; fprintf(Prog, "ATTENZIONE: Individuato problema nei valori della scheda madre:\n"); fprintf(Prog, " %s\n", Motivo); if (TotErrori == (MAX_ALARM - 2)) fprintf(Prog, " Al prossimo controllo fallito il sistema verrą spento.\n"); else if (TotErrori == (MAX_ALARM - 1)) { fprintf(Prog, " Spegnimento immediato del sistema."); syslog(LOG_ERR, "Spegnimento immediato del sistema."); system ("/sbin/shutdown -h now"); } else fprintf(Prog, " Se il problema persiste il sistema verrą spento.\n"); if (Prog != stderr) pclose(Prog); Errore = 1; }