#!/usr/bin/env bash # # Mini Object Storage, (C) 2015 Minio, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # _init() { GO_VERSION="1.4" GIT_VERSION="1.0" PIP_VERSION="1.4" GCC_VERSION="4.0" YASM_VERSION="1.2.0" OSX_VERSION="10.8" UNAME=$(uname -sm) MINIO_DEV=$HOME/minio-dev } die() { echo -e "\e[31m[!] $@\e[0m"; exit 1 } msg() { echo -e "\e[93m[*] $@\e[0m" } call() { $@ 2>&1 | sed 's/^\(.*\)$/ | \1/g' return ${PIPESTATUS[0]} } push_dir() { pushd $@ >/dev/null } pop_dir() { popd >/dev/null } #### # # Takes two arguments # arg1: version number in `x.x.x` format # arg2: version number in `x.x.x` format # # example: check_version "$version1" "$version2" # # returns: # 0 - Installed version is equal to required # 1 - Installed version is greater than required # 2 - Installed version is lesser than required # 3 - If args have length zero # #### check_version () { ## validate args [[ -z $1 ]] && return 3 [[ -z $2 ]] && return 3 if [[ $1 == $2 ]]; then return 0 fi local IFS=. local i ver1=($1) ver2=($2) # fill empty fields in ver1 with zeros for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do ver1[i]=0 done for ((i=0; i<${#ver1[@]}; i++)); do if [[ -z ${ver2[i]} ]]; then # fill empty fields in ver2 with zeros ver2[i]=0 fi if ((10#${ver1[i]} > 10#${ver2[i]})); then return 1 fi if ((10#${ver1[i]} < 10#${ver2[i]})); then return 2 fi done return 0 } is_supported_arch() { local supported case ${UNAME##* } in "x86_64") supported=1 ;; *) supported=0 ;; esac if [ $supported -eq 0 ]; then die "Invalid arch: ${UNAME} not supported, please use x86_64/amd64" fi } install_go() { msg "Downloading golang.." case ${UNAME%% *} in "Linux") os="linux" GOLANG_TARBALL_FNAME="go${GO_VERSION}.${os}-amd64.tar.gz" ;; "Darwin") os="darwin" osx_host_version=$(env sw_vers -productVersion) check_version "${osx_host_version}" "${OSX_VERSION}" [[ $? -ge 2 ]] && die "Minimum OSX version supported is ${OSX_VERSION}" GOLANG_TARBALL_FNAME="go${GO_VERSION}.${os}-amd64-osx${OSX_VERSION}.tar.gz" ;; "*") die "Exiting.. unsupported operating system found" esac GOLANG_TARBALL_URL="https://storage.googleapis.com/golang/$GOLANG_TARBALL_FNAME" status_code=$(curl -w '%{http_code}' --progress-bar -L -C - $GOLANG_TARBALL_URL -o $MINIO_DEV/dls/$GOLANG_TARBALL_FNAME) [[ "200 416" =~ $status_code ]] || die "Download failed. Abort installation." call tar -xf $MINIO_DEV/dls/$GOLANG_TARBALL_FNAME -C $MINIO_DEV/deps } install_yasm() { msg "Downloading yasm.." YASM_TARBALL_FNAME="yasm-$YASM_VERSION.tar.gz" YASM_TARBALL_URL="http://www.tortall.net/projects/yasm/releases/$YASM_TARBALL_FNAME" status_code=$(curl -w '%{http_code}' --progress-bar -L -C - $YASM_TARBALL_URL -o $MINIO_DEV/dls/$YASM_TARBALL_FNAME) [[ "200 416" =~ $status_code ]] || die "Download failed. Abort installation." call tar -xf $MINIO_DEV/dls/$YASM_TARBALL_FNAME -C $MINIO_DEV/deps/ push_dir $MINIO_DEV/deps/yasm-$YASM_VERSION call ./configure call make pop_dir } setup_env() { python_version=$(python --version 2>&1 | sed 's/Python \([0-9]*.[0-9]*\).*/\1/') cat < env.sh #!/bin/sh MINIO_DEV=\$(dirname \$(readlink -f \${BASH_SOURCE[0]})) [[ -z \$GOROOT ]] && export GOROOT=\$MINIO_DEV/deps/go export GOPATH=\$MINIO_DEV/mygo export PATH=\$MINIO_DEV/deps/go/bin:\$MINIO_DEV/mygo/bin:\$MINIO_DEV/deps/yasm-\$YASM_VERSION:\$MINIO_DEV/deps/mkdocs/bin:\$GOPATH/bin:\$PATH export PYTHONPATH=\$PYTHONPATH:\$MINIO_DEV/deps/mkdocs/lib/python\$python_version/site-packages/ EOF } install_mkdocs() { msg "Downloading mkdocs.." mkdir -p $MINIO_DEV/deps/mkdocs call pip install --install-option="--prefix=$MINIO_DEV/deps/mkdocs" mkdocs [[ $? -ne 0 ]] && die "Cannot install mkdocs. Abort installation." } install_minio_deps() { msg "Installing minio deps.." env go get github.com/tools/godep && echo "Installed godep" || \ die "Cannot install godep. Abort installation." env go get golang.org/x/tools/cmd/cover && echo "Installed cover" || \ die "Cannot install cover. Abort installation." } install_minio() { msg "Installing minio.." push_dir ${MINIO_DEV}/src if [ ! -d minio ] ; then call git clone "https://github.com/minio-io/minio" || \ die "Cannot download minio. Abort installation." fi (cd minio; call make) pop_dir } main() { trap 'die "Ctrl-C pressed. Quitting.."' INT # Check supported arch is_supported_arch [[ -d ${MINIO_DEV} ]] || \ die "You should have an empty working directory before you start.." mkdir -p ${MINIO_DEV}/{src,deps,dls,mygo} push_dir ${MINIO_DEV} check_version "$(env pip --version | awk {'print $2'})" ${PIP_VERSION} [[ $? -ge 2 ]] && die "pip(${PIP_VERSION}) not installed. Abort." check_version "$(env gcc --version | sed 's/^.* \([0-9.]*\).*$/\1/' | head -1)" ${GCC_VERSION} [[ $? -ge 2 ]] && die "gcc(${GCC_VERSION}) not installed. Abort." check_version "$(env git --version | sed 's/^.* \([0-9.]*\).*$/\1/')" ${GIT_VERSION} [[ $? -ge 2 ]] && die "git${GIT_VERSION} not installed. Abort." check_version "$(env go version 2>/dev/null | sed 's/^.* go\([0-9.]*\).*$/\1/')" ${GOLANG_VERSION} [[ $? -le 1 ]] && \ [[ -z $GOROOT ]] && die "Please setup the goroot variable according to your current installation of golang." \ || install_go check_version "$(env yasm --version 2>/dev/null | sed 's/^.* \([0-9.]*\).*$/\1/' | head -1)" ${YASM_VERSION} [[ $? -ge 2 ]] && install_yasm env mkdocs help >/dev/null 2>&1 [[ $? -ne 0 ]] && install_mkdocs setup_env source env.sh install_minio_deps install_minio msg "--" msg "Run ''source env.sh'' to setup your work env." } # Putting main function at the end of the script ensures that the execution # won't start until the script is entirely downloaded. _init && main "$@"