- Timestamp:
- 07/19/12 16:02:21 (12 years ago)
- Location:
- TOOLS/PACK_IPSL
- Files:
-
- 2 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
TOOLS/PACK_IPSL/DEM_utilities.sh
r1729 r1822 132 132 } 133 133 134 # gpdebug : fonctions de gestion des erreurs ######################################################## 135 function DEM_errorSend { 136 # Envoi d'un msg d'erreur au programme principal. 137 # Suppression des processus du programme principal au fils emetteur de l'erreur 138 139 echo "########## DEM_errorSend : Error detected ==> Sending an error..." 140 141 msgToSend=${1} 142 listPIDtoKill=${2} 143 if [ "x${listPIDtoKill}" == "x" ] 144 then 145 listPIDtoKill=${listPID} 146 fi 147 # -------------------------------- 148 # Verif du format de listPIDtoKill 149 # -------------------------------- 150 listPIDformat='^[[:digit:]]*\([[:blank:]][[:digit:]]*\)*$' 151 isListPIDformatOK=`echo ${listPIDtoKill} | grep -e ${listPIDformat} | wc -l ` 152 if [ "x$isListPIDformatOK" == "x0" ] 153 then 154 echo " Attention : le format de la liste de PID est incorrecte :" 155 echo " $listPIDtoKill" 156 kill -TERM ${listPID} 157 fi 158 159 160 # ----------------------------------- 161 # Verif du Format du ${msgToSend} 162 # ----------------------------------- 163 errorFormat='^[^:]*\.sh:[[:digit:]]*:.*$' 164 isErrorFormatOK=`echo ${msgToSend} | grep -e ${errorFormat} | wc -l ` 165 if [ "x$isErrorFormatOK" == "x0" ] 166 then 167 echo " Attention : le format du message d'erreur est incorrect :" 168 echo " $msgToSend" 169 fi 170 171 # Envoi du msg dans le fichier d'erreur 172 # ------------------------------------- 173 # test sur la var contenant le nom du fichier d'erreur 174 if [ "x${errorMsgFile}" != "x${PWD}/errorMsg.txt" ] 175 then 176 echo " Le fichier d'erreur a un nom incorrect" 177 fi 178 179 echo $msgToSend > $errorMsgFile 180 181 echo "killing ${listPIDtoKill}" 182 kill -TERM ${listPIDtoKill} 183 184 exit -1 # utile : sinon le script qui appelle cette fonction continue un peu l'exec --> pas propre 185 } 186 187 function DEM_errorReceive { 188 # Récupération et affichage du msg d'erreur emis par un processus fils 189 190 # Lecture du msg dans le fichier d'erreur 191 # --------------------------------------- 192 # test sur la var contenant le nom du fichier d'erreur 193 if [ "x${errorMsgFile}" != "x${PWD}/errorMsg.txt" ] 194 then 195 echo " Le fichier d'erreur a un nom incorrect" 196 exit -1 197 fi 198 199 # Lecture 200 errorReceived=`cat $errorMsgFile ` 201 202 # ----------------------------------- 203 # Verif du Format du ${errorReceived} 204 # ----------------------------------- 205 errorFormat='^[^:]*\.sh:[[:digit:]]*:.*$' 206 isErrorFormatOK=`echo ${errorReceived} | grep -e ${errorFormat} | wc -l ` 207 if [ "x$isErrorFormatOK" == "x0" ] 208 then 209 echo " Attention : le format du message d'erreur est incorrect :" 210 echo " $errorReceived" 211 exit -1 212 fi 213 214 echo "########## DEM_errorReceive : $SCRIPT_NAME received an error..." 215 echo $errorReceived 216 217 # echo "Current PID:$$" 218 # echo "FatherPID:$FatherPID" 219 # On fait un bilan de la progression seulement si c'est une erreur bloquante : lorsque le proc pere est tue. 220 if [ "x${FatherPID}" == "x$$" ] 221 then 222 ./showListsProgress.sh $FileParam 223 fi 224 225 exit -1 226 } 227 228 # Verification de la version de nco chargee 229 function check_nco_version 230 { 231 # nom du présent prog (pour gestion des erreurs) 232 PROGNAME="DEM_utilities.sh" ######### 233 . /etc/profile 234 module list >& myModuleList.txt 235 236 if [ "x$?" != "x0" ] 237 then 238 # echo "La commande module list a rencontre un pb !" 239 DEM_errorSend "${PROGNAME}:${LINENO}:La commande module list a rencontre un pb !" 240 fi 241 242 if [ ! -e myModuleList.txt ] 243 then 244 # echo "Le fichier 'myModuleList.txt' n existe pas" 245 DEM_errorSend "${PROGNAME}:${LINENO}:Le fichier 'myModuleList.txt' n'existe pas." 246 fi 247 248 # Presence de la chaine "n) nco/" ou n est un nombre 249 ncoLines=` grep -e '[[:digit:]]*) nco/' myModuleList.txt ` 250 # ncoLines=` grep -e '[[:digit:]]*) nco/' moduleList.txt ` 251 # echo "ncoLines=${ncoLines}|" 252 # echo "----------------------------------------" 253 254 # Plus besoin du myModuleList.txt 255 rm -f myModuleList.txt 256 257 # La chaine "nco" est remplacee par le caractere "#" 258 temp1=`echo $ncoLines | sed 's;nco;#;g' ` 259 # echo "$temp1" 260 # echo "----------------------------------------" 261 262 # On supprime tout ce qui n'est pas "n) #/..." avec n un nombre et "..." une chaine sans blanc 263 temp2=`echo $temp1 | sed 's;[[:blank:]]*[[:digit:]]*) [^#][^[:blank:]]*;;g' ` 264 # echo "$temp2" 265 # echo "----------------------------------------" 266 267 268 # Recuperation du numero de version du nco au format x.y.z 269 # C'est une liste de num de version (a priori ici, il pourrait y en avoir plusieurs, 270 # mais dans les faits, les nco s'excluent les uns les autres) 271 temp3=`echo $temp2 | sed 's;[[:blank:]]*[[:digit:]]*) #/;|;g' ` 272 temp3=`echo $temp3 | sed 's;^|;;g' ` 273 temp3=`echo $temp3 | sed 's;|; ;g' ` 274 # echo "$temp3" 275 # echo "----------------------------------------" 276 277 # comptage du nombre de nco 278 versionNCO= 279 count=0 280 for ver in $temp3 281 do 282 # echo "ver=$ver" 283 versionNCO=$ver 284 count=$(( $count + 1 )) 285 done 286 # echo "count=$count" 287 288 # si aucun nco n'est charge, on sort. 289 if [ $count -eq 0 ] 290 then 291 # echo "nco pas charge" 292 DEM_errorSend "${PROGNAME}:${LINENO}:Aucun nco n'est charge" 293 fi 294 295 # si plus d'un nco sont charges, on sort (n'arrive jamais en pratique). 296 if [ $count -gt 1 ] 297 then 298 DEM_errorSend "${PROGNAME}:${LINENO}:Au moins 2 versions de nco sont chargees" 299 fi 300 301 # Si un seul nco est charge, on supprime les "." de son numero de version (x.y.z ==> xyz) 302 verNCOnumber=`echo $versionNCO | sed 's;[^[:digit:]];;g' ` 303 # echo "versionNCO=$versionNCO" 304 305 # On verifie que xyz est un nombre a 3 chiffres 306 if ! [[ "$verNCOnumber" =~ ^[0-9]\{3\}$ ]] 307 then 308 # echo "verNCOnumber is not a number" 309 DEM_errorSend "${PROGNAME}:${LINENO}:La variable verNCOnumber n'est pas un nombre --> $verNCOnumber" 310 fi 311 312 313 # On verifie que le num de version est >= 4.1.0 314 if [ $verNCOnumber -lt 410 ] 315 then 316 # echo "version < 4.1.0 . STOP." 317 DEM_errorSend "${PROGNAME}:${LINENO}:La version de nco < 4.1.0 ==> $versionNCO" 318 fi 319 320 echo "La version de nco chargee est : $versionNCO" 321 322 } 323 324 function prepareMonitoringDir 325 { 326 # nom du présent prog (pour gestion des erreurs) 327 PROGNAME="DEM_utilities.sh" ######### 328 329 MonitoringDirDefined=`echo $MonitoringDir | grep "SuiviListes" | wc -l ` 330 if [ "x${workFlowDirDefined}" == "x0" ] 331 then 332 DEM_errorSend "${PROGNAME}:${LINENO}:Le repertoire de suivi est mal defini." 333 fi 334 335 # Si l'option de forcage de toute les etapes est activee, 336 # on vide le fichier 337 if [ "x${execEveryStep}" == "x1" ] 338 then 339 echo "${MonitoringDir}:destruction..." 340 rm -rf ${MonitoringDir} 341 fi 342 343 # Si le rep de suivi n'existe pas, on le créé. 344 if [ ! -d ${MonitoringDir} ] 345 then 346 mkdir ${MonitoringDir} 347 fi 348 349 } 350 351 function generalMonitoring 352 { 353 # Si l'etape courante a ete executee (correctement), on sort du script appelant cette fonction 354 355 # nom du présent prog (pour gestion des erreurs) 356 PROGNAME="DEM_utilities.sh" ######### 357 358 currentStep=${1} 359 360 stepMsg=`echo $currentStep | grep -e '^.*\.sh-->OK$' | wc -l ` 361 if [ "x{stepMsg}" == "x0" ] 362 then 363 DEM_errorSend "${PROGNAME}:${LINENO}:Le nom de l'etape courante n'est pas au bon format !" 364 fi 365 366 currentStepScriptName=`echo $currentStep | sed 's;\.sh-->OK;;' ` 367 368 # si le fichier de suivi general n'existe pas, il n'y a pas eu de passage de script de liste avant. 369 # ==> on sort normalement 370 if [ ! -e ${generalMonitorFile} ] 371 then 372 return 0 373 fi 374 375 currentStepPassed=`grep ${currentStep} ${generalMonitorFile} | wc -l ` 376 377 if [ "x${currentStepPassed}" != "x0" ] 378 then 379 echo "${currentStepScriptName} a deja ete passee ..." 380 exit 0 381 fi 382 383 } 384 385 function createListingMonitoring_Check 386 { 387 388 # La presence de createListingOK.txt dans le sous rep (associe a un rep de param_AC.txt) du rep de suivi 389 # indique que le bon deroulement de l'action de create_listing.sh sur le repertoire de param_AC.txt 390 DIR=$(basename ${1}) 391 MonitSubDir=${MonitoringDir}/${DIR} 392 393 createListingOK=${MonitSubDir}/createListingOK.txt 394 395 if [ -e $createListingOK ] 396 then 397 echo "create_listing a deja ete passe pour ${DIR}..." 398 exit 0 399 fi 400 401 } 402 403 function createListingMonitoring_OK 404 { 405 406 # A partir du nom du rep courant (contenant des res de simulation), creation d'un sous rep de suivi 407 DIR=$(basename ${1}) 408 MonitSubDir=${MonitoringDir}/${DIR} 409 mkdir $MonitSubDir 410 411 # dans ce sous rep de suivi, creation d'un fichier dont la presence indique le bon deroulement 412 # de l'action de create_listing.sh sur le repertoire en argument (celui contenant des simus) 413 createListingOK=${MonitSubDir}/createListingOK.txt 414 touch $createListingOK 415 416 } 417 418 function simuMonitoring_check 419 { 420 # nom du présent prog (pour gestion des erreurs) 421 PROGNAME="DEM_utilities.sh" ######### 422 423 currentStep=${1} 424 config=${2} 425 # echo "######### simuMonitoring_check --> config:$config" 426 # former le nom du fichier de suivi de la simu a partir de "config" 427 getSimuMonitFileName $config 428 429 # si le fichier de suivi de simu n'existe pas, il n'y a pas eu de passage de script de liste avant. 430 # ==> on sort normalement 431 if [ ! -e ${simuMonitoringFile} ] 432 then 433 return 0 434 fi 435 436 stepMsg=`echo $currentStep | grep -e '^.*\.sh-->OK$' | wc -l ` 437 if [ "x{stepMsg}" == "x0" ] 438 then 439 DEM_errorSend "${PROGNAME}:${LINENO}:Le nom de l'etape courante n'est pas au bon format !" 440 fi 441 442 currentStepScriptName=`echo $currentStep | sed 's;\.sh-->OK;;' ` 443 444 currentStepPassed=`grep ${currentStep} ${simuMonitoringFile} | wc -l ` 445 446 # echo "######### simuMonitoring_check --> currentStep:$currentStep" 447 # echo "######### simuMonitoring_check --> simuMonitoringFile:$simuMonitoringFile" 448 # echo "######### simuMonitoring_check --> currentStepPassed:$currentStepPassed" 449 if [ "x${currentStepPassed}" != "x0" ] 450 then 451 echo "${currentStepScriptName} a deja ete passee ..." 452 # echo "-----------------------------------------------------------------------------" 453 exit 0 454 fi 455 456 } 457 458 function simuMonitoring_OK 459 { 460 currentStep=${1} 461 config=${2} 462 # echo "######### simuMonitoring_OK --> config:$config" 463 # former le nom du fichier de suivi de la simu a partir de "config" 464 getSimuMonitFileName $config 465 466 echo $currentStep >> $simuMonitoringFile 467 } 468 469 function getSimuMonitFileName 470 { 471 # nom du présent prog (pour gestion des erreurs) 472 PROGNAME="DEM_utilities.sh" ######### 473 474 config=${1} 475 # echo "######### getSimuMonitFileName --> config:$config" 476 configBaseName=$(basename ${config}) 477 478 # On cherche dans quel sous rep du rep de suivi on va chercher le fichier de suivi de la simu 479 listMonitSubDir=`ls -l ${MonitoringDir} | grep -e '^d' | awk '{print $NF}' ` 480 481 # echo "######### getSimuMonitFileName --> listMonitSubDir:$listMonitSubDir" 482 483 searchedDir= 484 for dir in $listMonitSubDir 485 do 486 found=`echo $config | grep "/${dir}/" | wc -l ` 487 if [ "x${found}" != "x0" ] 488 then 489 searchedDir=$dir 490 break 491 fi 492 done 493 494 if [ "x$searchedDir" == "x" ] 495 then 496 DEM_errorSend "${PROGNAME}:${LINENO}:Sous rep de suivi non trouve !" 497 fi 498 499 # On forme le nom du fichier de suivi pour la simu courante 500 # ... on debarasse config du fichier de config 501 repConfig=$(dirname $config) 502 # ... on supprime du path tout ce qui est devant le nom du sous rep 503 simu=`echo $repConfig | sed "s;^.*/$searchedDir;$searchedDir;" ` 504 # ... remplacement des "/" par des "_#_" (les "/" ne sont pas acceptes dans les noms de fichiers) 505 simuMonitoringFile=`echo $simu | sed 's;/;_#_;g' ` 506 # ... On rajoute un ".txt" a la fin du nom de fichier 507 simuMonitoringFile="${simuMonitoringFile}.txt" 508 509 simuMonitoringFile="${MonitoringDir}/${searchedDir}/${simuMonitoringFile}" 510 } 511 512 # gpdebug : fin ##################################################################################### 513 -
TOOLS/PACK_IPSL/archive_debug.sh
r1763 r1822 22 22 23 23 source ${EXE_DIR}/DEM_utilities.sh 24 25 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 26 MonitoringInfo="${SCRIPT_NAME}-->OK" 27 simuMonitoring_check "$MonitoringInfo" "$config_card" 24 28 25 29 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" … … 167 171 168 172 cd ${EXE_DIR} 173 174 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 175 simuMonitoring_OK "$MonitoringInfo" "$config_card" -
TOOLS/PACK_IPSL/archive_restart.sh
r1774 r1822 39 39 40 40 source ${EXE_DIR}/DEM_utilities.sh 41 42 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 43 MonitoringInfo="${SCRIPT_NAME}-->OK" 44 simuMonitoring_check "$MonitoringInfo" "$config_card" 41 45 42 46 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" … … 160 164 161 165 cd ${EXE_DIR} 166 167 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 168 simuMonitoring_OK "$MonitoringInfo" "$config_card" -
TOOLS/PACK_IPSL/calcul_size_simul.sh
r1714 r1822 17 17 SCRIPT_NAME=$(basename ${0} ) 18 18 source ${EXE_DIR}/DEM_utilities.sh 19 20 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 21 MonitoringInfo="${SCRIPT_NAME}-->OK" 22 simuMonitoring_check "$MonitoringInfo" "$config_card" 23 19 24 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" 20 25 … … 44 49 45 50 fi 51 52 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 53 simuMonitoring_OK "$MonitoringInfo" "$config_card" 54 46 55 DEM_log -0 "Fin de ${SCRIPT_NAME}" -
TOOLS/PACK_IPSL/create_config_card.sh
r1764 r1822 25 25 SCRIPT_NAME=$(basename ${0} ) 26 26 source ${EXE_DIR}/DEM_utilities.sh 27 28 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 29 MonitoringInfo="${SCRIPT_NAME}-->OK" 30 generalMonitoring "$MonitoringInfo" 31 27 32 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" 33 34 # gpdebug : on augmente la liste des proc à détruire en cas d'erreur bloquante du présent proc 35 export listPID="$$ ${listPID}" ######### 36 28 37 cd ${JOB_DIR} 29 38 # ---- … … 212 221 done 213 222 223 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 224 echo $MonitoringInfo >> $generalMonitorFile 225 214 226 DEM_log -0 "Fin de ${SCRIPT_NAME}" 215 227 -
TOOLS/PACK_IPSL/create_listing.sh
r1773 r1822 14 14 15 15 source ${EXE_DIR}/DEM_utilities.sh 16 17 # gpdebug : verif si le present script a ete execute jusqu'au bout, sinon on sort ######### 18 createListingMonitoring_Check "$REPtoList" 19 16 20 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" 17 21 22 # gpdebug : on augmente la liste des proc à détruire en cas d'erreur bloquante du présent proc 23 export listPID="$$ ${listPID}" ######### 24 25 echo "gpdebug : REPtoList=$REPtoList" # gpdebug : a virer 18 26 find $REPtoList -printf "%y %s %p \n" >> ${IGCM_DEM}/Listing.txt 19 27 … … 31 39 32 40 41 # gpdebug : le script n'a pas rencontre d'erreur. On créé un fichier de suivi pour create_listing dans le rep de suivi ########## 42 createListingMonitoring_OK "$REPtoList" 43 33 44 DEM_log -0 "Fin de ${SCRIPT_NAME}" 34 45 -
TOOLS/PACK_IPSL/enlarge_my_files.sh
r1768 r1822 89 89 } 90 90 91 # gpdebug : pour test showPackProgress.sh ************************* 92 export RANDOM=$$ 93 94 function gives_0_or_1 95 { 96 bit=-1 97 let "bit = RANDOM % 2" 98 echo $bit 99 } 100 101 resultCmd= 102 # gpdebug : ****************************** fin ******************** 103 104 105 #********** gpdebug : mesure d'intervalles de temps *************** 106 function getDateMilliSeconds 107 { 108 test=`date +%s%N` 109 testnum=${#test} 110 millisec=${test:0:$testnum-6} 111 echo "$millisec" 112 } 113 114 function getTimeDiffSeconds 115 { 116 startTimeMilliSec=$1 117 endTimeMilliSec=$( getDateMilliSeconds ) 118 119 diffMilliSec=$(( $endTimeMilliSec - $startTimeMilliSec )) 120 121 diffSeconds=$(awk 'BEGIN { print '$diffMilliSec'/'1000' }') 122 echo "$diffSeconds" 123 124 } 125 # gpdebug : ****************************** fin ******************** 91 126 #------------------------------------------------------ 92 127 for set in $( ls $PATH_SIMU/output_ncrcat/*list ) ; do … … 158 193 # Try 2 times before fire "FAILED" 159 194 ncrcatcmd=ncrcat 160 ncrcatoptions="--md5_digest" 161 # ncrcatoptions="" 162 163 cat $set | $ncrcatcmd $ncrcatoptions -O -x -v $varstoexclude -o $outputfile > $logfile 2>&1 195 # ncrcatoptions="--md5_digest" 196 ncrcatoptions="" 197 198 startTime=$( getDateMilliSeconds ) # gpdebug : time 199 cat $set | $ncrcatcmd $ncrcatoptions -O -x -v $varstoexclude -o $outputfile > $logfile 2>&1 # gpdebug : a retablir 200 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : time 201 202 # resultCmd=$( gives_0_or_1 ) 203 # resultCmd=1 204 # if [ $resultCmd -eq 0 ] ; then 164 205 if [ $? -eq 0 ] ; then 206 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 165 207 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 166 208 echo "DONE ; $datestr1 ; $datestr2 ; cat $set | $ncrcatcmd $ncrcatoptions -O -x -v '$varstoexclude' -o $outputfile ; $logfile ; $extratar" >> $statusfile … … 169 211 else 170 212 # Add --md5_digest 171 cat $set | $ncrcatcmd $ncrcatoptions -O -x -v $varstoexclude -o $outputfile > $logfile 2>&1 213 startTime=$( getDateMilliSeconds ) # gpdebug : time 214 cat $set | $ncrcatcmd $ncrcatoptions -O -x -v $varstoexclude -o $outputfile > $logfile 2>&1 # gpdebug : a retablir 215 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : time 216 # resultCmd=$( gives_0_or_1 ) 217 # resultCmd=1 218 # if [ $resultCmd -eq 0 ] ; then 172 219 if [ $? -eq 0 ] ; then 220 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 173 221 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 174 222 echo "DONE ; $datestr1 ; $datestr2 ; cat $set | $ncrcatcmd $ncrcatoptions -O -x -v '$varstoexclude' -o $outputfile ; $logfile ; $extratar" >> $statusfile … … 178 226 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 179 227 echo "====> FAILED at try #$nbtries" 180 echo "FAILED ; $datestr1 ; $datestr2 ; cat $set | $ncrcatcmd $ncrcatoptions -O -x -v '$varstoexclude' -o $outputfile ; $logfile ; $extratar" >> $statusfile228 echo "FAILED at try #$nbtries ; $datestr1 ; $datestr2 ; cat $set | $ncrcatcmd $ncrcatoptions -O -x -v '$varstoexclude' -o $outputfile ; $logfile ; $extratar" >> $statusfile 181 229 if [ $nbtries -ge $maxtries ] ; then 182 230 echo "====> DELEGATE to tar command after $nbtries tries (maxtries=$maxtries)" 183 231 echo "DELEGATE to tar command after $nbtries tries (maxtries=$maxtries)" >> $statusfile 184 cp $set $PATH_SIMU/output_tar232 # cp $set $PATH_SIMU/output_tar # gpdebug : a retablir 185 233 fi 186 234 fi … … 238 286 # Waiting for CCRT command 239 287 tarcmd=tar 240 taroptions="--format=posix -W -cf"241 288 # taroptions="--format=posix -W -cf" 289 taroptions="--format=posix -cf" 242 290 cd $dirinputfile 243 291 … … 248 296 249 297 # #----------------------------------- 250 251 $tarcmd $taroptions $outputfile --dereference --files-from $set.local > $logfile 2>&1 298 startTime=$( getDateMilliSeconds ) # gpdebug : time 299 $tarcmd $taroptions $outputfile --dereference --files-from $set.local > $logfile 2>&1 # gpdebug : a retablir 300 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : time 301 302 # resultCmd=$( gives_0_or_1 ) 303 # if [ $resultCmd -eq 0 ] ; then 252 304 if [ $? -eq 0 ] ; then 305 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 253 306 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 254 307 echo "DONE ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set); $logfile" >> $statusfile … … 258 311 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 259 312 echo "====> FAILED at try #$nbtries" 260 echo "FAILED ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set) ; $logfile" >> $statusfile313 echo "FAILED at try #$nbtries ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set) ; $logfile" >> $statusfile 261 314 262 315 fi … … 314 367 # Waiting for CCRT command 315 368 tarcmd=tar 316 taroptions="--format=posix -W -cf"317 369 # taroptions="--format=posix -W -cf" 370 taroptions="--format=posix -cf" 318 371 cd $dirin1 319 372 # ls 320 373 321 $tarcmd $taroptions $outputfile --dereference --files-from $set > $logfile 2>&1 374 startTime=$( getDateMilliSeconds ) # gpdebug : time 375 $tarcmd $taroptions $outputfile --dereference --files-from $set > $logfile 2>&1 # gpdebug : a retablir 376 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : time 377 378 # resultCmd=$( gives_0_or_1 ) 379 # if [ $resultCmd -eq 0 ] ; then 322 380 if [ $? -eq 0 ] ; then 381 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 323 382 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 324 383 echo "DONE ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set); $logfile" >> $statusfile … … 328 387 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 329 388 echo "====> FAILED at try #$nbtries" 330 echo "FAILED ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set) ; $logfile" >> $statusfile389 echo "FAILED at try #$nbtries ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set) ; $logfile" >> $statusfile 331 390 332 391 fi … … 382 441 # Waiting for CCRT command 383 442 tarcmd=tar 384 taroptions="--format=posix -W -cf"385 443 # taroptions="--format=posix -W -cf" 444 taroptions="--format=posix -cf" 386 445 cd $dirin1 387 446 # ls 388 389 $tarcmd $taroptions $outputfile --dereference --files-from $set > $logfile 2>&1 447 448 startTime=$( getDateMilliSeconds ) # gpdebug : time 449 $tarcmd $taroptions $outputfile --dereference --files-from $set > $logfile 2>&1 # gpdebug : a retablir 450 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : time 451 452 # resultCmd=$( gives_0_or_1 ) 453 # if [ $resultCmd -eq 0 ] ; then 390 454 if [ $? -eq 0 ] ; then 455 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 391 456 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 392 457 echo "DONE ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set); $logfile" >> $statusfile … … 396 461 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 397 462 echo "====> FAILED at try #$nbtries" 398 echo "FAILED ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set) ; $logfile" >> $statusfile463 echo "FAILED at try #$nbtries ; $datestr1 ; $datestr2 ; $tarcmd $taroptions $outputfile $(cat $set) ; $logfile" >> $statusfile 399 464 400 465 fi … … 447 512 cpcmd="cp " 448 513 cpoptions="-rf" 449 $cpcmd $cpoptions $file $diroutputfile > $logfile 2>&1 514 startTime=$( getDateMilliSeconds ) # gpdebug : time 515 $cpcmd $cpoptions $file $diroutputfile > $logfile 2>&1 # gpdebug : a retablir 516 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : time 450 517 done 451 518 519 # resultCmd=$( gives_0_or_1 ) 520 # if [ $resultCmd -eq 0 ] ; then 452 521 if [ $? -eq 0 ] ; then 522 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 453 523 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 454 524 echo "DONE ; $datestr1 ; $datestr2 ; $cpcmd $cpoptions $file $diroutputfile ; $logfile" >> $statusfile … … 458 528 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 459 529 echo "====> FAILED at try #$nbtries" 460 echo "FAILED ; $datestr1 ; $datestr2 ; $cpcmd $cpoptions $file $diroutputfile ; $logfile" >> $statusfile530 echo "FAILED at try #$nbtries ; $datestr1 ; $datestr2 ; $cpcmd $cpoptions $file $diroutputfile ; $logfile" >> $statusfile 461 531 462 532 fi … … 509 579 cpcmd="cp " 510 580 cpoptions="-rf" 511 $cpcmd $cpoptions $file $diroutputfile > $logfile 2>&1 581 startTime=$( getDateMilliSeconds ) # gpdebug : time 582 $cpcmd $cpoptions $file $diroutputfile > $logfile 2>&1 # gpdebug : a retablir 583 meantime=$( getTimeDiffSeconds $startTime ) # gpdebug : timeS 512 584 done 513 585 586 # resultCmd=$( gives_0_or_1 ) 587 # if [ $resultCmd -eq 0 ] ; then 514 588 if [ $? -eq 0 ] ; then 589 sed -i "1i\meantime:${meantime}" $statusfile # gpdebug : time 515 590 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 516 591 echo "DONE ; $datestr1 ; $datestr2 ; $cpcmd $cpoptions $file $diroutputfile ; $logfile" >> $statusfile … … 520 595 datestr2=`LC_ALL=C date +"%Y-%m-%dT%H:%M:%S"` 521 596 echo "====> FAILED at try #$nbtries" 522 echo "FAILED ; $datestr1 ; $datestr2 ; $cpcmd $cpoptions $file $diroutputfile ; $logfile" >> $statusfile597 echo "FAILED at try #$nbtries ; $datestr1 ; $datestr2 ; $cpcmd $cpoptions $file $diroutputfile ; $logfile" >> $statusfile 523 598 524 599 fi -
TOOLS/PACK_IPSL/find_directory_simul.sh
r1717 r1822 1 1 #!/bin/bash 2 2 # set -vx # gpdebug : a virer ######## 3 3 # prend en argument le path et le nom d'un fichier param (argument de la commande 4 4 # ccc_archive avec option ipsl_pack) … … 23 23 SCRIPT_NAME=$(basename ${0} ) 24 24 source ${EXE_DIR}/DEM_utilities.sh 25 26 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 27 MonitoringInfo="${SCRIPT_NAME}-->OK" 28 generalMonitoring "$MonitoringInfo" 29 25 30 DEM_log -0 "Demmarrage de ${SCRIPT_NAME}" 31 26 32 cd ${JOB_DIR} 27 33 # ---- 34 # gpdebug : Execute la function errorReceive() si reception d'un signal TERM 35 trap 'DEM_errorReceive' TERM ######## 36 37 # gpdebug : on augmente la liste des proc à détruire en cas d'erreur bloquante du présent proc 38 export listPID="$$ ${listPID}" ######### 28 39 29 40 LISTE_SIMUL=${1} … … 32 43 LISTE_SIMUL_NAME=$(basename ${LISTE_SIMUL} ) 33 44 34 45 echo "gpdebug : ${IGCM_TMP}/${$}.liste_Restart.txt" # gpdebug : a virer ####### 35 46 36 47 # Pour tous les fichiers ou repertoires contenus dans le fichier de parametres 37 48 for DIR in $( awk '{print $0}' ${LISTE_SIMUL} ) ; do 38 49 DEM_log -1 ${SCRIPT_NAME} - Inspection de ${DIR}"/" 39 # trouve la liste des répertoires restart sous l'arborescence 40 grep ${DIR}"/" ${LISTE_DMNFS} | grep Restart | awk '{print $3}' | sed 's%/Restart.*%%' >> ${IGCM_TMP}/${$}.liste_Restart.txt 50 # trouve la liste des repertoires restart sous l'arborescence 51 52 # grep ${DIR}"/" ${LISTE_DMNFS} | grep Restart | awk '{print $3}' | sed 's%/Restart.*%%' >> ${IGCM_TMP}/${$}.liste_Restart.txt # gpdebug : suppr 53 54 # gpdebug : s'il n'y a pas de rep Restart, on saute ############################################################################### 55 listRestart=`grep ${DIR}"/" ${LISTE_DMNFS} | grep Restart | awk '{print $3}' | sed 's%/Restart.*%%' ` 56 # arnaud : on teste si il y a des fichiers dans les repertoires Restart 57 nb_restart_non_vide=0 58 for irestart in $listRestart 59 do 60 if [ `find $irestart/Restart -type f | wc -l` -ne 0 ] ; 61 then 62 (( nb_restart_non_vide = nb_restart_non_vide + 1 )) 63 continue 64 fi 65 done 66 67 if ( [ "x${listRestart}" == "x" ] || [ $nb_restart_non_vide -eq 0 ] ) ; 68 then 69 # DEM_errorSend "${SCRIPT_NAME}:${LINENO}:Pas de Repertoire Restart dans ${DIR}" "${$}" # gpdebug : a virer ######## 70 echo "########## Attention :" 71 echo "${SCRIPT_NAME}:${LINENO}:Pas de Repertoire Restart ou de fichiers Restart dans ${DIR}" 72 continue 73 fi 74 echo "${listRestart}" >> ${IGCM_TMP}/${$}.liste_Restart.txt 75 # gpdebug : fin ######################################################################################################################### 76 done 77 # DEM_errorSend "${SCRIPT_NAME}:${LINENO}:On arrete expres !" $$ # gpdebug : a virer ######## 41 78 42 done 79 # Pour le cas ou aucune simu n aurait ete detectee 80 if [ -e ${IGCM_TMP}/${$}.liste_Restart.txt ] 81 then 82 listRestartNbLines=`cat ${IGCM_TMP}/${$}.liste_Restart.txt | wc -l ` 83 if [ "x${listRestartNbLines}" == "x0" ] 84 then 85 DEM_errorSend "${SCRIPT_NAME}:${LINENO}:Il n existe aucune simulation !" # "${$}" 86 fi 87 else 88 DEM_errorSend "${SCRIPT_NAME}:${LINENO}:Il n existe aucune simulation !" # "${$}" 89 fi 90 91 43 92 44 93 # On cherche le path (deux crans au dessus des repertoires Restart) … … 67 116 rm -f liste_simul_${LISTE_SIMUL_NAME} 68 117 118 # gpdebug : envoi du nombre de simu dans un "nbSimu.txt" du rep de suivi 119 echo `cat ${IGCM_DEM}/liste_simul_${LISTE_SIMUL_NAME} | wc -l ` > $nbSimuFile 120 69 121 DEM_log -1 "Fichier cree : liste_simul_${LISTE_SIMUL_NAME}" 122 70 123 71 124 [[ "${clean_tmp}" = "yes" ]] && rm -f ${IGCM_TMP}/${$}.path_simul.txt 72 125 [[ "${clean_tmp}" = "yes" ]] && rm -f ${IGCM_TMP}/${$}.liste_Restart.txt 73 126 127 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 128 echo $MonitoringInfo >> $generalMonitorFile 129 74 130 DEM_log -0 "Fin de ${SCRIPT_NAME}" -
TOOLS/PACK_IPSL/find_size_pack.sh
r1736 r1822 26 26 SCRIPT_NAME=$(basename ${0} ) 27 27 source ${EXE_DIR}/DEM_utilities.sh 28 29 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 30 MonitoringInfo="${SCRIPT_NAME}-->OK" 31 simuMonitoring_check "$MonitoringInfo" "$config_card" 32 33 # gpdebug : Execute la function errorReceive() si reception d'un signal TERM 34 trap 'DEM_errorReceive' TERM ######## 35 36 # gpdebug : on augmente la liste des proc à détruire en cas d'erreur bloquante du présent proc 37 export listPID="$$ ${listPID}" ######### 38 28 39 DEM_log -0 "Demmarrage de ${SCRIPT_NAME}" 29 40 cd ${JOB_DIR} … … 37 48 38 49 DEM_state=$( DEM_read_state ${IGCM_DEM}/config_card.liste ${config_card} ) 39 if [[ "${DEM_state}" != "ListToBeDone" ]] ; then 40 DEM_log -0 "Attention : Etat incorrect dans ${IGCM_DEM}/config_card.liste" 41 exit -1 50 # gpdebug : si c'est une premiere exec (pas une reprise) 51 if [[ "x${execEveryStep}" == "1" ]] && [[ "${DEM_state}" != "ListToBeDone" ]] ; then 52 echo "gpdebug : DEM_state=${DEM_state}" 53 DEM_errorSend "${SCRIPT_NAME}:${LINENO}:Etat incorrect dans ${IGCM_DEM}/config_card.liste" 42 54 fi 43 55 … … 242 254 DEM_write_state ${IGCM_DEM}/config_card.liste ${config_card} FindSizePackDone 243 255 256 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 257 simuMonitoring_OK "$MonitoringInfo" "$config_card" 258 244 259 DEM_log -0 "Fin de ${SCRIPT_NAME}" 245 260 -
TOOLS/PACK_IPSL/launch_ipsl_enlarge.sh
r1766 r1822 11 11 12 12 # ex : ./launch_ipsl_enlarge.sh 13 14 # gpdebug : pour option -f 15 restartExecFromZero=0 16 while [ $# -gt 0 ] 17 do 18 echo "boucle sur les arguments du script ..." 19 echo "@=$@" 20 case $1 in 21 -f) restartExecFromZero=1 22 echo "force restart from the beginning ..." 23 ;; 24 esac 25 shift 26 done 27 export restartExecFromZero=${restartExecFromZero} 28 # gpdebug : end 13 29 14 30 export JOB_DIR=${LS_SUBCWD:-${PWD}} … … 29 45 export config_card=${IGCM_DEM}/config_card.liste 30 46 47 48 ############## gpdebug : Pour gestion des erreurs ######################################### 49 # Execute la function errorReceive() si reception d'un signal TERM 50 trap 'DEM_errorReceive' TERM 51 # liste des processus à détruire en cas d'erreur bloquante 52 export listPID=$$ 53 # fichier pour la transmission des messages d'erreur d'un fils au prog principal 54 export errorMsgFile="${PWD}/errorMsg.txt" 55 ############## gpdebug : fin ############################################################## 56 31 57 source ${EXE_DIR}/DEM_utilities.sh 32 58 33 59 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" 60 61 check_nco_version # gpdebug : verification de la version de nco ####################### 62 63 # gpdebug : si l'option -f est activee, on detruit tous les fichiers status 64 if [ "x$restartExecFromZero" == "x1" ] 65 then 66 echo "Deleting all status files ..." 67 for CONFIG in $( awk '{print $1}' ${IGCM_DEM}/config_card.liste ) 68 do 69 PATH_SIMU=$( dirname $CONFIG ) 70 ListStatFileInSimu=`find $PATH_SIMU -type f -name "*status" ` 71 if [ "x$ListStatFileInSimu" != "x" ] 72 then 73 for file in $ListStatFileInSimu 74 do 75 if [ -e $file ] 76 then 77 rm -f $file 78 fi 79 80 done 81 fi 82 done 83 echo "Deletion done." 84 fi 85 # gpdebug : end 34 86 35 87 for CONFIG in $( awk '{print $1}' ${IGCM_DEM}/config_card.liste ) ; do -
TOOLS/PACK_IPSL/launch_ipsl_pack.sh
r1728 r1822 17 17 export EXE_DIR=${JOB_DIR} 18 18 19 LISTE_SIMUL=${1} 19 ##### gpdebug : addition ################################## 20 # Boucle qui gere les parametres du script (permet l'introduction d'une option -f 21 # qui force l'execution de toute les etapes du script de listes) 22 execEveryStep=0 23 LISTE_SIMUL= 24 while [ $# -gt 0 ] 25 do 26 echo "boucle sur les arguments du script ..." 27 echo "@=$@" 28 case $1 in 29 -f) execEveryStep=1 30 echo "force..." 31 ;; 32 *) LISTE_SIMUL=${1} 33 echo "autres..." 34 ;; 35 36 esac 37 shift 38 done 39 echo "Fin boucle sur arguments" 40 export execEveryStep=${execEveryStep} 41 42 # fichier de progression d'execution 43 extSuiviListes=`echo ${LISTE_SIMUL} | sed 's;\.[[:alnum:]]*$;;' ` 44 # echo "extSuiviListes=$extSuiviListes" # gpdebug : a virer 45 export MonitoringDir="${PWD}/SuiviListes_${extSuiviListes}" 46 # echo "MonitoringDir=$MonitoringDir" # gpdebug : a virer 47 # exit 0 # gpdebug : a virer 48 49 export generalMonitorFile=${MonitoringDir}/general.txt 50 export nbSimuFile=${MonitoringDir}/nbSimu.txt 51 52 ##### gpdebug : fin ##################################### 53 54 # LISTE_SIMUL=${1} # gpdebug : suppr --> cette affectation est maintenant faite dans la boucle while des arg du script ################ 20 55 21 56 #LISTE_SIMUL=${JOB_DIR}/param_SL.txt … … 33 68 export DEM_LOG=${JOB_DIR}/dem_${LSB_JOBID:-${$}}.log 34 69 export LOG_LEV=2 70 export FileParam=${LISTE_SIMUL} # gpdebug : pour appel (dans DEM_utilities.sh) a showListsProgress.sh 71 export FatherPID=$$ # gpdebug : pour appel (dans DEM_utilities.sh) a showListsProgress.sh 35 72 36 73 source ${EXE_DIR}/DEM_utilities.sh 74 75 # gpdebug : prepare le fichier de suivi de la progression 76 prepareMonitoringDir 77 # exit 0 # gpdebug : a virer ############## 78 79 # gpdebug : Execute la function errorReceive() si reception d'un signal TERM 80 trap 'DEM_errorReceive' TERM ######## 81 82 # gpdebug : liste des processus à détruire en cas d'erreur bloquante 83 export listPID=$$ ######## 84 85 # gpdebug : fichier pour la transmission des messages d'erreur d'un fils au prog principal 86 export errorMsgFile="${PWD}/errorMsg.txt" ######## 37 87 38 88 DEM_log -0 "Demarrage de ${SCRIPT_NAME}" … … 46 96 # 0- on cree le listing correspondant au fichier param 47 97 # on efface les tests precedents 48 rm -f ${IGCM_DEM}/Listing.txt 98 99 # rm -f ${IGCM_DEM}/Listing.txt # gpdebug : en cas de reprise, on ne peut pas laisser ca en l'etat --> suppr 100 # gpdebug : Donc on rajoute le if qui suit 101 if [ "x${execEveryStep}" == "x1" ] 102 then 103 rm -f ${IGCM_DEM}/Listing.txt 104 fi 105 49 106 for DIR in $( awk '{print $0}' ${LISTE_SIMUL} ) ; do 50 107 ./create_listing.sh $DIR … … 58 115 ${EXE_DIR}/find_directory_simul.sh ${LISTE_SIMUL} ${LISTE_DMNFS} 59 116 117 # sleep 2 # gpdebug : a virer 118 # echo "Le script principal continue..." # gpdebug : a virer 119 # exit 0 # gpdebug : a virer 120 121 #################################################################### 122 # gpdebug : partie vidée pour simplifier. Voir le fichier original. 123 60 124 # 2- Pour chacune des simulations listees on cree un fichier config.card correspondant 61 125 # ces fichiers seront stockes dans ${IGCM_DEM}/arborescence/ … … 63 127 64 128 ${EXE_DIR}/create_config_card.sh ${IGCM_DEM}/liste_simul_${LISTE_SIMUL_NAME} ${LISTE_DMNFS} 129 130 # exit 0 # gpdebug : a virer ######### 65 131 66 132 #3- recherche de la taille ideale de pack pour chacune des simulations - puis creation des listes … … 72 138 eval $(grep IGCM_DEM_SIMU ${CONFIG}) 73 139 ${EXE_DIR}/calcul_size_simul.sh ${CONFIG} ${LISTE_DMNFS} 74 140 # exit 0 # gpdebug : a virer ######### 75 141 DEM_state=$( DEM_read_state ${IGCM_DEM}/config_card.liste ${CONFIG} ) 76 142 if [[ "${DEM_state}" != "WriteListTarDone" ]] ; then … … 80 146 ${EXE_DIR}/write_liste_pack.sh ${CONFIG} ${LISTE_DMNFS} 81 147 ${EXE_DIR}/archive_restart.sh ${CONFIG} ${LISTE_DMNFS} 148 # DEM_errorSend "${SCRIPT_NAME}:${LINENO}:On arrete expres !" # gpdebug : a virer ######## 82 149 ${EXE_DIR}/archive_debug.sh ${CONFIG} ${LISTE_DMNFS} 83 150 84 151 fi 85 152 done 153 #################################################################### 86 154 87 155 DEM_log -0 "Fin de ${SCRIPT_NAME}" -
TOOLS/PACK_IPSL/write_liste_pack.sh
r1769 r1822 28 28 SCRIPT_NAME=$(basename ${0} ) 29 29 source ${EXE_DIR}/DEM_utilities.sh 30 31 # gpdebug : verif si le present script a ete execute jusqu'au bout ######### 32 MonitoringInfo="${SCRIPT_NAME}-->OK" 33 simuMonitoring_check "$MonitoringInfo" "$config_card" 34 35 # gpdebug : Execute la function errorReceive() si reception d'un signal TERM 36 trap 'DEM_errorReceive' TERM ######## 37 38 # gpdebug : on augmente la liste des proc à détruire en cas d'erreur bloquante du présent proc 39 export listPID="$$ ${listPID}" ######### 40 30 41 DEM_log -0 "Demmarrage de ${SCRIPT_NAME}" 31 42 cd ${JOB_DIR} … … 43 54 SIMUL=${PATH_SIMUL_FULL}/${JobName} 44 55 56 45 57 DEM_state=$( DEM_read_state ${IGCM_DEM}/config_card.liste ${config_card} ) 46 if [[ "${DEM_state}" != "FindSizePackDone" ]] ; then 47 DEM_log -0 "Attention : Etat incorrect dans ${IGCM_DEM}/config_card.liste" 48 exit -158 # gpdebug : si c'est une premiere exec (pas une reprise) 59 if [[ "x${execEveryStep}" == "1" ]] && [[ "${DEM_state}" != "FindSizePackDone" ]] ; then 60 DEM_errorSend "${SCRIPT_NAME}:${LINENO}:Etat incorrect dans ${IGCM_DEM}/config_card.liste" 49 61 fi 62 50 63 51 64 DEM_write_state ${IGCM_DEM}/config_card.liste ${config_card} WriteListPackRunning … … 244 257 DEM_write_state ${IGCM_DEM}/config_card.liste ${config_card} WriteListPackDone 245 258 259 # gpdebug : le script n'a pas rencontre d'erreur. On l'inscrit dans le fichier de suivi 260 simuMonitoring_OK "$MonitoringInfo" "$config_card" 261 246 262 DEM_log -0 "Fin de ${SCRIPT_NAME}" 247 263
Note: See TracChangeset
for help on using the changeset viewer.