#! /bin/sh

#    Dec 03/08 - F.Majaess (Revised for sa/saiph, ib/dorval-ib, af/alef)
#    Oct 16/06 - F.Majaess (Revised for ma/maia, ns/naos)
#    Mar 01/06 - F.Majaess (Revised for rg/rigel)
#    Jun 20/03 - F.Majaess (Revised for az/azur)
#    Feb 25/02 - F.Majaess (Revised for ya/yata)
#    Dec 01/00 - F.Majaess (Revised to match the ownership of created
#                           link, when pollux is targeted, to that of the 
#                           actual file.)
#    Sep 14/00 - F.Majaess (Revised for tu/tsunami)
#    Jan 05/00 - F.Majaess (Added kz/kaze)
#    Jan 21/99 - F.Majaess (Added yo/yonaka)
#    Apr 29/98 - F.Majaess (Revised to get around long list)
#    Jul 14/97 - F.Majaess (Added sx/hiru)
#    Jun 05/97 - F.Majaess (Remove /data/ccrp/data scan on pollux)
#    Mar 14/96 - F.Majaess (Added sx4)
#    Oct 16/95 - F.Majaess (Added orion, gandalf & aragorn)
#    Nov 08/94 - F.Majaess (Modify for sx3r and new destination identifiers)
#    SEP 21/94 - F.Majaess (Adjust for changing from /data/ccrn01)
#    JUL 21/94 - F.Majaess (restrict links to files with edition number)
#    JUL 08/94 - F.Majaess (fix "datapath" default)
#    Oct 12/93 - F.Majaess (Adjust for having several /data... on cidsv08)
#    Dec 23/92 - F.Majaess (Correct default /data... with "all")
#    Dec 01/92 - E. Chan   
 
#id  lnmake  - establishes symbolic links on the official CCRD/N data
#id            directory to files residing in the targeted CCRD/N file 
#id            systems on the front-end or one of the back-ends.
 
#    AUTHOR - E. Chan  
 
#hd  PURPOSE - "lnmake" submits a job either to the front-end or one of the
#hd            back-ends and establishes symbolic links on the official data 
#hd            directory to all files in all targeted official CCRD/N file 
#hd            systems.
#hd  
#hd            This may be required if the file system on which the official
#hd            data directory resides crashes. By default, all user run
#hd            directories (on different file systems) will be scanned by 
#hd            "lnmake" except for '$DATAPATH' (the official data directory) 
#hd            and '$DATAPATH_BACKUP' (the designated backup if appropriate).
#hd   
#hd            If "lnmake" is to be run for the purpose of making the backup
#hd            file system the operational one, then the environment variable
#hd            '$DATAPATH' must point to the backup file system. 
 
#pr  PARAMETERS:
#pr  
#pr    POSITIONAL
#pr
#pr       dirlist = list of user '$RUNPATH' run directories
#pr  
#pr    PRIMARY
#pr   
#pr
#pr      Note: One of 'ha/sp/po/ca/mz' in Dorval.
#pr
#pr            ha = to target job to IBM (hadar).
#pr
#pr            sp = to target job to IBM (spica).
#pr
#pr            po = to target job to Linux (pollux).
#pr
#pr            ca = to target job to Linux (castor).
#pr
#pr            mz = to target job to Linux (mez).
#pr
#pr
#pr      datapath = path of data directory (='$DATAPATH') 
#pr   
#pr      databack = path of backup data directory (='$DATAPATH_BACKUP') 
#pr                 (disabled)
#pr   
#pr          time = time limit for job in seconds (=1799)
#pr  
#pr           mem = memory limit for job in megabytes (=100)
#pr  
#pr    SECONDARY
#pr 
#pr           all = switch to establish links for all files on all
#pr                 user run directories (=no)
#pr
#pr        nowait = switch controls allowing for wait time before
#pr                 proceeding with establishing missing link (=no).
#pr  
 
#ex  EXAMPLE: 
#ex  
#ex  lnmake all ha
#ex 
#ex  The above example generates symbolic links on the official data
#ex  directory ('$DATAPATH') on MAIA pointing to all files residing 
#ex  in all user run directories on the different official CCRD/N 
#ex  file systems.

#  * Obtain any specified option. 

