#!/usr/bin/perl

# $Id: faimond,v 1.2 2004/06/27 11:18:55 lange Exp $
#*********************************************************************
#
# faimond -- monitor daemon which collects client status info
#
# This script is part of FAI (Fully Automatic Installation)
# (c) 2003-2004 by Thomas Lange, lange@informatik.uni-koeln.de
# Universitaet zu Koeln
#
#*********************************************************************

#use strict;
use Socket;

$| = 1;
my $port = 4711;

@tasklist = qw/confdir defclass defvar partition mountdisks extrbase updatebase instsoft configure finish/;

%tasks = (
confdir => [' ', "Beziehe System-Einstellungen"],
defclass => [' ',"Definieren von Klassen"],
defvar => [' ',"Definieren von Variablen"],
partition => [' ',"Paritionieren der Festplatten"],
mountdisks => [' ',"Einbinden der Dateisysteme"],
extrbase => [' ',"Installieren des Basis-Systems"],
updatebase => [' ',"Aktualisieren des Basis-Systems"],
instsoft => [' ',"Installieren der Software"],
configure => [' ',"Abschlieende Konfiguration"],
finish => [' ',"Abschlieen der Installation"]
);

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub server_init() {

  my $proto = getprotobyname('tcp');
  socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
  setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1) or die "setsock: $!";

  my $paddr = sockaddr_in($port, INADDR_ANY);

  bind(SERVER, $paddr) or die "bind: $!";
  listen(SERVER, SOMAXCONN) or die "listen: $!";
#  print "FAI monitoring daemon started on port $port\n";
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub big_loop() {

  # accept a connection, print message received and close
  my ($client_addr,$inp);
  while ($client_addr = accept(CLIENT, SERVER)) {
    $inp = <CLIENT>;
    close CLIENT;
    ($host,$begend,$task,$ecode) = split /\s+/,$inp;
    chomp $ecode;
    $strecode = sprintf "%-3s",$ecode;
    $sym = ($begend =~ /TASKEND/) ? "   \\Z2OK\\Zn" : "   ->";
    $tasks{$task}[0] = $ecode ? " \\Z1E$strecode\\Zn" : $sym;
    showtab();

    # Stop if we've reached faiend
    if ( $task =~ /faiend/ ){
  	system("dialog --timeout 60 --msgbox '\nDie Installation wurde abgeschlossen. Drcken Sie die Eingabetaste um das System neu zu starten.' 8 60");
    	break;
    }
  }
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub showtab() {

# nach taskbeg soll es blinken, bei taskend, X oder error code

  my $pre = '--colors --title " Aktueller Installationsverlauf "';
  my $s2 = " --infobox \"\n";
  # show tabular %tasks

  $str = "$pre $s2";
  foreach (@tasklist) {
    $x = sprintf "%5s  $tasks{$_}[1]\n", $tasks{$_}[0];
    $str .= $x;
  }

  $str .=  "\" 14 50\n";
#  print $str;
  system("dialog $str");

}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

server_init;
big_loop;
