-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Import script for building command line installers
The tools/make-installers script creates command line installers for Linux/x64 and Linux/arm64 systems using the archives built by the tools/make-binaries script.
- Loading branch information
Showing
2 changed files
with
212 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,210 @@ | ||
#!/bin/sh | ||
|
||
# Build installers for Linux/x64 and Linux/arm64. | ||
# | ||
# Author: Holger Weiss <holger@zedat.fu-berlin.de>. | ||
# | ||
# Copyright (c) 2022 ProcessOne, SARL. | ||
# All rights reserved. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
set -e | ||
set -u | ||
|
||
myself=${0##*/} | ||
architectures='x64 arm64' | ||
iteration=1 | ||
|
||
usage() | ||
{ | ||
echo >&2 "Usage: $myself [-i <iteration>]" | ||
exit 2 | ||
} | ||
|
||
while getopts i: opt | ||
do | ||
case $opt in | ||
i) | ||
iteration="$OPTARG" | ||
;; | ||
\?) | ||
usage | ||
;; | ||
esac | ||
done | ||
shift $((OPTIND - 1)) | ||
|
||
if ! [ -e 'mix.exs' ] || ! [ -e "tools/$myself" ] | ||
then | ||
echo >&2 "Please call this script from the repository's root directory." | ||
exit 2 | ||
elif [ $# -ne 0 ] | ||
then | ||
usage | ||
fi | ||
if type 'makeself' >'/dev/null' | ||
then makeself='makeself' | ||
elif type 'makeself.sh' >'/dev/null' | ||
then makeself='makeself.sh' | ||
else | ||
echo >&2 'This script requires makeself: https://makeself.io' | ||
exit 1 | ||
fi | ||
|
||
rel_name='ejabberd' | ||
rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') | ||
tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") | ||
code_path="/opt/$rel_name-$rel_vsn" | ||
data_path="/opt/$rel_name" | ||
pem_file="$data_path/conf/server.pem" | ||
url='https://docs.ejabberd.im/admin/upgrade/#specific-version-upgrade-notes' | ||
|
||
trap 'rm -rf "$tmp_dir"' INT TERM EXIT | ||
umask 022 | ||
|
||
create_setup_script() | ||
{ | ||
local dir="$1" | ||
local tarball="$2" | ||
|
||
cat >"$dir/setup" <<-EOF | ||
#!/bin/sh | ||
set -e | ||
set -u | ||
export PATH='/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin' | ||
user_agrees() | ||
{ | ||
local question="\$*" | ||
if [ -t 0 ] | ||
then | ||
read -p "\$question (y/n) [n] " response | ||
response="\$(printf '%s' "\$response" | | ||
tr '[:upper:]' '[:lower:]')" | ||
if [ "\$response" = 'y' ] || [ "\$response" = 'yes' ] | ||
then return 0 | ||
else return 1 | ||
fi | ||
else # Assume 'yes' if not running interactively. | ||
return 0 | ||
fi | ||
} | ||
if [ \$(id -u) != 0 ] | ||
then | ||
echo >&2 'The installer must be run with superuser privileges.' | ||
exit 1 | ||
fi | ||
if [ -e '/run/systemd/system' ] | ||
then is_systemd=true | ||
else is_systemd=false | ||
fi | ||
if [ -e '$data_path' ] | ||
then is_upgrade=true | ||
else is_upgrade=false | ||
fi | ||
if id -u '$rel_name' >'/dev/null' 2>&1 | ||
then user_exists=true | ||
else user_exists=false | ||
fi | ||
echo 'The following installation paths will be used:' | ||
echo '- $code_path' | ||
if [ \$is_upgrade = true ] | ||
then echo "- $data_path (existing files won't be modified)" | ||
else echo '- $data_path' | ||
fi | ||
if [ \$is_systemd = true ] | ||
then echo '- /etc/systemd/system/$rel_name.service' | ||
fi | ||
if [ \$user_exists = false ] | ||
then echo 'The $rel_name user is going to be created.' | ||
fi | ||
if [ \$is_systemd = true ] && [ \$is_upgrade = false ] | ||
then echo 'The $rel_name service is going to be enabled and started.' | ||
fi | ||
if ! user_agrees 'Install $rel_name $rel_vsn now?' | ||
then | ||
echo 'Aborting installation.' | ||
exit 1 | ||
fi | ||
if [ \$user_exists = false ] | ||
then useradd -r -d '$data_path' '$rel_name' | ||
fi | ||
tar --skip-old-files -C "\$(dirname '$code_path')" -xf '$tarball' | ||
chown -R -h 'root:root' '$code_path' | ||
chown 'root:$rel_name' '$code_path/lib/epam-'*'/priv/bin/epam' | ||
chmod '4750' '$code_path/lib/epam-'*'/priv/bin/epam' | ||
if ! [ -e '$pem_file' ] | ||
then | ||
openssl req -x509 \ | ||
-batch \ | ||
-nodes \ | ||
-newkey rsa:4096 \ | ||
-keyout '$pem_file' \ | ||
-out '$pem_file' \ | ||
-days 3650 \ | ||
-subj '/CN=ejabberd.im' >'/dev/null' 2>&1 || : | ||
if [ -e '$pem_file' ] | ||
then chown '$rel_name:$rel_name' '$pem_file' | ||
else echo 'Failed to create a TLS certificate for ejabberd.' >&2 | ||
fi | ||
fi | ||
if [ \$is_systemd = true ] | ||
then | ||
cp '$code_path/bin/$rel_name.service' '/etc/systemd/system/' | ||
systemctl -q daemon-reload | ||
if [ \$is_upgrade = false ] | ||
then systemctl -q --now enable '$rel_name' | ||
fi | ||
elif [ \$is_upgrade = false ] | ||
then | ||
echo 'You might want to install an init script (see the' | ||
echo '$code_path/bin directory for an example).' | ||
fi | ||
echo '$rel_name $rel_vsn has been installed successfully.' | ||
if [ \$is_upgrade = true ] | ||
then | ||
echo 'Please check the following web site for upgrade notes:' | ||
echo | ||
echo '$url' | ||
echo | ||
echo 'If everything looks fine, restart the $rel_name service.' | ||
fi | ||
EOF | ||
chmod +x "$dir/setup" | ||
} | ||
|
||
for arch in $architectures | ||
do | ||
tar_name="$rel_name-$rel_vsn-linux-$arch.tar" | ||
tgz_name="$tar_name.gz" | ||
installer_name="$rel_name-$rel_vsn-$iteration-linux-$arch.run" | ||
|
||
test -e "$tgz_name" || tools/make-binaries | ||
echo "$myself: Putting together installer for $arch ..." | ||
gzip -c -d <"$tgz_name" >"$tmp_dir/$tar_name" | ||
create_setup_script "$tmp_dir" "$tar_name" | ||
"$makeself" "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' | ||
find "$tmp_dir" -mindepth 1 -delete | ||
done | ||
echo "$myself: Created installers successfully." |