|
#!/usr/bin/env bash |
|
|
|
__rvm_pkgs=( sed grep tar gzip bzip2 bash curl git-core ) |
|
|
|
__mri_pkgs=( gcc-c++ patch zlib zlib-devel libffi-devel sqlite3-devel libxml2-devel libxslt-devel libreadline5 readline-devel libopenssl-devel ) |
|
|
|
__rvm_ruby_default="ruby-1.9.2-p180" |
|
|
|
__cookbooks_path_default="/var/chef-solo" |
|
|
|
log() { printf "===> $*\n" ; return $? ; } |
|
|
|
fail() { log "\nERROR: $*\n" ; exit 1 ; } |
|
|
|
usage() { |
|
printf " |
|
|
|
Usage |
|
|
|
suse_chef_bootstrap.sh [options] [action] |
|
|
|
Options |
|
|
|
--rvm-version <head|latest|x.y.z> - Install RVM version [head|latest|x.y.z] |
|
|
|
--rvm-ruby <ruby-xxx-pxx|ree-1.8.2-xxx> - Install a specific RVM ruby |
|
|
|
Actions |
|
|
|
help - Display CLI help (this output) |
|
|
|
" |
|
} |
|
|
|
install_rvm_prerequisites() { |
|
log "Installing RVM pre-requisite packages..." |
|
zypper --non-interactive install -l "${__rvm_pkgs[@]}" |
|
} |
|
|
|
install_mri_prerequisites() { |
|
log "Installing RVM MRI ruby pre-requisite packages..." |
|
zypper --non-interactive install -l "${__mri_pkgs[@]}" |
|
} |
|
|
|
install_rvm() { |
|
local flags="" |
|
if [[ -n "$__rvm_version" ]] ; then flags=" --version $__rvm_version" ; fi |
|
if [[ -n "$__rvm_branch" ]] ; then flags=" --branch $__rvm_branch" ; fi |
|
|
|
log "Installing RVM..." |
|
bash <(curl -LB "http://rvm.beginrescueend.com/install/rvm") $flags |
|
source /etc/profile.d/rvm.sh |
|
} |
|
|
|
install_rvm_ruby() { |
|
if [[ -z "$__rvm_ruby" ]] ; then __rvm_ruby="$__rvm_ruby_default" ; fi |
|
|
|
if rvm list strings | grep -q "^ruby-1.9.2-p180" >/dev/null ; then |
|
log "RVM ruby $__rvm_ruby is already installed, so skipping." |
|
else |
|
log "Install RVM ruby ${__rvm_ruby}..." |
|
rvm install $__rvm_ruby |
|
fi |
|
rvm $__rvm_ruby --default |
|
} |
|
|
|
compile_sqlite() { |
|
local tar="sqlite-autoconf-3070500.tar.gz" |
|
local dl_dir="/tmp/sqlite-$$" |
|
|
|
log "Downloading sqlite3...." |
|
mkdir -p $dl_dir |
|
curl -L "http://www.sqlite.org/$tar" -o "$dl_dir/$tar" |
|
log "Extracting sqlite3..." |
|
(cd $dl_dir && tar -zxf "$dl_dir/$tar") |
|
log "Configuring sqlite3..." |
|
(cd $dl_dir/${tar%.tar.gz} && ./configure) |
|
log "Compiling and installing sqlite3..." |
|
(cd $dl_dir/${tar%.tar.gz} && make && make install) |
|
} |
|
|
|
ensure_current_sqlite() { |
|
local current_version=$(sqlite3 --version) |
|
local need_upgrade=1 |
|
|
|
if [[ $(echo $current_version | cut -d\. -f1) -gt 3 ]] ; then |
|
need_upgrade=0 |
|
elif [[ $(echo $current_version | cut -d\. -f1) -eq 3 ]] ; then |
|
if [[ $(echo $current_version | cut -d\. -f2) -gt 6 ]] ; then |
|
need_upgrade=0 |
|
elif [[ $(echo $current_version | cut -d\. -f2) -eq 6 ]] ; then |
|
if [[ $(echo $current_version | cut -d\. -f3) -ge 16 ]] ; then |
|
need_upgrade=0 |
|
fi |
|
fi |
|
fi |
|
|
|
if [[ $need_upgrade -eq 1 ]] ; then |
|
log "Version of sqlite found was too old, so building one..." |
|
compile_sqlite |
|
else |
|
log "Version of sqlite is good." |
|
fi |
|
} |
|
|
|
install_chef_gem() { |
|
log "Installing chef gem..." |
|
rvm $__rvm_ruby gem install chef --no-ri --no-rdoc |
|
} |
|
|
|
clone_chef_repo() { |
|
if [[ -z "$__cookbooks_path" ]] ; then |
|
__cookbooks_path="$__cookbooks_path_default" |
|
fi |
|
|
|
log "Cloning chef repo into $__cookbooks_path..." |
|
mkdir -p $(dirname $__cookbooks_path) |
|
git clone git://github.com/fnichol/chef-repo.git $__cookbooks_path |
|
} |
|
|
|
installation_complete() { |
|
printf " |
|
|
|
Installation is complete. |
|
" |
|
} |
|
|
|
# Parse CLI arguments |
|
while [[ $# -gt 0 ]] ; do |
|
token="$1" ; shift |
|
case "$token" in |
|
|
|
--rvm-version) |
|
case "$1" in |
|
*.*.*) |
|
__rvm_version="$1" ; shift |
|
;; |
|
latest|stable) |
|
__rvm_version="latest" |
|
;; |
|
head|master) |
|
__rvm_version="head" |
|
__rvm_branch="master" |
|
;; |
|
*) |
|
fail "--version must be followed by a valid version number x.y.z" |
|
;; |
|
esac |
|
;; |
|
|
|
--rvm-ruby) |
|
__rvm_ruby="$1" |
|
;; |
|
|
|
help|usage) |
|
usage |
|
exit 0 |
|
;; |
|
|
|
*) |
|
usage |
|
exit 1 |
|
;; |
|
|
|
esac |
|
done |
|
|
|
# Perform the actual installation |
|
|
|
install_rvm_prerequisites |
|
|
|
install_rvm |
|
|
|
install_mri_prerequisites |
|
|
|
ensure_current_sqlite |
|
|
|
install_rvm_ruby |
|
|
|
install_chef_gem |
|
|
|
clone_chef_repo |
|
|
|
installation_complete |
|
|
|
exit 0 |