From 23d7b7513f76d6b564ceb0464db481a2e9f58c09 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Mon, 28 Nov 2022 00:43:04 +0100 Subject: [PATCH] Calculate, log & save estimated & actual transfer speed --- transatlanticTorrentExpress.py | 66 +++++++++++++++++++++++++++++++++- utils.py | 21 ++++++++++- 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/transatlanticTorrentExpress.py b/transatlanticTorrentExpress.py index 2c1c528..fe6af4e 100755 --- a/transatlanticTorrentExpress.py +++ b/transatlanticTorrentExpress.py @@ -4,7 +4,71 @@ from subprocess import check_output, Popen, PIPE # Local files from logger import logger -from utils import getConfig +from utils import getConfig, readAvgSpeedFromDisk, writeAvgSpeedToDisk + +ESTIMATED_TRANSFER_SPEED=readAvgSpeedFromDisk() +TRANSFER_SPEED_UNIT="Mb/s" +LAST_FILE_TRANSFER_SPEED=None + +def fileSizeByPath(path): + filename = path.split('/')[-1] + config = getConfig() + host = config['SSH']['host'] + user = config['SSH']['user'] + remotePath = config['FILES']['remote'] + + diskUsageCmd = 'du -hs' + if (remotePath in path): + cmd = 'ssh {}@{} {} "\'{}\'"'.format(user, host, diskUsageCmd, path) + else: + cmd = '{} "{}"'.format(diskUsageCmd, path) + + diskusageOutput = check_output(cmd, shell=True) + + diskusageOutput = diskusageOutput.decode('utf-8').split('\t') + return diskusageOutput[0] + 'B' + +def fileSizeInBytes(fileSize, blockSize=1024): + try: + if fileSize[-2] == 'G': + fileSizeInBytes = float(fileSize[:-2]) * 1024 * 1024 * 1024 + elif fileSize[-2] == 'M': + fileSizeInBytes = float(fileSize[:-2]) * 1024 * 1024 + elif fileSize[-2] == 'K': + fileSizeInBytes = float(fileSize[:-2]) * 1024 + except: + logger.error('Filesize to float. Filesize:', es={'output': fileSize}) + return + + return fileSizeInBytes + +def estimateFileTransferTime(fileSize, filename): + global ESTIMATED_TRANSFER_SPEED,TRANSFER_SPEED_UNIT,LAST_FILE_TRANSFER_SPEED + + fileSizeBytes = fileSizeInBytes(fileSize) + if fileSizeBytes == None: + logger.info('Unable to calculate transfer time for file', es={'filename': filename}) + return + + if (LAST_FILE_TRANSFER_SPEED): + estimatedTransferSpeed = LAST_FILE_TRANSFER_SPEED + else: + estimatedTransferSpeed = ESTIMATED_TRANSFER_SPEED + logger.debug('Guessing transfer speed with static speed variable', es={'transferSpeed': ESTIMATED_TRANSFER_SPEED, + 'transferSpeedUnit': TRANSFER_SPEED_UNIT}) + + elapsedTimeInSeconds = (fileSizeBytes / 1000 / 1000 * 8) / estimatedTransferSpeed + estimatedTransferTime = str(timedelta(seconds=elapsedTimeInSeconds)).split('.')[0] + + # trying to find the speed we average transfer at + logger.info('Estimated transfer time'.format(estimatedTransferTime), es={'filename': filename, + 'filesize': fileSize, + 'bytes': fileSizeBytes, + 'seconds': elapsedTimeInSeconds, + 'transferTime': estimatedTransferTime, + 'transferSpeed': estimatedTransferSpeed, + 'transferSpeedUnit': TRANSFER_SPEED_UNIT}) + return estimatedTransferSpeed def getFiles(path, host=None, user=None): logger.info('Getting filenames from path: {}'.format(path), es={'path': path}) diff --git a/utils.py b/utils.py index 2e1ebd2..a59bb93 100644 --- a/utils.py +++ b/utils.py @@ -15,4 +15,23 @@ def getConfig(): config.read(path) # logger.debug('Sections parsed: {}'.format(config.sections())) - return config \ No newline at end of file + return config + +def writeAvgSpeedToDisk(speed): + path = os.path.join(pwd, '.avgspeed.txt') + + with open(path, 'w') as f: + f.write(str(int(speed))) + f.close() + +def readAvgSpeedFromDisk(): + path = os.path.join(pwd, '.avgspeed.txt') + + with open(path, 'r') as f: + data = f.readline() + f.close() + + if data == '': + data = '1' + + return int(data) \ No newline at end of file