View | Details | Raw Unified | Return to bug 19795
Collapse All | Expand All

(-)a/Koha/Uploader.pm (-2 / +63 lines)
Lines 76-81 use C4::Koha; Link Here
76
use Koha::UploadedFile;
76
use Koha::UploadedFile;
77
use Koha::UploadedFiles;
77
use Koha::UploadedFiles;
78
78
79
80
BEGIN {
81
    if (C4::Context->preference('SwiftStorage')){
82
        require Net::OpenStack::Swift;
83
        import Net::OpenStack::Swift;
84
    }
85
}
86
79
__PACKAGE__->mk_ro_accessors( qw|| );
87
__PACKAGE__->mk_ro_accessors( qw|| );
80
88
81
=head1 INSTANCE METHODS
89
=head1 INSTANCE METHODS
Lines 204-209 sub _init { Link Here
204
    $self->{files} = {};
212
    $self->{files} = {};
205
    $self->{uid} = C4::Context->userenv->{number} if C4::Context->userenv;
213
    $self->{uid} = C4::Context->userenv->{number} if C4::Context->userenv;
206
    $self->{public} = $params->{public}? 1: undef;
214
    $self->{public} = $params->{public}? 1: undef;
215
    $self->{swift} = C4::Context->preference('SwiftStorage');
207
}
216
}
208
217
209
sub _fh {
218
sub _fh {
Lines 216-221 sub _fh { Link Here
216
sub _create_file {
225
sub _create_file {
217
    my ( $self, $filename ) = @_;
226
    my ( $self, $filename ) = @_;
218
    my $fh;
227
    my $fh;
228
    
229
    if ($self->{swift}){
230
        # We are uploading in to a swift object store, not local files
231
        # Authenticate to swift, bail out if we can't
232
        #
233
        # Maybe shift this to its own sub next
234
        my $sw = Net::OpenStack::Swift->new(
235
            auth_url    => C4::Context->preference('SwiftStorageAuthUrl'),
236
            user        => C4::Context->preference('SwiftStorageUser'),
237
            password    => C4::Context->preference('SwiftStoragePassword'),
238
            tenant_name => C4::Context->preference('SwiftStorageTenant'),
239
            region      => C4::Context->preference('SwiftStorageRegion')
240
        );
241
        my ( $storage_url, $token );
242
        eval {($storage_url,$token) = $sw->get_auth();};
243
        if ($@){
244
            # we can't login, bail out
245
            $self->{files}->{$filename}->{errcode} = 2; #not writable
246
            return;
247
        }
248
        # get our container, if one doesn't exist, make it
249
        my $container_name =C4::Context->config( 'database' );
250
        my $headers;
251
        eval {$headers = $sw->header_container(container_name => $container_name);};
252
        if ($@){
253
            # container doesn't exist
254
            eval {$headers = $sw->put_container(container_name => $container_name);};
255
            if ($@){
256
                # cant create a container bail out
257
                $self->{files}->{$filename}->{errcode} = 2; #not writable
258
                return;
259
            }
260
        }
261
        # We have a container we can write to, we need to write the file to tmp
262
        # Then put to the object store (as we buffer read the file)
263
        $self->{sw} = $sw;
264
        $self->{temporary} = 1;
265
    }
266
219
    if( $self->{files}->{$filename} &&
267
    if( $self->{files}->{$filename} &&
220
            $self->{files}->{$filename}->{errcode} ) {
268
            $self->{files}->{$filename}->{errcode} ) {
221
        #skip
269
        #skip
Lines 271-279 sub _done { Link Here
271
    $self->{done} = 1;
319
    $self->{done} = 1;
272
    foreach my $f ( keys %{ $self->{files} } ) {
320
    foreach my $f ( keys %{ $self->{files} } ) {
273
        my $fh = $self->_fh($f);
321
        my $fh = $self->_fh($f);
274
        $self->_register( $f, $fh? tell( $fh ): undef )
322
        my $size = undef;
323
        if ($fh){
324
            $size = tell($fh);
325
        }
326
        $self->_register( $f, $size )
275
            if !$self->{files}->{$f}->{errcode};
327
            if !$self->{files}->{$f}->{errcode};
276
        $fh->close if $fh;
328
        $fh->close if $fh;
329
        if ($self->{swift}){
330
            my $dir = $self->_dir;
331
            my $hashval = $self->{files}->{$f}->{hash};
332
            my $fn = $hashval. '_'. $f;
333
            open $fh, '<', "$dir/$fn";
334
            # put the file in the object store
335
            my $headers = $self->{sw}->put_object(container_name => C4::Context->config('database'),
336
            object_name => $f , content => $fh, content_length => $size);
337
            close $fh;
338
        }
277
    }
339
    }
278
}
340
}
279
341
280
- 

Return to bug 19795