#!/usr/bin/env bash # Copyright 2020 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. # syz-env is a wrapper around gcr.io/syzkaller/env container, # which includes all tools necessary to develop/test syzkaller. # It's recommended to create an alias for this script: # # alias syz-env="$(go env GOPATH)/src/github.com/google/syzkaller/tools/syz-env" # # Then it can be used to wrap almost any make invocation as: # # syz-env make format # syz-env make presubmit # syz-env make extract SOURCEDIR=~/linux # # Or you may run the shell inside of the container with just syz-env. # # Note: this way everything runs inside of the container # and uses all tools bundled in the container rather than host tools. # # Note: syz-env assumes a sudo-less Docker is installed, see: # https://docs.docker.com/engine/install # https://docs.docker.com/engine/install/linux-postinstall # (Googlers see go/docker). COMMAND="" BUILDARGS=() DOCKERARGS=() if [ -n $http_proxy ]; then BUILDARGS+=" --build-arg http_proxy=$http_proxy" DOCKERARGS+=" --env http_proxy=$http_proxy" fi if [ -n $https_proxy ]; then BUILDARGS+=" --build-arg https_proxy=$https_proxy" DOCKERARGS+=" --env https_proxy=$https_proxy" fi if [ -n $no_proxy ]; then BUILDARGS+=" --build-arg no_proxy=$no_proxy" DOCKERARGS+=" --env no_proxy=$no_proxy" fi for ARG in "$@"; do while IFS='=' read KEY VAL; do # If we have a kernel path passed in, we mount it in the container # at /syzkaller/kernel and fix up SOURCEDIR argument. if [ "$KEY" == "SOURCEDIR" ]; then DOCKERARGS+=" --volume $VAL:/syzkaller/kernel:z" COMMAND+=" SOURCEDIR=/syzkaller/kernel" else COMMAND+=" $ARG" fi done <<< "$ARG" done if [ "$CI" == "" ]; then # This gives interactive shell and allows to abort commands with Ctrl+C. DOCKERARGS+=" -it" fi if [ "$COMMAND" == "" ]; then COMMAND="bash" fi SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)" IMAGE="env" if [ "$(basename -- "$0")" == "syz-old-env" ]; then IMAGE="old-env" fi # If we're running rootless docker, files owned by the host user appear within the # container as being owned by root. # # If we're running regular rootful docker, we need to specify --user, as otherwise # processes within the container will create files with the wrong ownership. if [ ! "$(docker info -f "{{println .SecurityOptions}}" | grep rootless)" ]; then DOCKERARGS+=" --user $(id -u ${USER}):$(id -g ${USER})" fi # Build or update docker image if [ ! -z "$SYZ_ENV_BUILD" ]; then IMAGE_NAME="syz-$IMAGE" docker build "$SCRIPT_DIR/docker/$IMAGE" --tag "$IMAGE_NAME" ${BUILDARGS[@]} else IMAGE_NAME="gcr.io/syzkaller/$IMAGE" docker pull -q "$IMAGE_NAME" fi # Run everything as the host user, this is important for created/modified files. docker run \ --rm \ --volume "$SCRIPT_DIR/..:/syzkaller/gopath/src/github.com/google/syzkaller:z" \ --volume "$HOME/.cache:/syzkaller/.cache:z" \ --volume "/var/run/docker.sock":"/var/run/docker.sock" \ --workdir /syzkaller/gopath/src/github.com/google/syzkaller \ --env HOME=/syzkaller \ --env GOPATH=/syzkaller/gopath:/gopath \ --env GOPROXY \ --env FUZZIT_API_KEY \ --env GITHUB_REF \ --env GITHUB_SHA \ --env GITHUB_PR_HEAD_SHA \ --env GITHUB_PR_BASE_SHA \ --env GITHUB_PR_COMMITS \ --env CI \ ${DOCKERARGS[@]} \ "$IMAGE_NAME" -c "$COMMAND"