passenger 5.3.4 → 5.3.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +13 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/build/cxx_tests.rb +12 -1
- data/build/misc.rb +2 -1
- data/build/packaging.rb +2 -0
- data/build/support/cplusplus.rb +2 -2
- data/build/support/cxx_dependency_map.rb +653 -383
- data/dev/configkit-schemas/index.json +105 -3
- data/dev/show-latest-crashlog-dir +27 -0
- data/resources/templates/standalone/http.erb +2 -0
- data/src/agent/Core/AdminPanelConnector.h +2 -2
- data/src/agent/Core/ApplicationPool/Context.h +5 -1
- data/src/agent/Core/ApplicationPool/Group.h +2 -0
- data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +2 -1
- data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
- data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +12 -19
- data/src/agent/Core/ApplicationPool/Options.h +35 -31
- data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +2 -1
- data/src/agent/Core/ApplicationPool/Socket.h +1 -1
- data/src/agent/Core/Config.h +38 -7
- data/src/agent/Core/ConfigChange.cpp +13 -1
- data/src/agent/Core/Controller.h +3 -1
- data/src/agent/Core/Controller/Config.h +14 -11
- data/src/agent/Core/Controller/InitRequest.cpp +6 -5
- data/src/agent/Core/Controller/InitializationAndShutdown.cpp +3 -0
- data/src/agent/Core/CoreMain.cpp +149 -34
- data/src/agent/Core/OptionParser.h +12 -1
- data/src/agent/Core/SpawningKit/Config.h +1 -1
- data/src/agent/Core/SpawningKit/Context.h +7 -1
- data/src/agent/Core/SpawningKit/Exceptions.h +15 -12
- data/src/agent/Core/SpawningKit/README.md +34 -17
- data/src/agent/Core/SpawningKit/Spawner.h +5 -3
- data/src/agent/Core/SpawningKit/UserSwitchingRules.h +5 -2
- data/src/agent/Core/TelemetryCollector.h +674 -0
- data/src/agent/Shared/Fundamentals/AbortHandler.cpp +309 -83
- data/src/agent/Shared/Fundamentals/AbortHandler.h +18 -3
- data/src/agent/Watchdog/Config.h +21 -4
- data/src/agent/Watchdog/WatchdogMain.cpp +4 -1
- data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +10 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +5 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +30 -0
- data/src/apache2_module/DirectoryMapper.h +24 -36
- data/src/apache2_module/Hooks.cpp +13 -5
- data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +20 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +24 -0
- data/src/cxx_supportlib/AppTypeDetector/CBindings.cpp +136 -0
- data/src/cxx_supportlib/AppTypeDetector/CBindings.h +73 -0
- data/src/cxx_supportlib/{AppTypes.h → AppTypeDetector/Detector.h} +59 -132
- data/src/cxx_supportlib/ConfigKit/README.md +90 -2
- data/src/cxx_supportlib/ConfigKit/Schema.h +58 -13
- data/src/cxx_supportlib/ConfigKit/Store.h +128 -4
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/ProcessManagement/Ruby.cpp +3 -3
- data/src/cxx_supportlib/ProcessManagement/Ruby.h +7 -2
- data/src/cxx_supportlib/ProcessManagement/Spawn.cpp +14 -7
- data/src/cxx_supportlib/ProcessManagement/Spawn.h +21 -2
- data/src/cxx_supportlib/ResourceLocator.h +1 -1
- data/src/cxx_supportlib/ServerKit/ClientRef.h +17 -7
- data/src/cxx_supportlib/ServerKit/HttpRequestRef.h +17 -7
- data/src/cxx_supportlib/Utils/IOUtils.cpp +2 -1
- data/src/cxx_supportlib/Utils/ProcessMetricsCollector.h +9 -6
- data/src/cxx_supportlib/WrapperRegistry/CBindings.cpp +85 -0
- data/src/cxx_supportlib/WrapperRegistry/CBindings.h +56 -0
- data/src/cxx_supportlib/WrapperRegistry/Entry.h +112 -0
- data/src/cxx_supportlib/WrapperRegistry/README.md +37 -0
- data/src/cxx_supportlib/WrapperRegistry/Registry.h +309 -0
- data/src/helper-scripts/download_binaries/extconf.rb +6 -2
- data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +16 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +6 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +24 -0
- data/src/nginx_module/ContentHandler.c +34 -13
- data/src/nginx_module/ContentHandler.h +3 -3
- data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +11 -0
- data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +23 -0
- data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +8 -0
- data/src/nginx_module/config +2 -1
- data/src/nginx_module/ngx_http_passenger_module.c +9 -3
- data/src/nginx_module/ngx_http_passenger_module.h +4 -2
- data/src/ruby_supportlib/phusion_passenger.rb +2 -1
- data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +13 -0
- data/src/ruby_supportlib/phusion_passenger/common_library.rb +8 -5
- data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +6 -2
- data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +6 -2
- data/src/ruby_supportlib/phusion_passenger/native_support.rb +7 -3
- data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +15 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +11 -1
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +3 -1
- metadata +12 -4
- data/src/cxx_supportlib/AppTypes.cpp +0 -109
@@ -293,7 +293,7 @@
|
|
293
293
|
"type" : "unsigned integer"
|
294
294
|
},
|
295
295
|
"server_software" : {
|
296
|
-
"default_value" : "Phusion_Passenger/5.3.
|
296
|
+
"default_value" : "Phusion_Passenger/5.3.5",
|
297
297
|
"has_default_value" : "static",
|
298
298
|
"type" : "string"
|
299
299
|
},
|
@@ -795,7 +795,7 @@
|
|
795
795
|
"type" : "string"
|
796
796
|
},
|
797
797
|
"server_software" : {
|
798
|
-
"default_value" : "Phusion_Passenger/5.3.
|
798
|
+
"default_value" : "Phusion_Passenger/5.3.5",
|
799
799
|
"has_default_value" : "static",
|
800
800
|
"type" : "string"
|
801
801
|
},
|
@@ -826,6 +826,57 @@
|
|
826
826
|
"has_default_value" : "static",
|
827
827
|
"type" : "unsigned integer"
|
828
828
|
},
|
829
|
+
"telemetry_collector_ca_certificate_path" : {
|
830
|
+
"type" : "string"
|
831
|
+
},
|
832
|
+
"telemetry_collector_debug_curl" : {
|
833
|
+
"default_value" : false,
|
834
|
+
"has_default_value" : "static",
|
835
|
+
"type" : "boolean"
|
836
|
+
},
|
837
|
+
"telemetry_collector_disabled" : {
|
838
|
+
"default_value" : false,
|
839
|
+
"has_default_value" : "static",
|
840
|
+
"type" : "boolean"
|
841
|
+
},
|
842
|
+
"telemetry_collector_final_run_timeout" : {
|
843
|
+
"default_value" : 5,
|
844
|
+
"has_default_value" : "static",
|
845
|
+
"type" : "unsigned integer"
|
846
|
+
},
|
847
|
+
"telemetry_collector_first_interval" : {
|
848
|
+
"default_value" : 7200,
|
849
|
+
"has_default_value" : "static",
|
850
|
+
"type" : "unsigned integer"
|
851
|
+
},
|
852
|
+
"telemetry_collector_interval" : {
|
853
|
+
"default_value" : 21600,
|
854
|
+
"has_default_value" : "static",
|
855
|
+
"type" : "unsigned integer"
|
856
|
+
},
|
857
|
+
"telemetry_collector_interval_jitter" : {
|
858
|
+
"default_value" : 7200,
|
859
|
+
"has_default_value" : "static",
|
860
|
+
"type" : "unsigned integer"
|
861
|
+
},
|
862
|
+
"telemetry_collector_proxy_url" : {
|
863
|
+
"type" : "string"
|
864
|
+
},
|
865
|
+
"telemetry_collector_timeout" : {
|
866
|
+
"default_value" : 180,
|
867
|
+
"has_default_value" : "static",
|
868
|
+
"type" : "unsigned integer"
|
869
|
+
},
|
870
|
+
"telemetry_collector_url" : {
|
871
|
+
"default_value" : "https://anontelemetry.phusionpassenger.com/v1/collect.json",
|
872
|
+
"has_default_value" : "static",
|
873
|
+
"type" : "string"
|
874
|
+
},
|
875
|
+
"telemetry_collector_verify_server" : {
|
876
|
+
"default_value" : true,
|
877
|
+
"has_default_value" : "static",
|
878
|
+
"type" : "boolean"
|
879
|
+
},
|
829
880
|
"turbocaching" : {
|
830
881
|
"default_value" : true,
|
831
882
|
"has_default_value" : "static",
|
@@ -1517,7 +1568,7 @@
|
|
1517
1568
|
"type" : "string"
|
1518
1569
|
},
|
1519
1570
|
"server_software" : {
|
1520
|
-
"default_value" : "Phusion_Passenger/5.3.
|
1571
|
+
"default_value" : "Phusion_Passenger/5.3.5",
|
1521
1572
|
"has_default_value" : "static",
|
1522
1573
|
"type" : "string"
|
1523
1574
|
},
|
@@ -1556,6 +1607,57 @@
|
|
1556
1607
|
"has_default_value" : "static",
|
1557
1608
|
"type" : "unsigned integer"
|
1558
1609
|
},
|
1610
|
+
"telemetry_collector_ca_certificate_path" : {
|
1611
|
+
"type" : "string"
|
1612
|
+
},
|
1613
|
+
"telemetry_collector_debug_curl" : {
|
1614
|
+
"default_value" : false,
|
1615
|
+
"has_default_value" : "static",
|
1616
|
+
"type" : "boolean"
|
1617
|
+
},
|
1618
|
+
"telemetry_collector_disabled" : {
|
1619
|
+
"default_value" : false,
|
1620
|
+
"has_default_value" : "static",
|
1621
|
+
"type" : "boolean"
|
1622
|
+
},
|
1623
|
+
"telemetry_collector_final_run_timeout" : {
|
1624
|
+
"default_value" : 5,
|
1625
|
+
"has_default_value" : "static",
|
1626
|
+
"type" : "unsigned integer"
|
1627
|
+
},
|
1628
|
+
"telemetry_collector_first_interval" : {
|
1629
|
+
"default_value" : 7200,
|
1630
|
+
"has_default_value" : "static",
|
1631
|
+
"type" : "unsigned integer"
|
1632
|
+
},
|
1633
|
+
"telemetry_collector_interval" : {
|
1634
|
+
"default_value" : 21600,
|
1635
|
+
"has_default_value" : "static",
|
1636
|
+
"type" : "unsigned integer"
|
1637
|
+
},
|
1638
|
+
"telemetry_collector_interval_jitter" : {
|
1639
|
+
"default_value" : 7200,
|
1640
|
+
"has_default_value" : "static",
|
1641
|
+
"type" : "unsigned integer"
|
1642
|
+
},
|
1643
|
+
"telemetry_collector_proxy_url" : {
|
1644
|
+
"type" : "string"
|
1645
|
+
},
|
1646
|
+
"telemetry_collector_timeout" : {
|
1647
|
+
"default_value" : 180,
|
1648
|
+
"has_default_value" : "static",
|
1649
|
+
"type" : "unsigned integer"
|
1650
|
+
},
|
1651
|
+
"telemetry_collector_url" : {
|
1652
|
+
"default_value" : "https://anontelemetry.phusionpassenger.com/v1/collect.json",
|
1653
|
+
"has_default_value" : "static",
|
1654
|
+
"type" : "string"
|
1655
|
+
},
|
1656
|
+
"telemetry_collector_verify_server" : {
|
1657
|
+
"default_value" : true,
|
1658
|
+
"has_default_value" : "static",
|
1659
|
+
"type" : "boolean"
|
1660
|
+
},
|
1559
1661
|
"turbocaching" : {
|
1560
1662
|
"default_value" : true,
|
1561
1663
|
"has_default_value" : "static",
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Finds the latest Passenger crash log directory and prints its path.
|
3
|
+
# This tool is meant to make it easy to analyze local Passenger crash
|
4
|
+
# logs during debugging sessions. Instead of searching for the crash
|
5
|
+
# log directory path in the output and then copy-pasting that to the
|
6
|
+
# terminal, one can simply invoke one shell command:
|
7
|
+
#
|
8
|
+
# less $(./dev/show-latest-crashlog-dir)/backtrace.log
|
9
|
+
#
|
10
|
+
# This will open the latest crash log's backtrace.log in 'less'.
|
11
|
+
|
12
|
+
def parse_path(path)
|
13
|
+
File.basename(path).split('.')[1].to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
def main
|
17
|
+
dirs = Dir["/var/tmp/passenger-crash-log.*.*"].sort do |a, b|
|
18
|
+
parse_path(a) <=> parse_path(b)
|
19
|
+
end
|
20
|
+
if dirs.empty?
|
21
|
+
abort "No /var/tmp/passenger-crash-log.* directories found."
|
22
|
+
else
|
23
|
+
puts dirs.last
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
main
|
@@ -34,6 +34,8 @@ passenger_user_switching off;
|
|
34
34
|
<%= nginx_http_option(:instance_registry_dir) %>
|
35
35
|
<%= nginx_http_option(:disable_security_update_check) %>
|
36
36
|
<%= nginx_http_option(:security_update_check_proxy) %>
|
37
|
+
<%= nginx_http_option(:disable_anonymous_telemetry) %>
|
38
|
+
<%= nginx_http_option(:anonymous_telemetry_proxy) %>
|
37
39
|
<%= nginx_http_option(:data_buffer_dir) %>
|
38
40
|
<%= nginx_http_option(:core_file_descriptor_ulimit) %>
|
39
41
|
<%= nginx_http_option(:admin_panel_url) %>
|
@@ -193,7 +193,7 @@ private:
|
|
193
193
|
args.push_back("system-properties");
|
194
194
|
|
195
195
|
int status = 0;
|
196
|
-
|
196
|
+
SubprocessOutput output;
|
197
197
|
try {
|
198
198
|
runInternalRubyTool(*resourceLocator, ruby, args, &status, &output);
|
199
199
|
} catch (const std::exception &e) {
|
@@ -206,7 +206,7 @@ private:
|
|
206
206
|
|
207
207
|
server.getIoService().post(boost::bind(
|
208
208
|
&AdminPanelConnector::onGetServerPropertiesDone, this,
|
209
|
-
conn, doc, output, status, string()
|
209
|
+
conn, doc, output.data, status, string()
|
210
210
|
));
|
211
211
|
}
|
212
212
|
|
@@ -86,10 +86,14 @@ public:
|
|
86
86
|
return spawningKitFactory->getContext();
|
87
87
|
}
|
88
88
|
|
89
|
-
ResourceLocator *getResourceLocator() const {
|
89
|
+
const ResourceLocator *getResourceLocator() const {
|
90
90
|
return getSpawningKitContext()->resourceLocator;
|
91
91
|
}
|
92
92
|
|
93
|
+
const WrapperRegistry::Registry *getWrapperRegistry() const {
|
94
|
+
return getSpawningKitContext()->wrapperRegistry;
|
95
|
+
}
|
96
|
+
|
93
97
|
const RandomGeneratorPtr &getRandomGenerator() const {
|
94
98
|
return getSpawningKitContext()->randomGenerator;
|
95
99
|
}
|
@@ -46,6 +46,7 @@
|
|
46
46
|
#include <cassert>
|
47
47
|
#include <SmallVector.h>
|
48
48
|
#include <MemoryKit/palloc.h>
|
49
|
+
#include <WrapperRegistry/Registry.h>
|
49
50
|
#include <Hooks.h>
|
50
51
|
#include <Utils.h>
|
51
52
|
#include <Core/ApplicationPool/Common.h>
|
@@ -438,6 +439,7 @@ public:
|
|
438
439
|
Context *getContext() const;
|
439
440
|
psg_pool_t *getPallocPool() const;
|
440
441
|
const ResourceLocator &getResourceLocator() const;
|
442
|
+
const WrapperRegistry::Registry &getWrapperRegistry() const;
|
441
443
|
|
442
444
|
/****** Session management ******/
|
443
445
|
|
@@ -99,6 +99,11 @@ Group::getResourceLocator() const {
|
|
99
99
|
return *getPool()->getSpawningKitContext()->resourceLocator;
|
100
100
|
}
|
101
101
|
|
102
|
+
const WrapperRegistry::Registry &
|
103
|
+
Group::getWrapperRegistry() const {
|
104
|
+
return *getPool()->getSpawningKitContext()->wrapperRegistry;
|
105
|
+
}
|
106
|
+
|
102
107
|
|
103
108
|
} // namespace ApplicationPool2
|
104
109
|
} // namespace Passenger
|
@@ -53,7 +53,8 @@ Group::cleanupSpawner(boost::container::vector<Callback> &postLockActions) {
|
|
53
53
|
|
54
54
|
bool
|
55
55
|
Group::authorizeByUid(uid_t uid) const {
|
56
|
-
return uid == 0 || SpawningKit::prepareUserSwitching(options
|
56
|
+
return uid == 0 || SpawningKit::prepareUserSwitching(options,
|
57
|
+
getWrapperRegistry()).uid == uid;
|
57
58
|
}
|
58
59
|
|
59
60
|
bool
|
@@ -153,7 +153,7 @@ Group::addProcessToList(const ProcessPtr &process, ProcessList &destination) {
|
|
153
153
|
assert(process->isAlive());
|
154
154
|
process->enabled = Process::DETACHED;
|
155
155
|
|
156
|
-
if (!this->options.abortWebsocketsOnProcessShutdown && this->options.appType == P_STATIC_STRING("
|
156
|
+
if (!this->options.abortWebsocketsOnProcessShutdown && this->options.appType == P_STATIC_STRING("nodejs")) {
|
157
157
|
// When Passenger is not allowed to abort websockets the application needs a way to know graceful shutdown
|
158
158
|
// is in progress. The solution for the most common use (Node.js) is to send a SIGINT. This is the general
|
159
159
|
// termination signal for Node; later versions of pm2 also use it (with a 1.6 sec grace period, Passenger just waits)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2011-
|
3
|
+
* Copyright (c) 2011-2018 Phusion Holding B.V.
|
4
4
|
*
|
5
5
|
* "Passenger", "Phusion Passenger" and "Union Station" are registered
|
6
6
|
* trademarks of Phusion Holding B.V.
|
@@ -162,14 +162,15 @@ Group::inspectXml(std::ostream &stream, bool includeSecrets) const {
|
|
162
162
|
P_BUG("Unknown 'lifeStatus' state " << lifeStatus);
|
163
163
|
}
|
164
164
|
|
165
|
-
SpawningKit::UserSwitchingInfo usInfo(SpawningKit::prepareUserSwitching(options
|
165
|
+
SpawningKit::UserSwitchingInfo usInfo(SpawningKit::prepareUserSwitching(options,
|
166
|
+
getWrapperRegistry()));
|
166
167
|
stream << "<user>" << escapeForXml(usInfo.username) << "</user>";
|
167
168
|
stream << "<uid>" << usInfo.uid << "</uid>";
|
168
169
|
stream << "<group>" << escapeForXml(usInfo.groupname) << "</group>";
|
169
170
|
stream << "<gid>" << usInfo.gid << "</gid>";
|
170
171
|
|
171
172
|
stream << "<options>";
|
172
|
-
options.toXml(stream, getResourceLocator());
|
173
|
+
options.toXml(stream, getResourceLocator(), getWrapperRegistry());
|
173
174
|
stream << "</options>";
|
174
175
|
|
175
176
|
stream << "<processes>";
|
@@ -201,22 +202,14 @@ Group::inspectXml(std::ostream &stream, bool includeSecrets) const {
|
|
201
202
|
void
|
202
203
|
Group::inspectPropertiesInAdminPanelFormat(Json::Value &result) const {
|
203
204
|
result["path"] = absolutizePath(options.appRoot);
|
204
|
-
result["startup_file"] = absolutizePath(options.getStartupFile(
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
result["type"] = "nodejs";
|
213
|
-
} else if (options.appType == "meteor") {
|
214
|
-
result["type"] = "meteor";
|
215
|
-
} else {
|
216
|
-
result["type"] = "generic";
|
217
|
-
}
|
218
|
-
|
219
|
-
SpawningKit::UserSwitchingInfo usInfo(SpawningKit::prepareUserSwitching(options));
|
205
|
+
result["startup_file"] = absolutizePath(options.getStartupFile(getWrapperRegistry()),
|
206
|
+
absolutizePath(options.appRoot));
|
207
|
+
result["start_command"] = options.getStartCommand(getResourceLocator(),
|
208
|
+
getWrapperRegistry());
|
209
|
+
result["type"] = getWrapperRegistry().lookup(options.appType).language.toString();
|
210
|
+
|
211
|
+
SpawningKit::UserSwitchingInfo usInfo(SpawningKit::prepareUserSwitching(options,
|
212
|
+
getWrapperRegistry()));
|
220
213
|
result["user"]["username"] = usInfo.username;
|
221
214
|
result["user"]["uid"] = (Json::Int) usInfo.uid;
|
222
215
|
result["group"]["groupname"] = usInfo.groupname;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2010-
|
3
|
+
* Copyright (c) 2010-2018 Phusion Holding B.V.
|
4
4
|
*
|
5
5
|
* "Passenger", "Phusion Passenger" and "Union Station" are registered
|
6
6
|
* trademarks of Phusion Holding B.V.
|
@@ -30,7 +30,7 @@
|
|
30
30
|
#include <vector>
|
31
31
|
#include <utility>
|
32
32
|
#include <boost/shared_array.hpp>
|
33
|
-
#include <
|
33
|
+
#include <WrapperRegistry/Registry.h>
|
34
34
|
#include <DataStructures/HashedStaticString.h>
|
35
35
|
#include <Constants.h>
|
36
36
|
#include <ResourceLocator.h>
|
@@ -545,16 +545,16 @@ public:
|
|
545
545
|
* the `elements` argument.
|
546
546
|
*/
|
547
547
|
void toVector(vector<string> &vec, const ResourceLocator &resourceLocator,
|
548
|
-
int fields = ALL_OPTIONS) const
|
548
|
+
const WrapperRegistry::Registry &wrapperRegistry, int fields = ALL_OPTIONS) const
|
549
549
|
{
|
550
550
|
if (fields & SPAWN_OPTIONS) {
|
551
551
|
appendKeyValue (vec, "app_root", appRoot);
|
552
552
|
appendKeyValue (vec, "app_group_name", getAppGroupName());
|
553
553
|
appendKeyValue (vec, "app_type", appType);
|
554
554
|
appendKeyValue (vec, "app_log_file", appLogFile);
|
555
|
-
appendKeyValue (vec, "start_command", getStartCommand(resourceLocator));
|
556
|
-
appendKeyValue (vec, "startup_file", absolutizePath(getStartupFile(), absolutizePath(appRoot)));
|
557
|
-
appendKeyValue (vec, "process_title", getProcessTitle());
|
555
|
+
appendKeyValue (vec, "start_command", getStartCommand(resourceLocator, wrapperRegistry));
|
556
|
+
appendKeyValue (vec, "startup_file", absolutizePath(getStartupFile(wrapperRegistry), absolutizePath(appRoot)));
|
557
|
+
appendKeyValue (vec, "process_title", getProcessTitle(wrapperRegistry));
|
558
558
|
appendKeyValue2(vec, "log_level", logLevel);
|
559
559
|
appendKeyValue3(vec, "start_timeout", startTimeout);
|
560
560
|
appendKeyValue (vec, "environment", environment);
|
@@ -589,12 +589,12 @@ public:
|
|
589
589
|
|
590
590
|
template<typename Stream>
|
591
591
|
void toXml(Stream &stream, const ResourceLocator &resourceLocator,
|
592
|
-
int fields = ALL_OPTIONS) const
|
592
|
+
const WrapperRegistry::Registry &wrapperRegistry, int fields = ALL_OPTIONS) const
|
593
593
|
{
|
594
594
|
vector<string> args;
|
595
595
|
unsigned int i;
|
596
596
|
|
597
|
-
toVector(args, resourceLocator, fields);
|
597
|
+
toVector(args, resourceLocator, wrapperRegistry, fields);
|
598
598
|
for (i = 0; i < args.size(); i += 2) {
|
599
599
|
stream << "<" << args[i] << ">";
|
600
600
|
stream << escapeForXml(args[i + 1]);
|
@@ -614,43 +614,47 @@ public:
|
|
614
614
|
}
|
615
615
|
}
|
616
616
|
|
617
|
-
string getStartCommand(const ResourceLocator &resourceLocator
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
} else if (
|
628
|
-
|
629
|
-
|
617
|
+
string getStartCommand(const ResourceLocator &resourceLocator,
|
618
|
+
const WrapperRegistry::Registry &wrapperRegistry) const
|
619
|
+
{
|
620
|
+
const WrapperRegistry::Entry &entry = wrapperRegistry.lookup(appType);
|
621
|
+
|
622
|
+
string interpreter;
|
623
|
+
if (entry.language == P_STATIC_STRING("ruby")) {
|
624
|
+
interpreter = escapeShell(ruby);
|
625
|
+
} else if (entry.language == P_STATIC_STRING("python")) {
|
626
|
+
interpreter = escapeShell(python);
|
627
|
+
} else if (entry.language == P_STATIC_STRING("nodejs")) {
|
628
|
+
interpreter = escapeShell(nodejs);
|
629
|
+
} else if (entry.language == P_STATIC_STRING("meteor")) {
|
630
|
+
interpreter = escapeShell(ruby);
|
630
631
|
} else {
|
631
632
|
return startCommand;
|
632
633
|
}
|
634
|
+
|
635
|
+
return interpreter + " " + escapeShell(resourceLocator.getHelperScriptsDir()
|
636
|
+
+ "/" + entry.path);
|
633
637
|
}
|
634
638
|
|
635
|
-
StaticString getStartupFile() const {
|
639
|
+
StaticString getStartupFile(const WrapperRegistry::Registry &wrapperRegistry) const {
|
636
640
|
if (startupFile.empty()) {
|
637
|
-
const
|
638
|
-
if (
|
639
|
-
return
|
641
|
+
const WrapperRegistry::Entry &entry = wrapperRegistry.lookup(appType);
|
642
|
+
if (entry.isNull() || entry.defaultStartupFiles.empty()) {
|
643
|
+
return StaticString();
|
640
644
|
} else {
|
641
|
-
return
|
645
|
+
return entry.defaultStartupFiles[0];
|
642
646
|
}
|
643
647
|
} else {
|
644
648
|
return startupFile;
|
645
649
|
}
|
646
650
|
}
|
647
651
|
|
648
|
-
StaticString getProcessTitle() const {
|
649
|
-
const
|
650
|
-
if (
|
651
|
-
return processTitle;
|
652
|
+
StaticString getProcessTitle(const WrapperRegistry::Registry ®istry) const {
|
653
|
+
const WrapperRegistry::Entry &entry = registry.lookup(appType);
|
654
|
+
if (entry.isNull()) {
|
655
|
+
return entry.processTitle;
|
652
656
|
} else {
|
653
|
-
return
|
657
|
+
return StaticString();
|
654
658
|
}
|
655
659
|
}
|
656
660
|
|
@@ -52,7 +52,8 @@ Pool::getGroupRunUidAndGids(const StaticString &appGroupName) {
|
|
52
52
|
if (!groups.lookup(appGroupName.c_str(), &group)) {
|
53
53
|
throw RuntimeException("Could not find group: " + appGroupName);
|
54
54
|
} else {
|
55
|
-
SpawningKit::UserSwitchingInfo info = SpawningKit::prepareUserSwitching((*group)->options
|
55
|
+
SpawningKit::UserSwitchingInfo info = SpawningKit::prepareUserSwitching((*group)->options,
|
56
|
+
*context->getWrapperRegistry());
|
56
57
|
return pair<uid_t, gid_t>(info.uid,info.gid);
|
57
58
|
}
|
58
59
|
}
|