Luc Didry 8d6f10
package Lufi::Command::copyFilesToSwift;
Luc Didry 8d6f10
use Mojo::Base 'Mojolicious::Command';
Luc Didry 8d6f10
use File::Spec;
Luc Didry 8d6f10
use Term::ProgressBar;
Luc Didry 8d6f10
Luc Didry 8d6f10
has description => 'Copy files from filesystem to Swift object storage';
Luc Didry 8d6f10
has usage       => sub { shift->extract_usage };
Luc Didry 8d6f10
Luc Didry 8d6f10
sub run {
Luc Didry 8d6f10
    my $c = shift;
Luc Didry 8d6f10
Luc Didry 8d6f10
    if ($c->app->config('swift')) {
Luc Didry 8d6f10
        $c->app->check_swift_container();
Luc Didry 8d6f10
        my @dirs = glob(File::Spec->catdir($c->app->config('upload_dir'), '*'));
Luc Didry 8d6f10
Luc Didry 0b2ad4
        unless (scalar(@dirs)) {
Luc Didry 0b2ad4
            say sprintf('The configured upload_dir (%s) seems to be empty. Is `upload_dir` configured in lufi.conf?', $c->app->config('upload_dir'));
Luc Didry 0b2ad4
            exit 1;
Luc Didry 0b2ad4
        }
Luc Didry 8d6f10
        say sprintf('%d folders to upload to Swift (can\'t say how many files, or the total size, sorry). This can take some time.', scalar(@dirs));
Luc Didry 8d6f10
        print 'Do you want to continue? [Y/n] ';
Luc Didry 8d6f10
        my $confirm = <STDIN>;
Luc Didry 8d6f10
Luc Didry 8d6f10
        if ($confirm =~ m/yes|y/i) {
Luc Didry 8d6f10
            my $progress = Term::ProgressBar->new({ count => scalar(@dirs), ETA => 'linear', name => 'Copying to Swift'});
Luc Didry 8d6f10
            for my $dir (@dirs) {
Luc Didry 8d6f10
                my @files = glob(File::Spec->catfile($dir, '*'));
Luc Didry 8d6f10
                for my $file (@files) {
Luc Didry 8d6f10
                    my ($volume, $directories, $filename) = File::Spec->splitpath($file);
Luc Didry 8d6f10
                    my @file_dirs = File::Spec->splitdir($directories);
Luc Didry 8d6f10
                    my $short     = ($file_dirs[-1] ne '') ? $file_dirs[-1] : $file_dirs[-2];
Luc Didry 8d6f10
                    my $path      = File::Spec->catfile($short, $filename);
Luc Didry 8d6f10
Luc Didry 8d6f10
                    open my $fh, '<', $file or die sprintf('Unable to open file %s: %s', $file, $!);
Luc Didry 8d6f10
Luc Didry 8d6f10
                    $c->app->swift->put_object(
Luc Didry 8d6f10
                        container_name => $c->app->config('swift')->{container},
Luc Didry 8d6f10
                        object_name    => $path,
Luc Didry 8d6f10
                        content_length => -s $file,
Luc Didry 8d6f10
                        content        => $fh
Luc Didry 8d6f10
                    );
Luc Didry 8d6f10
                    close $fh;
Luc Didry 8d6f10
                }
Luc Didry 8d6f10
                $progress->update();
Luc Didry 8d6f10
            }
Luc Didry 8d6f10
            say sprintf('The copy to Swift object storage has ended. You can test Lufi, then delete `%s` directory', $c->app->config('upload_dir'));
Luc Didry 8d6f10
        } else {
Luc Didry 8d6f10
            say 'You want to stop. No problem.';
Luc Didry 8d6f10
        }
Luc Didry 8d6f10
    } else {
Luc Didry 8d6f10
        say 'You didn\'t configure `swift` in your config file. Exiting.';
Luc Didry 8d6f10
        exit 1;
Luc Didry 8d6f10
    }
Luc Didry 8d6f10
}
Luc Didry 8d6f10
Luc Didry 8d6f10
=encoding utf8
Luc Didry 8d6f10
Luc Didry 8d6f10
=head1 NAME
Luc Didry 8d6f10
Luc Didry 8d6f10
Lufi::Command::copyFilesToSwift Copy files from filesystem to Swift object storage
Luc Didry 8d6f10
Luc Didry 8d6f10
=head1 SYNOPSIS
Luc Didry 8d6f10
Luc Didry 8d6f10
  Usage: script/lufi copyFilesToSwift
Luc Didry 8d6f10
Luc Didry 8d6f10
  This command needs you to:
Luc Didry 8d6f10
    - set `upload_dir` in your config file (otherwise, it will use the default path, `files` to copy files from)
Luc Didry 8d6f10
    - configure `swift` with correct informations in your config file
Luc Didry 8d6f10
Luc Didry 8d6f10
=cut
Luc Didry 8d6f10
Luc Didry 8d6f10
1;