mirror of
https://github.com/xcat2/confluent.git
synced 2026-07-18 00:16:50 +00:00
c3c4805f9d
Centralize the SELinux chcon helper and use it for downloaded systemd units, onboot hooks, and apiclient files across EL7 through EL10. Include chcon in captured EL initramfs images. Without this fix the onboot services failed to start on SELinux enabled captured image.
221 lines
7.0 KiB
Bash
221 lines
7.0 KiB
Bash
#!/bin/bash
|
|
function test_mgr() {
|
|
whost=$1
|
|
if [[ "$whost" == *:* ]] && [[ "$whost" != *[* ]] ; then
|
|
whost="[$whost]"
|
|
fi
|
|
if curl -gs https://${whost}/confluent-api/ > /dev/null; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
function initconfluentscriptstmp() {
|
|
if [ -z "$confluentscripttmpdir" ]; then
|
|
mkdir -p /opt/confluent/tmpexec
|
|
confluentscripttmpdir=$(mktemp -d /opt/confluent/tmpexec/confluentscripts.XXXXXXXXX)
|
|
fi
|
|
}
|
|
|
|
function confluentpython() {
|
|
if [ -x /usr/libexec/platform-python ]; then
|
|
/usr/libexec/platform-python $*
|
|
elif [ -x /usr/bin/python3 ]; then
|
|
/usr/bin/python3 $*
|
|
elif [ -x /usr/bin/python ]; then
|
|
/usr/bin/python $*
|
|
elif [ -x /usr/bin/python2 ]; then
|
|
/usr/bin/python2 $*
|
|
fi
|
|
}
|
|
|
|
function set_confluent_vars() {
|
|
if [ -z "$nodename" ]; then
|
|
nodename=$(grep ^NODENAME: /etc/confluent/confluent.info | awk '{print $2}')
|
|
fi
|
|
if [[ "$confluent_mgr" == *"%"* ]]; then
|
|
confluent_mgr=""
|
|
fi
|
|
if [ -z "$confluent_mgr" ]; then
|
|
confluent_mgr=$(grep ^deploy_server: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
|
|
if ! test_mgr $confluent_mgr; then
|
|
confluent_mgr=$(grep ^deploy_server_v6: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
|
|
if [[ "$confluent_mgr" = *":"* ]]; then
|
|
confluent_mgr="[$confluent_mgr]"
|
|
fi
|
|
fi
|
|
if ! test_mgr $confluent_mgr; then
|
|
BESTMGRS=$(grep ^EXTMGRINFO: /etc/confluent/confluent.info | grep '|1$' | sed -e 's/EXTMGRINFO: //' -e 's/|.*//')
|
|
OKMGRS=$(grep ^EXTMGRINFO: /etc/confluent/confluent.info | grep '|0$' | sed -e 's/EXTMGRINFO: //' -e 's/|.*//')
|
|
for confluent_mgr in $BESTMGRS $OKMGRS; do
|
|
if [[ $confluent_mgr == *":"* ]]; then
|
|
confluent_mgr="[$confluent_mgr]"
|
|
fi
|
|
if test_mgr $confluent_mgr; then
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
if [ -z "$confluent_profile" ]; then
|
|
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
|
|
fi
|
|
export confluent_profile confluent_mgr nodename
|
|
}
|
|
|
|
fetch_remote() {
|
|
curlargs=""
|
|
if [ -f /etc/confluent/ca.pem ]; then
|
|
curlargs=" --cacert /etc/confluent/ca.pem"
|
|
fi
|
|
set_confluent_vars
|
|
mkdir -p $(dirname $1)
|
|
whost=$confluent_mgr
|
|
if [[ "$whost" == *:* ]] && [[ "$whost" != *[* ]] ; then
|
|
whost="[$whost]"
|
|
fi
|
|
curl -gf -sS $curlargs https://$whost/confluent-public/os/$confluent_profile/scripts/$1 > $1
|
|
if [ $? != 0 ]; then echo $1 failed to download; return 1; fi
|
|
}
|
|
|
|
source_remote_parts() {
|
|
unset confluentscripttmpdir
|
|
initconfluentscriptstmp
|
|
apiclient=/opt/confluent/bin/apiclient
|
|
if [ -f /etc/confluent/apiclient ]; then
|
|
apiclient=/etc/confluent/apiclient
|
|
fi
|
|
scriptlist=$(confluentpython $apiclient /confluent-api/self/scriptlist/$1|sed -e 's/^- //')
|
|
for script in $scriptlist; do
|
|
source_remote $1/$script
|
|
done
|
|
rm -rf $confluentscripttmpdir
|
|
unset confluentscripttmpdir
|
|
}
|
|
|
|
run_remote_parts() {
|
|
unset confluentscripttmpdir
|
|
initconfluentscriptstmp
|
|
apiclient=/opt/confluent/bin/apiclient
|
|
if [ -f /etc/confluent/apiclient ]; then
|
|
apiclient=/etc/confluent/apiclient
|
|
fi
|
|
scriptlist=$(confluentpython $apiclient /confluent-api/self/scriptlist/$1|sed -e 's/^- //')
|
|
for script in $scriptlist; do
|
|
run_remote $1/$script
|
|
done
|
|
rm -rf $confluentscripttmpdir
|
|
unset confluentscripttmpdir
|
|
}
|
|
|
|
set_selinux_context() {
|
|
if [ -x /usr/bin/chcon ]; then
|
|
/usr/bin/chcon "$1" "$2"
|
|
fi
|
|
}
|
|
|
|
source_remote() {
|
|
set_confluent_vars
|
|
unsettmpdir=0
|
|
echo
|
|
echo '---------------------------------------------------------------------------'
|
|
echo Sourcing $1 from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
|
|
initconfluentscriptstmp
|
|
echo Sourcing from $confluentscripttmpdir
|
|
cd $confluentscripttmpdir
|
|
fetch_remote $1
|
|
if [ $? != 0 ]; then echo $1 failed to download; return 1; fi
|
|
chmod +x $1
|
|
cmd=$1
|
|
shift
|
|
source ./$cmd
|
|
cd - > /dev/null
|
|
if [ "$unsettmpdir" = 1 ]; then
|
|
rm -rf $confluentscripttmpdir
|
|
unset confluentscripttmpdir
|
|
unsettmpdir=0
|
|
fi
|
|
rm -rf $confluentscripttmpdir
|
|
return $retcode
|
|
}
|
|
|
|
run_remote() {
|
|
requestedcmd="'$*'"
|
|
unsettmpdir=0
|
|
set_confluent_vars
|
|
echo
|
|
echo '---------------------------------------------------------------------------'
|
|
echo Running $requestedcmd from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
|
|
if [ -z "$confluentscripttmpdir" ]; then
|
|
unsettmpdir=1
|
|
fi
|
|
initconfluentscriptstmp
|
|
echo Executing in $confluentscripttmpdir
|
|
cd $confluentscripttmpdir
|
|
fetch_remote $1
|
|
if [ $? != 0 ]; then echo $requestedcmd failed to download; return 1; fi
|
|
chmod +x $1
|
|
cmd=$1
|
|
set_selinux_context system_u:object_r:bin_t:s0 "$cmd"
|
|
shift
|
|
./$cmd $*
|
|
retcode=$?
|
|
if [ $retcode -ne 0 ]; then
|
|
echo "$requestedcmd exited with code $retcode"
|
|
fi
|
|
cd - > /dev/null
|
|
if [ "$unsettmpdir" = 1 ]; then
|
|
rm -rf $confluentscripttmpdir
|
|
unset confluentscripttmpdir
|
|
unsettmpdir=0
|
|
fi
|
|
return $retcode
|
|
}
|
|
|
|
run_remote_python() {
|
|
echo
|
|
set_confluent_vars
|
|
if [ -f /etc/confluent/ca.pem ]; then
|
|
curlargs=" --cacert /etc/confluent/ca.pem"
|
|
fi
|
|
echo '---------------------------------------------------------------------------'
|
|
echo Running python script "'$*'" from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
|
|
unset confluentscripttmpdir
|
|
initconfluentscriptstmp
|
|
echo Executing in $confluentscripttmpdir
|
|
cd $confluentscripttmpdir
|
|
mkdir -p $(dirname $1)
|
|
whost=$confluent_mgr
|
|
if [[ "$whost" == *:* ]] && [[ "$whost" != *[* ]] ; then
|
|
whost="[$whost]"
|
|
fi
|
|
curl -gf -sS $curlargs https://$whost/confluent-public/os/$confluent_profile/scripts/$1 > $1
|
|
if [ $? != 0 ]; then echo "'$*'" failed to download; return 1; fi
|
|
confluentpython $*
|
|
retcode=$?
|
|
echo "'$*' exited with code $retcode"
|
|
cd - > /dev/null
|
|
rm -rf $confluentscripttmpdir
|
|
unset confluentscripttmpdir
|
|
return $retcode
|
|
}
|
|
|
|
run_remote_config() {
|
|
echo
|
|
set_confluent_vars
|
|
apiclient=/opt/confluent/bin/apiclient
|
|
if [ -f /etc/confluent/apiclient ]; then
|
|
apiclient=/etc/confluent/apiclient
|
|
fi
|
|
echo '---------------------------------------------------------------------------'
|
|
echo Requesting to run remote configuration for "'$*'" from $confluent_mgr under profile $confluent_profile
|
|
confluentpython $apiclient /confluent-api/self/remoteconfig/"$*" -d {}
|
|
confluentpython $apiclient /confluent-api/self/remoteconfig/status -w 204
|
|
echo
|
|
echo 'Completed remote configuration'
|
|
echo '---------------------------------------------------------------------------'
|
|
return
|
|
}
|
|
#If invoked as a command, use the arguments to actually run a function
|
|
(return 0 2>/dev/null) || $1 "${@:2}"
|