diff --git a/scripts/falco-driver-loader b/scripts/falco-driver-loader index d454f058..642aae01 100755 --- a/scripts/falco-driver-loader +++ b/scripts/falco-driver-loader @@ -68,29 +68,29 @@ cos_version_greater() get_kernel_config() { if [ -f /proc/config.gz ]; then - echo "Found kernel config at /proc/config.gz" + echo "* Found kernel config at /proc/config.gz" KERNEL_CONFIG_PATH=/proc/config.gz elif [ -f "/boot/config-${KERNEL_RELEASE}" ]; then - echo "Found kernel config at /boot/config-${KERNEL_RELEASE}" + echo "* Found kernel config at /boot/config-${KERNEL_RELEASE}" KERNEL_CONFIG_PATH=/boot/config-${KERNEL_RELEASE} elif [ -n "${HOST_ROOT}" ] && [ -f "${HOST_ROOT}/boot/config-${KERNEL_RELEASE}" ]; then - echo "Found kernel config at ${HOST_ROOT}/boot/config-${KERNEL_RELEASE}" + echo "* Found kernel config at ${HOST_ROOT}/boot/config-${KERNEL_RELEASE}" KERNEL_CONFIG_PATH="${HOST_ROOT}/boot/config-${KERNEL_RELEASE}" elif [ -f "/usr/lib/ostree-boot/config-${KERNEL_RELEASE}" ]; then - echo "Found kernel config at /usr/lib/ostree-boot/config-${KERNEL_RELEASE}" + echo "* Found kernel config at /usr/lib/ostree-boot/config-${KERNEL_RELEASE}" KERNEL_CONFIG_PATH="/usr/lib/ostree-boot/config-${KERNEL_RELEASE}" elif [ -n "${HOST_ROOT}" ] && [ -f "${HOST_ROOT}/usr/lib/ostree-boot/config-${KERNEL_RELEASE}" ]; then - echo "Found kernel config at ${HOST_ROOT}/usr/lib/ostree-boot/config-${KERNEL_RELEASE}" + echo "* Found kernel config at ${HOST_ROOT}/usr/lib/ostree-boot/config-${KERNEL_RELEASE}" KERNEL_CONFIG_PATH="${HOST_ROOT}/usr/lib/ostree-boot/config-${KERNEL_RELEASE}" elif [ -f "/lib/modules/${KERNEL_RELEASE}/config" ]; then # this code works both for native host and agent container assuming that # Dockerfile sets up the desired symlink /lib/modules -> $HOST_ROOT/lib/modules - echo "Found kernel config at /lib/modules/${KERNEL_RELEASE}/config" + echo "* Found kernel config at /lib/modules/${KERNEL_RELEASE}/config" KERNEL_CONFIG_PATH="/lib/modules/${KERNEL_RELEASE}/config" fi if [ -z "${KERNEL_CONFIG_PATH}" ]; then - echo "Cannot find kernel config" + >&2 echo "Cannot find kernel config" exit 1 fi @@ -177,37 +177,42 @@ load_kernel_module() { exit 0 fi - # skip dkms on UEK hosts because it will always fail` + # skip dkms on UEK hosts because it will always fail if [[ $(uname -r) == *uek* ]]; then echo "* Skipping dkms install for UEK host" else - if hash dkms &>/dev/null && dkms install -m "${DRIVER_NAME}" -v "${DRIVER_VERSION}" -k "${KERNEL_RELEASE}" 2>/dev/null; then - echo "* Trying to load a dkms ${DRIVER_NAME} module, if present" - - if insmod "/var/lib/dkms/${DRIVER_NAME}/${DRIVER_VERSION}/${KERNEL_RELEASE}/${ARCH}/module/${DRIVER_NAME}.ko" > /dev/null 2>&1; then - echo "${DRIVER_NAME} module found and loaded in dkms" - exit 0 - elif insmod "/var/lib/dkms/${DRIVER_NAME}/${DRIVER_VERSION}/${KERNEL_RELEASE}/${ARCH}/module/${DRIVER_NAME}.ko.xz" > /dev/null 2>&1; then - echo "${DRIVER_NAME} module found and loaded in dkms (xz)" - exit 0 + if hash dkms &>/dev/null; then + echo "* Trying to dkms install ${DRIVER_NAME} module" + if dkms install -m "${DRIVER_NAME}" -v "${DRIVER_VERSION}" -k "${KERNEL_RELEASE}" 2>/dev/null; then + echo "* Trying to load a dkms ${DRIVER_NAME} module, if present" + + if insmod "/var/lib/dkms/${DRIVER_NAME}/${DRIVER_VERSION}/${KERNEL_RELEASE}/${ARCH}/module/${DRIVER_NAME}.ko" > /dev/null 2>&1; then + echo "* ${DRIVER_NAME} module found and loaded in dkms" + exit 0 + elif insmod "/var/lib/dkms/${DRIVER_NAME}/${DRIVER_VERSION}/${KERNEL_RELEASE}/${ARCH}/module/${DRIVER_NAME}.ko.xz" > /dev/null 2>&1; then + echo "* ${DRIVER_NAME} module found and loaded in dkms (xz)" + exit 0 + else + echo "* Unable to insmod" + fi else - echo "* Unable to insmod" + DKMS_LOG="/var/lib/dkms/${DRIVER_NAME}/${DRIVER_VERSION}/build/make.log" + if [ -f "${DKMS_LOG}" ]; then + echo "* Running dkms build failed, dumping ${DKMS_LOG}" + cat "${DKMS_LOG}" + else + echo "* Running dkms build failed, couldn't find ${DKMS_LOG}" + fi fi else - DKMS_LOG="/var/lib/dkms/${DRIVER_NAME}/${DRIVER_VERSION}/build/make.log" - if [ -f "${DKMS_LOG}" ]; then - echo "* Running dkms build failed, dumping ${DKMS_LOG}" - cat "${DKMS_LOG}" - else - echo "* Running dkms build failed, couldn't find ${DKMS_LOG}" - fi + echo "* Skipping dkms install (dkms not found)" fi fi echo "* Trying to load a system ${DRIVER_NAME} driver, if present" if modprobe "${DRIVER_NAME}" > /dev/null 2>&1; then - echo "${DRIVER_NAME} module found and loaded with modprobe" + echo "* ${DRIVER_NAME} module found and loaded with modprobe" exit 0 fi @@ -218,7 +223,7 @@ load_kernel_module() { local FALCO_KERNEL_MODULE_FILENAME="${DRIVER_NAME}_${TARGET_ID}_${KERNEL_RELEASE}_${KERNEL_VERSION}.ko" if [ -f "${HOME}/.falco/${FALCO_KERNEL_MODULE_FILENAME}" ]; then - echo "Found a prebuilt module at ${HOME}/.falco/${FALCO_KERNEL_MODULE_FILENAME}, loading it" + echo "* Found a prebuilt module at ${HOME}/.falco/${FALCO_KERNEL_MODULE_FILENAME}, loading it" insmod "${HOME}/.falco/${FALCO_KERNEL_MODULE_FILENAME}" exit $? fi @@ -228,7 +233,7 @@ load_kernel_module() { echo "* Trying to download prebuilt module from ${URL}" if curl -L --create-dirs "${FALCO_DRIVER_CURL_OPTIONS}" -o "${HOME}/.falco/${FALCO_KERNEL_MODULE_FILENAME}" "${URL}"; then - echo "Download succeeded, loading module" + echo "* Download succeeded, loading module" insmod "${HOME}/.falco/${FALCO_KERNEL_MODULE_FILENAME}" exit $? else @@ -278,7 +283,7 @@ load_bpf_probe() { } if [ -n "${COS}" ]; then - echo "* COS detected (build ${BUILD_ID}), using cos kernel headers..." + echo "* COS detected (build ${BUILD_ID}), using cos kernel headers" BPF_KERNEL_SOURCES_URL="https://storage.googleapis.com/cos-tools/${BUILD_ID}/kernel-headers.tgz" KERNEL_EXTRA_VERSION="+" @@ -341,6 +346,7 @@ load_bpf_probe() { cd /tmp/kernel || exit cd "$(mktemp -d -p /tmp/kernel)" || exit if ! curl -L -o kernel-sources.tgz --create-dirs "${FALCO_DRIVER_CURL_OPTIONS}" "${BPF_KERNEL_SOURCES_URL}"; then + >&2 echo "Download failed" exit 1; fi @@ -396,7 +402,7 @@ load_bpf_probe() { ln -sf "${HOME}/.falco/${BPF_PROBE_FILENAME}" "${HOME}/.falco/${DRIVER_NAME}-bpf.o" exit $? else - echo "* Failure to find an eBPF probe" + >&2 echo "Failure to find an eBPF probe" exit 1 fi } @@ -425,12 +431,12 @@ if [ "${1}" = "--source-only" ]; then fi if [ "$(id -u)" != 0 ]; then - echo "Installer must be run as root (or with sudo)." + >&2 echo "This program must be run as root (or with sudo)" exit 1 fi if ! hash curl > /dev/null 2>&1; then - echo "This program requires curl" + >&2 echo "This program requires curl" exit 1 fi