class DriverMega(Service): ERROR_TRY_AGAIN = -3 NODE_FILE = 0 NODE_ROOT = 2 def __init__(self, params): ''' Connects to Mega with the provided credentials Arguments --------- params: A dict with the params to be passed to the initialised object ''' self.logger = logging.getLogger('clouddump') self.logger.info("Connecting to Mega...") self.params = params self.mega = Mega() try: self.mega.login(params['user_name'], params['password']) self.logger.info("Sucessfully logged in to Mega.") except Exception: self.logger.error( "Authentication to Mega failed. Please check user / password.") sys.exit(errno.EPERM) def upload(self, file_name): ''' Uploads the file to Mega, retrying if it couldn't be achieved Arguments --------- file_name: A string with the name of the file to be uploaded ''' try: link = self._upload_try(file_name) except Exception as e: if e == DriverMega.ERROR_TRY_AGAIN: count = 0 self.logger.warn( "Failed to upload %s to Mega. Trying again..." % (file_name)) while link == None and count < self.params['retries']: link = self._upload_try(file_name) count += 1 if link == None: self.logger.error("Upload failed after all retries.") def delete_old_files(self): '''Delete files from the specified folder older than x days''' files = self._get_folder_files() if len(files) > 0: past = datetime.datetime.now() - datetime.timedelta( days = self.params["delete_files_older_than"]) past_timestamp = calendar.timegm(past.utctimetuple()) for file_id, file_metadata in files.iteritems(): if file_metadata['ts'] < past_timestamp: try: self.mega.delete(file_id) self.logger.info( "%s deleted" % (file_metadata['a']['n'])) except Exception as e: if e == DriverMega.ERROR_TRY_AGAIN: self.logger.warn( "Failed to delete %s from Mega." % (file_metadata['a']['n'])) else: self.logger.info("No files to delete") def _get_folder_files(self): ''' Return the files stored in the specified folder, or from the root one if no folder was passed ''' if self.params['folder_name'] == '': only_files = {} files = self.mega.get_files_in_node(DriverMega.NODE_ROOT) for key, value in files.iteritems(): if value['t'] == DriverMega.NODE_FILE: only_files[key] = value return only_files folder = self.mega.find(self.params['folder_name']) return self.mega.get_files_in_node(folder[0]) def _upload_try(self, file_name): ''' Uploads the file to the selected folder in Mega, or root if no folder was chosen Arguments --------- file_name: A string with the name of the file to be uploaded ''' self.logger.info("Uploading %s..." % (file_name)) if self.params['folder_name'] == '': file = self.mega.upload(file_name) else: folder = self.mega.find(self.params['folder_name']) if folder: file = self.mega.upload(file_name, folder[0]) else: self.logger.critical("Folder %s doesn't exists in Mega." % (self.params['folder_name'])) sys.exit(errno.ENOENT) return self.mega.get_upload_link(file)