source: trunk/libIGCM/libIGCM_sys/libIGCM_sys_obelix.ksh @ 217

Last change on this file since 217 was 217, checked in by sdipsl, 14 years ago

Avoid side effect with user environment. Do not define read-only varible potentially defined by system environment.

File size: 34.2 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip, Christian Laguerre
5# Contact: Martial.Mancip_ipsl.jussieu.fr
6# $Date: 2008-05-29 21:29:09 +0200 (Thu, 29 May 2008) $
7# $Author: laguerre $
8# $Revision: 7 $
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11# History:
12# Modification:
13#
14#**************************************************************
15
16#=========================================================
17# The documentation of this file can be automatically generated
18# if you use the prefix #D- for comments to be extracted.
19# Extract with command: cat lib* | grep "^#D-" | cut -c "4-"
20#=========================================================
21
22#D-#==================================================
23#D-LibIGCM_sys for obelix
24#D-#==================================================
25#D-
26#D- This ksh library if a layer under some usefull
27#D-environment variables and shell commands.
28#D-All those definitions depend on host particularities.
29#D-It manages a stack mechanism and test validity of operations.
30#D-All function described bellow must be prefixed by IGCM_sys.
31
32#====================================================
33# libIGCM_sys PARAMETERS
34#====================================================
35
36#=====================================================
37# set DEBUG_sys to true to output calls of function
38typeset -r DEBUG_sys=${DEBUG_sys:=true}
39
40#=====================================================
41# Turn in dry run mode ? (sys_Put_Rest, sys_Put_Out, sys_Get)
42typeset -r DRYRUN=${DRYRUN:=0}
43
44# YOU MUST COMPILE YOUR EXE FILES FOR DRYRUN MODE !
45# -------------------------------------------------------------------------------------
46# | DRYRUN=  |  Date computations, | sys_Get    |  Exe    | sys_Put_Out; sys_Put_Rest |
47# |          |  Cp/Exe param files |            |  Chmod  |                           |
48# |          |      Qsub           |            |         |                           |
49# -------------------------------------------------------------------------------------
50# |    0     |       yes           |    yes     |  yes    |      yes                  |
51# -------------------------------------------------------------------------------------
52# |    1     |       yes           |    yes     |  yes    |      no                   |
53# -------------------------------------------------------------------------------------
54# |    2     |       yes           |    yes     |  no     |      no                   |
55# -------------------------------------------------------------------------------------
56# |    3     |       yes           |    no      |  no     |      no                   |
57# -------------------------------------------------------------------------------------
58
59#=====================================================
60# Global Variables :
61#=====================================================
62# Language : "fr" or "en"
63typeset -r MYLANG="fr"
64
65#=====================================================
66# Host and user names
67# $hostname ou hostname
68typeset  HOST=${HOST:=$( hostname ) }
69# $username ou whoami
70typeset  LOGIN=${LOGIN:=$( whoami ) }
71# $hostname of the MASTER job
72typeset -r MASTER=obelix
73
74#D-
75#D-#==================================================
76#D-Program used in libIGCM
77#D-#==================================================
78
79# rsync with path
80typeset -r RSYNC=/usr/bin/rsync
81# RSYNC_opt args to rsync
82typeset -r RSYNC_opt="-Lt -v"
83
84#====================================================
85# Source Ferret
86. /home/users/brock/.atlas_env_asterix_ksh
87
88#=========================================================
89# Host specific DIRECTORIES
90#====================================================
91
92#====================================================
93#- R_EXE   (==> BIN_DIR = ${MODIPSL}/bin )
94typeset -r R_EXE="${MODIPSL}/bin"
95
96#====================================================
97#- SCRATCHDIR (=> ${R_DONNEES})
98typeset -r SCRATCHDIR=/tmp
99
100#====================================================
101#- SUBMIT_DIR : submission dir
102typeset SUBMIT_DIR=${SUBMIT_DIR:=${PBS_O_WORKDIR}}
103#====================================================
104#- ARCHIVE
105typeset -r ARCHIVE=/home/scratch01/${LOGIN}
106
107#====================================================
108#- libIGCM_POST
109typeset -r libIGCM_POST=${libIGCM}
110
111#====================================================
112#- IN
113typeset -r R_IN=${R_IN:=${ARCHIVE}/${LOGIN}/IGCM}
114
115#====================================================
116#- OUT
117typeset -r R_OUT=${ARCHIVE}/${LOGIN}/IGCM_OUT
118
119#====================================================
120#- OUT_POST
121typeset -r R_OUT_POST=${R_OUT}
122
123#====================================================
124#- RUN_DIR_PATH : Temporary working directory (=> TMP)
125typeset -r RUN_DIR_PATH=${RUN_DIR_PATH:=${SCRATCHDIR}/tmp$$}
126#typeset -r RUN_DIR_PATH=${RUN_DIR_PATH:=/home/orchidee_ns/${LOGIN}/tmp$$}
127
128#====================================================
129#- BIG_DIR : BIG_DIR to store files waiting for rebuild
130typeset -r BIG_DIR=${BIG_DIR:=${SCRATCHDIR}/REBUILD}
131
132#====================================================
133#- HOST_MPIRUN_COMMAND
134typeset -r HOST_MPIRUN_COMMAND=${HOST_MPIRUN_COMMAND:="time mpirun"}
135
136#=========================================================
137#- Add "time" before mpirun command
138MPIRUN_COMMAND="time "${MPIRUN_COMMAND}
139echo ${MPIRUN_COMMAND}
140
141#====================================================
142#- Max number of arguments passed to nco operator or demigration command
143UNIX_MAX_LIMIT=360
144
145#D-#==================================================
146#D-function IGCM_sys_RshMaster
147#D-* Purpose: Master rsh command
148#D-* Examples:
149#D-
150function IGCM_sys_RshMaster {
151    IGCM_debug_PushStack "IGCM_sys_RshMaster" $@
152    ssh ${HOST} /bin/ksh  <<-EOF
153    export libIGCM=${libIGCM}
154    export DEBUG_debug=${DEBUG_debug}
155    . ${libIGCM}/libIGCM_debug/libIGCM_debug.ksh
156    . ${libIGCM}/libIGCM_card/libIGCM_card.ksh
157    ${@}
158EOF
159    if [ $? -gt 0 ] ; then
160        echo "IGCM_sys_RshMaster : erreur."
161        IGCM_debug_Exit "IGCM_sys_RshMaster"
162    fi
163    IGCM_debug_PopStack "IGCM_sys_RshMaster"
164}
165
166#D-#==================================================
167#D-function IGCM_sys_RshArchive
168#D-* Purpose: Archive rsh command
169#D-* Examples:
170#D-
171function IGCM_sys_RshArchive {
172    IGCM_debug_PushStack "IGCM_sys_RshArchive" $@
173    /bin/ksh <<-EOF
174    ${@}
175EOF
176    if [ $? -gt 0 ] ; then
177        echo "IGCM_sys_RshArchive : erreur."
178        IGCM_debug_Exit "IGCM_sys_RshArchive"
179    fi
180    IGCM_debug_PopStack "IGCM_sys_RshArchive"
181}
182
183#D-#==================================================
184#D-function IGCM_sys_RshPost
185#D-* Purpose: Master rsh command
186#D-* Examples:
187#D-
188(( RshPNum = 0 ))
189function IGCM_sys_RshPost {
190    IGCM_debug_PushStack "IGCM_sys_RshPost" $@
191    if ( $DEBUG_sys ) ; then
192        echo "IGCM_sys_RshPost :" $@
193    fi
194    #ssh ${HOST} exec /bin/ksh -vx $@ > out_RshPost.${RshPNum}
195    ssh ${HOST} exec /bin/ksh $@ > out_RshPost.${RshPNum}
196    if [ $? -gt 0 ] ; then
197        echo "IGCM_sys_RshPost : erreur."
198        IGCM_debug_Exit "IGCM_sys_RshPost"
199    fi
200    (( RshPNum = RshPNum + 1 ))
201    IGCM_debug_PopStack "IGCM_sys_RshPost"
202}
203
204#D-#==================================================
205#D-function IGCM_sys_SendMail
206#D-* Purpose: Send mail when simulation is over
207#D-* Examples:
208#D-
209function IGCM_sys_SendMail {
210    IGCM_debug_PushStack "IGCM_sys_SendMailPost" $@
211    if ( $DEBUG_sys ) ; then
212        echo "IGCM_sys_SendMail :" $@
213    fi
214
215    cat  << END_MAIL > job_atlas.mail
216Dear ${LOGIN},
217
218  Simulation ${config_UserChoices_JobName} is finished on supercomputer `hostname`.
219  Job started : ${DateBegin}
220  Job ended   : ${DateEnd}
221  Ouput files are available in ${R_SAVE}
222END_MAIL
223
224    if [ ! -z ${config_UserChoices_MailName} ] ; then
225        mailx -s "${config_UserChoices_JobName} completed" ${config_UserChoices_MailName} <  job_end.mail
226    elif [ -f ~/.forward ] ; then
227        mailx -s "${config_UserChoices_JobName} completed" $( cat ~/.forward ) < job_end.mail
228    fi
229
230    if [ $? -gt 0 ] ; then
231        echo "IGCM_sys_SendMail : erreur."
232        IGCM_debug_Exit "IGCM_sys_SendMail"
233    fi
234    IGCM_debug_PopStack "IGCM_sys_SendMail"
235}
236
237#D-#==================================================
238#D-function IGCM_sys_Mkdir
239#D-* Purpose: Master locale mkdir command
240#D-* Examples:
241#D-
242function IGCM_sys_Mkdir {
243    IGCM_debug_PushStack "IGCM_sys_Mkdir" $@
244    if ( $DEBUG_sys ) ; then
245        echo "IGCM_sys_Mkdir :" $@
246    fi
247    if [ ! -d ${1} ]; then
248        \mkdir -p $1
249        if [ $? -gt 0 ] ; then
250            echo "IGCM_sys_Mkdir : erreur."
251            IGCM_debug_Exit "IGCM_sys_Mkdir"
252        fi
253    fi
254    # vérification :
255    if [ ! -d ${1} ] ; then
256        echo "IGCM_sys_Mkdir : erreur."
257        IGCM_debug_Exit "IGCM_sys_Mkdir"
258    fi
259    IGCM_debug_PopStack "IGCM_sys_Mkdir"
260}
261
262#D-#==================================================
263#D-function IGCM_sys_MkdirArchive
264#D-* Purpose: Mkdir on Archive
265#D-* Examples:
266#D-
267function IGCM_sys_MkdirArchive {
268    IGCM_debug_PushStack "IGCM_sys_MkdirArchive" $@
269    if ( $DEBUG_sys ) ; then
270        echo "IGCM_sys_MkdirArchive :" $@
271    fi
272    #- creation de repertoire sur le serveur fichier
273    if [ ! -d ${1} ]; then 
274        \mkdir -p $1
275        if [ $? -gt 0 ] ; then
276            echo "IGCM_sys_MkdirArchive : erreur."
277            IGCM_debug_Exit "IGCM_sys_MkdirArchive"
278        fi
279    fi
280    IGCM_debug_PopStack "IGCM_sys_MkdirArchive"
281}
282
283#D-#==================================================
284#D-function IGCM_sys_MkdirWork
285#D-* Purpose: Mkdir on Work
286#D-* Examples:
287#D-
288function IGCM_sys_MkdirWork {
289    IGCM_debug_PushStack "IGCM_sys_MkdirWork" $@
290    if ( $DEBUG_sys ) ; then
291        echo "IGCM_sys_MkdirWork :" $@
292    fi
293    #- creation de repertoire sur le serveur fichier
294    if [ ! -d ${1} ]; then 
295        \mkdir -p $1
296        if [ $? -gt 0 ] ; then
297            echo "IGCM_sys_MkdirWork : erreur."
298            IGCM_debug_Exit "IGCM_sys_MkdirWork"
299        fi
300    fi
301    IGCM_debug_PopStack "IGCM_sys_MkdirWork"
302}
303
304#D-#==================================================
305#D-function IGCM_sys_Cd
306#D-* Purpose: master cd command
307#D-* Examples:
308#D-
309function IGCM_sys_Cd {
310    IGCM_debug_PushStack "IGCM_sys_Cd" $@
311    if ( $DEBUG_sys ) ; then
312        echo "IGCM_sys_Cd :" $@
313    fi
314    \cd $1
315    if [ $? -gt 0 ] ; then
316        echo "IGCM_sys_Cd : erreur."
317        IGCM_debug_Exit "IGCM_sys_Cd"
318    fi
319    IGCM_debug_PopStack "IGCM_sys_Cd"
320}
321
322#D-#==================================================
323#D-function IGCM_sys_Chmod
324#D-* Purpose: Chmod
325#D-* Examples:
326#D-
327function IGCM_sys_Chmod {
328    IGCM_debug_PushStack "IGCM_sys_Chmod" $@
329    if ( $DEBUG_sys ) ; then
330        echo "IGCM_sys_Chmod :" $@
331    fi
332    if [ $DRYRUN -le 1 ]; then
333        \chmod $@
334        if [ $? -gt 0 ] ; then
335            echo "IGCM_sys_Chmod : erreur."
336            IGCM_debug_Exit "IGCM_sys_Chmod"
337        fi
338    else
339        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
340    fi
341    IGCM_debug_PopStack "IGCM_sys_Chmod"
342}
343
344#D-#==================================================
345#D-function IGCM_sys_FileSize
346#D-* Purpose: Filesize
347#D-* Examples:
348#D-
349function IGCM_sys_FileSize {
350    IGCM_debug_PushStack "IGCM_sys_FileSize" $@
351
352    typeset sizeF
353    set +A sizeF -- $( ls -la ${1} )
354    if [ $? -gt 0 ] ; then
355        IGCM_debug_Exit "IGCM_sys_FileSize"
356    fi
357    eval ${2}=${sizeF[4]}
358
359    IGCM_debug_PopStack "IGCM_sys_FileSize"
360}
361
362#D-#==================================================
363#D-function IGCM_sys_TestDir
364#D-* Purpose: Test Directory that must exists
365#D-* Examples:
366#D-
367function IGCM_sys_TestDir {
368    IGCM_debug_PushStack "IGCM_sys_TestDir" $@
369    if ( $DEBUG_sys ) ; then
370        echo "IGCM_sys_TestDir :" $@
371    fi
372    typeset ExistFlag
373    ExistFlag=$( [ -d $1 ] && echo 0 || echo 1 )
374    IGCM_debug_PopStack "IGCM_sys_TestDir"
375
376    return ${ExistFlag}
377}
378
379#D-#==================================================
380#D-function IGCM_sys_TestDirArchive
381#D-* Purpose: Test Directory that must exists on Archive
382#D-* Examples:
383#D-
384function IGCM_sys_TestDirArchive {
385    IGCM_debug_PushStack "IGCM_sys_TestDirArchive" $@
386    if ( $DEBUG_sys ) ; then
387        echo "IGCM_sys_TestDirArchive :" $@
388    fi
389    typeset ExistFlag
390    ExistFlag=$( [ -d $1 ] && echo 0 || echo 1 )
391    IGCM_debug_PopStack "IGCM_sys_TestDirArchive"
392
393    return ${ExistFlag}
394}
395
396#D-#==================================================
397#D-function IGCM_sys_TestFileArchive
398#D-* Purpose: Test file that must NOT EXISTS on Archive
399#D-* Examples:
400#D-
401function IGCM_sys_TestFileArchive {
402    IGCM_debug_PushStack "IGCM_sys_TestFileArchive" $@
403    if ( $DEBUG_sys ) ; then
404        echo "IGCM_sys_TestFileArchive :" $@
405    fi
406    typeset ExistFlag
407    ExistFlag=$( [ -f $1 ] && echo 0 || echo 1 )
408    IGCM_debug_PopStack "IGCM_sys_TestFileArchive"
409
410    return ${ExistFlag}
411}
412
413#D-#==================================================
414#D-function IGCM_sys_CountFileArchive
415#D-* Purpose: Count files on Archive filesystem
416#D-* Examples:
417#D-
418function IGCM_sys_CountFileArchive {
419    IGCM_debug_PushStack "IGCM_sys_CountFileArchive" $@
420    ls ${@} 2>/dev/null | wc -l
421    if [ $? -gt 0 ] ; then
422        echo "IGCM_sys_CountFileArchive : erreur."
423    fi
424    IGCM_debug_PopStack "IGCM_sys_CountFileArchive"
425}
426
427#D-#==================================================
428#D-function IGCM_sys_Tree
429#D-* Purpose: Tree directories with files on ${ARCHIVE}
430#D-* Examples: IGCM_sys_Tree ${R_IN} ${R_OUT}
431#D-
432function IGCM_sys_Tree {
433    IGCM_debug_PushStack "IGCM_sys_Tree" $@
434    if ( $DEBUG_sys ) ; then
435        echo "IGCM_sys_Tree :" $@
436    fi
437
438    \tree -f $@
439
440    IGCM_debug_PopStack "IGCM_sys_Tree"
441}
442
443#D-#==================================================
444#D-function IGCM_sys_Tar
445#D-* Purpose: master un-tar command
446#D-* Examples:
447#D-
448function IGCM_sys_Tar {
449    IGCM_debug_PushStack "IGCM_sys_Tar" $@
450    if ( $DEBUG_sys ) ; then
451        echo "IGCM_sys_Tar :" $@
452    fi
453    \tar cvf $@
454    if [ $? -gt 0 ] ; then
455        echo "IGCM_sys_Tar : erreur."
456        IGCM_debug_Exit "IGCM_sys_Tar"
457    fi
458    \tar tvf $1
459
460    IGCM_debug_PopStack "IGCM_sys_Tar"
461}
462
463#D-#==================================================
464#D-function IGCM_sys_UnTar
465#D-* Purpose: master un-tar command
466#D-* Examples:
467#D-
468function IGCM_sys_UnTar {
469    IGCM_debug_PushStack "IGCM_sys_UnTar" $@
470    if ( $DEBUG_sys ) ; then
471        echo "IGCM_sys_UnTar :" $@
472    fi
473    \tar xvf $1
474    if [ $? -gt 0 ] ; then
475        echo "IGCM_sys_UnTar : erreur."
476        IGCM_debug_Exit "IGCM_sys_UnTar"
477    fi
478    IGCM_debug_PopStack "IGCM_sys_UnTar"
479}
480
481#D-#==================================================
482#D-function IGCM_sys_Qsub
483#D-* Purpose: Qsub new job
484#D-* Examples:
485#D-
486function IGCM_sys_Qsub {
487    IGCM_debug_PushStack "IGCM_sys_Qsub" $@
488    if ( $DEBUG_sys ) ; then
489        echo "IGCM_sys_Qsub :" $@
490    fi
491    /usr/local/bin/qsub -o ${Script_Output} -N ${config_UserChoices_JobName}.${CumulPeriod} < $1
492    if [ $? -gt 0 ] ; then
493        echo "IGCM_sys_Qsub : erreur -o ${Script_Output} -N ${config_UserChoices_JobName}.${CumulPeriod} $@."
494        IGCM_debug_Exit "IGCM_sys_Qsub"
495    fi
496    IGCM_debug_PopStack "IGCM_sys_Qsub"
497}
498
499#D-#==================================================
500#D-function IGCM_sys_QsubPost
501#D-* Purpose: Qsub new job on scalaire
502#D-* Examples:
503#D-
504function IGCM_sys_QsubPost {
505    IGCM_debug_PushStack "IGCM_sys_QsubPost" $@
506    if ( $DEBUG_sys ) ; then
507        echo "IGCM_sys_QsubPost :" $@
508    fi
509    /usr/local/bin/qsub -q medium -o ${POST_DIR}/$1.${PeriodDateEnd}.out ${libIGCM_POST}/$1.job -v ${listVarEnv}
510    if [ $? -gt 0 ] ; then
511        echo "IGCM_sys_QsubPost : erreur " $@
512        IGCM_debug_Exit "IGCM_sys_QsubPost"
513    fi
514    IGCM_debug_PopStack "IGCM_sys_QsubPost"
515}
516
517#D-*************************
518#D- File transfer functions
519#D-*************************
520#D-
521
522#D-#==================================================
523#D-function IGCM_sys_Rsync_out
524#D-* Purpose: treat return val of rsync
525#D-* Examples: IGCM_sys_Rsync_out out_RET_rsync
526#D-  Error values and explanations can depend on your system version.
527function IGCM_sys_Rsync_out {
528    RET=$1
529    if [ ! $RET ] ; then
530        echo "rsync error !"
531    fi
532
533    if [ $MYLANG = "fr" ]; then
534        case $RET in
535            0)  return ;;
536            1)  echo "Erreur de rsync ; RERR_SYNTAX : "
537                echo "Erreur de syntaxe ou d'utilisation."
538                return;;
539            2)  echo "Erreur de rsync ; RERR_PROTOCOL : "
540                echo "Incompatibilité de protocole."
541                return;;
542            3)  echo "Erreur de rsync ; RERR_FILESELECT 3"
543                echo "Erreurs  lors  de  la  sélection des fichiers d'entrée sortie et"
544                echo "répertoires"
545                return;;
546            4)  echo "Erreur de rsync ; RERR_UNSUPPORTED"
547                echo "Action demandée non supportée : une tentative de manipulation de"
548                echo "fichiers  64-bits  sur une plate-forme qui ne les supporte pas a"
549                echo "été faite ; ou une option qui est supportée par le  client  mais"
550                echo "pas par le serveur a été spécifiée."
551                return;;
552            10) echo "Erreur de rsync ; RERR_SOCKETIO"
553                echo "Erreur dans le socket d'entrée sortie"
554                return;;
555            11) echo "Erreur de rsync ; RERR_FILEIO"
556                echo "Erreur d'entrée sortie fichier"
557                return;;
558            12) echo "Erreur de rsync ; RERR_STREAMIO"
559                echo "Erreur dans flux de donnée du protocole rsync"
560                return;;
561            13) echo "Erreur de rsync ; RERR_MESSAGEIO"
562                echo "Erreur avec les diagnostics du programme"
563                return;;
564            14) echo "Erreur de rsync ; RERR_IPC"
565                echo "Erreur dans le code IPC"
566                return;;
567            20) echo "Erreur de rsync ; RERR_SIGNAL"
568                echo "SIGUSR1 ou SIGINT reçu"
569                return;;
570            21) echo "Erreur de rsync ; RERR_WAITCHILD"
571                echo "Une erreur retournée par waitpid()"
572                return;;
573            22) echo "Erreur de rsync ; RERR_MALLOC"
574                echo "Erreur lors de l'allocation des tampons de mémoire de coeur"
575                return;;
576            23) echo ""
577                echo "Erreur fichier inexistant"
578                return;;
579            30) echo "Erreur de rsync ; RERR_TIMEOUT"
580                echo "Temps d'attente écoulé dans l'envoi/réception de données"
581                return;;
582            *)  echo "Erreur de rsync : code de retour de rsync inconnu :" $RET
583                return;;
584        esac
585    elif [ $MYLANG = "en" ] ; then
586        case $RET in
587            0)  return;;               
588            1)  echo "rsync error : Syntax or usage error "
589                return;;
590            2)  echo "rsync error : Protocol incompatibility "
591                return;;
592            3)  echo "rsync error : Errors selecting input/output files, dirs"
593                return;;
594            4)  echo "rsync error : Requested action not supported: an attempt"
595                echo "was made to manipulate 64-bit files on a platform that cannot support"
596                echo "them; or an option was specified that is supported by the client and"
597                echo "not by the server."
598                return;;
599            5)  echo "rsync error : Error starting client-server protocol"
600                return;;
601            10) echo "rsync error : Error in socket I/O "
602                return;;
603            11) echo "rsync error : Error in file I/O "
604                return;;
605            12) echo "rsync error : Error in rsync protocol data stream "
606                return;;
607            13) echo "rsync error : Errors with program diagnostics "
608                return;;
609            14) echo "rsync error : Error in IPC code "
610                return;;
611            20) echo "rsync error : Received SIGUSR1 or SIGINT "
612                return;;
613            21) echo "rsync error : Some error returned by waitpid() "
614                return;;
615            22) echo "rsync error : Error allocating core memory buffers "
616                return;;
617            23) echo "rsync error : Partial transfer due to error"
618                return;;
619            24) echo "rsync error : Partial transfer due to vanished source files"
620                return;;
621            30) echo "rsync error : Timeout in data send/receive "
622                return;;
623            *)  echo "rsync error : return code of rsync unknown :" $RET
624                return;;
625        esac
626    else
627        echo "unknown language $MYLANG."
628        return
629    fi
630}
631   
632#D-#==================================================
633#D-function IGCM_sys_Cp
634#D-* Purpose: generic cp
635#D-* Examples:
636#D-
637function IGCM_sys_Cp {
638    IGCM_debug_PushStack "IGCM_sys_Cp" $@
639    if ( $DEBUG_sys ) ; then
640        echo "IGCM_sys_Cp :" $@
641    fi
642
643    typeset RET
644
645    echo cp --preserve=timestamps $@ > out_rsync 2>&1
646    \cp --preserve=timestamps $@ >> out_rsync 2>&1
647    RET=$?
648   
649    if [ ${RET} -gt 0 ] ; then
650        echo "IGCM_sys_Cp : error."
651        cat out_rsync
652        IGCM_debug_Exit "IGCM_sys_Cp"
653    fi
654    IGCM_debug_PopStack "IGCM_sys_Cp"
655}
656
657#D-#==================================================
658#D-function IGCM_sys_Rm
659#D-* Purpose: generic rm
660#D-* Examples:
661#D-
662function IGCM_sys_Rm {
663    IGCM_debug_PushStack "IGCM_sys_Rm" $@
664    if ( $DEBUG_sys ) ; then
665        echo "IGCM_sys_Rm :" $@
666    fi
667
668    typeset RET
669
670    echo rm $@ > out_rsync 2>&1
671    \rm $@ >> out_rsync 2>&1
672    RET=$?
673   
674    if [ ${RET} -gt 0 ] ; then
675        echo "IGCM_sys_Rm : error."
676        cat out_rsync
677        IGCM_debug_Exit "IGCM_sys_Rm"
678    fi
679    IGCM_debug_PopStack "IGCM_sys_Rm"
680}
681
682#D-#==================================================
683#D-function IGCM_sys_RmRunDir
684#D-* Purpose: rm tmpdir (dummy function most of the time batch
685#D-                      scheduler will do the job)
686#D-* Examples:
687#D-
688function IGCM_sys_RmRunDir {
689    IGCM_debug_PushStack "IGCM_sys_RmRunDir" -- $@
690    if ( $DEBUG_sys ) ; then
691        echo "IGCM_sys_RmRunDir :" $@
692        echo "Dummy call, let the scheduler do that."
693    fi
694    IGCM_debug_PopStack "IGCM_sys_RmRunDir"
695}
696
697#D-#==================================================
698#D-function IGCM_sys_Mv
699#D-* Purpose: generic move
700#D-* Examples:
701#D-
702function IGCM_sys_Mv {
703    IGCM_debug_PushStack "IGCM_sys_Mv" $@
704    if ( $DEBUG_sys ) ; then
705        echo "IGCM_sys_Mv :" $@
706    fi
707
708    if [ $DRYRUN = 0 ]; then
709
710        typeset RET
711           
712        echo mv $@ > out_rsync 2>&1
713        \mv $@ >> out_rsync 2>&1
714        RET=$?
715   
716        if [ ${RET} -gt 0 ] ; then
717            echo "IGCM_sys_Mv : error in mv."
718            cat out_rsync
719            IGCM_debug_Exit "IGCM_sys_Mv"
720        fi
721    else
722        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
723    fi
724
725    IGCM_debug_PopStack "IGCM_sys_Mv"
726}
727
728#D-#==================================================
729#D-function IGCM_sys_Put_Dir
730#D-* Purpose: Copy a complete directory on $(ARCHIVE)
731#D-* Examples:
732#D-
733function IGCM_sys_Put_Dir {
734    IGCM_debug_PushStack "IGCM_sys_Put_Dir" $@
735    if ( $DEBUG_sys ) ; then
736        echo "IGCM_sys_Put_Dir :" $@
737    fi
738    if [ $DRYRUN = 0 ]; then
739        if [ ! -d ${1} ] ; then
740            echo "WARNING : IGCM_sys_Put_Dir ${1} DOES NOT EXIST ."
741            IGCM_debug_PopStack "IGCM_sys_Put_Dir"
742            return
743        fi
744
745        typeset RET
746
747        # Only if we use rsync
748        #IGCM_sys_TestDirArchive $( dirname $2 )
749        #
750        #USUAL WAY
751        \cp -R $1 $2 > out_rsync 2>&1
752        RET=$?
753
754        if [ ${RET} -gt 0 ] ; then
755            echo "IGCM_sys_Put_Dir : error."
756            cat out_rsync
757            IGCM_debug_Exit "IGCM_sys_Put_Dir"
758        fi
759    else
760        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
761    fi
762    IGCM_debug_PopStack "IGCM_sys_Put_Dir"
763}
764
765#D-#==================================================
766#D-function IGCM_sys_Get_Dir
767#D-* Purpose: Copy a complete directory from $(ARCHIVE)
768#D-* Examples:
769#D-
770function IGCM_sys_Get_Dir {
771    IGCM_debug_PushStack "IGCM_sys_Get_Dir" $@
772    if ( $DEBUG_sys ) ; then
773        echo "IGCM_sys_Get_Dir :" $@
774    fi
775    if [ $DRYRUN = 0 ]; then
776        if [ ! -d ${1} ] ; then
777            echo "WARNING : IGCM_sys_Get_Dir ${1} DOES NOT EXIST ."
778            IGCM_debug_PopStack "IGCM_sys_Get_Dir"
779            return
780        fi
781
782        typeset RET
783
784        #USUAL WAY
785        \cp -R $1 $2 > out_rsync 2>&1
786        RET=$?
787
788        if [ ${RET} -gt 0 ] ; then
789            echo "IGCM_sys_Get_Dir : error."
790            cat out_rsync
791            IGCM_debug_Exit "IGCM_sys_Get_Dir"
792        fi
793    else
794        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
795    fi
796    IGCM_debug_PopStack "IGCM_sys_Get_Dir"
797}
798
799#D-#==================================================
800#D-function IGCM_sys_Get_Master
801#D-* Purpose: Copy a complete directory from MASTER filesystem
802#D-* Examples:
803#D-
804function IGCM_sys_Get_Master {
805    IGCM_debug_PushStack "IGCM_sys_Get_Master" $@
806    if ( $DEBUG_sys ) ; then
807        echo "IGCM_sys_Get_Master :" $@
808    fi
809    if [ $DRYRUN = 0 ]; then
810        if [ ! -d ${1} ] ; then
811            echo "WARNING : IGCM_sys_Get_Master ${1} DOES NOT EXIST ."
812            IGCM_debug_PopStack "IGCM_sys_Get_Master"
813            return
814        fi
815
816        typeset RET
817        sleep 60
818
819        #USUAL WAY
820        cp -R $1 $2 > out_rsync 2>&1
821        RET=$?
822
823        if [ ${RET} -gt 0 ] ; then
824            echo "IGCM_sys_Get_Master : error."
825            cat out_rsync
826            IGCM_debug_Exit "IGCM_sys_Get_Master"
827        fi
828    else
829        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
830    fi
831    IGCM_debug_PopStack "IGCM_sys_Get_Master"
832}
833
834#D-#==================================================
835#D-function IGCM_sys_Put_Rest
836#D-* Purpose: commande de transfert des restarts $(ARCHIVE).
837#D-           Quitte si le fichier ou si le répertoire d'arriver n'existe pas.
838#D-* Examples:
839#D-
840function IGCM_sys_Put_Rest {
841    IGCM_debug_PushStack "IGCM_sys_Put_Rest" $@
842    if ( $DEBUG_sys ) ; then
843        echo "IGCM_sys_Put_Rest :" $@
844    fi
845    if [ $DRYRUN = 0 ]; then
846
847        IGCM_sys_TestDirArchive $( dirname $2 )
848
849        if [ ! -f ${1} ] ; then
850            echo "ERROR : IGCM_sys_Put_Rest ${1} DOES NOT EXIST ."
851            IGCM_debug_Exit "IGCM_sys_Put_Rest"
852        fi
853        if [ X${JobType} = XRUN ] ; then
854            IGCM_sys_Chmod 444 ${1}
855        fi
856
857        typeset RET
858
859        echo ${RSYNC} ${RSYNC_opt} $1 $2 > out_rsync 2>&1
860        ${RSYNC} ${RSYNC_opt} $1 $2 >> out_rsync 2>&1
861        RET=$?
862        IGCM_sys_Rsync_out $RET
863
864        ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
865        (( RET=RET+$? ))
866
867        if [ ${RET} -gt 0 ] ; then
868            echo "IGCM_sys_Put_Rest : error."
869            cat out_rsync
870            IGCM_debug_Exit "IGCM_sys_Put_Rest"
871        fi
872    else
873        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
874    fi
875    IGCM_debug_PopStack "IGCM_sys_Put_Rest"
876}
877
878#D-#==================================================
879#D-function IGCM_sys_Put_Out
880#D-* Purpose: Copy a file on $(ARCHIVE) after have chmod it in readonly
881#D-* Examples:
882#D-
883function IGCM_sys_Put_Out {
884    IGCM_debug_PushStack "IGCM_sys_Put_Out" $@
885    if ( $DEBUG_sys ) ; then
886        echo "IGCM_sys_Put_Out :" $@
887    fi
888    if [ $DRYRUN = 0 ]; then
889        if [ -f ${1} ] ; then
890            if [ ! -d $( dirname $2 ) ] ; then
891                IGCM_sys_MkdirArchive $( dirname $2 )
892            fi
893        else
894            echo "WARNING : IGCM_sys_Put_Out ${1} DOES NOT EXIST ."
895            IGCM_debug_PopStack "IGCM_sys_Put_Out"
896            return 1
897        fi
898
899        typeset RET
900        #
901        if [ X${JobType} = XRUN ] ; then
902            IGCM_sys_Chmod 444 ${1}
903        fi
904        #
905
906        echo ${RSYNC} ${RSYNC_opt} $1 $2 > out_rsync 2>&1
907        ${RSYNC} ${RSYNC_opt} $1 $2 >> out_rsync 2>&1
908        RET=$?
909        IGCM_sys_Rsync_out $RET
910
911        ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
912        (( RET=RET+$? ))
913
914        if [ ${RET} -gt 0 ] ; then
915            echo "IGCM_sys_Put_Out : error."
916            cat out_rsync
917            IGCM_debug_Exit "IGCM_sys_Put_Out"
918        fi
919    else
920        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
921    fi
922    IGCM_debug_PopStack "IGCM_sys_Put_Out"
923    return 0
924}
925
926#D-#==================================================
927#D-function IGCM_sys_Get
928#D-* Purpose: Get a file from ${ARCHIVE}
929#D-* Examples: IGCM_sys_Get myfile /destpath/myfile_with_PREFIX
930#D-            IGCM_sys_Get /l Array_contain_myfiles /destpath/
931function IGCM_sys_Get {
932    IGCM_debug_PushStack "IGCM_sys_Get" $@
933
934    typeset DEST RET dm_liste ifile target
935
936    if ( $DEBUG_sys ) ; then
937        echo "IGCM_sys_Get :" $@
938    fi
939    if [ $DRYRUN -le 2 ]; then
940        if [ X${1} = X'/l' ] ; then
941            # test if the first file is present in the old computation :
942            eval set +A dm_liste \${${2}}
943        else
944            dm_liste=${1}
945        fi
946        eval DEST=\${${#}}
947
948        # test if the (first) file is present in the old computation :
949        IGCM_sys_TestFileArchive ${dm_liste[0]}
950        RET=$?
951        if [ ${RET} -gt 0 ] ; then
952            echo "IGCM_sys_Get, ERROR : regular file ${dm_liste[0]} DOES NOT EXIST ."
953            IGCM_debug_Exit "IGCM_sys_Get"
954            #return
955        fi
956
957        (( RET=0 ))
958        for target in ${dm_liste[*]} ; do
959          \cp ${target} ${DEST} >> out_rsync 2>&1
960          (( RET=RET+$? ))
961        done
962
963#       echo ${RSYNC} ${RSYNC_opt} $@ > out_rsync 2>&1
964#       ${RSYNC} ${RSYNC_opt} $@ >> out_rsync 2>&1
965#       RET=$?
966#       IGCM_sys_Rsync_out $RET
967
968#       ${libIGCM}/libIGCM_sys/IGCM_analyse_rsync_out.awk out_rsync
969#       (( RET=RET+$? ))
970
971        if [ ${RET} -gt 0 ] ; then
972            echo "IGCM_sys_Get : copy error."
973            cat out_rsync
974            IGCM_debug_Exit "IGCM_sys_Get"
975        fi
976    else
977        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
978    fi
979    IGCM_debug_PopStack "IGCM_sys_Get"
980}
981
982#D-#==================================================
983#D-function IGCM_sys_Put_Dods
984#D-* Purpose: DO NOTHING ! Put $(ARCHIVE) files on DODS internet protocole.
985#D-* Examples:
986#D-
987function IGCM_sys_Put_Dods {
988    IGCM_debug_PushStack "IGCM_sys_Put_Dods" $@
989    if ( $DEBUG_sys ) ; then
990        echo "IGCM_sys_Put_Dods :" $@
991    fi
992    if [ $DRYRUN = 0 ]; then
993        if [ ! -f ${1} ] ; then
994            echo "WARNING : IGCM_sys_Put_Dods ${1} DOES NOT EXIST ."
995            IGCM_debug_PopStack "IGCM_sys_Put_Dods"
996            return
997        fi
998        #DO NOTHING
999    else
1000        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
1001    fi
1002    IGCM_debug_PopStack "IGCM_sys_Put_Dods"
1003}
1004
1005############################################################## A FINIR !!
1006
1007#D-#==================================================
1008#D-function IGCM_sys_GetDate_FichWork
1009#D-* Purpose: donne la date filesys d'un fichier sur le filesystem WORK
1010#D-* Examples:
1011#D-
1012function IGCM_sys_GetDate_FichWork {
1013    IGCM_debug_PushStack "IGCM_sys_FichWork" $@
1014    if ( $DEBUG_sys ) ; then
1015        echo "IGCM_sys_GetDate_FichWork :" $@
1016    fi
1017    # donne la date filesys d'un fichier sur la machine work
1018    IGCM_debug_PopStack "IGCM_sys_FichWork"
1019}
1020
1021#D-#==================================================
1022#D-function IGCM_sys_GetDate_FichArchive
1023#D-* Purpose: donne la date filesys d'un fichier sur le filesystem ARCHIVE
1024#D-* Examples:
1025#D-
1026function IGCM_sys_GetDate_FichArchive {
1027    IGCM_debug_PushStack "IGCM_sys_FichArchive" $@
1028    if ( $DEBUG_sys ) ; then
1029        echo "IGCM_sys_GetDate_FichArchive :" $@
1030    fi
1031    IGCM_debug_PopStack "IGCM_sys_FichArchive"
1032}
1033
1034
1035##############################################################
1036# REBUILD OPERATOR
1037
1038function IGCM_sys_rebuild {
1039    IGCM_debug_PushStack "IGCM_sys_rebuild" -- $@
1040    if ( $DEBUG_sys ) ; then
1041        echo "IGCM_sys_rebuild :" $@
1042    fi
1043    rebuild -f -o $@
1044    if [ $? -gt 0 ] ; then
1045       echo "IGCM_sys_rebuild : erreur ${@}."
1046       IGCM_debug_Exit "rebuild"
1047    fi
1048
1049    IGCM_debug_PopStack "IGCM_sys_rebuild"
1050}
1051
1052##############################################################
1053# NCO OPERATOR
1054
1055function IGCM_sys_ncap {
1056    IGCM_debug_PushStack "IGCM_sys_ncap" -- $@
1057    if ( $DEBUG_sys ) ; then
1058        echo "IGCM_sys_ncap :" $@
1059    fi
1060    /usr/local/bin/ncap $@
1061    if [ $? -gt 0 ] ; then
1062       echo "IGCM_sys_ncap : erreur ${@}."
1063#       IGCM_debug_Exit "ncap"
1064    fi
1065
1066    IGCM_debug_PopStack "IGCM_sys_ncap"
1067}
1068
1069ncatted=/usr/local/bin/ncatted
1070# Problem with ksh and string passed in this function to ncatted !
1071# function IGCM_sys_ncatted {
1072#     IGCM_debug_PushStack "IGCM_sys_ncatted" -- $@
1073#     if ( $DEBUG_sys ) ; then
1074#       echo "IGCM_sys_ncatted :" $@
1075#     fi
1076#     /usr/local/bin/ncatted $@
1077#     if [ $? -gt 0 ] ; then
1078#        echo "IGCM_sys_ncatted : erreur ${@}."
1079#        IGCM_debug_Exit "ncatted"
1080#     fi
1081
1082#     IGCM_debug_PopStack "IGCM_sys_ncatted"
1083# }
1084
1085function IGCM_sys_ncbo {
1086    IGCM_debug_PushStack "IGCM_sys_ncbo" -- $@
1087    if ( $DEBUG_sys ) ; then
1088        echo "IGCM_sys_ncbo :" $@
1089    fi
1090    /usr/local/bin/ncbo $@
1091    if [ $? -gt 0 ] ; then
1092       echo "IGCM_sys_ncbo : erreur ${@}."
1093#       IGCM_debug_Exit "ncbo"
1094    fi
1095
1096    IGCM_debug_PopStack "IGCM_sys_ncbo"
1097}
1098
1099function IGCM_sys_ncdiff {
1100    IGCM_debug_PushStack "IGCM_sys_ncdiff" -- $@
1101    if ( $DEBUG_sys ) ; then
1102        echo "IGCM_sys_ncdiff :" $@
1103    fi
1104    /usr/local/bin/ncdiff $@
1105    if [ $? -gt 0 ] ; then
1106       echo "IGCM_sys_ncdiff : erreur ${@}."
1107#       IGCM_debug_Exit "ncdiff"
1108    fi
1109
1110    IGCM_debug_PopStack "IGCM_sys_ncdiff"
1111}
1112
1113function IGCM_sys_ncea {
1114    IGCM_debug_PushStack "IGCM_sys_ncea" -- $@
1115    if ( $DEBUG_sys ) ; then
1116        echo "IGCM_sys_ncea :" $@
1117    fi
1118    /usr/local/bin/ncea $@
1119    if [ $? -gt 0 ] ; then
1120       echo "IGCM_sys_ncea : erreur ${@}."
1121#       IGCM_debug_Exit "ncea"
1122    fi
1123
1124    IGCM_debug_PopStack "IGCM_sys_ncea"
1125}
1126
1127function IGCM_sys_ncecat {
1128    IGCM_debug_PushStack "IGCM_sys_ncecat" -- $@
1129    if ( $DEBUG_sys ) ; then
1130        echo "IGCM_sys_ncecat :" $@
1131    fi
1132    /usr/local/bin/ncecat $@
1133    if [ $? -gt 0 ] ; then
1134       echo "IGCM_sys_ncecat : erreur ${@}."
1135#       IGCM_debug_Exit "ncecat"
1136    fi
1137
1138    IGCM_debug_PopStack "IGCM_sys_ncecat"
1139}
1140
1141function IGCM_sys_ncflint {
1142    IGCM_debug_PushStack "IGCM_sys_ncflint" -- $@
1143    if ( $DEBUG_sys ) ; then
1144        echo "IGCM_sys_ncflint :" $@
1145    fi
1146    /usr/local/bin/ncflint $@
1147    if [ $? -gt 0 ] ; then
1148       echo "IGCM_sys_ncflint : erreur ${@}."
1149#       IGCM_debug_Exit "ncflint"
1150    fi
1151
1152    IGCM_debug_PopStack "IGCM_sys_ncflint"
1153}
1154
1155function IGCM_sys_ncks {
1156    IGCM_debug_PushStack "IGCM_sys_ncks" -- $@
1157    if ( $DEBUG_sys ) ; then
1158        echo "IGCM_sys_ncks :" $@
1159    fi
1160    /usr/local/bin/ncks $@
1161    if [ $? -gt 0 ] ; then
1162       echo "IGCM_sys_ncks : erreur ${@}."
1163#       IGCM_debug_Exit "ncks"
1164    fi
1165
1166    IGCM_debug_PopStack "IGCM_sys_ncks"
1167}
1168
1169function IGCM_sys_ncpdq {
1170    IGCM_debug_PushStack "IGCM_sys_ncpdq" -- $@
1171    if ( $DEBUG_sys ) ; then
1172        echo "IGCM_sys_ncpdq :" $@
1173    fi
1174    /usr/local/bin/ncpdq $@
1175    if [ $? -gt 0 ] ; then
1176       echo "IGCM_sys_ncpdq : erreur ${@}."
1177#       IGCM_debug_Exit "ncpdq"
1178    fi
1179
1180    IGCM_debug_PopStack "IGCM_sys_ncpdq"
1181}
1182
1183function IGCM_sys_ncra {
1184    IGCM_debug_PushStack "IGCM_sys_ncra" -- $@
1185    if ( $DEBUG_sys ) ; then
1186        echo "IGCM_sys_ncra :" $@
1187    fi
1188    /usr/local/bin/ncra $@
1189    if [ $? -gt 0 ] ; then
1190       echo "IGCM_sys_ncra : erreur ${@}."
1191#       IGCM_debug_Exit "ncra"
1192    fi
1193
1194    IGCM_debug_PopStack "IGCM_sys_ncra"
1195}
1196
1197function IGCM_sys_ncrcat {
1198    IGCM_debug_PushStack "IGCM_sys_ncrcat" -- $@
1199    if ( $DEBUG_sys ) ; then
1200        echo "IGCM_sys_ncrcat :" $@
1201    fi
1202    /usr/local/bin/ncrcat $@
1203    if [ $? -gt 0 ] ; then
1204       echo "IGCM_sys_ncrcat : erreur ${@}."
1205#       IGCM_debug_Exit "ncrcat"
1206    fi
1207
1208    IGCM_debug_PopStack "IGCM_sys_ncrcat"
1209}
1210
1211function IGCM_sys_ncrename {
1212    IGCM_debug_PushStack "IGCM_sys_ncrename" -- $@
1213    if ( $DEBUG_sys ) ; then
1214        echo "IGCM_sys_ncrename :" $@
1215    fi
1216    /usr/local/bin/ncrename $@
1217    if [ $? -gt 0 ] ; then
1218       echo "IGCM_sys_ncrename : erreur ${@}."
1219#       IGCM_debug_Exit "ncrename"
1220    fi
1221
1222    IGCM_debug_PopStack "IGCM_sys_ncrename"
1223}
1224
1225function IGCM_sys_ncwa {
1226    IGCM_debug_PushStack "IGCM_sys_ncwa" -- $@
1227    if ( $DEBUG_sys ) ; then
1228        echo "IGCM_sys_ncwa :" $@
1229    fi
1230    /usr/local/bin/ncwa $@
1231    if [ $? -gt 0 ] ; then
1232       echo "IGCM_sys_ncwa : erreur ${@}."
1233#       IGCM_debug_Exit "ncwa"
1234    fi
1235
1236    IGCM_debug_PopStack "IGCM_sys_ncwa"
1237}
1238
1239############################################################
1240# Activate Running Environnment Variables
1241
1242function IGCM_sys_activ_variables {
1243    IGCM_debug_PushStack "IGCM_sys_activ_variables"
1244    if ( $DEBUG_sys ) ; then
1245        echo "IGCM_sys_activ_variables"
1246    fi
1247    IGCM_debug_PopStack "IGCM_sys_activ_variables"
1248}
1249
1250############################################################
1251# Desactivate Running Environnment Variables
1252
1253function IGCM_sys_desactiv_variables {
1254    IGCM_debug_PushStack "IGCM_sys_desactiv_variables"
1255    if ( $DEBUG_sys ) ; then
1256        echo "IGCM_sys_desactiv_variables"
1257    fi
1258    IGCM_debug_PopStack "IGCM_sys_desactiv_variables"
1259}
1260
1261############################################################
1262# Build run file
1263
1264function IGCM_sys_build_run_file {
1265    IGCM_debug_PushStack "IGCM_sys_build_run_file"
1266    if ( $DEBUG_sys ) ; then
1267        echo "IGCM_sys_build_run_file"
1268    fi
1269    IGCM_debug_PopStack "IGCM_sys_build_run_file"
1270}
Note: See TracBrowser for help on using the repository browser.