La tOiLeB
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
#
# Partie serveur de l'outil d'exploitation
#
# Eric BURGHARD 28/12/2001

package require aster 1.1
package require dp 4.0

source svrcfg.tcl

proc LoginClient { file adr } {
	return 1
}
proc Stat path {
	file stat $path st
	return [array get st]
}
proc GetDirContents path {
	return [glob -nocomplain [file join $path *]]
}
proc HandleFileInput { filefd cli } {
	if {[eof $filefd]} {
	 fileevent $filefd readable {}
	 close $filefd
	 $cli Disconnect
	} else {
	 puts [$cli GetSock] [read $filefd]
	}
}
proc NewUserConnection { sock adr port } {
	# Procédure traitant les nouvelles demandes de connections
	# - envois asynchrones des résultats d'execution des services
	# - transferts de fichiers
	#
	
	set cli [Client new cli[Client Seq] $sock]
	fconfigure $sock -blocking 0 -buffering line
	fileevent $sock readable [list HandleUserInput $cli]
}
proc HandleUserInput cli {
	set sock [$cli GetSock]
	
	if {[eof $sock]} {
	 # supprime le client lorsque la fin de fichier est atteinte
	 $cli destroy
	} else {
	 set data [read $sock]
	 puts "data: \"$data\""
	 if {[regexp {^([A-Z]+) (.*$)} $data match key args]} {
	  # execute la commande envoyée par le client ($key C {SERVICE, GET, PUT})
	  eval $key $args $cli
	 }
	}
}
proc PUT { base_sid site_e site_d num cli } {
	# place une depeche dans le repertoire de reception
	# -> base_sid
	#    site_e
	#    site_d
	#    num
	
	set filename [file join [GetVal BALREC $base_sid] $base_d X_${site_e}_${site_d}_${num}.dat]
	
}
proc GET { path cli } {
	set filefd [open $path r]
	fconfigure $filefd -blocking 0 -buffering line
	fileevent $filefd readable [list HandleFileInput $filefd $cli]
	
}
proc SERVICE { class id cli } {
	# Procédure pour signifier à un service d'envoyer son activité vers $sock
	# -> class: Classe du type Service
	#    id:    identificateur du service
	#    sock:  socket client
	#
	[$class GetInst $id] Register [$cli GetSock]
}
# vérifie les arguments
switch $argc {
 0 {
  set port 5120
  set uport 5121
 }
 1 {
  set port [lindex $argv 0]
  set uport [expr $port + 1]
 }
 default {
  puts stderr "usage: [info script] \[port\]"
  exit 1
 }
}

# charge l'environnement global
GlobalSetEnv

# instancie les différents services
array set sites [GetVals SITE]
foreach base_sid_i [array names sites] {
 puts "scrutateur $base_sid_i"
 Scrut new scrut$base_sid_i $base_sid_i
}

# attend les RPCs sur le port $port
set rpc_srv [dp_MakeRPCServer $port LoginClient]
# attend les autres type de connection sur le port $uport
set usr_srv [socket -server NewUserConnection $uport]

# boucle indéfiniment
vwait forever

# ferme la connection vers les clients et la connexion RPC
foreach cli_i [Client allchildren] {
 $cli_i destroy
}
close $rpc_srv

# arrete tous les services
foreach serv_i [Service allchildren] {
 $serv_i destroy
}

exit