for arg in $@
do
  case $arg in
        -x) set $arg                   ;;
       *=*) eval $arg                  ;;
       all) all=yes                    ;;
    nowait) nowait=yes                 ;;
        hr) mdest=${mdest:='hare'}       ;;
        br) mdest=${mdest:='brooks'}       ;;
        p1) mdest=${mdest:='ppp1'}       ;;
        p2) mdest=${mdest:='ppp2'}       ;;
        ha) mdest=${mdest:='hadar'}       ;;
        sp) mdest=${mdest:='spica'}       ;;
        po) mdest=${mdest:='pollux'}   ;;
        ca) mdest=${mdest:='castor'}   ;;
        mz) mdest=${mdest:='mez'}   ;;
         *) dirlist="$dirlist $arg"
  esac
done

#  * Ensure target directories are specified.

if [ -z "$dirlist" -a -z "$all" ] ; then
  echo Error in lnmake: must specify directories or use "all" option
  exit 1
fi

#  * Prompt for a destination if none was specified.

while [ -z "$mdest" ]
do
 if [ "$SITE_ID" = 'Victoria' ] ; then
   mdest='vicsmall'
 elif [ "$SITE_ID" = 'Dorval' ] ; then
  echo "please enter a destination; ha/sp/po/ca/mz: > \\c"
  read tmdest
  case $tmdest in
      ha) mdest='hadar'                 ;;
      sp) mdest='spica'                 ;;
      po) mdest='pollux'                ;;
      ca) mdest='castor'                ;;
      mz) mdest='mez'                ;;
       *) echo "illegal destination ! " ;;
  esac
 elif [ "$SITE_ID" = 'DrvlSC' ] ; then
  echo "please enter a destination; hr/br/p1/p2: > \\c"
  read tmdest
  case $tmdest in
      hr) mdest='hare'                 ;;
      br) mdest='brooks'                 ;;
      p1) mdest='ppp1'                ;;
      p2) mdest='ppp2'                ;;
       *) echo "illegal destination ! " ;;
  esac
 else
  echo "please enter a destination: > \\c"
  read mdest
 fi
done

#  * Set the defaults and any specified option.

# DATAPATH_BACKUP=/data/ccrn06

time=${time:=1799}
mem=${mem:=100}
nonqs=${nonqs:=$NONQS}
nonqs=${nonqs:='no'}
nowait=${nowait:='no'}
# databack=${databack:='$DATAPATH_BACKUP'}
datapath=${datapath:='$DATAPATH'}
LOGNAME=${LOGNAME:=`whoami`}

#  * Construct and submit the job.

if [ "$mdest" = 'hare' ] ; then
  outdest=$OUTPUTQ/lnmake.hr.$$
  if [ -n "$all" ] ; then
   unset dirlist
   dirlist='`ls -Cd /fs/xc1lustre1/crd/hrd02/src_data /fs/xc1lustre1/crd/hrd0[1-3]/data`'
  #dirlist='`ls -Cd                                   /fs/xc1lustre1/crd/hrd0[1-3]/data`'
  fi
elif [ "$mdest" = 'brooks' ] ; then
  outdest=$OUTPUTQ/lnmake.br.$$
  if [ -n "$all" ] ; then
   unset dirlist
   dirlist='`ls -Cd /fs/xc2lustre1/eccc/crd/brd02/src_data /fs/xc2lustre1/eccc/crd/brd0[1-3]/data`'
  #dirlist='`ls -Cd                                   /fs/xc1lustre1/crd/brd0[1-3]/data`'
  fi
elif [ "$mdest" = 'hadar' ] ; then
  outdest=$OUTPUTQ/lnmake.ha.$$
  if [ -n "$all" ] ; then
   unset dirlist
   dirlist='`ls -Cd /fs/dev/crb/had02/src_data /fs/dev/crb/had0[1-3]/data`'
  fi
elif [ "$mdest" = 'spica' ] ; then
  outdest=$OUTPUTQ/lnmake.sp.$$
  if [ -n "$all" ] ; then
   unset dirlist
   dirlist='`ls -Cd /fs/dev/crb/spd02/src_data /fs/dev/crb/spd0[1-3]/data`'
  fi
