CrashTest.pl
author Vincent Tondellier <tonton+hg@team1664.org>
Mon, 04 Aug 2014 14:52:24 +0200
changeset 32 3e776f1b21d4
parent 29 006e82a1bcd0
child 34 e0d6597078a5
permissions -rwxr-xr-x
Fix and improve atom/rss feed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
     1
#!/usr/bin/env perl
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
     2
12
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     3
# This program is free software: you can redistribute it and/or modify
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     4
# it under the terms of the GNU General Public License as published by
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     5
# the Free Software Foundation, either version 3 of the License, or
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     6
# (at your option) any later version.
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     7
#
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     8
# This program is distributed in the hope that it will be useful,
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
     9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
    10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
    11
# GNU General Public License for more details.
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
    12
#
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
    13
# You should have received a copy of the GNU General Public License
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
    14
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
c98d3fa4a948 Add licence
Vincent Tondellier <tonton+hg@team1664.org>
parents: 11
diff changeset
    15
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    16
use Mojolicious::Lite;
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    17
use UUID;
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    18
use Mojo::JSON;
16
76a5a48538e4 Use helper instead of using the full class name
Vincent Tondellier <tonton+hg@team1664.org>
parents: 12
diff changeset
    19
use Mojo::ByteStream 'b';
3
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    20
use Mojo::UserAgent;
11
0bef3b8087c1 Move filesystem access to lib/
Vincent Tondellier <tonton+hg@team1664.org>
parents: 6
diff changeset
    21
use lib 'lib';
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    22
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    23
my @valid_params = qw/Add-ons Distributor ProductName ReleaseChannel StartupTime UserID Version BuildID CrashTime Comments/;
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    24
my $config = plugin 'Config';
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    25
29
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    26
plugin 'TagHelpers::BootstrapPagination';
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    27
17
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    28
app->attr(storage => sub {
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    29
    my $self = shift;
24
b69b7aa98a1d Add basic SQL Storage
Vincent Tondellier <tonton+hg@team1664.org>
parents: 23
diff changeset
    30
    eval "require $config->{Storage}->{Type}" or die "Loading module failed $@";
19
300b902b5461 Reorganize config
Vincent Tondellier <tonton+hg@team1664.org>
parents: 17
diff changeset
    31
    return $config->{Storage}->{Type}->new($config->{Storage});
17
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    32
});
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    33
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    34
app->attr(decode_queue => sub {
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    35
    my $self = shift;
23
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
    36
    eval "require $config->{DecodeQueue}->{Type}" or die "Loading module failed $@";
19
300b902b5461 Reorganize config
Vincent Tondellier <tonton+hg@team1664.org>
parents: 17
diff changeset
    37
    return $config->{DecodeQueue}->{Type}->new($config->{DecodeQueue}, $config->{Dumper}, app->storage);
17
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
    38
});
3
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    39
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    40
helper scm_file_link => sub {
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    41
    my ($self, $file, $line) = @_;
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    42
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    43
    return "" unless(defined($file));
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    44
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    45
    if($file =~ qr{([a-z]+):([a-z/.]+):(.+):(\d+)})
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    46
    {
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    47
        my ($scm, $repo, $scmpath, $rev) = ($1, $2, $3, $4);
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    48
        my $filename = File::Spec->splitpath($scmpath);
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    49
        my $scmrepo = "$scm:$repo";
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    50
        if(exists($config->{ScmLinks}->{$scmrepo})) {
16
76a5a48538e4 Use helper instead of using the full class name
Vincent Tondellier <tonton+hg@team1664.org>
parents: 12
diff changeset
    51
            return b($self->link_to("$filename:$line" =>
11
0bef3b8087c1 Move filesystem access to lib/
Vincent Tondellier <tonton+hg@team1664.org>
parents: 6
diff changeset
    52
                    $self->render(inline => $config->{ScmLinks}->{$scmrepo},
0bef3b8087c1 Move filesystem access to lib/
Vincent Tondellier <tonton+hg@team1664.org>
parents: 6
diff changeset
    53
                        repo => $repo, scmpath => $scmpath, rev => $rev, line => $line, partial => 1)
3
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    54
                ));
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    55
        }
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    56
        #return $file;
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    57
    }
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    58
    my $filebase = (File::Spec->splitpath($file))[-1];
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    59
    if(defined($line) && $line ne "") {
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    60
        return "$filebase:$line";
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    61
    }
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    62
    return $filebase;
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    63
};
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    64
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    65
helper shorten_signature => sub {
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    66
    my ($self, $signature) = @_;
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    67
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    68
    return "" if(!defined($signature) || $signature eq "");
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    69
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    70
    my $short_signature = $signature;
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    71
    if($signature =~ qr{([^<]+)<.+>::([^()]+)\(.*\)(.*)}) {
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    72
        # c++ with template
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    73
        $short_signature = "$1<>::$2()$3";
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    74
    } elsif($signature =~ qr{([^()]+)\(.*\)(.*)}) {
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    75
        # c/c++
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    76
        $short_signature = "$1()$2";
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    77
    }
16
76a5a48538e4 Use helper instead of using the full class name
Vincent Tondellier <tonton+hg@team1664.org>
parents: 12
diff changeset
    78
    return b($self->t(span => (title => $signature, class => "shortened-signature") => $short_signature));
3
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    79
};
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
    80
