0
  #   ˆl—äY>”Je¶¥8 [¸ËWmLZ7ÿÂƒp ¿Ä Ô    #!/usr/bin/bash
# vi:syntax=sh

set -eo pipefail

progname=$(basename "$0")

sub_help(){
    echo "Usage: $progname <subcommand> [options]"
    echo ""
    echo "Subcommands:"
    echo "    init   [username ...]"
    echo "    disable"
    echo ""
    echo "For help with each subcommand run:"
    echo "$progname <subcommand> -h|--help"
    echo ""
}

subcommand=$1
KCARE_PROFILE='/etc/profile.d/kernelcare.sh'
KCARE_SUDOERS='/etc/sudoers.d/kernelcare'
TMP_SUDOERS="/root/kernelcare.sudoers.tmp"
KCARE_FALCON_OVERRIDE_DIR='/etc/systemd/system/falcon-sensor.service.d'
KCARE_FALCON_OVERRIDE="${KCARE_FALCON_OVERRIDE_DIR}/kcare-scanner-interface.conf"


function clean_env_file(){
    [ -f "$1" ] && sed -i '/kpatch_package/d' "$1" || :
}

function patch_env_file(){
    clean_env_file "$1"
    echo "$2${KCARE_PACKAGE_ENV}$3" >> "$1"
}

function patch_falcon(){
    # CrowdStrike Falcon's unit file declares no EnvironmentFile, so a
    # systemd drop-in is the only supported way to inject LD_PRELOAD.
    command -v systemctl >/dev/null 2>&1 || return 0
    systemctl cat falcon-sensor.service >/dev/null 2>&1 || return 0

    mkdir -p "${KCARE_FALCON_OVERRIDE_DIR}"
    cat > "${KCARE_FALCON_OVERRIDE}" << FALCONOVERRIDE
# Managed by kcare-scanner-interface â€” do not edit manually
[Service]
Environment="${KCARE_PACKAGE_ENV}"
FALCONOVERRIDE
    chmod 0644 "${KCARE_FALCON_OVERRIDE}"
    systemctl daemon-reload >/dev/null 2>&1 || :
    echo "Restart falcon-sensor.service to apply: systemctl restart falcon-sensor.service"
}

function unpatch_falcon(){
    [ -f "${KCARE_FALCON_OVERRIDE}" ] || return 0
    rm -f "${KCARE_FALCON_OVERRIDE}"
    rmdir "${KCARE_FALCON_OVERRIDE_DIR}" 2>/dev/null || :
    command -v systemctl >/dev/null 2>&1 && systemctl daemon-reload >/dev/null 2>&1 || :
    echo "Restart falcon-sensor.service to drop the LD_PRELOAD wrapper: systemctl restart falcon-sensor.service"
}

function patch_agents(){
    # Patch environment of the Qualys agent
    patch_env_file "/etc/sysconfig/qualys-cloud-agent" 'export ' '.qualys'
    patch_env_file "/etc/default/qualys-cloud-agent" '' '.qualys'
    # Patch environment of the Nessus agent
    patch_env_file "/etc/sysconfig/nessusagent" '' ''
    # Patch environment of the CrowdStrike Falcon agent
    patch_falcon
}


function patch_bashrc(){
    BASHRC=$1
    SOURCE_LINE="test -f ${KCARE_PROFILE} && source ${KCARE_PROFILE} > /dev/null ||:"
    test -f "${BASHRC}" && sed -i "2 i${SOURCE_LINE}" "${BASHRC}" 2> /dev/null || :
}

function patch_user(){
    KCARE_SCANNER_USER=$1

    # Setup scanner interface for one user defined in $KCARE_SCANNER_USER
    if [ "$KCARE_SCANNER_USER" == '*' ]; then
        cat >> ${KCARE_PROFILE} << PROFILECONTENT
export ${KCARE_PACKAGE_ENV}
PROFILECONTENT
    else
        # Ensure profile script always exits with code 0 to avoid breaking job execution
        cat >> ${KCARE_PROFILE} << PROFILECONTENT
[ \$(logname 2>/dev/null || echo \${SUDO_USER:-\$USER}) = ${KCARE_SCANNER_USER} ] && export ${KCARE_PACKAGE_ENV} || :
PROFILECONTENT
    fi

    chmod 644 "${KCARE_PROFILE}"

    rm -rf "${TMP_SUDOERS}"
    [ -f ${KCARE_SUDOERS} ] && cp ${KCARE_SUDOERS} ${TMP_SUDOERS}

    # Patch environment for sudoers
    if [ -f /usr/sbin/visudo ]; then
        if [ "$KCARE_SCANNER_USER" == '*' ]; then
            echo "Defaults env_file=/usr/libexec/kcare/env" >> "${TMP_SUDOERS}"
        else
            echo "Defaults:$KCARE_SCANNER_USER env_file=/usr/libexec/kcare/env" >> "${TMP_SUDOERS}"
        fi
        /usr/sbin/visudo -cf ${TMP_SUDOERS} > /dev/null && cp ${TMP_SUDOERS} ${KCARE_SUDOERS} && chmod 0440 ${KCARE_SUDOERS}
    fi
}

sub_disable(){
  rm -f ${KCARE_PROFILE}
  rm -f ${KCARE_SUDOERS}

  sed -i '/^SCANNER_USER=/d' /etc/sysconfig/kcare/kcare.conf || :
  sed -i "\,${KCARE_PROFILE},d" /etc/bash.bashrc 2> /dev/null || :
  sed -i "\,${KCARE_PROFILE},d" /etc/bashrc 2> /dev/null || :

  clean_env_file /etc/sysconfig/qualys-cloud-agent
  clean_env_file /etc/default/qualys-cloud-agent
  clean_env_file /etc/sysconfig