elif [ "$mdest" = 'pollux' ] ; then
  outdest=$OUTPUTQ/lnmake.po.$$
  if [ -n "$all" ] ; then
   unset dirlist
   # dirlist='`ls -Cd /data/cava_ccrn0/dib02/src_data /data/cava_ccrn0/dib0[1-3]/data /data/cava_ccrn[1-2]/data /data/cava_ccrn[1-2]/data/utmp /data/cava_ccrnj0[1-9]/data /data/cava_ccrnj0[1-9]/data/utmp /data/cava_ccrnj10/data /data/cava_ccrnj10/data/utmp /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data/utmp /data/cava_ccrn0/dib02/data/ursl_data`'
   # dirlist='`ls -Cd /data/cava_ccrn0/dib02/src_data /data/cava_ccrn0/dib0[1-3]/data /data/cava_ccrn[1-2]/data /data/cava_ccrn[1-2]/data/utmp /data/cava_ccrnj0[1-9]/data /data/cava_ccrnj0[1-9]/data/utmp /data/cava_ccrnj1[0-4]/data /data/cava_ccrnj1[0-4]/data/utmp /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data/utmp /data/cava_ccrn0/dib02/data/ursl_data`'
   # dirlist='`ls -Cd /fs/cava/dev/crb/sata/ccrna02/src_data /fs/cava/dev/crb/sata/ccrna0[1-5]/data /fs/cava/dev/crb/sata/ccrna0[1-5]/data/utmp /fs/cava/dev/crb/sas/ccrns0[1-9]/data /fs/cava/dev/crb/sas/ccrns0[1-9]/data/utmp /fs/cava/dev/crb/sas/ccrns1[0-4]/data /fs/cava/dev/crb/sas/ccrns1[0-4]/data/utmp /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data/utmp`'
   dirlist='`ls -Cd /fs/cava/dev/crb/sata/ccrna02/src_data /fs/cava/dev/crb/sata/ccrna0[1-5]/data /fs/cava/dev/crb/sata/ccrna0[1-5]/data/utmp /fs/cava/dev/crb/sas/ccrns0[1-9]/data /fs/cava/dev/crb/sas/ccrns0[1-9]/data/utmp /fs/cava/dev/crb/sas/ccrns1[0-4]/data /fs/cava/dev/crb/sas/ccrns1[0-4]/data/utmp /fs/cetus/fs2/crb/linux/cetus_ccrn01/data /fs/cetus/fs2/crb/linux/cetus_ccrn01/data/utmp`'
  fi
elif [ "$mdest" = 'castor' ] ; then
  outdest=$OUTPUTQ/lnmake.ca.$$
  if [ -n "$all" ] ; then
   unset dirlist
   # dirlist='`ls -Cd /fs/cava/dev/crb/sata/ccrna02/src_data /fs/cava/dev/crb/sata/ccrna0[1-5]/data /fs/cava/dev/crb/sata/ccrna0[1-5]/data/utmp /fs/cava/dev/crb/sas/ccrns0[1-9]/data /fs/cava/dev/crb/sas/ccrns0[1-9]/data/utmp /fs/cava/dev/crb/sas/ccrns1[0-4]/data /fs/cava/dev/crb/sas/ccrns1[0-4]/data/utmp /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data/utmp`'
   dirlist='`ls -Cd /fs/cava/dev/crb/sata/ccrna02/src_data /fs/cava/dev/crb/sata/ccrna0[1-5]/data /fs/cava/dev/crb/sata/ccrna0[1-5]/data/utmp /fs/cava/dev/crb/sas/ccrns0[1-9]/data /fs/cava/dev/crb/sas/ccrns0[1-9]/data/utmp /fs/cava/dev/crb/sas/ccrns1[0-4]/data /fs/cava/dev/crb/sas/ccrns1[0-4]/data/utmp /fs/cetus/fs2/crb/linux/cetus_ccrn01/data /fs/cetus/fs2/crb/linux/cetus_ccrn01/data/utmp`'
  fi
