@if not [%DEBUG%] == [1] @echo off setlocal enableDelayedExpansion enableExtensions REM +----------------------------------------------------------------------------+ REM | REM | ///// ///// ///// ////// / OOOOO OOO OOO O OOOO REM | / / / / / / O O O O O O O REM | /// ///// /// / / O O O O O O OOO REM | / / / / / / O O O O O O O REM | / / / / / / O O O O O O O REM | / / / ///// / / O OOO OOO OOOO OOOO REM | REM +----------------------------------------------------------------------------+ REM | * TLS_BACKUP * REM +----------------------------------------------------------------------------+ REM | Module identification REM +----------------------------------------------------------------------------+ REM REM Module Name : TLS_backup.cmd REM REM Version : 01 REM REM Copyright (c) : 2006 Yokogawa SCE REM REM Author : H. Geerds REM REM +----------------------------------------------------------------------------+ REM | Module specification REM +----------------------------------------------------------------------------+ REM REM Description : Script file to create a backup of the TLS including history REM definitions but excluding the history itself REM REM Remarks : REM REM +----------------------------------------------------------------------------+ REM | Changes .... REM +----------------------------------------------------------------------------+ REM | Version Who Date Description REM +----------------------------------------------------------------------------+ REM 1.0 H.Geerds 2013-06 First version REM 1.1 H.Geerds 2013-06 Backup the history groups as well (*000.*). REM 1.2 H.Geerds 2013-08 Skip history directory if not exist (detected on an ows). REM 1.3 H.Geerds 2014-08 Skip history directory if no 000 files exist . REM in directory (detected on an ows). REM 1.4 R.Jameson 2014-01 Added purge of backup directory REM (enforces max number of zip files). REM 2.0 R.Jameson 2015-01-12 Corrected bug in purge, ensure MAX_FILES is REM multiple of 3, mirror to N drive, and added "don't sync" flag. REM 2.1 R.Jameson 2015-01-13 Removed /ZB switch from robocopy, added check REM to TLS_LOG_PATH and TLS_LST_PATH. REM 2.2 R.Jameson 2015-01-13 Updated version header, made mirror to N REM not default, added max backups default for OWS's, REM changed max backups default to 14 (2 weeks). REM 2.3 R.Jameson 2015-01-15 Corrected check of lst and log directory, only REM create dir in N if sync option is selected. REM 2.4 A. Wijnja 2016-05-10 Added do-his option, REM Added integrity check of zip file, REM Exclude log\*.lck files REM 2.5 A. Wijnja 2019-04-11 Allow for FTLS to be installed in one tls tree REM ------------------------------------------------------------------------------ REM maximum number of backup triplets to keep in backup directory set DEFAULT_MAX_BACKUPS=14 set DEFAULT_MAX_BACKUPS_OWS=3 if "%TLS_BACKUP_PATH%"=="" set TLS_BACKUP_PATH=C:\TLS_backup set DEST_PREFIX=\\pcn.originenergy.com.au\dfs\02_Backups set HOST=%COMPUTERNAME% REM set defaults if /I [%HOST:~0,3%] == [OWS] ( set /A MAX_BACKUPS=%DEFAULT_MAX_BACKUPS_OWS% ) else ( set /A MAX_BACKUPS=%DEFAULT_MAX_BACKUPS% ) set TLS_BACKUP_DIR=%TLS_BACKUP_PATH% set DO_ZIP=1 set DO_PURGE=1 set DO_SYNC=0 set SAW_NEG=0 set DO_HIS=0 REM handle command line arguments :begin_args if [%~1] == [] goto end_args if /I [%~1] == [--help] ( goto usage ) if /I [%~1] == [--max-backups] goto handle_max_backups if /I [%~1] == [--zip] ( call :check_default set DO_ZIP=1 goto next_arg ) if /I [%~1] == [--sync] ( set DO_SYNC=1 goto next_arg ) if /I [%~1] == [--purge] ( call :check_default set DO_PURGE=1 goto next_arg ) if /I [%~1] == [--no-zip] ( set DO_ZIP=0 goto next_arg ) if /I [%~1] == [--no-purge] ( set DO_PURGE=0 goto next_arg ) if /I [%~1] == [--do-his] ( set DO_HIS=1 goto next_arg ) REM default option is backup directory set TLS_BACKUP_DIR=%~1 goto next_arg :next_arg shift goto begin_args :end_args if not exist %TLS_BACKUP_DIR% MD %TLS_BACKUP_DIR% set LOG_FILE=%TLS_BACKUP_DIR%\Backup_log.txt set DateYYYYMMDD=%date:~10,4%%date:~4,2%%date:~7,2% REM Windows is does not add "0" as a i when the time is 0-9hrs am if %time:~0,2% lss 10 Set HHMM=0%time:~1,1%%time:~3,2% if %time:~0,2% geq 10 Set HHMM=%time:~0,2%%time:~3,2% REM log file header echo *** BEGIN BACKUP *** >"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: User: %USERNAME%@%HOST% >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: User: %USERNAME%@%HOST% echo %DATE% %TIME%:#INFO#: DO_ZIP: %DO_ZIP% >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: DO_ZIP: %DO_ZIP% echo %DATE% %TIME%:#INFO#: DO_PURGE: %DO_PURGE% >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: DO_PURGE: %DO_PURGE% echo %DATE% %TIME%:#INFO#: DO_SYNC: %DO_SYNC% >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: DO_SYNC: %DO_SYNC% echo %DATE% %TIME%:#INFO#: DO_HIS: %DO_HIS% >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: DO_HIS: %DO_HIS% echo %DATE% %TIME%:#INFO#: MAX_BACKUPS: %MAX_BACKUPS% >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: MAX_BACKUPS: %MAX_BACKUPS% echo %DATE% %TIME%:#INFO#: Zip prefix: %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_ >>%LOG_FILE% echo %DATE% %TIME%:#INFO#: Zip prefix: %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_ if not [%DO_ZIP%] == [1] goto end_zip echo %DATE% %TIME%:#INFO#: Doing backup. >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: Doing backup. cd /d %TLS_DAT_PATH%\.. >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the DAT directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the DAT directory dir /b /a | findstr .>nul 2>&1 || goto zip_sav zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip dat* >> "%LOG_FILE%" && goto zip_sav goto:EOF :zip_sav cd /d %TLS_SAV_PATH%\.. >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the SAV directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the SAV directory dir /b /a | findstr .>nul 2>&1 || goto zip_his zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip sav* >> "%LOG_FILE%" && goto zip_his goto:EOF :zip_his if not exist %TLS_HIS_PATH% goto zip_log cd /d %TLS_HIS_PATH% >> "%LOG_FILE%" REM ensure a his zip is always created (ensures backups are always comprised of 3 files) if not exist *000.* echo dummy>"DUMMY_000000.his" if [%DO_HIS%] == [1] goto zip_all_his echo %date% %time%:#INFO#: Started zipping the HIS definitions ^(000^) >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the HIS definitions ^(000^) zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_HIS *000.* >> "%LOG_FILE%" && goto zip_log goto:EOF :zip_all_his echo %date% %time%:#INFO#: Started zipping the HIS directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the HIS directory zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_HIS *.* >> "%LOG_FILE%" && goto zip_log goto:EOF :zip_log cd /d %TLS_LOG_PATH%\.. >> "%LOG_FILE%" if not exist "log\*.log" goto zip_lst echo %date% %time%:#INFO#: Started zipping the LOG directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the LOG directory zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip lo*\*.log -x *.lck >> "%LOG_FILE%" && goto zip_lst goto:EOF :zip_lst cd /d %TLS_LST_PATH%\.. >> "%LOG_FILE%" if not exist "lst\*.lst" goto zip_pki echo %date% %time%:#INFO#: Started zipping the LST directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the LST directory zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip ls*\*.lst >> "%LOG_FILE%" && goto zip_pki goto:EOF :zip_pki cd /d %TLS_ALLUSERS_PATH%\ >> "%LOG_FILE%" if not exist "pki\*" goto zip_wap echo %date% %time%:#INFO#: Started zipping the PKI directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the PKI directory zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip pki* >> "%LOG_FILE%" && goto zip_wap goto:EOF :zip_wap cd /d %TLS_WAP_PATH%\.. >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the WAP directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the WAP directory if not exist "wap\*" goto zip_misc zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip wap* >> "%LOG_FILE%" && goto zip_misc goto:EOF :zip_misc cd /d %TLS_ALLUSERS_PATH%\ >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the MISC directory >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the MISC directory dir /b /a | findstr -v "dat sav his log lst pki wap">nul 2>&1 || goto zip_prog zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip * -x dat\* sav\* his\* log\* lst\* pki\* wap\* >> "%LOG_FILE%" && goto zip_prog goto:EOF :zip_prog if /I [%TLS_ROOT_PATH%\tls] == [%TLS_ALLUSERS_PATH%] ( echo %date% %time%:#INFO#: Skip zipping Program files, one tls-tree only >> "%LOG_FILE%" echo %date% %time%:#INFO#: Skip zipping Program files, one tls-tree only goto check_zip_u ) ELSE ( cd /d %TLS_ROOT_PATH%\tls >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the Program files >> "%LOG_FILE%" echo %date% %time%:#INFO#: Started zipping the Program files dir /b /a | findstr .>nul 2>&1 || goto check_zip_u zip -q -r -S %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_P.zip * >> "%LOG_FILE%" && goto check_zip_u goto:EOF ) :check_zip_u if not exist %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip goto check_zip_p echo %date% %time%:#INFO#: Check %DateYYYYMMDD%%HHMM%_%HOST%_U.zip >> "%LOG_FILE%" echo %date% %time%:#INFO#: Check %DateYYYYMMDD%%HHMM%_%HOST%_U.zip zip -q -T %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_U.zip >> "%LOG_FILE%" && goto check_zip_p goto:EOF :check_zip_p if not exist %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_P.zip goto check_zip_h echo %date% %time%:#INFO#: Check %DateYYYYMMDD%%HHMM%_%HOST%_P.zip >> "%LOG_FILE%" echo %date% %time%:#INFO#: Check %DateYYYYMMDD%%HHMM%_%HOST%_P.zip zip -q -T %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_P.zip >> "%LOG_FILE%" && goto check_zip_h goto:EOF :check_zip_h if not exist %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_HIS.zip goto zip_success echo %date% %time%:#INFO#: Check %DateYYYYMMDD%%HHMM%_%HOST%_HIS.zip >> "%LOG_FILE%" echo %date% %time%:#INFO#: Check %DateYYYYMMDD%%HHMM%_%HOST%_HIS.zip zip -q -T %TLS_BACKUP_DIR%\%DateYYYYMMDD%%HHMM%_%HOST%_HIS.zip >> "%LOG_FILE%" && goto zip_success goto:EOF :zip_success echo %date% %time%:#INFO#: Zip successfully created >> "%LOG_FILE%" echo %date% %time%:#INFO#: Zip successfully created :end_zip rem +--------------------------------------------------------------------------+ rem purge old zip files rem +--------------------------------------------------------------------------+ if not [%DO_PURGE%] == [1] goto end_purge set /A MAX_FILES=MAX_BACKUPS * 3 set /A COUNT=0 set /A TO_REMOVE=0 set /A REMOVED=0 pushd "%TLS_BACKUP_DIR%" rem count existing files (for /F "usebackq" %%I in (`dir *.zip ^| find "File(s)"`) do set /A COUNT=%%I) 1>nul: 2>&1 if "%COUNT%" EQU "" set /A COUNT=0 rem echo %DATE% %TIME%:#INFO#: File count is %COUNT%, max files is %MAX_FILES% >>"%LOG_FILE%" rem echo %DATE% %TIME%:#INFO#: File count is %COUNT%, max files is %MAX_FILES% if %COUNT% LEQ %MAX_FILES% ( rem echo %DATE% %TIME%:%SOURCE%:#INFO#: File count is within limits skipping purge >>"%LOG_FILE%" rem echo %DATE% %TIME%:%SOURCE%:#INFO#: File count is within limits skipping purge goto end_purge ) set /A TO_REMOVE=COUNT - MAX_FILES echo %DATE% %TIME%:#INFO#: Enforcing zip file life time. >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: Enforcing zip file life time. echo %DATE% %TIME%:#INFO#: Current is %COUNT%, max count is %MAX_FILES%, removing %TO_REMOVE% files >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: Current is %COUNT%, max count is %MAX_FILES%, removing %TO_REMOVE% files rem remove required amount of files (oldest first) for /F "usebackq tokens=*" %%I in (`dir /b /od *.zip`) do ( echo !DATE! !TIME!:#INFO#: removing %%I REMOVED=!REMOVED! >>"%LOG_FILE%" echo !DATE! !TIME!:#INFO#: removing %%I REMOVED=!REMOVED! del "%%I" >>"%LOG_FILE%" 2>&1 set /A REMOVED=REMOVED+1 if !REMOVED! GEQ %TO_REMOVE% ( goto break ) ) :break echo %DATE% %TIME%:#INFO#: Removed %TO_REMOVE% files >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: Removed %TO_REMOVE% files :end_purge rem +--------------------------------------------------------------------------+ rem sync to N drive rem +--------------------------------------------------------------------------+ if not [%DO_SYNC%] == [1] goto end_sync REM check the root if not exist "%DEST_PREFIX%" ( echo %DATE% %TIME%:#ERROR#: Archive location [%DEST_PREFIX%] not reachable >>"%LOG_FILE%" echo %DATE% %TIME%:#ERROR#: Archive location [%DEST_PREFIX%] not reachable goto end_sync ) REM get the domain number if /I [%HOST:~0,2%] == [WS] ( set DOMAIN_NUMBER=%HOST:~2,2% ) else ( set DOMAIN_NUMBER=%HOST:~3,2% ) REM get the dest dir dir /b "%DEST_PREFIX%\%DOMAIN_NUMBER%_*" >nul 2>&1 if errorlevel 1 ( echo %DATE% %TIME%:#ERROR#: Could not find directory for domain [%DOMAIN_NUMBER%] >>"%LOG_FILE%" echo %DATE% %TIME%:#ERROR#: Could not find directory for domain [%DOMAIN_NUMBER%] goto end_sync ) for /f "usebackq tokens=*" %%i in (`dir /b "%DEST_PREFIX%\%DOMAIN_NUMBER%_*"`) do set DEST_DIR=%%i REM get the full path set DEST_FT=%DEST_PREFIX%\%DEST_DIR%\06_Fasttools if not exist "%DEST_FT%" ( echo %DATE% %TIME%:#ERROR#: Could not find fasttools directory in [%DEST_FT%] >>"%LOG_FILE%" echo %DATE% %TIME%:#ERROR#: Could not find fasttools directory in [%DEST_FT%] goto end_sync ) set DEST_PATH=%DEST_FT%\%HOST% if not exist "%DEST_PATH%" ( mkdir "%DEST_PATH%" if errorlevel 1 ( echo %DATE% %TIME%:#ERROR#: Could not create directory for station [%HOST%] in [%DEST_FT%] >>"%LOG_FILE%" echo %DATE% %TIME%:#ERROR#: Could not create directory for station [%HOST%] in [%DEST_FT%] goto end_sync ) ) echo %DATE% %TIME%:#INFO#: Syncing to [%DEST_PATH%] >>"%LOG_FILE%" echo %DATE% %TIME%:#INFO#: Syncing to [%DEST_PATH%] robocopy "%TLS_BACKUP_DIR%" "%DEST_PATH%" "*_P.zip" "*_U.zip" "*_HIS.zip" /PURGE /R:3 /W:30 /NP /LOG+:"%LOG_FILE%" /TEE :end_sync goto:EOF :check_default if [%SAW_NEG%] == [0] ( set SAW_NEG=1 set DO_ZIP=0 set DO_PURGE=0 set DO_SYNC=0 ) goto:EOF :handle_max_backups shift if [%~1] == [] ( echo Size argument missing goto:EOF ) set /A MAX_BACKUPS=%~1 goto next_arg :usage echo Usage: %~nx0 [OPTIONS] [BACKUP_DIR] echo Where OPTIONS are: echo --help This help. echo --do-his Backup all history information. Omiting this option will echo backup history definitions only. echo --no-zip Do not create zips, only purge and synchronize. echo --no-purge Do not purge backups over the limit. echo --zip Only create zips, do not purge or synchronize. echo May be used with --sync and --purge echo --sync Synchronize with backup directory. echo May be used with --purge and --zip. echo --purge Only purge backups over the limit, no zips will be created echo or synchronizing carried out. echo May be used with --zip and --sync. echo --max-backups SIZE Maximum number of zip backups ^(groups of three^). echo If BACKUP_DIR is not specified, the default %DEFAULT_BACKUP_DIR% is used. goto:EOF