diff options
Diffstat (limited to 'tests/test-framework/vmware/ftpsource.py')
-rw-r--r-- | tests/test-framework/vmware/ftpsource.py | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/tests/test-framework/vmware/ftpsource.py b/tests/test-framework/vmware/ftpsource.py new file mode 100644 index 000000000..306c76b63 --- /dev/null +++ b/tests/test-framework/vmware/ftpsource.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +from ftplib import FTP +import datetime, functools, os, time, tempfile +from source import Installer +import utils + +def _timestampFromFilename( platform, fn ): + # windows: assumed format is YYYY_mm_dd_HH_MM as prefix + # linux: assumed format is YYYY-mm-dd as suffix + if platform.startswith( 'windows' ): + format = '%Y_%m_%d_%H_%M' + length = len( 'YYYY_mm_dd_HH_MM' ) + return datetime.datetime.strptime( fn[0:length], format ) + else: + format = '%Y-%m-%d' + length = len( 'YYYY-mm-dd' ) + return datetime.datetime.strptime( fn[-length:], format ) + + + +def timestampFromFilename( platform, fn ): + try: + return _timestampFromFilename( platform, fn ) + except ValueError: + return None + +def filesNewerThan( files, dt ): + if dt: + return filter( lambda (x,y): y >= dt, files ) + else: + return files + +#internal to FtpSource +class Location: + def __init__( self, host, path, platform ): + self.host = host + self.path = path + self.platform = platform + self.testedFiles = [] + + def ls( self ): + ftp = FTP( self.host ) + ftp.login() + try: + return map( utils.basename, ftp.nlst( self.path ) ) + finally: + ftp.close() + + def filesSortedByTimestamp( self ): + files = self.ls() + withTS = [( i, timestampFromFilename( self.platform, i ) ) for i in files] + filtered = filter( lambda (x,y): y != None, withTS ) + filtered.sort( key=lambda (x,y): y ) + return filtered + + def untestedFilesSortedByTimestamp( self ): + l = self.filesSortedByTimestamp() + return filter( lambda ( x, y ): not self.isTested( x ), l ) + + def markAsTested( self, filename ): + self.testedFiles.append( filename ) + + def isTested( self, filename ): + return filename in self.testedFiles + + def description( self ): + return "host={0} path={1} platform={2}".format( self.host, self.path, self.platform ) + + def download( self, fn, target ): + ftp = FTP( self.host ) + ftp.login() + try: + ftp.retrbinary( 'RETR {0}/{1}'.format( self.path, fn ), target.write ) + finally: + ftp.close() + +class FtpSource: + def __init__( self, delay=60*60, tempdir='/tmp' ): + self._locations = [] + self._delay = delay + self._tempdir = tempdir + self._startDate = None + + def setStartDate( self, date ): + self._startDate = date + + def addLocation( self, host, path, platform ): + self._locations.append( Location( host, path, platform ) ) + + def nextInstaller( self ): + while True: + for i in self._locations: + print( "** Checking FTP location: " + i.description() ) + files = i.untestedFilesSortedByTimestamp() + if self._startDate != None: + files = filesNewerThan( files, self._startDate ) + if len( files ) == 0: + continue; + fn, ts = files[0] + print( "** Downloading new installer: {0}...".format( fn ) ) + tmp = tempfile.NamedTemporaryFile( dir=self._tempdir, prefix=fn ) + i.download( fn, tmp ) + print( "** Download completed. ({0})".format( tmp.name ) ) + i.lastTested = ts + inst = Installer( tmp.name, i.platform, i, ts, tmp ) + inst.sourceFilename = fn + return inst + print( "** No installers found. Going to sleep for {0} seconds...".format( self._delay ) ) + time.sleep( self._delay ) + +if __name__ == "__main__": + src = FtpSource() + src.addLocation( "hegel", "/projects/ndk/installers/windows", "windows" ) + while True: + inst = src.nextInstaller() + print inst + inst.markAsTested() |