home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / base / root.14 / sbin / emergency_rec / emergency_rec~
Text File  |  1998-08-19  |  22KB  |  775 lines

  1. #!/sbin/sh
  2.  
  3. # Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  4. #                                                                         
  5. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  6. #                   SANTA CRUZ OPERATION INC.                             
  7. #                                                                         
  8. #   The copyright notice above does not evidence any actual or intended   
  9. #   publication of such source code.                                      
  10.  
  11. #ident    "@(#)drf:cmd/emergency_rec.sh    1.15.1.9"
  12.  
  13. #This function maps the OS partition type to the corresponding
  14. #number used by fdisk command
  15. find_os_num()
  16. {
  17.     OS_NUM=0
  18.     case "$1" in
  19.  
  20.         "UNIX System" )
  21.             OS_NUM=1
  22.             ;;
  23.         "pre-5.0DOS" ) 
  24.             OS_NUM=2
  25.             ;;
  26.         "DOS" ) 
  27.             OS_NUM=3
  28.             ;;
  29.         "System" )
  30.             OS_NUM=4
  31.             ;;
  32.         "Other" )
  33.             OS_NUM=5
  34.             ;;
  35.         *)    ;;
  36.     esac
  37. }
  38.  
  39. #This function creates the ${FD_CMDS1} file corresponding to $1
  40. #FD_CMDS1 file will contain the commands to be executed to create the
  41. #unix and system partition if present and if it is first disk
  42.  
  43. fdisk_cmds()
  44. {
  45.    RTDEV=`devattr $1 cdevice 2>/dev/null`
  46.  
  47.    FDSKOUT=/tmp/fd_out export FDSKOUT
  48.    echo x | LC_ALL=C fdisk -L $RTDEV >${FDSKOUT} 
  49.    RDEV=`echo $RTDEV | sed "s/..$//"`
  50.    eval `grep NPART ${FDSKOUT}`
  51.    echo "fdisk -L \$1 >/tmp/fdisk_out <<-END" > ${FD_CMDS1}
  52.  
  53.    > ${PART_DD_INF}
  54.    > ${FD_CMDS2}
  55.    PART=1
  56.    # Check for Unix and system partition and write the create the command
  57.    # to create it in to FD_CMDS1 file and the boundary info to FD_CMDS2. 
  58.    # Update the PART_DD_INF file to contain the info about system partition 
  59.    # to be used by dd to backup/restore the system partition. 
  60.    while [ $PART -le $NPART ]
  61.    do
  62.     OS_LINE=`grep PART$PART ${FDSKOUT}`
  63.     OS_STAT=`echo "$OS_LINE" | cut -f2`
  64.     OS_TYPE=`echo "$OS_LINE" | cut -f3`
  65.     BEG_CYL=`echo "$OS_LINE" | cut -f4`
  66.     END_CYL=`echo "$OS_LINE" | cut -f5`
  67.     SIZE_CYL=`echo "$OS_LINE" | cut -f6`
  68.     find_os_num "$OS_TYPE"
  69.     OS_ST=""
  70.     if [ "$OS_STAT" = "Active" -a $OS_NUM -eq 1 ] 
  71.     then
  72.         OS_ST=1
  73.         PART_CMD="c $OS_NUM $BEG_CYL $SIZE_CYL $OS_ST"
  74.         echo $PART_CMD >>${FD_CMDS1}
  75.         PART_CMD="$BEG_CYL $END_CYL"
  76.         echo $PART_CMD >> ${FD_CMDS2}
  77.     else
  78.         #Make a note if it system partition on first disk
  79.         [ $OS_NUM -eq 4 -a $2 -eq 1 ] && {
  80.                 Dd_dev="${RDEV}p${PART}"    
  81.                 echo "$Dd_dev  p$PART"  > ${PART_DD_INF}
  82.             PART_CMD="c $OS_NUM $BEG_CYL $SIZE_CYL $OS_ST"
  83.             echo $PART_CMD >>${FD_CMDS1}
  84.             PART_CMD="$BEG_CYL $END_CYL"
  85.             echo $PART_CMD >> ${FD_CMDS2}
  86.         }
  87.     fi
  88.     PART=`expr $PART \+ 1`
  89.    done
  90.    echo s >>${FD_CMDS1}
  91.    echo END >>${FD_CMDS1}
  92.  
  93. }  # End of fdisk_cmds
  94.  
  95.  
  96. #this function creates the $LAYOUT_FL to match the existing
  97. #file systems in ${RDEV}s0 unix slice
  98. #This file will be used to setup the corresponding disk
  99.  
  100. dskset_cmds ()
  101. {
  102.     AN=`basename $RDEV`
  103.     ODM_FILES=/etc/vx/reconfig.d/disk.d/$AN
  104.     if [ "$VM_RUNNING" = "Yes" -a -s $ODM_FILES/vtoc ]
  105.     then
  106.     LC_ALL=C prtvtoc -f $ODM_VTOC ${RDEV}s0
  107.     echo "${RDEV}sf  sf" > $ODM_VOLINFO    
  108.     cp $ODM_FILES/vtoc $PRT_FOUT
  109.     else
  110.     LC_ALL=C prtvtoc -f $PRT_FOUT ${RDEV}s0
  111.     fi
  112.     LC_ALL=C prtvtoc ${RDEV}s0 > ${PRT_OUT}
  113.     SWAP_SLICE=200
  114.     grep SWAP $PRT_OUT >/dev/null
  115.     [ $? -eq 0 ] && 
  116.     SWAP_SLICE=`grep SWAP $PRT_OUT | cut -f1 -d":" | cut -f2 -d" "`
  117.     DUMP_SLICE=201
  118.     grep DUMP $PRT_OUT >/dev/null
  119.     [ $? -eq 0 ] && 
  120.     DUMP_SLICE=`grep DUMP $PRT_OUT | cut -f1 -d":" | cut -f2 -d" "`
  121.     STAND_SLICE=202
  122.     grep STAND $PRT_OUT >/dev/null
  123.     [ $? -eq 0 ] && 
  124.     STAND_SLICE=`grep STAND $PRT_OUT | cut -f1 -d":" | cut -f2 -d" "`
  125.     VOL_PRIV_SLICE=203
  126.     grep VOLPRIVATE $PRT_OUT >/dev/null
  127.     [ $? -eq 0 ] && 
  128.     VOL_PRIV_SLICE=`grep VOLPRIVATE $PRT_OUT | cut -f1 -d":" | cut -f2 -d" "`
  129.     VOL_PUB_SLICE=203
  130.     grep VOLPUBLIC $PRT_OUT >/dev/null
  131.     [ $? -eq 0 ] && 
  132.     VOL_PUB_SLICE=`grep VOLPUBLIC $PRT_OUT | cut -f1 -d":" | cut -f2 -d" "`
  133.     >${LAYOUT_FL}
  134.     while read slice rest
  135.     do
  136.     [ $slice = "#SLICE" -o $slice = "0" -o $slice = "7" -o $slice = "8" ] && continue
  137.     ii=$slice
  138.     ap=`echo $slice|awk '{ printf( "%x\n", $1) }'`
  139.     if [ $slice -lt 10 ] 
  140.     then
  141.         ii=" $slice"
  142.     fi
  143.  
  144.     grep "^$ii    0x0    0x0    0    0" $PRT_FOUT > /dev/null
  145.     [ $? -eq  0 ] && continue    #If the slice is all 0s, skip it
  146.  
  147.     grep "^$ii" $PRT_FOUT > /dev/null
  148.     [ $? -ne 0 ] && continue    #If the slice is not configured, skip it
  149.  
  150.      BDSK=/dev/dsk/${AN}s${ap}
  151.     MNTPNT=`grep "^$BDSK[     ]" $VFSTAB | sort -u | awk '{print $3}'`
  152.     [ -z "$MNTPNT" ] &&
  153.         case $slice in
  154.               "1")    MNTPNT="/"
  155.                 if [ $dd_fs -eq 1 ]
  156.                 then
  157.                     echo "/dev/rdsk/${AN}s1 $BDSK" > $WRK_DIR/dd_list
  158.                 fi
  159.                 ;;
  160.               "10")    MNTPNT="/stand"
  161.                 if [ $dd_fs -eq 1 ]
  162.                 then
  163.                     echo "/dev/rdsk/$(AN}sa $BDISK" >> $WRK_DIR/dd_list
  164.                 fi
  165.                 ;;
  166.               "$SWAP_SLICE")         MNTPNT="/dev/swap"
  167.                          ;;
  168.               "$DUMP_SLICE")         MNTPNT="/dev/dump"
  169.                          ;;
  170.               "$VOL_PRIV_SLICE")     MNTPNT="/dev/volprivate"
  171.                          ;;
  172.               "$VOL_PUB_SLICE")      MNTPNT="/dev/volpublic"
  173.                          ;;
  174.         esac 
  175.  
  176.     [ "$MNTPNT" = "" ] && {
  177.         pfmt -l UX:drf -s Warning -g drf:34 "Cannot determine mountpoint for device $BDSK"
  178.     }
  179.     
  180.     
  181.     if [ $slice -eq $SWAP_SLICE -o $slice -eq $DUMP_SLICE -o $slice -eq $VOL_PRIV_SLICE -o $slice -eq $VOL_PUB_SLICE ] 
  182.     then
  183.         FStyp="-"
  184.         BUFSZ="-"
  185.     else
  186.         FStyp=`grep "^$BDSK[     ]" $VFSTAB | awk '{print $4}'`
  187.         [ -z "$FStyp" -a $slice -eq 1 ] &&
  188.              FStyp=`grep "/dev/root" $VFSTAB | awk '{print $4}'`
  189.         [ -z "$FStyp" -a $slice -eq 10 ] &&
  190.              FStyp=`grep "/dev/stand" $VFSTAB | awk '{print $4}'`
  191.         [ -z "$FStyp" ] && continue
  192.             Binfo=`mkfs -m -F $FStyp  $BDSK 2>/dev/null | grep bsize 2>/dev/null`
  193.         if [ $? -eq 0 ]
  194.         then
  195.                 BUFSZ=`echo "$Binfo" | sed 's/.*bsize=//' | cut -f1 -d','`
  196.         else
  197.             case "$FStyp" in  #set the default value for the Fstyp
  198.                "bfs"  )        BUFSZ=512;;
  199.                "s5" | "vxfs" )    BUFSZ=1024;;
  200.                *)         BUFSZ=4096;;
  201.             esac
  202.         fi
  203.     fi
  204.  
  205.     UN_TYP=K
  206.     if [ $slice -eq $VOL_PUB_SLICE ] 
  207.     then
  208.        FLs=200
  209.        UN_TYP=W
  210.     else
  211.         FLs=`grep "^$ii    0x" $PRT_FOUT | cut -f5`
  212.     fi
  213.     [ -z "$FLs" ] && continue
  214.     FLsiz=`expr $FLs \/ 2`
  215.  
  216.     if grep -q "^${MNTPNT}$" /tmp/mnt_points 2>/dev/null
  217.     then
  218.         pfmt -l UX:drf -s error -g drf:35 "Duplicate mountpoint $MNTPNT detected with device $BDSK"
  219.         cleanup
  220.     else
  221.         echo $MNTPNT >>/tmp/mnt_points
  222.     fi
  223.     echo "$slice    $MNTPNT    $FStyp    $BUFSZ    ${FLsiz}${UN_TYP}    1R" >> ${LAYOUT_FL}
  224.     done <$PRT_FOUT
  225. }
  226.  
  227. #Set the variables for different output files for disk 1 and invoke fdisk_cmds
  228. #and dskset_cmds function
  229. disk1_setup ()
  230. {
  231.     rm -rf $WRK_DIR
  232.     mkdir -p $WRK_DIR
  233.     LAYOUT_FL=$WRK_DIR/lay_out_1 export LAYOUT_FL
  234.     PRT_FOUT=$WRK_DIR/prt_f_11 export PRT_FOUT
  235.     PRT_OUT=$WRK_DIR/prt_f_12 export PRT_OUT
  236.     PART_DD_INF=$WRK_DIR/part_dd_1 export PART_DD_INF
  237.     FD_CMDS1=$WRK_DIR/fd_cmds_11 export FD_CMDS1
  238.     FD_CMDS2=$WRK_DIR/fd_cmds_12 export FD_CMDS2
  239.     [ "$VM_RUNNING" = "Yes" ] && {
  240.         ODM_VTOC=$WRK_DIR/odm_vtoc_1 export ODM_VTOC
  241.         ODM_VOLINFO=$WRK_DIR/odm_volinfo_1 export ODM_VOLINFO
  242.     }
  243.     fdisk_cmds disk1 1
  244.     dskset_cmds 1
  245.     rm -f $PRT_FOUT $PRT_OUT
  246. }
  247.  
  248. #Set the variables for different output files for disk 2 and invoke fdisk_cmds
  249. #and dskset_cmds function
  250. disk2_setup ()
  251. {
  252.     LAYOUT_FL=$WRK_DIR/lay_out_2 export LAYOUT_FL
  253.     PRT_FOUT=$WRK_DIR/prt_f_21 export PRT_FOUT
  254.     PRT_OUT=$WRK_DIR/prt_f_22 export PRT_FOUT
  255.     PART_DD_INF=$WRK_DIR/part_dd_2 export PART_DD_INF
  256.     FD_CMDS1=$WRK_DIR/fd_cmds_21 export FD_CMDS1
  257.     FD_CMDS2=$WRK_DIR/fd_cmds_22 export FD_CMDS2
  258.     [ "$VM_RUNNING" = "Yes" ] && {
  259.         ODM_VTOC=$WRK_DIR/odm_vtoc_2 export ODM_VTOC
  260.         ODM_VOLINFO=$WRK_DIR/odm_volinfo_2 export ODM_VOLINFO
  261.     }
  262.     fdisk_cmds disk2 2
  263.     dskset_cmds 2
  264.     rm -f $PRT_FOUT $PRT_OUT $PART_DD_INF 
  265. }
  266.  
  267. check_disk2 ()
  268. {
  269.     devattr disk2 1>/dev/null 2>&1
  270.     [ $? -ne 0 ] && return
  271.     RT2=`devattr disk2 addcmd | cut -f 2 -d" "`
  272.     for i in /usr /home /home2 /var $NWS_SYS_PATH
  273.     do
  274.        spl=`grep "[     ]$i[     ]" $VFSTAB  | grep -v "^#" | awk '{print $1}'`
  275.        if [ $? -eq 0 ] 
  276.        then
  277.         echo $spl | grep $RT2 >/dev/null 2>&1
  278.         [ $? -eq 0 ] && {
  279.             disk2_setup
  280.             return
  281.           }
  282.        fi
  283.     done
  284.     return
  285. }
  286.  
  287. dd_copy_disk()
  288. {
  289.     pfmt -l UX:drf -s NOSTD -g drf:26 "\n\tCopying the primary disk to tape, please wait ...\n"
  290.     cd /tmp
  291.     rm -rf $WRK_DIR
  292.     mkdir -p $WRK_DIR
  293.     tapecntl -t $TAPEDEV
  294.     tapecntl -w $TAPEDEV
  295.     tapecntl -f 512 $TAPEDEV
  296.     OUTDEV=`devattr $MEDIUM norewind`
  297.     DV=`devattr disk1 addcmd | cut -f2 -d" "`
  298.     echo "Entire Disk" > $WRK_DIR/entire_dsk
  299.     find $CPIO_DIR -depth -print | cpio -ocdu -O $OUTDEV 2>/dev/null 1>&2
  300.     
  301.     INDEV=/dev/rdsk/${DV}p0
  302.     dd if=$INDEV of=$OUTDEV bs=64k 2>&1 >/dev/null
  303.     if [ $? -eq 0 ]
  304.     then
  305.         pfmt -l UX:drf -s NOSTD -g drf:12 "\n\tCreation of the Emergency Recovery tape was successful.\n\n"
  306.     else
  307.         pfmt -l UX:drf -s NOSTD -g drf:25 "\n\tCreation of the Emergency Recovery tape was NOT successful.\n\n"
  308.     fi
  309.     return 
  310. }
  311.  
  312. cpio_copy_disk()
  313. {
  314.     pfmt -l UX:drf -s NOSTD -g drf:11 "\n\tCopying the hard disk(s) to tape, please wait ...\n"
  315.     cd /tmp
  316.     tapecntl -t $TAPEDEV
  317.     tapecntl -w $TAPEDEV
  318.     tapecntl -f 512 $TAPEDEV
  319.     OUTDEV=`devattr $MEDIUM norewind`
  320.     cp /etc/boot $WRK_DIR
  321.     cp /usr/sbin/disksetup $WRK_DIR
  322.     [ -s $WRK_DIR/odm_volinfo_1 -o -s $WRK_DIR/odm_volinfo_2 ] && {
  323.         rm -rf /etc/vx/.drf
  324.         mkdir -p /etc/vx/.drf
  325.         echo "#!/sbin/sh" > /etc/vx/.drf/priv_slc_copy
  326.         echo "#!/sbin/sh" > /etc/vx/.drf/S90DRF
  327.     }
  328.     [ -s $WRK_DIR/odm_volinfo_1 ] && {
  329.         read dd_to_cp dd_jnk < $WRK_DIR/odm_volinfo_1
  330.         dd if=$dd_to_cp of=/etc/vx/.drf/Drf_Vol_1 bs=512 >/dev/null 2>&1
  331.         echo "[ -s /etc/vx/.drf/Drf_Vol_1 ] && " >>/etc/vx/.drf/priv_slc_copy
  332.         echo "    dd if=/etc/vx/.drf/Drf_Vol_1 of=\$1 bs=512 >/dev/null 2>&1" >> /etc/vx/.drf/priv_slc_copy
  333.         chmod 0755 /etc/vx/.drf/priv_slc_copy
  334.         echo "[ -s /etc/vx/.drf/Drf_Vol_1 ] && " >> /etc/vx/.drf/S90DRF
  335.         echo "    /sbin/mv /etc/vx/.drf/Drf_Vol_1 /etc/vx/.drf/S_Drf_Vol_1 >/dev/null 2>&1 " >> /etc/vx/.drf/S90DRF
  336.  
  337.     }
  338.     [ -s $WRK_DIR/odm_volinfo_2 ] && {
  339.         read dd_to_cp  dd_jnk < $WRK_DIR/odm_volinfo_2
  340.         dd if=$dd_to_cp of=/etc/vx/.drf/Drf_Vol_2 bs=512 >/dev/null 2>&1
  341.         echo "[ -s /etc/vx/.drf/Drf_Vol_2 ] &&" >> /etc/vx/.drf/priv_slc_copy
  342.         echo "    dd if=/etc/vx/.drf/Drf_Vol_2 of=\$2 bs=512 >/dev/null 2>&1" >>/etc/vx/.drf/priv_slc_copy
  343.         chmod 0755 /etc/vx/.drf/priv_slc_copy
  344.         echo "[ -s /etc/vx/.drf/Drf_Vol_2 ] &&" >>/etc/vx/.drf/S90DRF
  345.         echo "    /sbin/mv /etc/vx/.drf/Drf_Vol_2 /etc/vx/.drf/S_Drf_Vol_2 >/dev/null 2>&1 " >> /etc/vx/.drf/S90DRF
  346.     }
  347.     [ -s $WRK_DIR/odm_volinfo_1 -o -s $WRK_DIR/odm_volinfo_2 ] && {
  348.         echo "/usr/bin/ed -s /etc/inittab >/dev/null <<-END" >>/etc/vx/.drf/S90DRF
  349.         echo "/priv_slc_copy/d" >>/etc/vx/.drf/S90DRF
  350.         echo "w\nq\nEND" >>/etc/vx/.drf/S90DRF
  351.         echo "/sbin/rm /etc/rc2.d/S90DRF " >>/etc/vx/.drf/S90DRF
  352.     }
  353.     rm -f $WRK_DIR/odm_volinfo_1 $WRK_DIR/odm_volinfo_2
  354.     find $CPIO_DIR -depth -print | cpio -ocdu -O $OUTDEV 2>/dev/null 1>&2
  355.     sleep 30    #workaround for ST01 returns too fast bug
  356.     [ -s $WRK_DIR/part_dd_1 ] && {
  357.         read dd_to_cp dd_size < $WRK_DIR/part_dd_1
  358.         dd if=$dd_to_cp of=$OUTDEV bs=512 >/dev/null 2>&1
  359.     }
  360.     CONT_MSG=`pfmt -l UX:drf -s NOSTD -g drf:23 "\n\tRemove the tape from the tape drive.\n\tInsert the next tape and press <ENTER>." 2>&1`
  361. #
  362. #backup SYS volume as a separate cpio archive on the front of
  363. #the tape, because we'll want to read it in again later
  364. #
  365.     $NWS_CONFIG && {
  366.         cd /
  367.         find ./$NWS_SYS_PATH -depth -print | cpio -ocdu -M "$CONT_MSG" -O $OUTDEV >/dev/null
  368.         ret=$?
  369.         if [ $ret -ne 0 -a $ret -ne 2 ]
  370.         then
  371.             pfmt -l UX:drf -s NOSTD -g drf:25 "\n\tCreation of the Emergency Recovery tape was NOT successful.\n\n"
  372.         fi
  373.     }
  374.  
  375.     cd /
  376.     if [ $dd_fs -eq 0 ]
  377.     then
  378.         # using cpio
  379.         if [ $NWS_FILTER = "No" ]
  380.         then
  381.         find . -depth -print | cpio -ocdu -M "$CONT_MSG" -O $OUTDEV > /dev/null
  382.         ret=$?
  383.         else
  384.         NWS_SYS_PATH=`echo $NWS_SYS_PATH | sed "s&^\(.*[^/]\)/*&\1&"`
  385.         find . -depth -print | awk -v filter="$NWS_SYS_PATH" '{ if ($0 !~ "^\." filter "/.*") { print $0 }}' | cpio -ocdu -M "$CONT_MSG" -O $OUTDEV >/dev/null
  386.         ret=$?
  387.         fi
  388.         $NWS_CONFIG && {
  389.         sleep 10
  390.         stop_NWS_server
  391.         $NWS_MOUNTED && {
  392.             umount $NWS_SYS_PATH 2>/dev/null
  393.             NWS_MOUNTED=false
  394.         }
  395.         }
  396.     else
  397.         # dd each file-system
  398.         $NWS_CONFIG && {
  399.         sleep 10
  400.         stop_NWS_server
  401.         $NWS_MOUNTED && {
  402.             umount $NWS_SYS_PATH 2>/dev/null
  403.             NWS_MOUNTED=false
  404.         }
  405.         }
  406.         ret=0
  407.         while read cdevice bdevice
  408.         do
  409.         dd if=$cdevice of=$OUTDEV bs=64k 2>&1 1>/dev/null
  410.         ret=$?
  411.         [ $ret -ne 0 ] && break
  412.         done < $WRK_DIR/dd_list
  413.  
  414.         # Ensure we get an error message
  415.         [ $ret -ne 0 ] && ret=1
  416.     fi
  417.  
  418.     if [ $ret -eq 0 -o $ret -eq 2 ]
  419.     then
  420.         pfmt -l UX:drf -s NOSTD -g drf:12 "\n\tCreation of the Emergency Recovery tape was successful.\n\n"
  421.     else
  422.         pfmt -l UX:drf -s NOSTD -g drf:25 "\n\tCreation of the Emergency Recovery tape was NOT successful.\n\n"
  423.     fi
  424.     return 
  425.  }
  426.  
  427. # Display message and exit
  428. cleanup()
  429. {
  430.     trap '' 1 2 15
  431.  
  432.     $NWS_CONFIG && {
  433.         stop_NWS_server
  434.     }
  435.     $NWS_MOUNTED && {
  436.         umount $NWS_SYS_PATH 2>/dev/null
  437.         NWS_MOUNTED=false
  438.     }
  439.  
  440.     echo
  441.     rm /tmp/mnt_points 2>/dev/null
  442.     pfmt -l UX:drf -s error -g drf:13 "Emergency Recovery tape creation aborted.\n\n"
  443.     exit 1
  444. }
  445.  
  446. Usage()
  447. {
  448.    echo
  449.    pfmt -l UX:drf -s error -g drf:14 "Usage: emergency_rec [-e] ctape1|ctape2\n\n"
  450.    exit 1
  451. }
  452.  
  453.  
  454. # Make sure that the system is in maintenance mode.
  455. check_run_level()
  456. {
  457.    set `LC_ALL=C who -r`
  458.    if [ "$3" != "S" -a "$3" != "s" -a "$3" != "1" ] 
  459.    then
  460.     echo
  461.     pfmt -l UX:drf -s error -g drf:15 " You must be in maintenance mode to create the Emergency\n\t\tRecovery tape.\n\n"
  462.     exit 1
  463.    fi
  464. }
  465.  
  466. mount_usrfs()
  467. {
  468.     [ -f /usr/lib/libc.so.1 ] && return 
  469.     mount /usr  >/dev/null 2>&1
  470.     [ $? -eq 0 ] && return
  471.     while read spl fskdev mountp fstyp fsckpass atomnt mntpts macceil
  472.     do
  473.         [ "$mountp" != "/usr" ] && continue
  474.         fsck -F $fstyp  -y $fskdev  >/dev/null 2>&1
  475.         mount -F $fstyp $spl $mountp >/dev/null 2>&1
  476.         [ $? -eq 0 ] && return
  477.         pfmt -l UX:drf -s error -g drf:24 " Not able to mount /usr file systems.\n\t\tAborting the emergency tape creation.\n\n"
  478.         exit 1
  479.     done < /etc/vfstab
  480.     pfmt -l UX:drf -s error -g drf:24 " Not able to mount /usr file systems.\n\t\tAborting the emergency tape creation.\n\n"
  481.     exit 1
  482. }
  483.  
  484. mount_flsystms ()
  485. {
  486.  
  487.     RT1=`devattr disk1 addcmd | cut -f2 -d" "`
  488.  
  489.     devattr disk2 1>/dev/null 2>&1 && 
  490.     RT2=`devattr disk2 addcmd | cut -f2 -d" "`
  491.  
  492.     Not_mnted=""
  493.     echo 0   > /tmp/$$_drf_abc
  494.     while read special fsckdev mountp fstyp fsckpass automnt mountpts macceil
  495.     do
  496.     #skip the comment line
  497.     fst_chr=`echo $special | cut -c1`
  498.     [ "$fst_chr" = "#" ] && continue
  499.     #skip if it / or /stand or /proc or /dev/fd
  500.     [ "$mountp" = "/" -o "$mountp" = "/proc" -o "$mountp" = "/dev/fd" -o "$mountp" = "/usr" ] && continue
  501.     [ "$mountp" = "/usr" -a $dd_fs -eq 0 ] && continue
  502.     [ "$mountp" = "/stand" -a $dd_fs -eq 0 ] && continue
  503.  
  504.     echo "$special" | grep $RT1 >/dev/null 2>&1
  505.     rt=$?
  506.     [ $rt -ne 0 -a "$VM_RUNNING" = "Yes" ] && {
  507.         vspl=`grep "[     ]$mountp[     ]" $VFSTAB  | awk '{print $1}'`
  508.         echo "$vspl" | grep $RT1 >/dev/null 2>&1
  509.         rt=$?
  510.     }
  511.     if [ $rt -eq 0 ] 
  512.     then
  513.         if [ $dd_fs -eq 1 ]
  514.         then
  515.         [ "$fsckdev" != "-" ] &&
  516.             echo "$fsckdev $special" >> $WRK_DIR/dd_list
  517.         continue
  518.         fi
  519.  
  520.         # check if it is already mounted
  521.         awk -v mntpt="$mountp" '{ if ($2 == mntpt) exit 1 }' < /etc/mnttab
  522.         [ $? -eq 1 ] && continue
  523.  
  524.         mount -F$fstyp $special $mountp >/dev/null 2>&1
  525.         if [ $? -ne 0 ]
  526.         then
  527.         fsck -F$fstyp -y $fsckdev >/dev/null 2>&1
  528.         mount -F $fstyp $special $mountp >/dev/null 2>&1
  529.         [ $? -ne 0 ] && {
  530.             Not_mnted="$Not_mnted $mountp"
  531.                 echo 1 $Not_mnted > /tmp/$$_drf_abc
  532.         }
  533.         fi
  534.     else
  535.         [ "$mountp" = "/home" -o "$mountp" = "/home2" -o "$mountp" = "/var" ] || continue
  536.         [ -z "$RT2" ] && continue
  537.         echo "$special" | grep $RT2 >/dev/null 2>&1
  538.         rt=$?
  539.         [ $rt -ne 0 -a "$VM_RUNNING" = "Yes" ] && {
  540.         vspl=`grep "[     ]$mountp[     ]" $VFSTAB  | awk '{print $1}'`
  541.         echo "$vspl" | grep $RT2 >/dev/null 2>&1
  542.         rt=$?
  543.         }
  544.         if [ $rt -eq 0 ]
  545.         then
  546.         if [ $dd_fs -eq 1 ]
  547.         then
  548.             [ "$fsckdev" != "-" ] &&
  549.             echo "$fsckdev $special" >> $WRK_DIR/dd_list
  550.             continue
  551.         fi
  552.  
  553.         # check if it is already mounted
  554.         awk -v mntpt="$mntp" '{ if ($2 == mntpt) exit 1 }' < /etc/mnttab
  555.  
  556.         mount -F $fstyp $special $mountp >/dev/null 2>&1
  557.                 if [ $? -ne 0 ]
  558.                 then
  559.                     fsck -F$fstyp -y $fsckdev >/dev/null 2>&1
  560.                     mount -F $fstyp $special $mountp >/dev/null 2>&1
  561.                     [ $? -ne 0 ] && {
  562.                 Not_mnted="$Not_mnted $mountp"
  563.                     echo 1 $Not_mnted > /tmp/$$_drf_abc
  564.             }
  565.             fi
  566.         fi
  567.     fi
  568.     done < /etc/vfstab
  569.     read err Not_mnted < /tmp/$$_drf_abc
  570.     rm -f /tmp/$$_drf_abc
  571.     if [ $err -eq 1 ]
  572.     then
  573.     pfmt -l UX:drf -s error -g drf:16 " Not able to mount %s file systems.\n\t\tAborting the emergency tape creation.\n\n" "$Not_mnted"
  574.     exit 1
  575.     fi
  576. }
  577.  
  578. tape_ready ()
  579. {
  580.     while pfmt -l UX:drf -s NOSTD -g drf:17 "\n\tPlace a tape in %s and press <ENTER> or enter [q/Q] to abort : " $MEDIUM
  581.     do
  582.         read inp
  583.         if [ "$inp" = "Q" -o "$inp" = "q" ] 
  584.         then
  585.             pfmt -l UX:drf -s NOSTD -g drf:18 "\n\tEmergency Recovery tape creation terminated.\n\n"
  586.             exit 1
  587.         fi
  588.         tapecntl -w $TAPEDEV >/dev/null 2>&1
  589.         ls /sbin/emergency_rec | cpio -ocdu -G STDIO -O $TAPEDEV 2>/dev/null
  590.         [ $? = 0 ] && break
  591.         echo
  592.         pfmt -l UX:drf -s error -g drf:19 " Not able to write into the tape. Check the tape for damage\n\t\tor may be it is write protected.\n"
  593.     done
  594. }
  595.  
  596. stop_NWS_server ()
  597. {
  598.     sh /etc/init.d/nws stop
  599.  
  600.     while nwserverstatus >/dev/null 2>&1 #wait until server is down
  601.     do
  602.         sleep 5
  603.     done
  604.  
  605.     sh /etc/init.d/nw stop
  606.     nwcm -q -s login=on    #reset NetWare server for full access mode
  607.     nwcm -q -s nwum=$NWUM #set it back
  608.     nwcm -q -s nws_start_at_boot=$NWSBOOT #set it back
  609.     nwcm -q -s ipx_start_at_boot=$IPXBOOT #set it back
  610. }
  611.  
  612. #main
  613.  
  614. check_run_level
  615.  
  616. # cd to /tmp, to insure it does not get unmounted, because we need it
  617.  
  618. cd /tmp
  619. umountall 2>&1 | grep -v " /tmp "
  620.  
  621. NWS_CONFIG=false
  622. NWS_MOUNTED=false
  623. NWS_FILTER="No"
  624. trap 'cleanup 1' 1 2 15
  625. rm /tmp/mnt_points 2>/dev/null
  626.  
  627.  
  628. mount_usrfs
  629.  
  630. ENTire=NO
  631. dd_fs=0
  632. while getopts 'e\?' c
  633. do
  634.     case $c in
  635.         e)    ENTire=YES
  636.             ;;
  637.         d)    dd_fs=1
  638.             ;;
  639.         \?)    Usage
  640.             ;;
  641.         *)    Usage
  642.             ;;
  643.     esac
  644. done
  645.  
  646. shift `expr $OPTIND - 1`
  647.  
  648. [ $# -eq 1 ] || Usage
  649.  
  650. if [ "$ENTire" = "YES" -a dd_fs -eq 1 ]
  651. then
  652.     Usage
  653. fi
  654.  
  655. MEDIUM=$1
  656. devattr ${MEDIUM} 1>/dev/null 2>&1 ||
  657.     { echo
  658.       pfmt -l UX:drf -s error -g drf:20 "Device %s is not present in /etc/device.tab.\n" $MEDIUM;
  659.       echo
  660.       exit 1;
  661.     }
  662.  
  663. if [ "$ENTire" != "YES" ]
  664. then
  665.     mount /tmp 2>/dev/null
  666. fi
  667.  
  668. TAPEDEV=`devattr $MEDIUM cdevice`
  669. WRK_DIR=/tmp/.extra.d/Drf_Rec export WRK_DIR  #Need to have some fixed name
  670. CPIO_DIR=.extra.d/Drf_Rec export CPIO_DIR  #Need to have some fixed name
  671.  
  672. tape_ready
  673.  
  674. VFSTAB=/etc/vfstab export VFSTAB
  675. VM_RUNNING="No" export VM_RUNNING
  676.  
  677. grep standvol /etc/vfstab >/dev/null 2>&1  #Check for odm
  678. [ $? -eq -0 -o $? -eq 3 ] && {
  679.     VM_RUNNING=Yes
  680.     /usr/lib/drf/odm_vfs /tmp/odm_vfstab /dev/null /dev/null /dev/null /dev/null
  681.     VFSTAB=/tmp/odm_vfstab
  682. }
  683.  
  684. NWS_SYS_PATH=""
  685.  
  686. if [ "$ENTire" != "YES" ]
  687. then
  688.  
  689. [ -f /var/sadm/pkg/nwsrvr/pkginfo -o -f /var/sadm/pkg/nwsrvrJ/pkginfo ] && {
  690.     while read num vol type path rest
  691.     do
  692.         [ "$vol" != "SYS" ] && continue
  693.         echo $path >/tmp/sys_path
  694.         break
  695.     done </etc/netware/voltab
  696.  
  697.     NWS_SYS_PATH=`cat /tmp/sys_path`
  698.  
  699.     [ "$NWS_SYS_PATH" = "" ] && {
  700.         pfmt -l UX:drf -s NOSTD -g drf:31 "\n\tCannot locate SYS volume of NetWare Server.\n"
  701.         pfmt -l UX:drf -s NOSTD -g drf:18 "\n\tEmergency Recovery tape creation terminated.\n\n"
  702.         exit 1
  703.     }
  704.     NWS_FILTER="Yes"
  705.  
  706.     awk -v mnt_pt="$NWS_SYS_PATH" '{ if ($3==mnt_pt) exit_val=1 } END { exit exit_val }' </etc/vfstab || {
  707.         # "SYS is a separate file-system
  708.         mount | grep -q $NWS_SYS_PATH || mount $NWS_SYS_PATH || {
  709.             pfmt -l UX:drf -s NOSTD -g drf:32 "\n\tCannot mount SYS volume of NetWare Server.\n"
  710.             pfmt -l UX:drf -s NOSTD -g drf:18 "\n\tEmergency Recovery tape creation terminated.\n\n"
  711.             exit 1
  712.         }
  713.         NWS_MOUNTED=true
  714.     }
  715.     NWS_CONFIG=true
  716.     eval `/usr/sbin/nwcm -v nwum -v nws_start_at_boot -v ipx_start_at_boot`
  717.     NWUM=$nwum
  718.     NWSBOOT=$nws_start_at_boot
  719.     IPXBOOT=$ipx_start_at_boot
  720.     nwcm -q -s nwum=off #Allows NWS to run without in.snmpd
  721.     nwcm -q -s nws_start_at_boot=on #In case they had turned it off
  722.     nwcm -q -s ipx_start_at_boot=on #In case they had turned it off
  723.  
  724.     sh /etc/init.d/nw start    #start NPSD daemon
  725.     nwcm -q -s login=on    #Needed to allow server to come up
  726.     sh /etc/init.d/nws start    #start NetWare Server
  727.  
  728. count=0
  729.     until nwserverstatus >/tmp/status 2>&1    #nwserverstatus returns 0 (true)
  730.     do                    #when the NetWare server is up
  731.         rc=$?
  732.         count=`expr $count + 1`
  733.         [ $count -gt 50 ] && {
  734.             pfmt -l UX:drf -s NOSTD -g drf:33 "\n\tCannot start NetWare Server.\n"
  735.             cat /tmp/status
  736.             pfmt -l UX:drf -s NOSTD -g drf:18 "\n\tEmergency Recovery tape creation terminated.\n\n"
  737.             exit 1
  738.         }
  739.         [ $rc = 254 ] && {
  740.             pfmt -l UX:drf -s NOSTD -g drf:33 "\n\tCannot start NetWare Server.\n"
  741.             cat /tmp/status
  742.             pfmt -l UX:drf -s NOSTD -g drf:18 "\n\tEmergency Recovery tape creation terminated.\n\n"
  743.             exit 1
  744.         }
  745.  
  746.         [ $rc = 255 ] && {
  747.             pfmt -l UX:drf -s NOSTD -g drf:33 "\n\tCannot start NetWare Server.\n"
  748.             cat /tmp/status
  749.             pfmt -l UX:drf -s NOSTD -g drf:18 "\n\tEmergency Recovery tape creation terminated.\n\n"
  750.             exit 1
  751.         }
  752.         sleep 5
  753.     done
  754.  
  755.     nwcm -q -s login=off    #set NetWare server for limited access mode
  756.     ndsbackup -o /usr/lib/drf/nds.backup    #backup NDS just in case
  757. }
  758. fi
  759.  
  760. if [ "$ENTire" = "YES" ]
  761. then
  762.     dd_copy_disk
  763. else
  764.     disk1_setup
  765.  
  766.     mount_flsystms
  767.  
  768.     check_disk2
  769.  
  770.     cpio_copy_disk
  771. fi
  772.  
  773. exit 0
  774.  
  775.