Tim Jenssen 64391c88c7 moved some directories and adjusted the README
- also removed some unused projects under examples(updater, updaterplugin)
 - adjusted pro files to the new structure
2011-03-09 11:05:24 +01:00

118 lines
3.8 KiB
Python

# -*- 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()