Boeing MBD FTP Download Script

Here is my Boeing MBD Hubspan FTP Download Script. (vbscript)
Instead of downloading files from Hubspan with FTP, decrypting with PGP, and then unzipping the tar.gz and zip files all by hand, this script will do it all for you.  I have it added to a Scheduled task on a Windows server that runs at 6am and Noon.
Make sure you note the instructions in the header.

I have added newer versions of my Hubspan scripts here:
https://www.dropbox.com/s/pdbnfow7qxwukq4/Hubspan-Scripts.zip?dl=0

'Author: Ed Hammond
'Date: Nov 1, 2008
'Purpose: Search pickup.log file for new jobs to download, download them, decrypt with GPG, unzip with PowerArchiver.
'Usage: This script will parse the Boeing SNET pickup.log file and output today's files in pickup-out.txt.
'Requirments: Install PowerArchiver (or modify script for winzip) and GNU GPG. Add the path to both programs to your PATH system variable.
'Requirments: Don't forget to import your PGP keys and get the IDEA plugin for GPG.

'-----------------------------------------------------------------------------
'Start setting user variables
'-----------------------------------------------------------------------------
'Update these areas with your information, put this VBscript in the outputpath1 folder and then run the script.

'Output file name and directory
'WARNING: Your outputpath1 variable cannot have spaces in it or the command line stuff will break. (I'm to busy to fix that right now)

'Location of script and also this will be the working directory where everything will get dumped.
outputpath1 = "z:\scripts"

'FTP account info and your PGP passcode
tdiAccount = ""
tdiPassword = ""
PGPpasscode = ""

'-----------------------------------------------------------------------------
'Finished setting user variables
'-----------------------------------------------------------------------------
outputpath = outputpath1 & "\"
outputfname = outputpath & "pickup-out.txt"

'Enter log file name
fname = outputpath & "pickup.log"

'The header variable will help us remove the top line of the log file.
header = "BOEING"

'-----------------------------------------------------------------------------
'Start FTP Function
'
'------------------------------------------------------------------------------

Function FTPDownload(sSite, sUsername, sPassword, sLocalPath, sRemotePath, _
sRemoteFile, sExt)
'This script is provided under the Creative Commons license located
'at http://creativecommons.org/licenses/by-nc/2.5/ . It may not
'be used for commercial purposes with out the expressed written consent
'of NateRice.com

Const OpenAsDefault = -2
Const FailIfNotExist = 0
Const ForReading = 1
Const ForWriting = 2

Set oFTPScriptFSO = CreateObject("Scripting.FileSystemObject")
Set oFTPScriptShell = CreateObject("WScript.Shell")

sRemotePath = Trim(sRemotePath)
sLocalPath = Trim(sLocalPath)

'----------Path Checks---------
'Here we will check the remote path, if it contains
'spaces then we need to add quotes to ensure
'it parses correctly.
If InStr(sRemotePath, " ") > 0 Then
If Left(sRemotePath, 1) <> """" And Right(sRemotePath, 1) <> """" Then
sRemotePath = """" & sRemotePath & """"
End If
End If

'Check to ensure that a remote path was
'passed. If it's blank then pass a "\"
If Len(sRemotePath) = 0 Then
'Please note that no premptive checking of the
'remote path is done. If it does not exist for some
'reason. Unexpected results may occur.
sRemotePath = "\"
End If

'If the local path was blank. Pass the current
'working direcory.
If Len(sLocalPath) = 0 Then
sLocalpath = oFTPScriptShell.CurrentDirectory
End If

If Not oFTPScriptFSO.FolderExists(sLocalPath) Then
'destination not found
FTPDownload = "Error: Local Folder Not Found."
Exit Function
End If

sOriginalWorkingDirectory = oFTPScriptShell.CurrentDirectory
oFTPScriptShell.CurrentDirectory = sLocalPath
'--------END Path Checks---------

'build input file for ftp command
sFTPScript = sFTPScript & "USER " & sUsername & vbCRLF
sFTPScript = sFTPScript & sPassword & vbCRLF
sFTPScript = sFTPScript & "cd " & sRemotePath & vbCRLF

