summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Quantum.pm
blob: 1638f8c9ae47908bd4a4de239859a47591849005 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.

package Bugzilla::Quantum;
use Mojo::Base 'Mojolicious';

# Needed for its exit() overload, must happen early in execution.
use CGI::Compile;
use utf8;
use Encode;

use Bugzilla          ();
use Bugzilla::BugMail ();
use Bugzilla::CGI     ();
use Bugzilla::Constants qw(bz_locations);
use Bugzilla::Extension             ();
use Bugzilla::Install::Requirements ();
use Bugzilla::Logging;
use Bugzilla::Quantum::CGI;
use Bugzilla::Quantum::SES;
use Bugzilla::Quantum::Home;
use Bugzilla::Quantum::Static;
use Mojo::Loader qw( find_modules );
use Module::Runtime qw( require_module );
use Bugzilla::Util ();
use Cwd qw(realpath);
use MojoX::Log::Log4perl::Tiny;
use Bugzilla::WebService::Server::REST;

has 'static' => sub { Bugzilla::Quantum::Static->new };

sub startup {
  my ($self) = @_;

  DEBUG('Starting up');
  $self->plugin('Bugzilla::Quantum::Plugin::Glue');
  $self->plugin('Bugzilla::Quantum::Plugin::Hostage')
    unless $ENV{BUGZILLA_DISABLE_HOSTAGE};
  $self->plugin('Bugzilla::Quantum::Plugin::BlockIP');
  $self->plugin('Bugzilla::Quantum::Plugin::Helpers');

  # hypnotoad is weird and doesn't look for MOJO_LISTEN itself.
  $self->config(
    hypnotoad => {
      proxy              => $ENV{MOJO_REVERSE_PROXY} // 1,
      heartbeat_interval => $ENV{MOJO_HEARTBEAT_INTERVAL} // 10,
      heartbeat_timeout  => $ENV{MOJO_HEARTBEAT_TIMEOUT} // 120,
      inactivity_timeout => $ENV{MOJO_INACTIVITY_TIMEOUT} // 120,
      workers            => $ENV{MOJO_WORKERS} // 15,
      clients            => $ENV{MOJO_CLIENTS} // 10,
      spare              => $ENV{MOJO_SPARE} // 5,
      listen             => [$ENV{MOJO_LISTEN} // 'http://*:3000'],
    },
  );

  # Make sure each httpd child receives a different random seed (bug 476622).
  # Bugzilla::RNG has one srand that needs to be called for
  # every process, and Perl has another. (Various Perl modules still use
  # the built-in rand(), even though we never use it in Bugzilla itself,
  # so we need to srand() both of them.)
  # Also, ping the dbh to force a reconnection.
  Mojo::IOLoop->next_tick(sub {
    Bugzilla::RNG::srand();
    srand();
    eval { Bugzilla->dbh->ping };
  });

  Bugzilla::Extension->load_all();
  if ($self->mode ne 'development') {
    Bugzilla->preload_features();
    DEBUG('preloading templates');
    Bugzilla->preload_templates();
    DEBUG('done preloading templates');
    require_module($_) for find_modules('Bugzilla::User::Setting');

    $self->hook(
      after_static => sub {
        my ($c) = @_;
        $c->res->headers->cache_control('public, max-age=31536000');
      }
    );
  }
  Bugzilla::WebService::Server::REST->preload;

  $self->setup_routes;

  Bugzilla::Hook::process('app_startup', {app => $self});
}

sub setup_routes {
  my ($self) = @_;

  my $r = $self->routes;
  Bugzilla::Quantum::CGI->load_all($r);
  Bugzilla::Quantum::CGI->load_one('bzapi_cgi', 'extensions/BzAPI/bin/rest.cgi');

  $r->get('/home')->to('Home#index');
  $r->any('/')->to('CGI#index_cgi');
  $r->any('/bug/<id:num>')->to('CGI#show_bug_cgi');
  $r->any('/<id:num>')->to('CGI#show_bug_cgi');
  $r->get(
    '/testagent.cgi' => sub {
      my $c = shift;
      $c->render(text => "OK Mojolicious");
    }
  );

  $r->any('/rest')->to('CGI#rest_cgi');
  $r->any('/rest.cgi/*PATH_INFO')->to('CGI#rest_cgi' => {PATH_INFO => ''});
  $r->any('/rest/*PATH_INFO')->to('CGI#rest_cgi' => {PATH_INFO => ''});
  $r->any('/extensions/BzAPI/bin/rest.cgi/*PATH_INFO')->to('CGI#bzapi_cgi');
  $r->any('/latest/*PATH_INFO')->to('CGI#bzapi_cgi');
  $r->any('/bzapi/*PATH_INFO')->to('CGI#bzapi_cgi');

  $r->static_file('/__lbheartbeat__');
  $r->static_file(
    '/__version__' => {file => 'version.json', content_type => 'application/json'});
  $r->static_file('/version.json', {content_type => 'application/json'});

  $r->page('/review',        'splinter.html');
  $r->page('/user_profile',  'user_profile.html');
  $r->page('/userprofile',   'user_profile.html');
  $r->page('/request_defer', 'request_defer.html');

  $r->get('/__heartbeat__')->to('CGI#heartbeat_cgi');
  $r->get('/robots.txt')->to('CGI#robots_cgi');
  $r->any('/login')->to('CGI#index_cgi' => {'GoAheadAndLogIn' => '1'});
  $r->any('/:new_bug' => [new_bug => qr{new[-_]bug}])->to('CGI#new_bug_cgi');

  my $ses_auth = $r->under(
    '/ses' => sub {
      my ($c) = @_;
      my $lc = Bugzilla->localconfig;

      return $c->basic_auth('SES', $lc->{ses_username}, $lc->{ses_password});
    }
  );
  $ses_auth->any('/index.cgi')->to('SES#main');
}

1;