opener-webservice 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +135 -17
- data/lib/opener/webservice/configuration.rb +90 -0
- data/lib/opener/webservice/error_handler.rb +29 -0
- data/lib/opener/webservice/input_extractor.rb +43 -0
- data/lib/opener/webservice/input_sanitizer.rb +65 -0
- data/lib/opener/webservice/option_parser.rb +175 -0
- data/lib/opener/webservice/server.rb +297 -0
- data/lib/opener/webservice/uploader.rb +50 -0
- data/lib/opener/webservice/version.rb +4 -6
- data/lib/opener/webservice.rb +18 -417
- data/opener-webservice.gemspec +18 -10
- metadata +109 -5
- data/lib/opener/webservice/opt_parser.rb +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32302b9a2aac215c69670cd55e4c28d22901df9c
|
4
|
+
data.tar.gz: d24fb9f1fc3113ff70685bd1c2ce440eced844c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c96ce12b9449ee865ee208180fed338a7bdb9077741cecc23a618cd31fe499570a0fa750f905ca1f17ebebb09294a9a431fa83d7c43910a6890a83779c68285
|
7
|
+
data.tar.gz: 602204c799cca06cf486f1fb44c1f6d2ea2a8f53417916313a08e7e80a035ef2e6f4c2eb75f784ce0f3ac7389c121851b041ef8b7a628493f2e1aaec2334663a
|
data/README.md
CHANGED
@@ -1,29 +1,147 @@
|
|
1
|
-
# Opener
|
1
|
+
# Opener Webservice
|
2
2
|
|
3
|
-
|
3
|
+
This Gem makes it possible for OpeNER components to be used as a webservice.
|
4
|
+
Input can be passed directly or using an URL, the latter allows for greater data
|
5
|
+
sizes to be processed. Webservices can be chained together using callback URLs,
|
6
|
+
each passing its output to the next callback. Output can either be passed
|
7
|
+
directly, or as a URL pointing to a document in Amazon S3.
|
4
8
|
|
5
|
-
##
|
9
|
+
## Usage
|
6
10
|
|
7
|
-
|
11
|
+
Create an executable file `bin/<component>-server`, for example
|
12
|
+
`bin/language-identifier-server`, with the following content:
|
8
13
|
|
9
|
-
|
14
|
+
#!/usr/bin/env ruby
|
10
15
|
|
11
|
-
|
16
|
+
require 'opener/webservice'
|
12
17
|
|
13
|
-
|
18
|
+
parser = Opener::Webservice::OptionParser.new(
|
19
|
+
'opener-<component>',
|
20
|
+
File.expand_path('../../config.ru', __FILE__)
|
21
|
+
)
|
14
22
|
|
15
|
-
|
23
|
+
parser.run
|
16
24
|
|
17
|
-
|
25
|
+
Replace `<component>` with the name of the component. For example, for the
|
26
|
+
language identifier this would result in the following:
|
18
27
|
|
19
|
-
|
28
|
+
#!/usr/bin/env ruby
|
29
|
+
|
30
|
+
require 'opener/webservice'
|
31
|
+
|
32
|
+
parser = Opener::Webservice::OptionParser.new(
|
33
|
+
'opener-language-identifier',
|
34
|
+
File.expand_path('../../config.ru', __FILE__)
|
35
|
+
)
|
36
|
+
|
37
|
+
parser.run
|
38
|
+
|
39
|
+
Next, create a `config.ru` file in the root directory of the component. It
|
40
|
+
should have the following content:
|
41
|
+
|
42
|
+
require File.expand_path('../lib/opener/<component>', __FILE__)
|
43
|
+
require File.expand_path('../lib/opener/<component>/server', __FILE__)
|
44
|
+
|
45
|
+
run Opener::<constant>::Server
|
46
|
+
|
47
|
+
Replace `<component>` with the component name, replace `<constant>` with the
|
48
|
+
corresponding constant. For example, for the language identifier:
|
49
|
+
|
50
|
+
require File.expand_path('../lib/opener/language_identifier', __FILE__)
|
51
|
+
require File.expand_path('../lib/opener/language_identifier/server', __FILE__)
|
52
|
+
|
53
|
+
run Opener::LanguageIdentifier::Server
|
54
|
+
|
55
|
+
## Input
|
56
|
+
|
57
|
+
To submit data, send a POST request to the root URL of a webservice. The request
|
58
|
+
body can either be a set of POST fields, or a JSON object. In both cases the
|
59
|
+
following fields can be set:
|
60
|
+
|
61
|
+
* `input`: direct input to process
|
62
|
+
* `input_url`: a URL to a document to download and process
|
63
|
+
* `callbacks`: an array of callback URLs to send output to
|
64
|
+
* `error_callback`: a URL to send errors to
|
65
|
+
* `request_id`: a custom request ID/identifier to associate with the document
|
66
|
+
* `metadata`: an arbitrary metadata object to associate with a document, only
|
67
|
+
supported when using JSON input as POST fields can't represent key/values.
|
68
|
+
|
69
|
+
Any other parameters are ignored _but_ passed along to the next callback (if
|
70
|
+
any).
|
71
|
+
|
72
|
+
To use JSON input, set the `Content-Type` header to `application/json` when
|
73
|
+
submitting data.
|
74
|
+
|
75
|
+
If no callback URLs are specified the data is processed synchronously, the
|
76
|
+
response will be whatever output the underlying component returned (usually
|
77
|
+
KAF).
|
78
|
+
|
79
|
+
When using a callback URL the response will be a JSON object containing:
|
80
|
+
|
81
|
+
* `request_id`: the generated (or manually specified) request ID/identifier
|
82
|
+
* `output_url`: the URL that will contain the end output after all callbacks
|
83
|
+
have been processed
|
84
|
+
|
85
|
+
If an error occurs the output URL will _not_ contain the document, instead a
|
86
|
+
POST request is executed using the URL in the `error_callback` field. This URL
|
87
|
+
receives the following parameters:
|
88
|
+
|
89
|
+
* `request_id`: The ID of the request/document that failed
|
90
|
+
* `error`: the error message
|
91
|
+
|
92
|
+
## Requirements
|
93
|
+
|
94
|
+
* A supported Ruby version (see below)
|
95
|
+
* Amazon S3 (only when one wants to store ouput in S3)
|
96
|
+
|
97
|
+
The following Ruby versions are supported:
|
98
|
+
|
99
|
+
| Ruby | Required | Recommended |
|
100
|
+
|:---------|:--------------|:------------|
|
101
|
+
| MRI | >= 1.9.3 | >= 2.1.4 |
|
102
|
+
| Rubinius | >= 2.2 | >= 2.3.0 |
|
103
|
+
| JRuby | >= 1.7 | >= 1.7.16 |
|
104
|
+
|
105
|
+
Note that various components use JRuby, thus they won't work on MRI and
|
106
|
+
Rubinius.
|
107
|
+
|
108
|
+
## S3 Support
|
109
|
+
|
110
|
+
To enable storing of output on Amazon S3, specify the `--bucket` option when
|
111
|
+
running the CLI. Also make sure that the following environment variables are
|
112
|
+
set:
|
113
|
+
|
114
|
+
* `AWS_ACCESS_KEY_ID`
|
115
|
+
* `AWS_SECRET_ACCESS_KEY`
|
116
|
+
* `AWS_REGION`
|
117
|
+
|
118
|
+
If you're running this daemon on an EC2 instance then the first two environment
|
119
|
+
variables will be set automatically if the instance has an associated IAM
|
120
|
+
profile. The `AWS_REGION` variable must _always_ be set.
|
121
|
+
|
122
|
+
Output files are named `<identifier>.xml` where `<identifier>` is the unique
|
123
|
+
identifier of the document. The content type of these documents is set to
|
124
|
+
`application/xml`. Metadata associated with the job (as specified in the
|
125
|
+
`metadata` field) is saved as metadata of the S3 object.
|
126
|
+
|
127
|
+
The S3 URLs are only valid for a limited time (currently 1 hour) so callbacks
|
128
|
+
must ensure they can process the input within that time limit.
|
129
|
+
|
130
|
+
To use custom identifiers for documents, specify a unique value in the
|
131
|
+
`request_id` parameter when submitting data. Existing documents using the same
|
132
|
+
identifier will be _overwritten_, so make sure your identifiers are truly
|
133
|
+
unique. Default identifiers are generated using Ruby's `SecureRandom.hex`
|
134
|
+
method.
|
135
|
+
|
136
|
+
## Monitoring
|
20
137
|
|
21
|
-
|
138
|
+
Components using this Gem can measure performance using New Relic and report
|
139
|
+
errors using Rollbar. To support this the following two environment variables
|
140
|
+
must be set:
|
22
141
|
|
23
|
-
|
142
|
+
* `NEWRELIC_TOKEN`
|
143
|
+
* `ROLLBAR_TOKEN`
|
24
144
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
145
|
+
For New Relic the application names will be `opener-<component>` where
|
146
|
+
`<component>` is the component name, as defined by a component itself. If one of
|
147
|
+
these environment variables is not set the corresponding feature is disabled.
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Opener
|
2
|
+
module Webservice
|
3
|
+
##
|
4
|
+
# Module for storing global configuration settings such as whether or not to
|
5
|
+
# enable authentication.
|
6
|
+
#
|
7
|
+
module Configuration
|
8
|
+
##
|
9
|
+
# Returns `true` if authentication should be enabled.
|
10
|
+
#
|
11
|
+
# @return [TrueClass|FalseClass]
|
12
|
+
#
|
13
|
+
def self.authentication?
|
14
|
+
return !!authentication_endpoint && !authentication_endpoint.empty?
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Returns the authentication endpoint to use.
|
19
|
+
#
|
20
|
+
# @return [String]
|
21
|
+
#
|
22
|
+
def self.authentication_endpoint
|
23
|
+
return ENV['AUTHENTICATION_ENDPOINT']
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Returns the field name of the authentication secret.
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
#
|
31
|
+
def self.authentication_secret
|
32
|
+
return ENV['AUTHENTICATION_SECRET'] || 'secret'
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Returns the field name of the authentication token.
|
37
|
+
#
|
38
|
+
# @return [String]
|
39
|
+
#
|
40
|
+
def self.authentication_token
|
41
|
+
return ENV['AUTHENTICATION_TOKEN'] || 'token'
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Name of the S3 bucket to store output in.
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
#
|
49
|
+
def self.output_bucket
|
50
|
+
return ENV['OUTPUT_BUCKET']
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Returns `true` if Syslog should be enabled.
|
55
|
+
#
|
56
|
+
# @return [TrueClass|FalseClass]
|
57
|
+
#
|
58
|
+
def self.syslog?
|
59
|
+
return !!ENV['ENABLE_SYSLOG'] && !ENV['ENABLE_SYSLOG'].empty?
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Returns `true` if Rollbar error tracking should be enabled.
|
64
|
+
#
|
65
|
+
# @return [TrueClass|FalseClass]
|
66
|
+
#
|
67
|
+
def self.rollbar?
|
68
|
+
return !!ENV['ROLLBAR_TOKEN']
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Configures Rollbar.
|
73
|
+
#
|
74
|
+
def self.configure_rollbar
|
75
|
+
Rollbar.configure do |config|
|
76
|
+
config.access_token = ENV['ROLLBAR_TOKEN']
|
77
|
+
config.enabled = rollbar?
|
78
|
+
config.environment = environment
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# @return [String]
|
84
|
+
#
|
85
|
+
def self.environment
|
86
|
+
return ENV['RACK_ENV'] || ENV['RAILS_ENV']
|
87
|
+
end
|
88
|
+
end # Configuration
|
89
|
+
end # Webservice
|
90
|
+
end # Opener
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Opener
|
2
|
+
module Webservice
|
3
|
+
##
|
4
|
+
# Class for handling error messages that occur when processing a document.
|
5
|
+
#
|
6
|
+
# @!attribute [r] http
|
7
|
+
# @return [HTTPClient]
|
8
|
+
#
|
9
|
+
class ErrorHandler
|
10
|
+
attr_reader :http
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@http = HTTPClient.new
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# @param [StandardError] error
|
18
|
+
# @param [String] request_id
|
19
|
+
# @param [String] url
|
20
|
+
#
|
21
|
+
def submit(error, request_id, url)
|
22
|
+
http.post(
|
23
|
+
url,
|
24
|
+
:body => {:error => error.message, :request_id => request_id}
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end # ErrorHandler
|
28
|
+
end # Webservice
|
29
|
+
end # Opener
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Opener
|
2
|
+
module Webservice
|
3
|
+
##
|
4
|
+
# Extracts the KAF/text input to use from a set of input parameters.
|
5
|
+
#
|
6
|
+
# @!attribute [r] http
|
7
|
+
# @return [HTTPClient]
|
8
|
+
#
|
9
|
+
class InputExtractor
|
10
|
+
attr_reader :http
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@http = HTTPClient.new
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# @param [Hash] options
|
18
|
+
#
|
19
|
+
# @option options [String] input_url A URL to download input from.
|
20
|
+
# @option options [String] input The direct input to process.
|
21
|
+
#
|
22
|
+
# @return [String]
|
23
|
+
#
|
24
|
+
# @raise [RuntimeError] Raised when the input could not be downloaded.
|
25
|
+
#
|
26
|
+
def extract(options)
|
27
|
+
if options['input_url']
|
28
|
+
resp = http.get(options['input_url'], :follow_redirect => true)
|
29
|
+
|
30
|
+
unless resp.ok?
|
31
|
+
raise "Failed to download input from #{options['input_url']}"
|
32
|
+
end
|
33
|
+
|
34
|
+
input = resp.body
|
35
|
+
else
|
36
|
+
input = options['input']
|
37
|
+
end
|
38
|
+
|
39
|
+
return input
|
40
|
+
end
|
41
|
+
end # InputExtractor
|
42
|
+
end # Webservice
|
43
|
+
end # Opener
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Opener
|
2
|
+
module Webservice
|
3
|
+
##
|
4
|
+
# Sanitizes raw Sinatra input and component options.
|
5
|
+
#
|
6
|
+
class InputSanitizer
|
7
|
+
##
|
8
|
+
# Returns a Hash containing cleaned up pairs based on the input
|
9
|
+
# parameters. The keys of the returned Hash are String instances to
|
10
|
+
# prevent Symbol DOS attacks.
|
11
|
+
#
|
12
|
+
# @param [Hash] input
|
13
|
+
# @return [Hash]
|
14
|
+
#
|
15
|
+
def prepare_parameters(input)
|
16
|
+
sanitized = {}
|
17
|
+
|
18
|
+
input.each do |key, value|
|
19
|
+
# Sinatra/Rack uses "on" for checked checkboxes.
|
20
|
+
if value == 'true' or value == 'on'
|
21
|
+
value = true
|
22
|
+
elsif value == 'false'
|
23
|
+
value = false
|
24
|
+
end
|
25
|
+
|
26
|
+
sanitized[key.to_s] = value
|
27
|
+
end
|
28
|
+
|
29
|
+
# Strip empty callback URLs (= default form values).
|
30
|
+
if sanitized['callbacks']
|
31
|
+
sanitized['callbacks'].reject! { |url| url.nil? || url.empty? }
|
32
|
+
end
|
33
|
+
|
34
|
+
if sanitized['error_callback'] and sanitized['error_callback'].empty?
|
35
|
+
sanitized.delete('error_callback')
|
36
|
+
end
|
37
|
+
|
38
|
+
return sanitized
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Returns a Hash containing the whitelisted options to pass to a
|
43
|
+
# component. Since components use Symbols for their options this Hash uses
|
44
|
+
# Symbols for its keys.
|
45
|
+
#
|
46
|
+
# @param [Hash] input
|
47
|
+
# @param [Array] accepted The accepted parameter names.
|
48
|
+
# @return [Hash]
|
49
|
+
#
|
50
|
+
def whitelist_options(input, accepted)
|
51
|
+
whitelisted = {}
|
52
|
+
|
53
|
+
input.each do |key, value|
|
54
|
+
sym_key = key.to_sym
|
55
|
+
|
56
|
+
if accepted.include?(sym_key)
|
57
|
+
whitelisted[sym_key] = value
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
return whitelisted
|
62
|
+
end
|
63
|
+
end # InputSanitizer
|
64
|
+
end # Webservice
|
65
|
+
end # Opener
|
@@ -0,0 +1,175 @@
|
|
1
|
+
module Opener
|
2
|
+
module Webservice
|
3
|
+
##
|
4
|
+
# Slop wrapper for parsing webservice options and passing them to Puma.
|
5
|
+
#
|
6
|
+
# @!attribute [r] name
|
7
|
+
# The name of the component.
|
8
|
+
# @return [String]
|
9
|
+
#
|
10
|
+
# @!attribute [r] rackup
|
11
|
+
# Path to the config.ru to use.
|
12
|
+
# @return [String]
|
13
|
+
#
|
14
|
+
# @!attribute [r] parser
|
15
|
+
# @return [Slop]
|
16
|
+
#
|
17
|
+
class OptionParser
|
18
|
+
attr_reader :name, :rackup, :parser
|
19
|
+
|
20
|
+
##
|
21
|
+
# Mapping of environment variables and Slop options.
|
22
|
+
#
|
23
|
+
# @return [Hash]
|
24
|
+
#
|
25
|
+
ENV_OPTIONS = {
|
26
|
+
'OUTPUT_BUCKET' => :bucket,
|
27
|
+
'AUTHENTICATION_TOKEN' => :token,
|
28
|
+
'AUTHENTICATION_SECRET' => :secret,
|
29
|
+
'AUTHENTICATION_ENDPOINT' => :authentication
|
30
|
+
}
|
31
|
+
|
32
|
+
##
|
33
|
+
# @param [String] name
|
34
|
+
# @param [String] rackup
|
35
|
+
#
|
36
|
+
def initialize(name, rackup)
|
37
|
+
@name = name
|
38
|
+
@rackup = rackup
|
39
|
+
@parser = configure_slop
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse(*args)
|
43
|
+
parser.parse(*args)
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Parses the given CLI options and starts Puma.
|
48
|
+
#
|
49
|
+
# @param [Array] argv
|
50
|
+
#
|
51
|
+
def run(argv = ARGV)
|
52
|
+
parser.parse(argv)
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# @return [Slop]
|
57
|
+
#
|
58
|
+
def configure_slop
|
59
|
+
outer = self
|
60
|
+
server_name = "#{name}-server"
|
61
|
+
cli_name = server_name.gsub('opener-', '')
|
62
|
+
|
63
|
+
return Slop.new(:strict => false, :indent => 2) do
|
64
|
+
banner "Usage: #{cli_name} [RACKUP] [OPTIONS]"
|
65
|
+
|
66
|
+
separator <<-EOF.chomp
|
67
|
+
|
68
|
+
About:
|
69
|
+
|
70
|
+
Runs the OpeNER component as a webservice using Puma. For example:
|
71
|
+
|
72
|
+
language-identifier-server --daemon
|
73
|
+
|
74
|
+
This would start a language identifier server in the background.
|
75
|
+
|
76
|
+
Environment Variables:
|
77
|
+
|
78
|
+
These daemons make use of Amazon SQS queues and other Amazon services. In
|
79
|
+
order to use these services you should make sure the following environment
|
80
|
+
variables are set:
|
81
|
+
|
82
|
+
* AWS_ACCESS_KEY_ID
|
83
|
+
* AWS_SECRET_ACCESS_KEY
|
84
|
+
* AWS_REGION
|
85
|
+
|
86
|
+
If you're running this daemon on an EC2 instance then the first two
|
87
|
+
environment variables will be set automatically if the instance has an
|
88
|
+
associated IAM profile. The AWS_REGION variable must _always_ be set.
|
89
|
+
|
90
|
+
Optionally you can also set the following extra variables:
|
91
|
+
|
92
|
+
* NEWRELIC_TOKEN: when set the daemon will send profiling data to New Relic
|
93
|
+
using this token. The application name will be "#{server_name}".
|
94
|
+
|
95
|
+
* ROLLBAR_TOKEN: when set the daemon will report errors to Rollbar using
|
96
|
+
this token. You can freely use this in combination with NEWRELIC_TOKEN.
|
97
|
+
|
98
|
+
Puma Options:
|
99
|
+
|
100
|
+
This webserver uses Puma under the hood, but defines its own CLI options.
|
101
|
+
All unrecognized options are passed to the Puma CLI. For more information
|
102
|
+
on the available options for Puma, run `#{cli_name} --puma-help`.
|
103
|
+
EOF
|
104
|
+
|
105
|
+
separator "\nOptions:\n"
|
106
|
+
|
107
|
+
on :h, :help, 'Shows this help message' do
|
108
|
+
abort to_s
|
109
|
+
end
|
110
|
+
|
111
|
+
on :'puma-help', 'Shows the options of Puma' do
|
112
|
+
Puma::CLI.new(['--help']).run
|
113
|
+
|
114
|
+
abort
|
115
|
+
end
|
116
|
+
|
117
|
+
on :b=,
|
118
|
+
:bucket=,
|
119
|
+
'The S3 bucket to store output in',
|
120
|
+
:as => String
|
121
|
+
|
122
|
+
on :authentication=,
|
123
|
+
'An authentication endpoint to use',
|
124
|
+
:as => String
|
125
|
+
|
126
|
+
on :secret=,
|
127
|
+
'Parameter name for the authentication secret',
|
128
|
+
:as => String
|
129
|
+
|
130
|
+
on :token=,
|
131
|
+
'Parameter name for the authentication token',
|
132
|
+
:as => String
|
133
|
+
|
134
|
+
on :'disable-syslog', 'Disables Syslog logging (enabled by default)'
|
135
|
+
|
136
|
+
run do |opts, args|
|
137
|
+
puma_args = [outer.rackup] + args
|
138
|
+
|
139
|
+
ENV['APP_NAME'] = outer.name
|
140
|
+
ENV['APP_ROOT'] = File.expand_path('../../../../', __FILE__)
|
141
|
+
ENV['NRCONFIG'] = File.join(ENV['APP_ROOT'], 'config/newrelic.yml')
|
142
|
+
|
143
|
+
ENV_OPTIONS.each do |key, opt|
|
144
|
+
ENV[key] = opts[opt]
|
145
|
+
end
|
146
|
+
|
147
|
+
unless opts[:'disable-syslog']
|
148
|
+
ENV['ENABLE_SYSLOG'] = '1'
|
149
|
+
end
|
150
|
+
|
151
|
+
if !ENV['RAILS_ENV'] and ENV['RACK_ENV']
|
152
|
+
ENV['RAILS_ENV'] = ENV['RACK_ENV']
|
153
|
+
end
|
154
|
+
|
155
|
+
if ENV['NEWRELIC_TOKEN']
|
156
|
+
NewRelic::Control.instance.init_plugin
|
157
|
+
|
158
|
+
# Enable the GC profiler for New Relic.
|
159
|
+
GC::Profiler.enable
|
160
|
+
end
|
161
|
+
|
162
|
+
Configuration.configure_rollbar
|
163
|
+
|
164
|
+
# Puma on JRuby does some weird stuff with forking/exec. As a result
|
165
|
+
# of this we *have to* update ARGV as otherwise running Puma as a
|
166
|
+
# daemon does not work.
|
167
|
+
ARGV.replace(puma_args)
|
168
|
+
|
169
|
+
Puma::CLI.new(puma_args).run
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end # OptionParser
|
174
|
+
end # Webservice
|
175
|
+
end # Opener
|