elif [ "$mdest" = 'mez' ] ; then
  outdest=$OUTPUTQ/lnmake.mz.$$
  if [ -n "$all" ] ; then
   unset dirlist
   # dirlist='`ls -Cd /fs/cava/dev/crb/sata/ccrna02/src_data /fs/cava/dev/crb/sata/ccrna0[1-5]/data /fs/cava/dev/crb/sata/ccrna0[1-5]/data/utmp /fs/cava/dev/crb/sas/ccrns0[1-9]/data /fs/cava/dev/crb/sas/ccrns0[1-9]/data/utmp /fs/cava/dev/crb/sas/ccrns1[0-4]/data /fs/cava/dev/crb/sas/ccrns1[0-4]/data/utmp /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data /cnfs/dev/crb/linux/cnfs_ccrn0[1-2]/data/utmp`'
   dirlist='`ls -Cd /fs/cava/dev/crb/sata/ccrna02/src_data /fs/cava/dev/crb/sata/ccrna0[1-5]/data /fs/cava/dev/crb/sata/ccrna0[1-5]/data/utmp /fs/cava/dev/crb/sas/ccrns0[1-9]/data /fs/cava/dev/crb/sas/ccrns0[1-9]/data/utmp /fs/cava/dev/crb/sas/ccrns1[0-4]/data /fs/cava/dev/crb/sas/ccrns1[0-4]/data/utmp /fs/cetus/fs2/crb/linux/cetus_ccrn01/data /fs/cetus/fs2/crb/linux/cetus_ccrn01/data/utmp`'
  fi
fi

# if [ "$mdest" = 'sx' ] ; then
#  queue=${DEFBEQ:='hiru'}
# else
#  queue=$mdest
# fi
queue=$mdest

# qsub -q $queue -lT $time -lM ${mem}mb -r lnmake \
#                -eo -o $outdest <<endjob

if [ "$nonqs" = 'yes' ] ; then
 queue="$HOSTID"
 if [ "$queue" = "$HOSTID" ] ; then
  line="nohup sh -s - 1>>$outdest 2>>$outdest & "
 else
  echo "LNMAKE: Sorry, nohup is limited to the same platform"
  echo "        queue=$queue; HOSTID=$HOSTID !"
  exit 1
 fi
else
 line="$CCCQSUB -q $queue -lT $time -lM ${mem}mb -r lnmake -eo -o $outdest"
