def transfer_demo(uuid, config): """Transfer the files contained in the sip to the destination. Very similar to the rsync transfer. However, because of time, I use the VERY UNSECURE sshpass package for rsync authentication. DO NOT USE IN PROD!!! :param str uuid: the id of the sip containing files to transfer :param dict config: here config must be a dict with the following keys: - user - the SSH user - password_file - a path where the password is stored - remote - the URL or IP of the remote - remote_path - where to store files on the remote - args - the args for rsync """ # we retrieve the archive and the SIP associated sip = SIP.get_sip(uuid) ark = Archive.get_from_sip(uuid) # we export it to the temp folder archiver = BaseArchiver(sip) archiver.write_all_files() # we rsync it to the remote src_path = archiver.get_fullpath('') dest_path = join(config['remote_path'], ark.accession_id) dest_path = '{}:{}'.format(config['remote'], dest_path) ssh_command = 'sshpass -f {filename} ssh -l {user}'.format( filename=config['password_file'], user=config['user']) return call([ 'rsync', config['args'], '--rsh={}'.format(ssh_command), src_path, dest_path ])
def transfer_rsync(uuid, config): """Transfer the files contained in the sip to the destination. The transfer is done with a rsync. If transfer to remote, you need a valid ssh setup. This method is automatically called by the module to transfer the files. Depending on your installation, you may want to have a different behavior (copy among servers...). Then, you can create your own factory and link it into the config variable :py:data:`invenio_archivematica.config.ARCHIVEMATICA_TRANSFER_FACTORY`. The config needs to include at least the destination folder. If transfer to remote, it needs to include the user and the server. In either cases, you can include usual rsync parameters. See :py:data:`invenio_archivematica.config.ARCHIVEMATICA_TRANSFER_FOLDER`: .. code-block:: python ARCHIVEMATICA_TRANSFER_FOLDER = { 'server': 'localhost', 'user': '******', 'destination': '/tmp', 'args': '-az' } :param str uuid: the id of the sip containing files to transfer :param config: the config for rsync """ sip = SIP.get_sip(uuid) # first we copy everything in a temp folder archiver = BaseArchiver(sip) archiver.write_all_files() # then we rsync to the final dest src_path = archiver.get_fullpath('') dest_path = config['destination'] if config.get('server', None) and config.get('user', None): dest_path = '{user}@{server}:{dest}'.format(user=config['user'], server=config['server'], dest=dest_path) try: ret = call(['rsync', config['args'], src_path, dest_path]) # we remove the temp folder finally: rmtree(src_path) return ret
def transfer_cp(uuid, config): """Transfer the files contained in the sip to a local destination. The transfer is done with a simple copy of files. This method is automatically called by the module to transfer the files. Depending on your installation, you may want to have a different behavior (copy among servers...). Then, you can create your own factory and link it into the config variable :py:data:`invenio_archivematica.config.ARCHIVEMATICA_TRANSFER_FACTORY`. :param str uuid: the id of the sip containing files to transfer :param config: can be empty. It will have the content of the variable :py:data:`invenio_archivematica.config.ARCHIVEMATICA_TRANSFER_FOLDER`. However, it will use the export folder set in :py:data:`invenio_sipstore.config.SIPSTORE_ARCHIVER_LOCATION_NAME` """ sip = SIP.get_sip(uuid) archiver = BaseArchiver(sip) archiver.write_all_files() return 0
def test_SIP(db): """Test SIP API class.""" user = create_test_user('*****@*****.**') agent = {'email': '*****@*****.**', 'ip_address': '1.1.1.1'} # we create a SIP model sip = SIP_.create(user_id=user.id, agent=agent) db.session.commit() # We create an API SIP on top of it api_sip = SIP(sip) assert api_sip.model is sip assert api_sip.id == sip.id assert api_sip.user is user assert api_sip.agent == agent assert api_sip.archivable is True assert api_sip.archived is False api_sip.archived = True db.session.commit() assert api_sip.archived is True assert sip.archived is True # test of the get method api_sip2 = SIP.get_sip(sip.id) assert api_sip2.id == api_sip.id