'check to see if we should download in ASCII mode
If sExt = "I01" Then
sFTPScript = sFTPScript & "ascii" & vbCRLF
Else
sFTPScript = sFTPScript & "binary" & vbCRLF
End If

sFTPScript = sFTPScript & "prompt n" & vbCRLF
sFTPScript = sFTPScript & "mget " & sRemoteFile & vbCRLF
sFTPScript = sFTPScript & "quit" & vbCRLF & "quit" & vbCRLF & "quit" & vbCRLF


sFTPTemp = oFTPScriptShell.ExpandEnvironmentStrings("%TEMP%")
sFTPTempFile = sFTPTemp & "\" & oFTPScriptFSO.GetTempName
sFTPResults = sFTPTemp & "\" & oFTPScriptFSO.GetTempName

'Write the input file for the ftp command
'to a temporary file.
Set fFTPScript = oFTPScriptFSO.CreateTextFile(sFTPTempFile, True)
fFTPScript.WriteLine(sFTPScript)
fFTPScript.Close
Set fFTPScript = Nothing

oFTPScriptShell.Run "%comspec% /c FTP -n -s:" & sFTPTempFile & " " & sSite & _
" > " & sFTPResults, 0, TRUE

Wscript.Sleep 1000

'Check results of transfer.
Set fFTPResults = oFTPScriptFSO.OpenTextFile(sFTPResults, ForReading, _
FailIfNotExist, OpenAsDefault)
sResults = fFTPResults.ReadAll
fFTPResults.Close

'oFTPScriptFSO.DeleteFile(sFTPTempFile)
'oFTPScriptFSO.DeleteFile (sFTPResults)

If InStr(sResults, "226 Transfer complete.") > 0 Then
FTPDownload = True
ElseIf InStr(sResults, "File not found") > 0 Then
FTPDownload = "Error: File Not Found"
ElseIf InStr(sResults, "cannot log in.") > 0 Then
FTPDownload = "Error: Login Failed."
Else
FTPDownload = "Error: Unknown."
End If

Set oFTPScriptFSO = Nothing
Set oFTPScriptShell = Nothing
End Function

dim results
sLocalPath = outputpath
sRemotePath = "\"

'-----------------------------------------------------------------------------
'Get pickup.log from Boeing FTP
'
'------------------------------------------------------------------------------

'Get pickup.log

pickuplog = FTPDownload("tdi.boeing.com", tdiAccount, tdiPassword, sLocalPath, sRemotePath, "pickup.log", "log")


dim a

'Looking for today's date as this format: Oct 31
'If the date is less than 10, then use 2 spaces.
if Day(Date) < 10 then
searchdate = " " & Day(Date)
Else
searchdate = " " & Day(Date)
End if

'This is the date format used by the log to pick out only files added today.
spam = MonthName(Month(Date),true) & searchdate


'*** String searching for

Const ForReading = 1, ForWriting = 2, ForAppending = 8

'**** Open pickup log file for appending
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set objOutputFile = objFileSystem.OpenTextFile(outputfname, ForAppending, TRUE)
set fso = CreateObject("Scripting.FileSystemObject")
if not fso.fileExists(outputfname) then
Set MyFile = fso.CreateTextFile(outputfname, True)
MyFile.Close
End if

found = "0"

if fso.fileExists(fname) then
set txtstream = fso.Opentextfile(fname)

Do while not (txtStream.atEndofStream)
text2 = txtStream.ReadLine
text = text2 & vbCrlf

'*** Checks pickup.log for uploads from today
if (InStr(text,spam)>1) then

if (InStr(text,header)<1 data-blogger-escaped-br="" data-blogger-escaped-then=""> a=Split(text)
'Take the first part of the file name and add a wildcard
formattedA = a(0) & "*"
found = "1"
results = FTPDownload("tdi.boeing.com", tdiAccount, tdiPassword, sLocalPath, sRemotePath, formattedA, a(1))
objOutputFile.WriteLine(text2)
End if
End if
loop
end if

if found = "0" then
objOutputFile.WriteLine(spam & " - Nothing found today.")
WScript.Quit [exitcode]
End if

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & outputpath1 & "'} Where " _
& "ResultClass = CIM_DataFile")