fi
#
cd $HOME/tmp
(cat <<endjob) | eval "$line"
#!/bin/sh
# set -x
fixme () {
#set -x
 unset file
 eval "\$@"
 if [ -n "\$file" ] ; then
  Oline=\`ls -ld \$file \`
  line=\`echo "\$Oline" | grep '^-'\`
  if [ -n "\$line" ] ; then
    Ofile=\`echo "\$Oline" | \$AWK '{ print \$3 ; }'\`
    if [ ! -f "$datapath/\$file" ] ; then
     if [ \( \( "\$OS" = 'Linux' -o "\$OS" = 'AIX' \) -a "\$SITE_ID" = 'Dorval' \) -o "\$SITE_ID" = 'DrvlSC' ] ; then
      if [ "$nowait" != 'yes' ] ; then sleep 2 ; fi
      if [ ! -f "$datapath/\$file" ] ; then
       if [ "$nowait" != 'yes' ] ; then sleep 2 ; fi
       if [ -s "\$dir/\$file" ] ; then
        echo "Link to \$dir/\$file is missing"
        ls -ldL \$dir/\$file
#       if [ "\$Ofile" = 'acrnrxx' ] ; then
          if [ ! -f "$datapath/\$file" ] ; then
           if [ "\$Ofile" = "$LOGNAME" ] ; then
            (cd $datapath; ln -s \$dir/\$file \$file )
           else
            if [ "\$OS" = 'Linux' ] ; then
             if [ "\$SITE_ID" = 'DrvlSC' ] ; then
              set -x
              ssh \$Ofile@${mdest} "cd $datapath; ln -s \$dir/\$file \$file"
              set +x
             elif [ "$mdest" = 'pollux' ] ; then
              set -x
              ssh \$Ofile@pollux "cd $datapath; ln -s \$dir/\$file \$file"
              set +x
            #else
            # set -x
            # ssh \$Ofile@alef "cd $datapath; ln -s \$dir/\$file \$file"
            # set +x
             elif [ "$mdest" = 'castor' -o "$mdest" = 'mez' ] ; then
              set -x
              ssh \$Ofile@${mdest} "cd $datapath; ln -s \$dir/\$file \$file"
              set +x
             fi
            else
             if [ "$mdest" = 'hadar' ] ; then
              set -x
              ssh \$Ofile@hadar "cd $datapath; ln -s \$dir/\$file \$file"
              set +x
             elif [ "$mdest" = 'spica' ] ; then
              set -x
              ssh \$Ofile@spica "cd $datapath; ln -s \$dir/\$file \$file"
              set +x
             fi
            fi
           fi
           echo "Link to \$dir/\$file established"
          else
           echo "Link to \$dir/\$file seems to have just been established!" 
           ls -ld $datapath/\$file
          fi
       else
        echo ' ****** ZERO SIZE FILE DETECTED:'
        ls -ldL \$dir/\$file
        echo ' ^^^^^^^^^^^^^^^^ **************'
       fi
       echo ' '
      fi
     else
      ln -s \$dir/\$file $datapath/\$file
      eval "\$fix_link_ownrshp"
      echo "Link to \$dir/\$file established"
      if [ ! -s "\$dir/\$file" ] ; then
       echo ' ****** ZERO SIZE FILE DETECTED:'
       ls -ldL \$dir/\$file
       echo ' ^^^^^^^^^^^^^^^^ **************'
      fi
      #echo "Link $datapath/\$file needs to be set for \$dir/\$file"
     fi
    fi
  fi
 fi
 }
#
echo
echo "            Check done from - HOSTID=\$HOSTID - as of \`date\`"
echo
echo "            Check done from - hostname=\`hostname\` - as of \`date\`"
echo
echo "         List of links established in directory: $datapath"
echo
# if [ \`hostname\` = 'cidsv08' ] ; then
# echo "                       \`/usr/bsd43/bin/date\`" 
# else
# echo "                       \`date\`" 
# fi
echo
#
#  * Generate listing of all files/links in the designated official data
#  * directory. 
#
cd $datapath
List_File="\$HOME/tmp/tmp_lnmake_\${HOSTID}_list\$\$"
touch \${List_File}
ls >> \${List_File}
fix_link_ownrshp=':'

Scrpt_File="\$HOME/tmp/tmp_lnmake_\${HOSTID}_scrpt\$\$"

#
#  * Loop through all files on all targeted directories and establish
#  * links to them on the desigated official data directory.
#
for dir in $dirlist
do
  #
  #  * Ensure that the official data and backup directories are not done.
  #
#  (ls -ld \$dir || : )
#  if [ "\$dir" != "$datapath" -a "\$dir" != "$datapath_backup" ] ; then
#  echo "Processing \${dir}:"
# set -x
  if [ "\$dir" != "$datapath" -a -d "\$dir" ] ; then
    # set +x
    (rm -f \${Scrpt_File} || : )
    cd \$dir
    # echo "Inside \`pwd\`"
    #
    #  * Generate a listing of files that do not have symbolic links by
    #  * comparing file listing with that obtained on the data directory.
    #
#   file_list=\`ls | diff -b \${List_File} - | \\
#   file_list=\`ls *.[0-9][0-9][0-9] | diff -b \${List_File} - | \\
#               sed -n 's/^> *\([^ ]*\)/\1/p'\`
#   file_list=\`ls | sed -n '/^.*\.[0-9][0-9][0-9]$/p' | diff -b \${List_File} - | \\
#               sed -n 's/^> *\([^ ]*\)/\1/p'\`
    touch \${Scrpt_File}
    ls | sed -n '/^.*\.[0-9][0-9][0-9]$/p' | diff -b \${List_File} - | \\
                sed -n 's/^> *\([^ ]*\)/\1/p' | sed -e 's/^/fixme file=/' >> \${Scrpt_File}
    #  
    #  * Loop over all files in file list and create the links.
    #
    if [ -s "\${Scrpt_File}" ] ; then
     echo "rm \${Scrpt_File}" >> \${Scrpt_File}
     # echo "\${Scrpt_File} file contents:"
     # cat \${Scrpt_File}
     . \${Scrpt_File}
    fi
    (rm -f \${Scrpt_File} || : )
  fi
done

echo
echo " FINISHED:             \`date\`"
#
#  * Remove temporary file and exit script.
#
rm -f \${List_File}
#
( rmllfls || : )
exit
endjob
exit
