; #########################################################################################
; ### ###
; ### Script to copy latest NAI SuperDAT files to Netlogon Export directories on PDC's ###
; ### Created: 2001.08.24 Bill Leonard ###
; ### Domains included: Domain1, Domain2, Domain3 ###
; ### Revisions: ###
; ### ###
; #########################################################################################
; REM ** Variables in use by this script
$CR = CHR(13) + CHR(10) ; REM ** Carriage returns
$ArrErr = 0 ; REM ** Track errors encountered in Array process to exit loop
$BatchDir = "C:\SubDir" ; REM ** Where are batch files called from
$ChkVer = "" ; REM ** Track file version comparisons results
$DownDir = "C:\Temp\Nai" ; REM ** FTP Download directory
$Emailid1 = "admin1@@mycompany.com" ; REM ** Primary email Recipient for login script errors/warning messages
$Emailid2 = "admin2@@mycompany.com" ; REM ** Secondary email Recipient for login script errors/warning messages
$EmailSvr = "mailserver.mycompany.com" ; REM ** SMTP/POP3 mail server
$EmailUsr = $Emailid1 ; REM ** Needed Senders email address
$Exist = "No" ; REM ** Bucket if files exist on destination servers
$Err = 0 ; REM ** Track errors encountered in script to alert admin
$FtpChk = "nai_ftp_chk.cmd" ; REM ** FTP check file
$FtpFil = "nai_ftp_get.cmd" ; REM ** FTP file to build
$NAIPath = "\\AppServer\SoftLib" ; REM ** Top level source directory for NAI update files
$sDATDir = "$NAIPath\NAI\SDats"
$zDATDir = "$NAIPath\NAI\ZDats"
$Pdc = "" ; REM ** Variable to hold name of receiving Domain Controller
$DstDrv = "W:"
$DstDir = "Winnt\System32\Repl\Export\Scripts\NAI"
$LocalSvr = "AppServer"
$LogDir = "\\AppServer\Share$"
$LogDir = "$LogDir\NAI\Servers"
$LogFil = $LocalSvr + "_NAI_Sdat_Download.txt"
; REM ** Step 1 - Open Log File
$Time = "@DATE @TIME"
$Log = "$LogDir\$LogFil"
SELECT
CASE EXIST ($Log) = 0 ; REM ** Log not in existence
$wri - OPEN (1, $Log, 5)
$wri = WRITELINE (1, "$LocalSvr Log started: $TIME" + $CR)
$wri = WRITELINE (1, "Log Path: $LogDir" + $CR)
$wri = WRITELINE (1, " " + $CR)
CASE (1)
$wri = OPEN (1, $Log, 5)
ENDSELECT
$wri = WRITELINE (1, "Process started: $Time" + $CR)
; REM ** Step 2 - delete previous download files
$RC = DIR ("$DownDir\sdat4*.exe")
IF ($RC <> 0)
DEL "$DownDir\$RC"
IF (@ERROR = 0)
$wri = WRITELINE (1, " Success deleting $DownDir\$RC" + $CR)
ELSE
$Err = $Err+1
$wri = WRITELINE (1, " Error @ERROR deleting $DownDir\$RC (@SERROR)" + $CR)
ENDIF
ENDIF
$RC = DIR ("$DownDir\Dat*.zip")
IF ($RC <> 0)
DEL "$DownDir\$RC"
IF (@ERROR = 0)
$wri = WRITELINE (1, " Success deleting $DownDir\$RC" + $CR)
ELSE
$Err = $Err+1
$wri = WRITELINE (1, " Error @ERROR deleting $DownDir\$RC (@SERROR)" + $CR)
ENDIF
ENDIF
; REM ** Step 3 - build FTP download file
IF EXIST ("$BatchDir\$FtpFil") <> 0
DEL "$BatchDir\$FtpFil"
IF (@ERROR <> 0)
$Err = $Err+1
$wri = WRITELINE (1, " Error @ERROR deleting $BatchDir\$FtpFil (@SERROR)" + $CR)
GOTO EndScript
ENDIF
ENDIF
$con = OPEN (9, "$BatchDir\$FtpFil", 5)
$wri = WRITELINE (9, "open ftp.nai.com" + $CR)
$wri = WRITELINE (9, "user anonymous" + $CR)
$wri = WRITELINE (9, "someone@@mycompany.com" + $CR)
$wri = WRITELINE (9, "binary" + $CR)
$wri = WRITELINE (9, "cd /pub/antivirus/datfiles/4.x" + $CR)
$wri = WRITELINE (9, "lcd \Temp\Nai" + $CR)
$wri = WRITELINE (9, "mget dat-*.zip" + $CR)
$wri = WRITELINE (9, "mget sdat*.exe" + $CR)
$wri = WRITELINE (9, "close" + $CR)
$wri = WRITELINE (9, "quit" + $CR)
$con = CLOSE (9)
; REM ** Step 4 - Initiate FTP download, check file for errors
SHELL "cmd /c ftp -ins:$BatchDir\$FtpFil > $BatchDir\$FtpChk"
OPEN (9, "$BatchDir\$FtpChk", 2)
$x = 0
$Line = READLINE (9)
WHILE ((INSTR ($Line, "ftp> quit") = 0) AND ($x < 50))
SELECT
CASE ($Line = "cannot login")
$Err = $Err+1
$wri = WRITELINE (1, " FTP login error to NAI server" + $CR)
GOTO EndScript
CASE ($Line = "login incorrect")
$Err = $Err+1
$wri = WRITELINE (1, " FTP login error to NAI server" + $CR)
GOTO EndScript
CASE ($Line = "access denied")
$Err = $Err+1
$wri = WRITELINE (1, " FTP login error to NAI server" + $CR)
GOTO EndScript
ENDSELECT
$x = $x+1
$Line = READLINE (9)
LOOP
CLOSE (9)
; REM ** Step 5 - Determe the present SuperDAT/ZipDAT filename, parse the string for the 4-digit version number
$FileCurSdat = DIR ("$sDATDir\Current\sdat4*.exe")
$FileCurSver = SUBSTR ($FileCurSdat, 5, 4)
$FileCurZdat = DIR ("$zDATDir\Current\dat*.zip")
$FileCurZver = SUBSTR ($FileCurZdat, 5, 4)
$FileNewSdat = DIR ("$DownDir\sdat4*.exe")
$FileNewSver = SUBSTR ($FileNewSdat, 5, 4)
$FileNewZdat = DIR ("$DownDir\dat*.zip")
$FileNewZver = SUBSTR ($FileNewSdat, 5, 4)
; REM ** Step 6 - Compare versions to see if latest download matches current on server
SELECT
CASE (($FileNewSver > $FileCurSver) OR ($FileNewZver > $FileCurZver))
$wri = WRITELINE (1, " sDAT: $sDATDir\Current: $FileCurSver / $DownDir: $FileNewSver ($FileNewSdat)" + $CR)
$wri = WRITELINE (1, " zDAT: $zDATDir\Current: $FileCurZver / $DownDir: $FileNewZver ($FileNewZdat)" + $CR)
CASE (1)
$Update = "No"
$wri = WRITELINE (1, " sDAT OK: $sDATDir\Current: $FileCurSver / $DownDir: $FileNewSver ($FileNewSdat)" + $CR)
$wri = WRITELINE (1, " zDAT OK: $zDATDir\Current: $FileCurZver / $DownDir: $FileNewZver ($FileNewZdat)" + $CR)
GOTO UpdateServers
ENDSELECT
; REM ** Step 7 - Copy current local server versions to archive directory
$RC = DIR ("$sDATDir\Current\sdat4*.exe")
COPY "$sDATDir\Current\$RC" "$sDATDir\Archive\$RC"
IF (@ERROR = 0)
DEL "$sDATDir\Current\$RC"
IF (@ERROR <> 0)
$wri = WRITELINE (1, " Error @ERROR deleting $sDATDir\Current\$RC (@SERROR) (Step 7)" + $CR)
ENDIF
ENDIF
$RC = DIR ("$zDATDir\Current\*.zip")
COPY "$zDATDir\Current\$RC" "$zDATDir\Archive\$RC"
IF (@ERROR = 0)
DEL "$zDATDir\Current\$RC"
IF (@ERROR <> 0)
$wri = WRITELINE (1, " Error @ERROR deleting $zDATDir\Current\$RC (@SERROR) (Step 7)" + $CR)
ENDIF
ENDIF
; REM ** Step 8 - Retrieve current files to server local server (SDAT and ZIP files)
COPY "$DownDir\$FileNewZdat" "$zDATDir\Current\"
IF (@ERROR <> 0)
$Err = $Err+1
$wri = WRITELINE (1, "Error @ERROR copying $FileNewZdat to $LocalSvr (@SERROR) (Step 8)" + $CR)
ENDIF
COPY "$DownDir\$FileNewSdat" "$sDATDir\Current\"
IF (@ERROR <> 0)
$Err = $Err+1
$wri = WRITELINE (1, "Error @ERROR copying $FileNewSdat to $LocalSvr (@SERROR) (Step 8)" + $CR)
ENDIF
:UpdateServers
; REM ** Step 9 - Obtain new files size and time stamps for check process confirming copy process to clients
$FileNewSsize = GETFILESIZE ("$sDATDir\Current\$FileNewSdat")
$FileNewStime = GETFILETIME ("$sDATDir\Current\$FileNewSdat")
$wri = WRITELINE (1, " New SDAT size: $FileNewSsize / time: $FileNewStime (Step 9)" + $CR)
; REM ** Step 10 - Build array to update primary domain controllers in this and other offices
$x=0
DIM $DstDom[3]
DIM $DstPdc[3]
DIM $DstShr[3]
$DstDom[$x] = "Domain1" $DstPdc[$x] = "Pdc1" $DstShr[$x] = "\\Pdc1\C$" $x=$x+1
$DstDom[$x] = "Domain2" $DstPdc[$x] = "Pdc2" $DstShr[$x] = "\\Pdc2\D$" $x=$x+1
$DstDom[$x] = "Domain3" $DstPdc[$x] = "Pdc3" $DstShr[$x] = "\\Pdc3\E$" $x=$x+1
$x2=0
DO
$ArrErr = 0
$ChkVer = ""
$Pdc = $DstPdc[$x2]
$TmpEx = EXIST ("$DstDrv\*.")
IF ($TmpEx <> 0)
USE "$DstDrv" /DEL
IF (@ERROR = 0)
$wri = WRITELINE (1, " Success deleting drive mapping $DstDrv (pass $x2)" + $CR)
ELSE
$ArrErr = $ArrErr+1
$wri = WRITELINE (1, " Error @ERROR deleting drive mapping $DstDrv (@SERROR)" + $CR)
ENDIF
ELSE
$wri = WRITELINE (1, " Verified $DstDrv drive mapping does not exist (pass $x2)" + $CR)
ENDIF
IF ($ArrErr <> 0)
$Err = $Err+1
GOTO EndLoop
ENDIF
USE "$DstDrv" $DstShr[$x2]
IF (@ERROR <> 0)
$ArrErr = $ArrErr+1
$Msg = "Error @ERROR (@SERROR)"
ELSE
$Msg = "Success"
ENDIF
$wri = WRITELINE (1, " $Msg mapping $DstDrv to " + $DstShr[$x2] + " ($x2)" + $CR)
IF ($ArrErr <> 0)
$Err = $Err+1
GOTO EndLoop
ENDIF
; REM ** Step 11 - Confirm version of SDAT on PDC, compare with current download on Local Server
IF EXIST ("$DstDrv\$DstDir\sdat4*.exe") = 1 ; REM ** SDAT file exists on server
$Exist = "Yes"
$FilePdcSdat = DIR ("$DstDrv\$DstDir\sdat4*.exe")
$FilePdcSver = SUBSTR ($FilePdcSdat, 5, 4)
SELECT
CASE ($FilePdcSver < $FileNewSver) $ChkVer = "Older"
CASE ($FilePdcSver > $FileNewSver) $ChkVer = "Newer"
$ArrErr = $ArrErr+1
CASE (1) $ChkVer = "Current"
ENDSELECT
ELSE $ChkVer = "Missing"
ENDIF
$wri = WRITELINE (1, " $ChkVer SDAT: $Pdc: $FilePdcSver / $LocalSvr: $FileNewSver (Step 11)" + $CR)
IF ($ChkVer = "Current") OR ($ChkVer = "Newer")
GOTO EndLoop
ENDIF
IF ($ArrErr <> 0)
$Err = $Err+1
GOTO EndLoop
ENDIF
; REM ** Step 12 - Delete existing verion(s) on PDC to only have 1 SDAT in the DIR at any time
IF ($Exist = "Yes")
DEL "$DstDrv\$DstDir\$FilePdcSdat"
IF (@ERROR = 0)
$Msg = "Success"
ELSE
$ArrErr = $ArrErr+1
$Msg = "Error @ERROR (@SERROR)"
ENDIF
$wri = WRITELINE (1, " $Msg deleting $FilePdcSdat on $DstDrv\$DstDir (Step 12)" + $CR)
ENDIF
IF ($ArrErr <> 0)
$Err = $Err+1
GOTO EndLoop
ENDIF
; REM ** Step 13 - Copy updated SDAT files to the PDC
COPY "$sDATDir\Current\$FileNewSdat" "$DstDrv\$DstDir\$FileNewSdat"
IF (@ERROR <> 0)
$ArrErr = $ArrErr+1
$Msg = "Error @ERROR (@SERROR)"
ELSE
$FilePdcSsize = GETFILESIZE ("$DstDrv\$DstDir\$FileNewSdat")
$FilePdcStime = GETFILETIME ("$DstDrv\$DstDir\$FileNewSdat")
IF (($FileNewSsize <> $FilePdcSsize) OR ($FileNewStime <> $FilePdcStime))
$ArrErr = $ArrErr+1
$Msg = "Error in confirmation process"
$wri = WRITELINE (1, " $LocalSvr SDAT size: $FileNewSsize / time: $FileNewStime" + $CR)
$wri = WRITELINE (1, " $Pdc SDAT size: $FilePdcSsize / time: $FilePdcStime" + $CR)
ELSE
$Msg = "Confirmed successful"
ENDIF
ENDIF
$wri = WRITELINE (1, " $Msg copying $FileNewSdat to $DstDrv\$DstDir (Step 13)" + $CR)
IF ($ArrErr <> 0)
$Err = $Err+1
GOTO EndLoop
ENDIF
:EndLoop
$x2=$x2+1
UNTIL $x2=$x
; REM ** Confirm drive no longer mapped
$TmpEx = EXIST ("$DstDrv\*.")
IF ($TmpEx <> 0)
USE "$DstDrv" /DEL
IF (@ERROR = 0)
$wri = WRITELINE (1, " Success deleting drive mapping $DstDrv (pass $x2)" + $CR)
ELSE
$Err = $Err+1
$wri = WRITELINE (1, " Error @ERROR deleting drive mapping $DstDrv (@SERROR)" + $CR)
ENDIF
ENDIF
:EndScript
; REM ** Step 14 - Close log file and exit the script
USE "$DstDrv" /DEL
$wri = WRITELINE (1, "Process completed: @TIME" + $CR)
$wri = WRITELINE (1, " " + $CR)
$wri = CLOSE (1)
IF ($Err <> 0) RUN "POSTIE.exe -host:$EmailSvr -to:$Emailid1 -from:$EmailUsr -s:NAI_Update_Error_on_@WKSTA -msg:" + CHR(34) + "Error Count: $Err" + CHR(34) + " -q -a:$Log"
ENDIF
SLEEP 3
IF ($Err <> 0) RUN "POSTIE.exe -host:$EmailSvr -to:$Emailid2 -from:$EmailUsr -s:NAI_Update_Error_on_@WKSTA -msg:" + CHR(34) + "Error Count: $Err" + CHR(34) + " -q -a:$Log"
ENDIF
SLEEP 3
; IF ($Err = 0) RUN "POSTIE.exe -host:$EmailSvr -to:$Emailid1 -from:$EmailUsr -s:NAI_Update_Success_on_@WKSTA -msg:" + CHR(34) + "Error Count: $Err" + CHR(34) + " -q -a:$Log"
; ENDIF
; SLEEP 3
EXIT