Set objShell = CreateObject("WScript.Shell")

For Each objFile In FileList
strNewName = objFile.Drive & objFile.Path & _
objFile.FileName & "." & objFile.Extension

If objFile.Extension = "ZIP" Then
strReName = objFile.Drive & objFile.Path & _
objFile.FileName & "-2.ZIP"
gpgString = "cmd /c echo " & PGPpasscode & Chr(124) & "gpg --load-extension Lib\idea --passphrase-fd 0 --decrypt --output " & strReName & " " & strNewName
objShell.Run(gpgString)
objOutputFile.WriteLine("Decrypted: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
End If

If objFile.Extension = "I01" Then
strReName = objFile.Drive & objFile.Path & _
objFile.FileName & ".igs"
Set objShell = CreateObject("WScript.Shell")
gpgString = "cmd /c echo " & PGPpasscode & Chr(124) & "gpg --load-extension Lib\idea --passphrase-fd 0 --decrypt --output " & strReName & " " & strNewName
objShell.Run(gpgString)
objOutputFile.WriteLine("Decrypted: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
End If

If objFile.Extension = "C31" Then
strReName = objFile.Drive & objFile.Path & _
objFile.FileName & ".igs"
Set objShell = CreateObject("WScript.Shell")
'Wscript.Echo gpgString
gpgString = "cmd /c echo " & PGPpasscode & Chr(124) & "gpg --load-extension Lib\idea --passphrase-fd 0 --decrypt --output " & strReName & " " & strNewName
objShell.Run(gpgString)
objOutputFile.WriteLine("Decrypted: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
End If
Next


'-----------------------------------------------------------------------------
'Unzip MBD Parts
'We run unzip first and then look for tar and gz archives twice, deleteing them after we unzip
'If the archives are really large you may need to increast the sleep time
'Add Powerarchiver to your path. C:\Program Files\PowerArchiver
'------------------------------------------------------------------------------


unzipped = "0"

Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & outputpath1 & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In FileList
strNewName = objFile.Drive & objFile.Path & _
objFile.FileName & "." & objFile.Extension

If objFile.Extension = "ZIP" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run("powerarc -e " & strNewName)
objOutputFile.WriteLine("Unzipped: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
unzipped = "1"
End If
Next
WScript.Sleep(2000)
if unzipped = "1" then

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & outputpath1 & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In FileList
strNewName = objFile.Drive & objFile.Path & _
objFile.FileName & "." & objFile.Extension


If objFile.Extension = "tar" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run("powerarc -e " & strNewName)
objOutputFile.WriteLine("Unzipped: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
unzipped = "2"
End If

If objFile.Extension = "gz" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run("powerarc -e " & strNewName)
objOutputFile.WriteLine("Unzipped: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
unzipped = "2"
End If
Next
end if
WScript.Sleep(2000)
if unzipped = "2" then

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & outputpath1 & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In FileList
strNewName = objFile.Drive & objFile.Path & _
objFile.FileName & "." & objFile.Extension


If objFile.Extension = "tar" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run("powerarc -e " & strNewName)
objOutputFile.WriteLine("Unzipped: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
unzipped = "3"
End If

If objFile.Extension = "gz" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run("powerarc -e " & strNewName)
objOutputFile.WriteLine("Unzipped: " & strNewName)
WScript.Sleep(8000)
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
unzipped = "3"
End If
Next
end if

'Let do some clean up on the txt0001.txt log files that no one reads

Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & outputpath1 & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In FileList
strNewName = objFile.Drive & objFile.Path & _
objFile.FileName & "." & objFile.Extension
'Wscript.Echo strNewName

If Instr(1, objFile.FileName, "txt0001") > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
objFSO.DeleteFile(strNewName)
End If
Next

'*** Close up everything
objOutputFile.Close
Set objFileSystem = Nothing

'Pop up the log file so you know something happend.
objShell.Run("notepad.exe " & outputfname)






Comments

Popular Posts