home *** CD-ROM | disk | FTP | other *** search
/ ftp.sunet.se/pub/OS2/ / 2014.11.ftp.sunet.se_pub_OS2.tar / ftp.sunet.se / pub / OS2 / hobbes / os2 / util / archiver / ldbkup1-02aa.exe / LDBkUp.cmd < prev    next >
OS/2 REXX Batch file  |  2004-12-15  |  12KB  |  375 lines

  1. /****************************************************************************/
  2. /* LDBkup is a REXX application to backup multiple large system drives      */
  3. /* on a LAN. LDBkup uses RAR with the "Volume-splitting" feature to         */
  4. /* create multi-part archives.                                              */
  5. /*                                                                          */
  6. /* RAR is copyrighted by Eugene Roshal and must be purchased                */
  7. /* separately.  Download the OS/2 - DOS trial version from                  */
  8. /* http://www.rarlabs.com/download.htm .                                    */
  9. /****************************************************************************/
  10.  
  11. DEBUG=VALUE(LD_DEBUG,,'OS2ENVIRONMENT')
  12.  
  13. IF DEBUG = 1 THEN TRACE ?i
  14.  
  15. CALL LoadRexxUtil                              /* Load Rexx System Library */
  16.  
  17. NEWDIRECTORY=VALUE(LD_HOME,,'OS2ENVIRONMENT')
  18. OutputDrive = '\\SERVER\WDRIVE'                /* Default backup location */
  19.  
  20. IF NEWDIRECTORY='' THEN
  21.    OldDirectory = DIRECTORY('G:\LDBkup')
  22. ELSE
  23.    OldDirectory = Directory(NEWDIRECTORY)
  24.  
  25. IF DEBUG = 1 THEN TRACE ?i
  26.  
  27. NewDrive=VALUE(LD_OUTPUT,,'OS2ENVIRONMENT')
  28.  
  29. IF NewDrive <> '' THEN OutputDrive = NewDrive
  30.  
  31. "@IF EXIST log.txt ERASE log.txt"
  32. "@IF EXIST err.txt ERASE err.txt"
  33.  
  34. IF (STREAM('W:\','c','query exists') = '') THEN
  35.    DO
  36.       "NET USE W: "||OutputDrive
  37.    END
  38.  
  39. IF RC == 2 THEN
  40. DO
  41.    SAY "Unable to make a connection with the Backup Drive."
  42.    SAY "Program aborted."
  43.    RETURN
  44.    EXIT
  45. END
  46.  
  47. crlf = '0D0A'x;
  48.  
  49. RRC = 0
  50.  
  51. /* Type of Backup */
  52.  
  53. IF DEBUG=1 THEN trace ?i
  54.  
  55. BackupType = '';
  56.  
  57. DriveLetters. = '' ;
  58. DriveLetters.0 = 0 ;
  59.  
  60. ARG BackupType Drives
  61.  
  62. /***********************************************************************/
  63. /*                                                                     */
  64. /*                        MAIN PROCEDURE                               */
  65. /*                                                                     */
  66. /***********************************************************************/
  67.  
  68.  
  69. GetDriveLetters:
  70.  
  71. IF DEBUG=1 THEN trace ?i
  72.  
  73.    k = 1 ;
  74.    PARSE VAR Drives DriveLetters.1 Drives
  75.  
  76. IF DriveLetters.k <> '' THEN
  77.       DO WHILE DriveLetters.k <> ''
  78.          DriveLetters.0 = DriveLetters.0 + 1
  79.          CALL VolumeBkup
  80.                 IF DEBUG=1 THEN trace ?i
  81.          IF RRC > 1 THEN EXIT
  82.          k = k + 1
  83.          PARSE VAR Drives DriveLetters.k Drives
  84.       END
  85.    ELSE
  86.       DO
  87.                         RRC = 251                 /* Set error code for invalid parameters */
  88.          CALL DisplayErrorCode RC, RRC, FilesTemp.0
  89.  
  90.    IF DEBUG=1 THEN trace ?i
  91.  
  92.          EXIT
  93.       END
  94.  
  95. EXIT
  96.  
  97. /******************************************/
  98. /*  Procedure to handle a single volume   */
  99. /******************************************/
  100.  
  101.  
  102. VolumeBkup:  PROCEDURE EXPOSE BackupType DriveLetters. k RRC
  103.  
  104.    DriveLetter1 = SUBSTR(DriveLetters.k,1,1)
  105.  
  106.    BaseBkupFile = BackupType ||'_'DriveLetter1'_'
  107.  
  108.    SourcePath = "'"DriveLetters.k"'"
  109.  
  110.         BadFile = 'FALSE'
  111.  
  112. /* Determine the type of backup and execute the appropriate procedure */
  113.  
  114. IF DEBUG=1 THEN trace ?i
  115.  
  116.                 SELECT
  117.                 WHEN  BackupType = 'FULL' THEN
  118.                                                 DO
  119.                                 RARCMD1 = "RAR 'a -r -dh -agYYYYMMDD-NN -cfg- -msrar;zip -v2000000k -ds -m1 -ierr.txt ' ||  'W:\' || BaseBkupFile  || ' @FilesList.lst -x wp?root.?sf >> log.txt'"
  120.                                                         BackupTypeDesc = 'FULL'
  121.                                                 END
  122.                 WHEN  BackupType = 'DIFF' THEN
  123.                                                 DO
  124.                                 RARCMD1 = "RAR 'a -r -dh -agYYYYMMDD-NN -cfg- -msrar;zip -v2000000k -ds -m1 -ierr.txt ' ||  'W:\' || BaseBkupFile  || ' @FilesList.lst -x wp?root.?sf >> log.txt'"
  125.                                                         BackupTypeDesc = 'DIFFERENTIAL'
  126.                                                 END
  127.                 WHEN  BackupType = 'UPDATE' THEN
  128.                                                 DO
  129.                                 RARCMD1 = "RAR 'u -r -dh -agYYYYMMDD-NN -cfg- -msrar;zip -v2000000k -ds -m1 -ao -ierr.txt ' || 'W:\' || BaseBkupFile  || ' @FilesList.lst -x wp?root.?sf >> log.txt'"
  130.                                                         BackupTypeDesc = 'UPDATE'
  131.                                                 END
  132.                 OTHERWISE
  133.                 SAY 'Invalid backup type specified.  Valid backup types are FULL, DIFF, UPDATE.'
  134.                 EXIT
  135.                         END
  136.  
  137.         IF DEBUG=1 THEN trace ?i
  138.  
  139.    CALL BkupProc              /* Call the actual backup procedure */
  140.  
  141.         IF DEBUG=1 THEN trace ?i
  142.  
  143.    SIGNAL DisplayErrorCode
  144.  
  145.    RETURN  RRC
  146.  
  147.  
  148.  
  149. END VolumeBkup
  150.  
  151. /***************************************************************************/
  152. /*  Finally we actually backup the drive and reset the Archive attributes  */
  153. /*  RARCMD1 *must* set to the correct value before calling this procedure! */
  154. /***************************************************************************/
  155. BkupProc:
  156.  
  157. IF DEBUG=1 THEN trace ?i
  158.  
  159. CALL BuildListFiles  DriveLetters. k FilesList.lst
  160.  
  161. /* The following code will skip the RAR command on a differential backup */
  162. /* IF there are no files to backup (excluding EA?DATA. SF .)     */
  163.  
  164. CALL LINEOUT 'STDOUT:',''                 /* Generate a blank line on the screen   */
  165. CALL LINEOUT 'STDOUT:',''                 /* Generate another blank line */
  166.  
  167.  
  168.  
  169. say 'Initiating a '||BackupTypeDesc|| ' backup of Logical Drive '|| DriveLetters.k||'.'
  170.  
  171. '@echo off'
  172.    IF RC = 0 THEN
  173.       DO
  174.          INTERPRET RARCMD1
  175.          RRC = RC
  176.       END
  177. '@echo on'
  178.  
  179.    CALL STREAM LOG.TXT,'c','close'
  180.  
  181.    i = 1                         /* Initialize file count index. */
  182.  
  183.    DO WHILE i <= FilesTemp.0
  184.       IF (SysFileTree(FilesTemp.i, ArchTemp.,'BSO','+****','-****') <> 0) THEN
  185.          DO
  186.             RRC=253
  187.             SIGNAL DisplayErrorCode
  188.          END
  189.  
  190.       i = i + 1
  191.    END
  192.  
  193.    RETURN RRC
  194. END
  195.  
  196. /***********************************************************************/
  197.  
  198. BuildListFiles: PROCEDURE EXPOSE DriveLetters. k FilesList.lst FilesTemp. BackupType rrc rc BadFile
  199.  
  200.    "@IF EXIST FilesList.lst ERASE FilesList.lst"
  201.    CALL STREAM FilesList.lst,'c','open'
  202.    CALL STREAM FilesList.lst,'s'
  203.  
  204.    IF result='READY' THEN result=0
  205.  
  206.    SELECT
  207.       WHEN BackupType = 'FULL' THEN
  208.          rc = SysFileTree(DriveLetters.k || '\*',FilesTemp.,'BSO','*****')
  209.       WHEN BackupType = 'DIFF' THEN
  210.          rc = SysFileTree(DriveLetters.k || '\*',FilesTemp.,'BSO','+****')
  211.       OTHERWISE
  212.          CALL LINEOUT log.txt,'Internal error: Invalid Backup Type error encountered in BuildListFiles.'
  213.          RRC = 252
  214.          SIGNAL DisplayErrorCode
  215.  
  216.    END
  217.  
  218.    IF (result = 0) & (rc = 0) THEN
  219.       DO  i=1 TO FilesTemp.0
  220.  
  221.       /* This section copies the filenames from FilesTemp. to the hard drive */
  222.       /* It watches for the files "EA DATA. SF" and "SWAPPER.DAT", which RAR */
  223.       /* is unable to backup. If either one is encountered, it will not be   */
  224.       /* written out, and the file count will be reduced by 1. In addition,  */
  225.       /* the "BadFile" flag is set for DisplayErrorCode to examine.          */
  226.  
  227.          TempFName = FILESPEC('n',FilesTemp.i)
  228.          IF (TempFName <> 'EA DATA. SF') & (TempFName <> 'SWAPPER.DAT') THEN
  229.             DO
  230.                CALL LINEOUT FilesList.lst,FilesTemp.i
  231.             END
  232.          ELSE
  233.                                 DO
  234.                 FilesTemp.0 = FilesTemp.0 - 1     /* Adjust file count */
  235.                 BadFile = "TRUE"
  236.                                 END
  237.  
  238.          CALL STREAM  FilesList.lst,'s'
  239.          IF (Result='READY') THEN
  240.             DO
  241.                Result=0
  242.                rc = 0
  243.             END
  244.          IF (Result<>0) | (rc<>0) THEN
  245.             DO
  246.                SAY 'Internal error while building list of files.'
  247.                SAY 'Backup of drive ' || DriveLetters.k || ' will be skipped.'
  248.                CALL LINEOUT log.txt,'Error occurred while attempting to construct ListFiles.1st for Drive ' || DriveLetters.k
  249.                IF rc = 2 THEN
  250.                   DO
  251.                      SAY 'Insufficient memory was available to construct list in memory.'
  252.                      CALL LINEOUT log.txt,'Insufficient memory was available to construct list in memory.'
  253.                      RETURN 254
  254.                   END
  255.             END
  256.       END
  257.  
  258.       CALL STREAM FilesList.lst,'c','close'  /* Close output file */
  259.  
  260.       IF result = 'READY:' THEN
  261.          DO
  262.             result = 0
  263.             rc = 0
  264.             rrc = 0
  265.          END
  266.  
  267.    RETURN RRC
  268.  
  269. END
  270.  
  271. /*******************************/
  272. /*  Error Handling Procedure   */
  273. /*******************************/
  274.  
  275. DisplayErrorCode:
  276.  
  277.  
  278. IF DEBUG=1 THEN trace ?i
  279.  
  280.  
  281.    CALL LINEOUT 'STDOUT:',''                 /* Generate blank line on the screen */
  282.  
  283.    /*  The next group of statements filter out warnings caused by no changes on a differential backup */
  284.  
  285.    IF (RRC = 1) & (BadFile = 'TRUE')  THEN SIGNAL SUCCESS
  286.    IF (RRC = 1) & (BackupType = 'DIFF') THEN
  287.       DO
  288.          rc = SysFileTree(DeviceLetters.k||'\EA DATA. SF', ArchTemp.,'BSO', '+****')
  289.          rc1 = SysFileTree(DeviceLetters.k||'\SWAPPER.DAT', Archtemp1.,'BSO', '+****')
  290.          IF (rc = 0) & (rc1 = 0) & (ArchTemp.0 = 0) & (ArchTemp1.0 = 0) THEN SIGNAL SUCCESS
  291.       END
  292.  
  293.  
  294.    IF RRC = 255 THEN SAY "User stopped the process."
  295.    IF RRC = 254 THEN SAY "INTERNAL WRITE ERROR: Error while creating FileList.lst; Drive DrivesLetter.k will be skipped."
  296.    IF RRC = 253 THEN SAY "ARCHIVE FLAGS ERROR: Error encountered while resetting Archive attributes."
  297.    IF RRC = 252 THEN SAY "BACKUP TYPE ERROR: Program error: Invalid Backup Type encountered in BuildListFiles.  Contact author."
  298.         IF RRC = 251 THEN SAY "INVALID PARAMETERS: At least one drive must be specified."
  299.    IF (RRC>9)&(RRC<251) THEN SAY "UNKNOWN: Error is undocumented or unknown."
  300.    IF RRC = 9   THEN SAY "FILE CREATE ERROR: File Create' error"
  301.    IF RRC = 8   THEN SAY "MEMORY ERROR:      Not enough memory for operation."
  302.    IF RRC = 7   THEN SAY "USER ERROR:        Command line option error."
  303.    IF RRC = 6   THEN SAY "OPEN ERROR:        Open file error."
  304.    IF RRC = 5   THEN SAY "WRITE ERROR:       Write to disk error."
  305.    IF RRC = 4   THEN SAY "LOCKED ARCHIVE:    Attempt to modify an archive previously locked by the 'k' command."
  306.    IF RRC = 3   THEN SAY "CRC ERROR:         A CRC error occurred when unpacking."
  307.    IF RRC = 2   THEN SAY "FATAL ERROR:       A fatal error occurred."
  308.    IF RRC = 1   THEN SAY "WARNING:           Non-fatal error(s) occurred."
  309.  
  310. WARNING:
  311.       IF RRC = 0 THEN
  312.          SIGNAL SUCCESS
  313.  
  314. /*      SAY 'The return code from RAR is ' RRC ' .  Check the logs for more information.' */
  315.  
  316.       IF RRC = 1 THEN
  317.          DO
  318.             SAY 'The return code from RAR is ' RRC '.  Check the logs for more information.'
  319.             RETURN RRC
  320.          END
  321.  
  322. ERROR:
  323.       IF RRC <> 253 THEN
  324.          DO
  325.             SAY "Aborting the program."
  326.             EXIT                            /* Exit the program */
  327.          END
  328.       ELSE
  329.          RETURN RRC
  330.  
  331. SUCCESS:
  332.  
  333.       SAY "SUCCESSFUL backup.  No errors or warnings."
  334.       SAY ""
  335.       SAY "Check the logs for additional information."
  336.  
  337.       RRC = 0
  338.       RC  = 0
  339.       Result = 0
  340.       RETURN RRC
  341. END   BuildListFiles
  342.  
  343.  
  344. /* Function to load Rexx Utility library if not registered */
  345.  
  346. LoadRexxUtil:
  347.    IF RxFuncQuery("SysLoadFuncs") THEN
  348.       DO
  349.          IF RxFuncAdd("SysLoadFuncs", "RexxUtil", "SysLoadFuncs") THEN
  350.             DO
  351.                SAY "Error:  Couldn't load RexxUtil library."
  352.                RETURN 1
  353.             END
  354.  
  355.          CALL SysLoadFuncs
  356.       END
  357.  
  358.    RETURN 0
  359. END
  360.  
  361. /*  Load parameters from LDBKUP.CFG, if present */
  362.  
  363. PAUSE SOURCE . . LD_HOME  /* Retrieve location of LDBKUP */
  364.  
  365. OldDirectory = Directory(LD_HOME)
  366.  
  367. CfgDir = LD_HOME || 'LD_HOME\LDBkup.cfg'
  368.  
  369. IF (STREAM(LD_HOME || '.cfg','c','query exists') = '') THEN
  370.    DO
  371.                 rrc = SysMkDir(LD_    END
  372. ELSE
  373.  
  374.  
  375.