Esempio n. 1
0
def _get_files_from_afs(cli_ctx, afs, path, expiry):
    """Returns a list of files and directories under given path on mounted Azure File share.

    :param models.AzureFileShareReference afs: Azure file share reference.
    :param str path: path to list files from.
    :param int expiry: SAS expiration time in minutes.
    """
    from azure.storage.file import FileService
    from azure.storage.file.models import File, FilePermissions
    result = []
    service = FileService(afs.account_name, _get_storage_account_key(cli_ctx, afs.account_name, None))
    share_name = afs.azure_file_url.split('/')[-1]
    effective_path = _get_path_for_storage(path)
    if not service.exists(share_name, effective_path):
        return result
    for f in service.list_directories_and_files(share_name, effective_path):
        if isinstance(f, File):
            sas = service.generate_file_shared_access_signature(
                share_name, effective_path, f.name, permission=FilePermissions(read=True),
                expiry=datetime.datetime.utcnow() + datetime.timedelta(minutes=expiry))
            result.append(
                LogFile(
                    f.name, service.make_file_url(share_name, effective_path, f.name, 'https', sas),
                    False, f.properties.content_length))
        else:
            result.append(LogFile(f.name, None, True, None))
    return result
Esempio n. 2
0
def create_snapshot(file_share, directory_name, file_name, container_name, correlation_guid = str(uuid.uuid4())):
    file_service = FileService(account_name=STORAGE_ACCOUNT_NAME, account_key=STORAGE_ACCOUNT_KEY)
    blob_service = BlockBlobService(account_name=STORAGE_ACCOUNT_NAME, account_key=STORAGE_ACCOUNT_KEY)
    file_sas_token = file_service.generate_file_shared_access_signature(
        file_share,
        directory_name,
        file_name,
        permission = FilePermissions.READ,
        expiry = datetime.now() + timedelta(minutes = 10))

    file_url = file_service.make_file_url(file_share, directory_name, file_name, sas_token = file_sas_token)

    blob_name = '{0}/{1}/{2}'.format(correlation_guid, directory_name, file_name)
    blob_service.create_container(container_name)

    try:
        blob_service.copy_blob(container_name, blob_name, file_url)
    except Exception as e:
        raise ValueError('Missing file ' + file_name)

    blob_sas_token = blob_service.generate_blob_shared_access_signature(
        container_name,
        blob_name,
        permission = BlobPermissions.READ,
        expiry = datetime.now() + timedelta(days = 1000))

    return blob_service.make_blob_url(container_name, blob_name, sas_token = blob_sas_token)
Esempio n. 3
0
def post_file(share_name, path_to_file):
    try:
        account_name, account_key = get_auth(request.authorization)
        file_service = FileService(account_name=account_name,
                                   account_key=account_key)
        start_timedelta, expiry_timedelta = get_sas_params(request.args)
        directory_name, file_name = get_location(path_to_file)
        if request.headers.get('Transfer-Encoding') == 'chunked':
            file_service.create_file_from_stream(share_name,
                                                 directory_name,
                                                 file_name,
                                                 request.stream,
                                                 count=4096)
        else:
            file_service.create_file_from_bytes(share_name, directory_name,
                                                file_name, request.get_data())
        sas_token = file_service.generate_file_shared_access_signature(
            share_name,
            directory_name=directory_name,
            file_name=file_name,
            permission=SharePermissions(read=True),
            expiry=datetime.now() + expiry_timedelta,
            start=start_timedelta,
            id=None,
            ip=None,
            protocol='https',
            cache_control=request.headers.get('Cache-Control'),
            content_disposition=request.headers.get(
                'Content-Disposition: attachment;'),
            content_encoding=request.headers.get('Content-Encoding'),
            content_language=request.headers.get('Content-Language'),
            content_type=request.headers.get('Content-Type'))
        url = file_service.make_file_url(share_name,
                                         directory_name,
                                         file_name,
                                         protocol='https',
                                         sas_token=sas_token)

        return Response(response=url + "",
                        status=200,
                        content_type='text/plain')
    except Exception as e:
        logger.exception(e)
        return abort(500, e)
Esempio n. 4
0
    def generate_url(self, remote_file):
        """Sign a remote file to distribute. The azure url format is https://myaccount.blob.core.windows.net/mycontainer/myblob.
         Args:
             remote_file(str): The blob that we want to sign.
        """
        parse_url = _parse_url(remote_file)
        key = self.storage_client.storage_accounts.list_keys(
            self.resource_group_name, parse_url.account).keys[0].value
        if parse_url.file_type == 'blob':
            bs = BlockBlobService(account_name=parse_url.account,
                                  account_key=key)

            sas_token = bs.generate_blob_shared_access_signature(
                parse_url.container_or_share_name,
                parse_url.file,
                permission=BlobPermissions.READ,
                expiry=datetime.utcnow() + timedelta(hours=24),
            )
            source_blob_url = bs.make_blob_url(
                container_name=parse_url.container_or_share_name,
                blob_name=parse_url.file,
                sas_token=sas_token)
            return source_blob_url
        elif parse_url.file_type == 'file':
            fs = FileService(account_name=parse_url.account, account_key=key)
            sas_token = fs.generate_file_shared_access_signature(
                share_name=parse_url.container_or_share_name,
                directory_name=parse_url.path,
                file_name=parse_url.file,
                permission=BlobPermissions.READ,
                expiry=datetime.utcnow() + timedelta(hours=24),
            )
            source_file_url = fs.make_file_url(
                share_name=parse_url.container_or_share_name,
                directory_name=parse_url.path,
                file_name=parse_url.file,
                sas_token=sas_token)
            return source_file_url
        else:
            raise ValueError(
                "This azure storage type is not valid. It should be blob or file."
            )