#!/bin/sh -ex
# Copyright 2022 Go Authors All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.


GO_VERSION=1.13.3
CRUN_VERSION=6254263af0a41d3b78ed280f944acda10199d42a # latest released version doesn't work
CONTAINERD_VERSION=v1.2.10
DOCKER_VERSION=v19.03.4
GOOS=linux
GOARCH=ppc64


# Setting up Go toolchain
bootstrap=go-${GOOS}-${GOARCH}-bootstrap
export GOROOT=$(pwd)/${bootstrap}
export GOPATH=$(pwd)/go
export PATH=$GOROOT/bin:$PATH

install_go() {
	if ! which go >/dev/null; then
		sha256sum -c $bootstrap.tgz.sha256
		tar xf $bootstrap.tgz
	else
		echo "skipping go installation"
	fi
	[ "$(go version)" = "go version go${GO_VERSION} ${GOOS}/${GOARCH}" ]
}

install_crun() {
	if [ -e /usr/local/bin/runc ]; then
		echo "skipping runc installation"
		return
	fi
	# crun is a C-only implementation of the OCI runtime spec, compatible with runc
	git clone https://github.com/containers/crun && cd crun && git checkout "$CRUN_VERSION"
	sudo apt-get update && sudo apt-get install --no-install-recommends -y make gcc libc6-dev pkgconf libtool go-md2man libtool autoconf python3 automake libcap-dev libseccomp-dev libyajl-dev
	./autogen.sh && ./configure --prefix=/usr/local && make && sudo make install

	sudo ln -s crun /usr/local/bin/runc    # hacky but will work
}

install_containerd() {
	if [ -e /usr/local/bin/containerd ]; then
		echo "skipping containerd installation"
		return
	fi
	# installs a static build of containerd
	mkdir -p $GOPATH/src/github.com/containerd
	git clone --depth 1 -b "$CONTAINERD_VERSION" https://github.com/containerd/containerd $GOPATH/src/github.com/containerd/containerd
	cd $GOPATH/src/github.com/containerd/containerd
	patch -p1 < containerd.patch
	BUILDTAGS='netgo osusergo static_build no_btrfs' make && sudo make install
}

install_docker() {
	# installs a static build of docker
	# unfortunately, need to build manually
	if [ -e /usr/local/bin/dockerd ]; then
		echo "skipping dockerd installation"
	else
		mkdir -p $GOPATH/src/github.com/docker
		git clone --depth=1 -b "$DOCKER_VERSION" https://github.com/docker/engine $GOPATH/src/github.com/docker/docker
		cd $GOPATH/src/github.com/docker/docker
		VERSION="$DOCKER_VERSION" GITCOMMIT=$(git rev-parse --short HEAD) bash ./hack/make/.go-autogen
		CGO_ENABLED=0 go build -o dockerd \
			-tags 'autogen netgo osusergo static_build exclude_graphdriver_devicemapper exclude_disk_quota' \
			-installsuffix netgo  \
			github.com/docker/docker/cmd/dockerd
		sudo mv dockerd /usr/local/bin/dockerd
	fi
	if [ -e /usr/local/bin/docker ]; then
		echo "skipping dockerd installation"
		return
	fi
	git clone --depth=1 -b "$DOCKER_VERSION" https://github.com/docker/cli $GOPATH/src/github.com/docker/cli
	cd $GOPATH/src/github.com/docker/cli
	VERSION="$DOCKER_VERSION" GITCOMMIT=$(git rev-parse --short HEAD) ./scripts/build/binary
	sudo cp build/docker-${GOOS}-${GOARCH} /usr/local/bin/docker
}

install_go
install_crun
install_containerd
install_docker

sudo install docker.service /etc/systemd/user/docker.service
sudo systemctl enable /etc/systemd/user/docker.service || true
sudo systemctl restart docker

sudo docker version