32
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    81
helper xml_escape_block => sub {
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    82
    my ($c, $block) = @_;
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    83
    my $result = $block->();
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    84
    $result = xml_escape $result;
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    85
    return Mojo::ByteStream->new($result);
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    86
};
3e776f1b21d4 Fix and improve atom/rss feed
Vincent Tondellier <tonton+hg@team1664.org>
parents: 29
diff changeset
    87
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    88
get '/' => sub {
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    89
    my $self = shift;
29
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    90
    my $page = 1;
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    91
    $self->validation->required('page')->like(qr/^[0-9]+$/);
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    92
    $page = scalar $self->validation->param("page") if $self->validation->is_valid('page');
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    93
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    94
    my $result = $self->app->storage->index($page, 20);
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    95
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    96
    $self->stash(files => $result->{crashs});
006e82a1bcd0 Add pagination
Vincent Tondellier <tonton+hg@team1664.org>
parents: 24
diff changeset
    97
    $self->stash(pager => $result->{pager});
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    98
    $self->render('index');
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
    99
} => 'index';
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   100
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   101
get '/report/:uuid' => [ uuid => qr/[0-9a-fA-F-]+/ ] => sub {
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   102
    my $self = shift;
17
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
   103
    $self->stash(processed_data => $self->app->storage->get_processed_data($self->param('uuid')));
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   104
    $self->render('report/crash');
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   105
} => 'report';
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   106
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   107
post '/submit' => sub {
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   108
    my $self = shift;
3
2ff78fe4abda Create helper to shorten signatures and create links to the repository
Vincent Tondellier <tonton+hg@team1664.org>
parents: 1
diff changeset
   109
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   110
    # save the dump in a file
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   111
    my $file = $self->req->upload('upload_file_minidump');
17
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
   112
    my %paramshash = map { $_ => $self->req->param($_) } $self->req->param;
c91535b1db3e Move the decoding to a module, and had config to choose which module
Vincent Tondellier <tonton+hg@team1664.org>
parents: 16
diff changeset
   113
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   114
    my ($uuid, $uuidstr);
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   115
    UUID::generate($uuid);
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   116
    UUID::unparse($uuid, $uuidstr);
23
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   117
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   118
    $self->render_later();
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   119
23
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   120
    $self->app->decode_queue->decode($file, \%paramshash, $uuidstr, sub {
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   121
            my $pjson = shift;
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   122
            # reply
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   123
            $self->render(text => $pjson->{status});
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   124
        }
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   125
    );
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   126
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   127
};
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   128
23
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   129
app->secrets([
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   130
    'My secret passphrase here'
e621317229f7 Async submit.
Vincent Tondellier <tonton+hg@team1664.org>
parents: 19
diff changeset
   131
]);
24
b69b7aa98a1d Add basic SQL Storage
Vincent Tondellier <tonton+hg@team1664.org>
parents: 23
diff changeset
   132
b69b7aa98a1d Add basic SQL Storage
Vincent Tondellier <tonton+hg@team1664.org>
parents: 23
diff changeset
   133
push @{app->commands->namespaces}, 'CrashTest::Commands';
0
5b78b8c79d9c Initial commit
Vincent Tondellier <tonton+hg@team1664.org>
parents:
diff changeset
   134
app->start;