Skip to content

Commit 52eb86c

Browse files
committed
Add support for relay extension
1 parent 2b77dd6 commit 52eb86c

File tree

5 files changed

+153
-1
lines changed

5 files changed

+153
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ PHP extensions can be set up using the `extensions` input. It accepts a `string`
207207

208208
- These extensions have custom support:
209209
- `cubrid` and `pdo_cubrid` on `Ubuntu`.
210-
- `gearman`, `geos` and `event` on `Ubuntu` and `macOS`.
210+
- `event`, `gearman`, `geos` and `relay` on `Ubuntu` and `macOS`.
211211
- `blackfire`, `couchbase`, `ioncube`, `oci8`, `pdo_firebird`, `pdo_oci`, `pecl_http`, `phalcon3`, `phalcon4` and `phalcon5` on all supported OS.
212212

213213
- By default, extensions which cannot be added or disabled gracefully leave an error message in the logs, the execution is not interrupted. To change this behaviour you can set `fail-fast` flag to `true`.

__tests__/extensions.test.ts

+3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ describe('Extension tests', () => {
5959
${'pdo_sqlsrv'} | ${'7.4'} | ${'add_sqlsrv pdo_sqlsrv'}
6060
${'pecl_http'} | ${'7.3'} | ${'add_http'}
6161
${'phalcon3'} | ${'7.3'} | ${'add_phalcon phalcon3'}
62+
${'relay'} | ${'7.4'} | ${'add_relay relay'}
63+
${'relay-v1.2.3'} | ${'7.4'} | ${'add_relay relay-v1.2.3'}
6264
${'sqlite'} | ${'7.4'} | ${'add_extension sqlite3'}
6365
${'sqlsrv-1.2.3-beta1'} | ${'7.4'} | ${'add_pecl_extension sqlsrv 1.2.3beta1 extension'}
6466
${'Xdebug'} | ${'7.4'} | ${'add_extension xdebug'}
@@ -92,6 +94,7 @@ describe('Extension tests', () => {
9294
${'pcov'} | ${'5.6'} | ${'add_log "$cross" "pcov" "pcov is not supported on PHP 5.6"'}
9395
${'pdo_oci'} | ${'7.3'} | ${'add_oci pdo_oci'}
9496
${'pecl_http'} | ${'7.3'} | ${'add_http'}
97+
${'relay-1.2.3'} | ${'7.4'} | ${'add_relay relay-1.2.3'}
9598
${'sqlite'} | ${'7.2'} | ${'add_extension sqlite3'}
9699
`(
97100
'checking addExtensionOnDarwin for extension $extension on version $version',

dist/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ async function addExtensionDarwin(extension_csv, version) {
244244
case /.+-.+\/.+@.+/.test(extension):
245245
add_script += await utils.parseExtensionSource(extension, ext_prefix);
246246
return;
247+
case /^(7\.4|8\.[0-2])relay(-v?\d+\.\d+\.\d+)?$/.test(version_extension):
247248
case /^(5\.[3-6]|7\.[0-4]|8\.[0-2])blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
248249
case /^couchbase|^event|^gearman$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test(extension):
249250
case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension):
@@ -358,6 +359,7 @@ async function addExtensionLinux(extension_csv, version) {
358359
case /.+-.+\/.+@.+/.test(extension):
359360
add_script += await utils.parseExtensionSource(extension, ext_prefix);
360361
return;
362+
case /^(7\.4|8\.[0-2])relay(-v?\d+\.\d+\.\d+)?$/.test(version_extension):
361363
case /^(5\.[3-6]|7\.[0-4]|8\.[0-2])blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
362364
case /^((5\.[3-6])|(7\.[0-2]))pdo_cubrid$|^((5\.[3-6])|(7\.[0-4]))cubrid$/.test(version_extension):
363365
case /^couchbase|^event|^gearman$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test(extension):

src/extensions.ts

+4
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ export async function addExtensionDarwin(
3131
case /.+-.+\/.+@.+/.test(extension):
3232
add_script += await utils.parseExtensionSource(extension, ext_prefix);
3333
return;
34+
// match 7.4relay...8.2relay
3435
// match 5.3blackfire...8.2blackfire
3536
// match 5.3blackfire-(semver)...8.1blackfire-(semver)
3637
// match couchbase, event, geos, pdo_oci, oci8, http, pecl_http
3738
// match 5.3ioncube...7.4ioncube
3839
// match 7.0phalcon3...7.3phalcon3, 7.2phalcon4...7.4phalcon4, and 7.4phalcon5...8.2phalcon5
40+
case /^(7\.4|8\.[0-2])relay(-v?\d+\.\d+\.\d+)?$/.test(version_extension):
3941
case /^(5\.[3-6]|7\.[0-4]|8\.[0-2])blackfire(-\d+\.\d+\.\d+)?$/.test(
4042
version_extension
4143
):
@@ -252,12 +254,14 @@ export async function addExtensionLinux(
252254
case /.+-.+\/.+@.+/.test(extension):
253255
add_script += await utils.parseExtensionSource(extension, ext_prefix);
254256
return;
257+
// match 7.4relay...8.2relay
255258
// match 5.3blackfire...8.2blackfire
256259
// match 5.3blackfire-(semver)...8.1blackfire-(semver)
257260
// match 5.3pdo_cubrid...7.2php_cubrid, 5.3cubrid...7.4cubrid
258261
// match couchbase, geos, pdo_oci, oci8, http, pecl_http
259262
// match 5.3ioncube...7.4ioncube
260263
// match 7.0phalcon3...7.3phalcon3, 7.2phalcon4...7.4phalcon4, 7.4phalcon5...8.2phalcon5
264+
case /^(7\.4|8\.[0-2])relay(-v?\d+\.\d+\.\d+)?$/.test(version_extension):
261265
case /^(5\.[3-6]|7\.[0-4]|8\.[0-2])blackfire(-\d+\.\d+\.\d+)?$/.test(
262266
version_extension
263267
):

src/scripts/extensions/relay.sh

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# Get relay version
2+
get_relay_version() {
3+
local ext=$1
4+
if [[ "$ext" =~ ^relay$ ]]; then
5+
get -s -n "" "${relay_releases:?}"/latest 2<&1 | grep -m 1 -Eo "tag/(v[0-9]+(\.[0-9]+)?(\.[0-9]+)?)" | head -n 1 | cut -d '/' -f 2
6+
else
7+
relay_version="${ext##*-}"
8+
echo "v${relay_version/v//}"
9+
fi
10+
}
11+
12+
# Get OS suffix in relay artifact URL.
13+
get_os_suffix() {
14+
if [ "$os" = "Linux" ]; then
15+
if [[ "$ID" =~ ubuntu|debian ]]; then
16+
echo debian
17+
elif [ "$ID" = "centos" ]; then
18+
echo centos"$VERSION_ID"
19+
else
20+
echo "$ID"
21+
fi
22+
else
23+
echo darwin
24+
fi
25+
}
26+
27+
# Get openssl suffix in relay artifact URL.
28+
get_openssl_suffix() {
29+
openssl_3=$(php -r "echo strpos(OPENSSL_VERSION_TEXT, 'SSL 3') !== false;")
30+
[ "$openssl_3" = "1" ] && echo '.libssl3' || echo ''
31+
}
32+
33+
# Change library paths in relay binary.
34+
change_library_paths() {
35+
if [ "$os" = "Darwin" ]; then
36+
otool -L "${ext_dir:?}"/relay.so | grep -q 'ssl.1' && openssl_version='1.1' || openssl_version='3'
37+
[ -e "${brew_prefix:?}"/opt/openssl@"$openssl_version" ] || brew install openssl@"$openssl_version"
38+
dylibs="$(otool -L "${ext_dir:?}"/relay.so | grep -Eo '.*\.dylib' | cut -f1 -d ' ')"
39+
install_name_tool -change "$(echo "${dylibs}" | grep -E "libzstd.*dylib" | xargs)" "$brew_prefix"/opt/zstd/lib/libzstd.dylib "$ext_dir"/relay.so
40+
install_name_tool -change "$(echo "${dylibs}" | grep -E "liblz4.*dylib" | xargs)" "$brew_prefix"/opt/lz4/lib/liblz4.dylib "$ext_dir"/relay.so
41+
install_name_tool -change "$(echo "${dylibs}" | grep -E "libssl.*dylib" | xargs)" "$brew_prefix"/opt/openssl@"$openssl_version"/lib/libssl.dylib "$ext_dir"/relay.so
42+
install_name_tool -change "$(echo "${dylibs}" | grep -E "libcrypto.*dylib" | xargs)" "$brew_prefix"/opt/openssl@"$openssl_version"/lib/libcrypto.dylib "$ext_dir"/relay.so
43+
fi
44+
}
45+
46+
# Add relay dependencies
47+
add_relay_dependencies() {
48+
add_extension json
49+
add_extension msgpack
50+
add_extension igbinary
51+
if [ "$os" = "Darwin" ]; then
52+
. "${0%/*}"/tools/brew.sh
53+
configure_brew
54+
brew install hiredis lz4 zstd
55+
fi
56+
}
57+
58+
# Initialize relay extension ini configuration
59+
init_relay_ini() {
60+
relay_ini=$1
61+
if [ -e "$relay_ini" ]; then
62+
if [[ -n "$RELAY_KEY" ]]; then
63+
sudo sed -i.bak "s/^; relay.key =.*/relay.key = $RELAY_KEY/" "$relay_ini"
64+
fi
65+
if [[ -n "$RELAY_ENVIRONMENT" ]]; then
66+
sudo sed -i.bak "s/^; relay.environment =.*/relay.environment = $RELAY_ENVIRONMENT/" "$relay_ini"
67+
fi
68+
if [[ -n "$RELAY_EVICTION_POLICY" ]]; then
69+
sudo sed -i.bak "s/^; relay.eviction_policy =.*/relay.eviction_policy = $RELAY_EVICTION_POLICY/" "$relay_ini"
70+
fi
71+
if [[ -n "$RELAY_MAX_MEMORY" ]]; then
72+
sudo sed -i.bak "s/^; relay.maxmemory =.*/relay.maxmemory = $RELAY_MAX_MEMORY/" "$relay_ini"
73+
fi
74+
sudo rm -rf "$relay_ini".bak
75+
fi
76+
}
77+
78+
# Enable relay extension
79+
enable_relay() {
80+
relay_ini=$1
81+
if [ -e "$relay_ini" ]; then
82+
init_relay_ini "$relay_ini"
83+
if [ "$os" = "Linux" ]; then
84+
sudo mv "$relay_ini" "${ini_dir:?}"/../mods-available/relay.ini
85+
sudo phpenmod -v "${version:?}" relay
86+
else
87+
sudo mv "${relay_ini}" "${scan_dir:?}"/60-relay.ini
88+
fi
89+
fi
90+
}
91+
92+
# Patch binary id in relay extension
93+
init_relay_binary_id() {
94+
if [ -e "${ext_dir:?}"/relay.so ]; then
95+
grep -aq 00000000 "${ext_dir:?}"/relay.so && \
96+
sudo LC_ALL=C sed -i.bak "s/00000000-0000-0000-0000-000000000000/$(uuidgen)/" "$ext_dir"/relay.so
97+
fi
98+
}
99+
100+
# Configure relay extension
101+
configure_relay() {
102+
change_library_paths
103+
init_relay_binary_id
104+
enable_relay "${ext_dir}"/relay.ini
105+
}
106+
107+
# Helper function to add relay extension
108+
add_relay_helper() {
109+
arch="$(uname -m | sed 's/_/-/')"
110+
os_suffix="$(get_os_suffix)"
111+
openssl_suffix="$(get_openssl_suffix)"
112+
artifact_file_name="relay-$relay_version-php${version:?}-$os_suffix-$arch$openssl_suffix.tar.gz"
113+
url="$relay_releases"/download/"$relay_version"/"$artifact_file_name"
114+
fallback_url="$relay_trunk"/"$artifact_file_name"
115+
get -q -n /tmp/relay.tar.gz "$url" "$fallback_url"
116+
if [ "$openssl_suffix" = '.libssl3' ] && (! [ -e /tmp/relay.tar.gz ] || ! file /tmp/relay.tar.gz | grep -q 'gzip'); then
117+
get -q -n /tmp/relay.tar.gz "${url/.libssl3/}" "${fallback_url/.libssl3/}"
118+
fi
119+
if [ -e /tmp/relay.tar.gz ] && file /tmp/relay.tar.gz | grep -q 'gzip'; then
120+
sudo tar --strip-components=1 -xzf /tmp/relay.tar.gz -C "${ext_dir:?}"
121+
sudo mv "${ext_dir:?}"/relay-pkg.so "${ext_dir:?}"/relay.so
122+
fi
123+
}
124+
125+
# Add relay extension
126+
add_relay() {
127+
local ext=$1
128+
local arch
129+
local url
130+
os=$(uname -s)
131+
relay_releases=https://github.com/cachewerk/relay/releases
132+
relay_trunk=https://builds.r2.relay.so
133+
relay_version=$(get_relay_version "$ext")
134+
add_relay_dependencies >/dev/null 2>&1
135+
if shared_extension relay; then
136+
message="Enabled"
137+
else
138+
add_relay_helper >/dev/null 2>&1
139+
message="Installed and enabled"
140+
fi
141+
configure_relay >/dev/null 2>&1
142+
add_extension_log relay "$message"
143+
}

0 commit comments

Comments
 (0)