blob: 84a71246b0c1f62b8d2dd56260e173d5f6c4631e [file] [log] [blame]
#pragma strong_types, save_types
#pragma no_clone, no_shadow
#include "/p/daemon/ch.h"
#include "/p/daemon/uptime_master.h"
/// Prototypen ///
void create();
void reset();
void SaveMaxUptime();
mapping QuerMaxUptime();
/// Globale Variablen ///
static int next_save_uptime;
static int max_uptime_reached;
static int last_record_boot;
/// Funktionen ///
void create()
{
seteuid(getuid(this_object()));
reset();
}
void reset()
{
call_out("SaveMaxUptime",1);
set_next_reset(300);
}
// Ist eine Rekord-Uptime erreicht, wird diese hier gespeichert.
void SaveMaxUptime()
{
int max_shut, max_boot;
// Lohnt es, schon wieder zu pruefen?
if (time()>next_save_uptime)
{
// Initialisieren
if (next_save_uptime==0)
{
DEBUG("Masterinit");
// Zeit berechnen, ab der ein Rekord aufgestellt ist.
// Vorher braucht nixhts mehr geprueft werden
sscanf(read_file(MAX_UPTIME)||"0 0","%d %d",last_record_boot, max_shut);
next_save_uptime=last_reboot_time()+(max_shut-last_record_boot)+1;
} else {
DEBUG("Rekord neu speichern.");
// Neuen Rekord in Datei schreiben.
catch(rm(MAX_UPTIME);publish);
write_file(MAX_UPTIME, last_reboot_time()+" "+time());
// Jetzt checken, ob die Uptime grade geknackt wurde ...
// Wenn ja, dann eine Meldung an den Master
if(last_reboot_time()!=last_record_boot)
{
DEBUG("Rekordmeldung. MB:"+last_record_boot+" LU:"+last_reboot_time());
// Nur einmal pro Rekord Uptime melden ...
last_record_boot=last_reboot_time();
// Hurraaah :)
CHMASTER->join(RECORD_CHANNEL,this_object());
CHMASTER->send(RECORD_CHANNEL,this_object(),
"[<MasteR>:Lars] Wow, eine Rekord-Uptime.\n"
"[<MasteR>:Merlin] Das erlebt man auch nicht alle Tage ...\n"
"[<MasteR>:Der GameDriver] Dann wird es wohl Zeit fuer einen Reboot, oder?\n"
"[<MasteR>:Merlin] Faules Stueck, arbeite weiter!\n"
"[<MasteR>:Der GameDriver] Och menno!",
MSG_EMPTY);
CHMASTER->leave(RECORD_CHANNEL,this_object());
}
}
}
}
// Gibt Daten zur bisher maximalen Uptime zurueck: (299 Ticks)
// 1.) Wann wurde gebootet
// 2.) Wann endete die Uptime
// 3.) Wann wird dieser Rekord gebrochen?
// 4.) Dauer der Uptime als lesbarer String.
mapping QueryMaxUptime()
{
int t, tmp, max_boot, max_shut;
string s;
sscanf(read_file(MAX_UPTIME)||"0 0","%d %d",max_boot, max_shut);
t=max_shut-max_boot;
s="";
if (t>=86400)
s+=sprintf("%d Tag%s, ",tmp=t/86400,(tmp==1?"":"e"));
if (t>=3600)
s+=sprintf("%d Stunde%s, ",tmp=(t=t%86400)/3600,(tmp==1?"":"n"));
if (t>60)
s+=sprintf("%d Minute%s und ",tmp=(t=t%3600)/60,(tmp==1?"":"n"));
s+=sprintf("%d Sekunde%s",t=t%60,(t==1?"":"n"));
return (["beginn":max_boot,
"ende":max_shut,
"naechster rekord":last_reboot_time()+(max_shut-max_boot),
"rekord als string":s]);
}