11#! /bin/bash
22
3- set -eu
3+ set -euo pipefail
44
55# entrypoint-utils.sh
66configPrefix=" ESPOCRM_CONFIG_"
@@ -15,7 +15,7 @@ compareVersion() {
1515 local version2=" $2 "
1616 local operator=" $3 "
1717
18- echo $( php -r " echo version_compare(' $version1 ', ' $version2 ', ' $operator '); " )
18+ php -r ' echo version_compare($argv[1], $argv[2], $argv[3]); ' " $version1 " " $version2 " " $operator "
1919}
2020
2121join () {
@@ -28,46 +28,50 @@ getConfigParamFromFile() {
2828 local name=" $1 "
2929
3030 php -r "
31+ \$ name = \$ argv[1];
32+
3133 if (file_exists('/var/www/html/data/state.php')) {
3234 \$ config=include('/var/www/html/data/state.php');
3335
34- if (array_key_exists(' $name ' , \$ config)) {
35- echo \$ config[' $name ' ];
36+ if (array_key_exists(\ $ name, \$ config)) {
37+ echo \$ config[\ $ name];
3638 exit;
3739 }
3840 }
3941
4042 if (file_exists('/var/www/html/data/config-internal.php')) {
4143 \$ config=include('/var/www/html/data/config-internal.php');
4244
43- if (array_key_exists(' $name ' , \$ config)) {
44- echo \$ config[' $name ' ];
45+ if (array_key_exists(\ $ name, \$ config)) {
46+ echo \$ config[\ $ name];
4547 exit;
4648 }
4749 }
4850
4951 if (file_exists('/var/www/html/data/config.php')) {
5052 \$ config=include('/var/www/html/data/config.php');
5153
52- if (array_key_exists(' $name ' , \$ config)) {
53- echo \$ config[' $name ' ];
54+ if (array_key_exists(\ $ name, \$ config)) {
55+ echo \$ config[\ $ name];
5456 exit;
5557 }
5658 }
57- "
59+ " " $name "
5860}
5961
6062getConfigParam () {
6163 local name=" $1 "
6264
6365 php -r "
66+ \$ name = \$ argv[1];
67+
6468 require_once('/var/www/html/bootstrap.php');
6569
6670 \$ app = new \Espo\Core\Application();
6771 \$ config = \$ app->getContainer()->get('config');
6872
69- echo \$ config->get(' $name ' );
70- "
73+ echo \$ config->get(\ $ name);
74+ " " $name "
7175}
7276
7377# Bool: saveConfigParam "jobRunInParallel" "true"
@@ -77,21 +81,50 @@ saveConfigParam() {
7781 local value=" $2 "
7882
7983 php -r "
84+ \$ name = \$ argv[1];
85+ \$ rawValue = \$ argv[2];
86+
87+ \$ normalizeValue = static function (string \$ value) {
88+ if (\$ value === 'null') {
89+ return null;
90+ }
91+
92+ if (\$ value === 'true') {
93+ return true;
94+ }
95+
96+ if (\$ value === 'false') {
97+ return false;
98+ }
99+
100+ if (preg_match('/^-?(?:0|[1-9][0-9]*)$/', \$ value)) {
101+ return (int) \$ value;
102+ }
103+
104+ if (preg_match('/^-?(?:[0-9]*\\ .[0-9]+|[0-9]+\\ .[0-9]*)$/', \$ value)) {
105+ return (float) \$ value;
106+ }
107+
108+ return \$ value;
109+ };
110+
111+ \$ value = \$ normalizeValue(\$ rawValue);
112+
80113 require_once('/var/www/html/bootstrap.php');
81114
82115 \$ app = new \Espo\Core\Application();
83116 \$ config = \$ app->getContainer()->get('config');
84117
85- if (\$ config->get(' $name ' ) === $value ) {
118+ if (\$ config->get(\ $ name) === \ $ value) {
86119 return;
87120 }
88121
89122 \$ injectableFactory = \$ app->getContainer()->get('injectableFactory');
90123 \$ configWriter = \$ injectableFactory->create('\\ Espo\\ Core\\ Utils\\ Config\\ ConfigWriter');
91124
92- \$ configWriter->set(' $name ', $value );
125+ \$ configWriter->set(\ $ name, \ $ value);
93126 \$ configWriter->save();
94- "
127+ " " $name " " $value "
95128}
96129
97130saveConfigArrayParam () {
@@ -100,40 +133,72 @@ saveConfigArrayParam() {
100133 local value=" $3 "
101134
102135 php -r "
136+ \$ key1 = \$ argv[1];
137+ \$ key2 = \$ argv[2];
138+ \$ rawValue = \$ argv[3];
139+
140+ \$ normalizeValue = static function (string \$ value) {
141+ if (\$ value === 'null') {
142+ return null;
143+ }
144+
145+ if (\$ value === 'true') {
146+ return true;
147+ }
148+
149+ if (\$ value === 'false') {
150+ return false;
151+ }
152+
153+ if (preg_match('/^-?(?:0|[1-9][0-9]*)$/', \$ value)) {
154+ return (int) \$ value;
155+ }
156+
157+ if (preg_match('/^-?(?:[0-9]*\\ .[0-9]+|[0-9]+\\ .[0-9]*)$/', \$ value)) {
158+ return (float) \$ value;
159+ }
160+
161+ return \$ value;
162+ };
163+
164+ \$ value = \$ normalizeValue(\$ rawValue);
165+
103166 require_once('/var/www/html/bootstrap.php');
104167
105168 \$ app = new \Espo\Core\Application();
106169 \$ config = \$ app->getContainer()->get('config');
107170
108- \$ arrayValue = \$ config->get(' $key1 ' ) ?? [];
171+ \$ arrayValue = \$ config->get(\ $ key1) ?? [];
109172
110173 if (!is_array(\$ arrayValue)) {
111174 return;
112175 }
113176
114- if (array_key_exists(' $key2 ' , \$ arrayValue) && \$ arrayValue[' $key2 ' ] === $value ) {
177+ if (array_key_exists(\ $ key2, \$ arrayValue) && \$ arrayValue[\ $ key2] === \ $ value) {
115178 return;
116179 }
117180
118181 \$ injectableFactory = \$ app->getContainer()->get('injectableFactory');
119182 \$ configWriter = \$ injectableFactory->create('\\ Espo\\ Core\\ Utils\\ Config\\ ConfigWriter');
120183
121- \$ arrayValue[' $key2 ' ] = $value ;
184+ \$ arrayValue[\ $ key2] = \ $ value;
122185
123- \$ configWriter->set(' $key1 ' , \$ arrayValue);
186+ \$ configWriter->set(\ $ key1, \$ arrayValue);
124187 \$ configWriter->save();
125- "
188+ " " $key1 " " $key2 " " $value "
126189}
127190
128191checkInstanceReady () {
129- local isInstalled=$( getConfigParamFromFile " isInstalled" )
192+ local isInstalled
193+ isInstalled=$( getConfigParamFromFile " isInstalled" )
130194
131195 if [ -z " $isInstalled " ] || [ " $isInstalled " != 1 ]; then
132196 echo >&2 " Instance is not ready: installation in progress"
133197 exit 0
134198 fi
135199
136- local maintenanceMode=$( getConfigParamFromFile " maintenanceMode" )
200+ local maintenanceMode
201+ maintenanceMode=$( getConfigParamFromFile " maintenanceMode" )
137202
138203 if [ -n " $maintenanceMode " ] && [ " $maintenanceMode " = 1 ]; then
139204 echo >&2 " Instance is not ready: waiting for maintenance mode to be disabled"
@@ -156,38 +221,32 @@ isDatabaseReady() {
156221
157222 try {
158223 \$ helper->createPDO();
159- }
160- catch (Exception \$ e) {
161- echo false;
162- exit;
224+ } catch (\Throwable \$ e) {
225+ exit(1);
163226 }
164227
165- echo true ;
228+ exit(0) ;
166229 "
167230}
168231
169232verifyDatabaseReady () {
170233 for i in {1..40}
171234 do
172- isReady=$( isDatabaseReady 2>&1 )
173-
174- if [ -n " $isReady " ]; then
175- return 0 # true
235+ if isDatabaseReady; then
236+ return 0
176237 fi
177238
178239 echo >&2 " Waiting for database connection (attempt $i /40)..."
179240 sleep 3
180241 done
181242
182243 echo >&2 " error: Database connection failed"
183- return 1 # false
244+ return 1
184245}
185246
186247applyConfigEnvironments () {
187248 local envName
188249 local envValue
189- local configParamName
190- local configParamValue
191250
192251 compgen -v | while read -r envName; do
193252
@@ -207,50 +266,15 @@ applyConfigEnvironments() {
207266 done
208267}
209268
210- isValueQuoted () {
211- local value=" $1 "
212-
213- php -r "
214- echo isQuote('$value ');
215-
216- function isQuote (\$ value) {
217- \$ value = trim(\$ value);
218-
219- if (\$ value === '0') {
220- return false;
221- }
222-
223- if (empty(\$ value)) {
224- return true;
225- }
226-
227- if (filter_var(\$ value, FILTER_VALIDATE_IP)) {
228- return true;
229- }
230-
231- if (!preg_match('/[^0-9.]+/', \$ value)) {
232- return false;
233- }
234-
235- if (in_array(\$ value, ['null', '1'], true)) {
236- return false;
237- }
238-
239- if (in_array(\$ value, ['true', 'false'])) {
240- return false;
241- }
242-
243- return true;
244- }
245- "
246- }
247-
248269normalizeConfigParamName () {
249270 local value=" $1 "
250271 local prefix=${2:- " $configPrefix " }
251272
252273 php -r "
253- \$ value = str_ireplace('$prefix ', '', '$value ');
274+ \$ value = \$ argv[1];
275+ \$ prefix = \$ argv[2];
276+
277+ \$ value = str_ireplace(\$ prefix, '', \$ value);
254278 \$ value = strtolower(\$ value);
255279
256280 \$ value = preg_replace_callback(
@@ -262,20 +286,23 @@ normalizeConfigParamName() {
262286 );
263287
264288 echo \$ value;
265- "
289+ " " $value " " $prefix "
266290}
267291
268292normalizeConfigParamValue () {
269- local value=${1 // \' / \\\' }
293+ local value=" $1 "
270294
271- local isValueQuoted=$( isValueQuoted " $value " )
295+ php -r "
296+ \$ value = \$ argv[1];
297+ \$ trimmed = trim(\$ value);
272298
273- if [ -n " $isValueQuoted " ] && [ " $isValueQuoted " = 1 ] ; then
274- echo " ' $value ' "
275- return
276- fi
299+ if (preg_match('/^\'(.*)\'$/s', \$ trimmed, \$ matches)) {
300+ echo str_replace(' \\\\ \'', '\'', \$ matches[1]);
301+ return;
302+ }
277303
278- echo " $value "
304+ echo \$ value;
305+ " " $value "
279306}
280307
281308isConfigArrayParam () {
@@ -297,8 +324,11 @@ saveConfigValue() {
297324 local envName=" $1 "
298325 local envValue=" $2 "
299326
300- local key=$( normalizeConfigParamName " $envName " )
301- local value=$( normalizeConfigParamValue " $envValue " )
327+ local key
328+ key=$( normalizeConfigParamName " $envName " )
329+
330+ local value
331+ value=$( normalizeConfigParamValue " $envValue " )
302332
303333 saveConfigParam " $key " " $value "
304334}
@@ -314,12 +344,15 @@ saveConfigArrayValue() {
314344 fi
315345
316346 local key1=" $i "
317- local key2=$( normalizeConfigParamName " $envName " " ${configPrefixArrayList[$i]} " )
347+
348+ local key2
349+ key2=$( normalizeConfigParamName " $envName " " ${configPrefixArrayList[$i]} " )
318350
319351 break
320352 done
321353
322- local value=$( normalizeConfigParamValue " $envValue " )
354+ local value
355+ value=$( normalizeConfigParamValue " $envValue " )
323356
324357 saveConfigArrayParam " $key1 " " $key2 " " $value "
325358}
@@ -341,12 +374,15 @@ setEnvValue() {
341374 export " $var " =" $val "
342375 unset " $fileVar "
343376}
377+
378+ urlEncode () {
379+ local value=" ${1-} "
380+ php -r ' echo rawurlencode($argv[1]);' " $value "
381+ }
344382# END: entrypoint-utils.sh
345383
346384checkInstanceReady
347385
348386applyConfigEnvironments
349387
350388/usr/local/bin/php /var/www/html/daemon.php
351-
352- exec " $@ "
0 commit comments