//================================================= // See description at the end of the file //================================================= //Turn off confirmation confirm off //*********** BEGIN EXTERNAL VARIABLES SECTION (values can be customized by user) SET STRING ROOT_PATH = "STRINGPARAMETER(rootdir)" SET STRING BACKUP_NAME = "STRINGPARAMETER(backupname)" SET STRING BACKUP_LABEL = "STRINGPARAMETER(backuplabel)" SET STRING VENDOR = "STRINGPARAMETER(vendor)" SET VALUE NUM_SETS = PARAMETER(setcount) SET VALUE NUM_IMGS = PARAMETER(imgcount) //*********** END EXTERNAL VARIABLES SECTION //================================================= // THE CODE PLACED BELOW SHOULD NOT BE MODIFIED //================================================= //*********** BEGIN INTERNAL VARIABLES SECTION *********** SET STRING CURRENT_SEC = STRINGDEC(SECOND(NOWTIME)) IF (STRINGLENGTH(STRING(CURRENT_SEC)) == 1) THEN SET STRING CURRENT_SEC = "0" + STRING(CURRENT_SEC) ENDIF SET STRING CURRENT_MIN = STRINGDEC(MINUTE(NOWTIME)) IF (STRINGLENGTH(STRING(CURRENT_MIN)) == 1) THEN SET STRING CURRENT_MIN = "0" + STRING(CURRENT_MIN) ENDIF SET STRING CURRENT_HOUR = STRINGDEC(HOUR(NOWTIME)) IF (STRINGLENGTH(STRING(CURRENT_HOUR)) == 1) THEN SET STRING CURRENT_HOUR = "0" + STRING(CURRENT_HOUR) ENDIF SET STRING CURRENT_MONTH = STRINGDEC(MONTH(NOWTIME) + 1) IF (STRINGLENGTH(STRING(CURRENT_MONTH)) == 1) THEN SET STRING CURRENT_MONTH = "0" + STRING(CURRENT_MONTH) ENDIF SET STRING CURRENT_DAY = STRINGDEC(DAYOFMONTH(NOWTIME)) IF (STRINGLENGTH(STRING(CURRENT_DAY)) == 1) THEN SET STRING CURRENT_DAY = "0" + STRING(CURRENT_DAY) ENDIF SET STRING HR_MIN_SEC = STRING(CURRENT_HOUR) + "-" + STRING(CURRENT_MIN) + "-" + STRING(CURRENT_SEC) SET STRING CURRENT_TIME = STRINGDEC(YEAR(NOWTIME)) + "-" + STRING(CURRENT_MONTH) + "-" + STRING(CURRENT_DAY) + "_" + STRING(HR_MIN_SEC) IF (STRINGSNOTEQUAL(SUBSTRING(STRING(ROOT_PATH), STRINGLENGTH(STRING(ROOT_PATH))-1, 1), "/")) THEN SET STRING ROOT_PATH = STRING(ROOT_PATH) + "/" ENDIF SET STRING BASE_PATH = STRING(ROOT_PATH) + STRING(BACKUP_NAME) SET STRING LATESTSET = "" SET STRING OLDESTSET = "" SET VALUE TIME_NOW = (NOWTIME) SET STRING PFI = "NO.PFI" PRINT "" PRINT "BACKUP SETS TO STORE: " + STRINGDEC(VALUE(NUM_SETS)) PRINT "" PRINT "IMAGES PER SET TO STORE: " + STRINGDEC(VALUE(NUM_IMGS)) PRINT "" CALL FIND_LAST_SET PRINT "" PRINT "LAST BACKUP SET FOUND: " + STRING(LATESTSET) PRINT "" //*********** END INTERNAL VARIABLES SECTION *********** //================================================= //*********** BEGIN SETS AND IMAGES CHECK *********** CALL FIND_IMAGE_COUNT IF ((VALUE(IMG_CNT) >= 1) AND VALUE(IMG_CNT) < VALUE(NUM_IMGS)) THEN CALL CREATE_INC ENDIF IF ((VALUE(IMG_CNT) >= 1) AND (VALUE(IMG_CNT) >= VALUE(NUM_IMGS)) OR (VALUE(SET_CNT) == 0)) THEN CALL CREATE_NEW_SET ENDIF exit(0) //================================================= FIND_IMAGE_COUNT: SET VALUE IMG_CNT = 0 SET STRING RES_PFI = "" SET STRING IMG_CNT_PATH = STRING(LATESTSET) XFIND OPTIONS RESULT = RES_PFI RECURSIVE = FILES FIRST RECURSIVE LEVEL = 0 START = STRING(IMG_CNT_PATH) MASK = "*.pfi" SEARCH = WIDE FILES = ON DIRECTORIES = OFF ENDOPTIONS BEGIN SET VALUE IMG_CNT = VALUE(IMG_CNT) + 1 PRINT "IMAGE FOUND: " + STRING(RES_PFI) PRINT "" ENDXFIND PRINT "IMAGES IN LAST BACKUP SET = " + STRINGDEC(VALUE(IMG_CNT)) PRINT "" ENDCALL //*********** END SETS AND IMAGES CHECK *********** //================================================= //*********** BEGIN FIND LAST SET SECTION *********** FIND_LAST_SET: SET VALUE SET_CNT = DIRCONTENTS(STRING(BASE_PATH)) SET VALUE TIME_CHK2 = 0 SET VALUE COUNT = VALUE(SET_CNT)-1 // scan and delete files and empty folders DO IF (VALUE(COUNT)>=0) THEN SET STRING DELNAME = STRING(BASE_PATH)+"/"+DIRELEMENT(STRING(BASE_PATH),VALUE(COUNT)) IF(FILEISDIR(STRING(DELNAME))) THEN IF((DIRCONTENTS(STRING(DELNAME)) == 0)) THEN FILEDELETEDIR(STRING(DELNAME)) SET VALUE SET_CNT = VALUE(SET_CNT)-1 ENDIF ENDIF ELSE FILEDELETE(STRING(DELNAME)) SET VALUE SET_CNT = VALUE(SET_CNT)-1 ENDELSE SET VALUE COUNT = VALUE(COUNT)-1 ENDIF WHILE (VALUE(COUNT)>=0) SET STRING LATESTSET = STRING(BASE_PATH)+"/"+DIRELEMENT(STRING(BASE_PATH),(VALUE(SET_CNT) - 1), SORT TIME) ENDCALL //*********** END FIND LAST SET SECTION *********** //================================================= // Function for checking error check_error: if (errorcode(1) != 0) then print "Some error occured: " strerror(errorcode(1)) print "" print "Exiting" print "" exit(errorcode(1)) endif endcall //================================================= //*********** BEGIN FULL BACKUP SECTION *********** CREATE_NEW_SET: SET STRING IMG_NAME = STRING(BACKUP_NAME) + "_" + STRING(CURRENT_TIME) PRINT "" PRINT "NEW BACKUP SET PATH: " + STRING(BASE_PATH) + "/" + STRING(IMG_NAME) PRINT "" // Backup [BACKUP_SOURCE_OBJECTS] // Backup partitions or disks to virtual containers print "Backup partitions or disks to virtual containers" print "" [BACKUP_OPTIONS] vd_store /path = STRING(BASE_PATH) + "/" /name = STRING(IMG_NAME) /vendor = STRING(VENDOR) // Check for errors call check_error // Apply all scheduled operations apply all CALL FINAL_CHECK ENDCALL //*********** END FULL BACKUP SECTION *********** //================================================= //*********** BEGIN INCREMENT SECTION *********** CREATE_INC: SET STRING SRCH_PATH = STRING(LATESTSET) PRINT "" PRINT "CREATE NEW INCREMENT IN: " + STRING(SRCH_PATH) PRINT "" SET STRING SRCH_PATH = STRING(LATESTSET) IF (VALUE(IMG_CNT) <= 1) THEN SET STRING INC_MASK = "*.pfi" ENDIF ELSE SET STRING INC_MASK = "inc_" + STRINGDEC(VALUE(IMG_CNT)-1) + "*.pfi" ENDELSE XFIND OPTIONS RESULT = PFI RECURSIVE = FILES FIRST RECURSIVE LEVEL = 2 START = STRING(SRCH_PATH) MASK = STRING(INC_MASK) SEARCH = WIDE FILES = ON DIRECTORIES = OFF ENDOPTIONS BEGIN PRINT "" PRINT "LAST BACKUP INDEX IN SET: " + STRING(SRCH_PATH) + "/" + STRING(PFI) PRINT "" ENDXFIND IF(STRINGSEQUAL(STRING(PFI), "NO.PFI")) THEN CALL CREATE_NEW_SET ENDIF print "Make incremental backup" print "" base = STRING(SRCH_PATH) + "/" + STRING(PFI) [INCREMENT_EXCLUDES] vd_store_increment // Check for errors call check_error // Apply all scheduled operations apply all CALL FINAL_CHECK ENDCALL //*********** END INCREMENT SECTION *********** //================================================= //*********** BEGIN FINAL CHECK SECTION *********** FINAL_CHECK: call check_error SET VALUE SET_CNT_MAINT = DIRCONTENTS(STRING(BASE_PATH)) PRINT"EXISTING BACKUP SETS = " + STRINGDEC(VALUE(SET_CNT_MAINT)) IF(VALUE(SET_CNT_MAINT)>0 AND VALUE(SET_CNT_MAINT)>VALUE(NUM_SETS)) THEN PRINT "" PRINT "BACKUP STORAGE MAINTENANCE STARTED" PRINT "" DO SET VALUE SET_CNT_MAINT_OLD = VALUE(SET_CNT_MAINT) SET STRING OLDESTSET = STRING(BASE_PATH)+"/"+DIRELEMENT(STRING(BASE_PATH),0,SORT TIME) PRINT "" PRINT "OLDEST BACKUP SET TO DELETE: " + STRING(OLDESTSET) PRINT "" FILEDELETEDIR(STRING(OLDESTSET)) DB CLEAR SET VALUE SET_CNT_MAINT = DIRCONTENTS(STRING(BASE_PATH)) WHILE(VALUE(SET_CNT_MAINT)0 AND VALUE(SET_CNT_MAINT)>VALUE(NUM_SETS)) ENDIF CALL ENDALL ENDCALL //*********** END FINAL CHECK SECTION *********** //================================================= ENDALL: PRINT"" PRINT "OPERATION COMPLETED SUCCESSFULLY" PRINT"" [SHUTDOWN_CALL] ENDCALL //================================================= // DESCRIPTION // // The presumed structure of BACKUP STORAGE // // \%ROOT_PATH% // \%BACKUP_NAME% // \%BACKUP_NAME%_MONTH-DAY-YEAR_HOUR-MIN-SEC (for first date-time) // \inc_1_0_1 // \inc_2_1_2 // \inc_3_1_3 // \%BACKUP_NAME%_MONTH-DAY-YEAR_HOUR-MIN-SEC (for second date-time) // \inc_1_0_1 // \inc_2_1_2 // \inc_3_1_3 // ... // //================================================= // // The presumed STRATEGY is the following: // // - the user is allowed to hold 1 image, even in case it exceeds quotas. // - the user is allowed to exceed quotas until the backup completes. // - quota check-outs are performed before and after the backup process. // - if quotas exceeded, the oldest image(s) are deleted // - the script tries to create a new image even in case quotas are exceeded.