osquery-1/tools/lib.sh
2016-03-08 10:47:38 -08:00

212 lines
5.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright (c) 2014-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree. An additional grant
# of patent rights can be found in the PATENTS file in the same directory.
ORACLE_RELEASE=/etc/oracle-release
SYSTEM_RELEASE=/etc/system-release
LSB_RELEASE=/etc/lsb-release
DEBIAN_VERSION=/etc/debian_version
function platform() {
local __out=$1
if [[ -f "$ORACLE_RELEASE" ]]; then
FAMILY="redhat"
eval $__out="oracle"
elif [[ -n `grep -o "CentOS" $SYSTEM_RELEASE 2>/dev/null` ]]; then
FAMILY="redhat"
eval $__out="centos"
elif [[ -n `grep -o "Red Hat Enterprise" $SYSTEM_RELEASE 2>/dev/null` ]]; then
FAMILY="redhat"
eval $__out="rhel"
elif [[ -n `grep -o "Amazon Linux" $SYSTEM_RELEASE 2>/dev/null` ]]; then
FAMILY="redhat"
eval $__out="amazon"
elif [[ -f "$LSB_RELEASE" ]] && grep -q 'DISTRIB_ID=Ubuntu' $LSB_RELEASE; then
FAMILY="debian"
eval $__out="ubuntu"
elif [[ -n `grep -o "Fedora" $SYSTEM_RELEASE 2>/dev/null` ]]; then
FAMILY="redhat"
eval $__out="fedora"
elif [[ -f "$DEBIAN_VERSION" ]]; then
FAMILY="debian"
eval $__out="debian"
elif [[ -n `uname | grep "CYGWIN"` ]]; then
FAMILY="windows"
eval $__out="windows"
else
eval $__out=`uname -s | tr '[:upper:]' '[:lower:]'`
fi
}
function _platform() {
platform PLATFORM
echo $PLATFORM
}
function distro() {
local __out=$2
if [[ $1 = "oracle" ]]; then
eval $__out=`grep -o "release [5-7]" $SYSTEM_RELEASE | sed 's/release /oracle/g'`
elif [[ $1 = "centos" ]]; then
eval $__out=`grep -o "release [6-7]" $SYSTEM_RELEASE | sed 's/release /centos/g'`
elif [[ $1 = "rhel" ]]; then
eval $__out=`grep -o "release [6-7]" $SYSTEM_RELEASE | sed 's/release /rhel/g'`
elif [[ $1 = "amazon" ]]; then
eval $__out=`grep -o "release 20[12][0-9]\.[0-9][0-9]" $SYSTEM_RELEASE | sed 's/release /amazon/g'`
elif [[ $1 = "ubuntu" ]]; then
eval $__out=`awk -F= '/DISTRIB_CODENAME/ { print $2 }' $LSB_RELEASE`
elif [[ $1 = "darwin" ]]; then
eval $__out=`sw_vers -productVersion | awk -F '.' '{print $1 "." $2}'`
elif [[ $1 = "fedora" ]]; then
eval $__out=`cat /etc/system-release | cut -d" " -f3`
elif [[ $1 = "debian" ]]; then
eval $__out="`lsb_release -cs`"
elif [[ $1 = "freebsd" ]]; then
eval $__out=`uname -r | awk -F '-' '{print $1}'`
elif [[ $1 = "windows" ]]; then
eval $__out="windows`uname | awk -F '-' '{print $2}'`"
else
eval $__out="unknown_version"
fi
}
function _distro() {
distro $1 DISTRO
echo $DISTRO
}
function threads() {
local __out=$1
platform OS
if [[ $FAMILY = "redhat" ]] || [[ $FAMILY = "debian" ]]; then
eval $__out=`cat /proc/cpuinfo | grep processor | wc -l`
elif [[ $OS = "darwin" ]]; then
eval $__out=`sysctl hw.ncpu | awk '{print $2}'`
elif [[ $OS = "freebsd" ]]; then
eval $__out=`sysctl -n kern.smp.cpus`
else
eval $__out=`nproc`
fi
}
function log() {
echo "[+] $1"
}
function fatal() {
echo "[!] $1"
exit 1
}
function set_cxx() {
export CXX=$1
export CMAKE_CXX_COMPILER=$1
}
function add_cxx_flag() {
export CXXFLAGS="$CXXFLAGS $1"
export CMAKE_CXX_FLAGS="$CMAKE_CXX_FLAGS $1"
}
function set_cc() {
export CC=$1
export CMAKE_C_COMPILER=$1
}
function contains_element() {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
function in_ec2() {
if [[ -d /home/ec2-user ]]; then
return 0
else
return 1
fi
}
function build_kernel_cleanup() {
# Cleanup kernel
$MAKE kernel-unload || sudo reboot
}
function initialize() {
DISTRO=$1
# Reset any work or artifacts from build tests in TP.
(cd third-party && git reset --hard HEAD)
git submodule init
git submodule update
# Remove any previously-cached variables
rm build/$DISTRO/CMakeCache.txt >/dev/null 2>&1 || true
}
function build() {
threads THREADS
platform PLATFORM
distro $PLATFORM DISTRO
# Build kernel extension/module and tests.
BUILD_KERNEL=0
if [[ "$PLATFORM" = "darwin" ]]; then
if [[ "$DISTRO" = "10.10" ]]; then
BUILD_KERNEL=1
fi
fi
MAKE=make
if [[ "$PLATFORM" = "freebsd" ]]; then
MAKE=gmake
fi
RUN_TESTS=$1
cd $SCRIPT_DIR/../
# Run build host provisions and install library dependencies.
if [[ ! -z $RUN_BUILD_DEPS ]]; then
$MAKE deps
else
initialize $DISTRO
fi
# Clean previous build artifacts.
$MAKE clean
# Build osquery.
if [[ -z "$RUN_TARGET" ]]; then
$MAKE -j$THREADS
else
$MAKE $RUN_TARGET -j$THREADS
fi
if [[ $BUILD_KERNEL = 1 ]]; then
# Build osquery kernel (optional).
$MAKE kernel-build
# Setup cleanup code for catastrophic test failures.
trap build_kernel_cleanup EXIT INT TERM
# Load osquery kernel (optional).
$MAKE kernel-load
fi
if [[ $RUN_TESTS = true ]]; then
# Run code unit and integration tests.
$MAKE test/fast
if [[ $BUILD_KERNEL = 1 ]]; then
# Run kernel unit and integration tests (optional).
$MAKE kernel-test/fast
fi
fi
}