Created
March 24, 2011 03:26
-
-
Save pivotalneutron/884505 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
usage() { | |
printf " | |
Usage: | |
rvm-install-system-wide [options] | |
Options: | |
--trace - Run turn on bash xtrace while the script runs. | |
--debug - Turn on bash verbose while the script runs. | |
--version X - Install RVM version X | |
--revision X - Install RVM revision X (sha1) | |
--help - Display this usage text. | |
" | |
return 0 | |
} | |
__rvm_system_wide_permissions() { | |
[[ -z "$1" ]] && return 1 | |
chown -R root:"$rvm_group_name" "$1" | |
chmod -R g+w "$1" | |
if [[ -d "$1" ]] ; then | |
find "$1" -type d -print0 | xargs -n1 -0 chmod g+s | |
fi | |
return 0 | |
} | |
__rvm_create_user_group() { | |
[[ -z "$1" ]] && return 1 | |
if \grep -q "$1" /etc/group ; then | |
echo "Group '$1' exists, proceeding with installation." | |
else | |
echo "Creating the group '$1'" | |
case "$os_type" in | |
"OpenBSD") groupadd "$rvm_group_name";; | |
"FreeBSD") pw groupadd -q "$rvm_group_name";; | |
"Linux") | |
if [[ -f "/etc/SuSE-release" ]] ; then | |
groupadd "$rvm_group_name" | |
else | |
groupadd -f "$rvm_group_name" | |
fi | |
;; | |
"Darwin") | |
gid="501" #only gids > 500 show up in user preferences | |
#Find an open gid | |
while true; do | |
name=$(dscl . search /groups PrimaryGroupID $gid | cut -f1 -s) | |
if [ -z "$name" ] ; then | |
break | |
fi | |
gid=$[$gid +1] | |
done | |
#Create the group | |
dscl . -create "/Groups/$rvm_group_name" | |
dscl . -create "/Groups/$rvm_group_name" gid "$gid" | |
;; | |
"SunOS") groupadd "$rvm_group_name";; | |
esac | |
fi | |
return 0 | |
} | |
__rvm_add_user_to_group() { | |
[[ -z "$1" || -z "$2" ]] && return 1 | |
echo "Adding '$1' to the group '$2'" | |
case "$os_type" in | |
"OpenBSD") usermod -G "$2" "$1";; | |
"FreeBSD") pw usermod "$1" -G "$2";; | |
"Linux") | |
if [[ -f "/etc/SuSE-release" ]] ; then | |
groupmod -A "$1" "$2" | |
else | |
/usr/sbin/usermod -a -G "$2" "$1" | |
fi | |
;; | |
"Darwin") dscl . -append "/Groups/$2" GroupMembership "$1";; | |
"SunOS") | |
groups="`id -G "$1"` \"$2\"" | |
csv_groups=$(echo $groups | tr " " ", ") | |
usermod -G "$csv_groups" "$1" | |
esac | |
return 0 | |
} | |
os_type="$(uname)" | |
# Require root to install it. | |
if [[ $UID -ne 0 ]]; then | |
echo "Please rerun this installer as root." >&2 | |
exit 1 | |
# Check for the presence of git. | |
elif [[ -z "$(command -v git)" ]] ; then | |
echo "Please ensure git is installed and available in PATH to continue." >&2 | |
exit 1 | |
else | |
case "$os_type" in | |
OpenBSD|Linux|FreeBSD|Darwin|SunOS) | |
: # All clear, proceed! | |
;; | |
*) | |
echo "The rvm system wide installer currently only supports the OS types:" >&2 | |
echo "Linux, FreeBSD, OpenBSD, Darwin and SunOS" >&2 | |
echo "'$os_type' is currently unknown." >&2 | |
exit 1 | |
;; | |
esac | |
fi | |
while [[ $# -gt 0 ]] ; do | |
case $1 in | |
--trace) | |
rvm_trace_flag=1 | |
set -o xtrace | |
;; | |
--debug) | |
rvm_trace_flag=1 | |
set -o verbose | |
;; | |
--version) | |
if [[ -n "${2:-""}" ]] ; then | |
version="$2" | |
shift | |
else | |
usage | |
exit 1 | |
fi | |
;; | |
--revision) | |
if [[ -n "${2:-""}" ]] ; then | |
revision="$2" | |
shift | |
else | |
usage | |
exit 1 | |
fi | |
;; | |
--help) | |
usage | |
exit 0 | |
;; | |
*) | |
usage | |
exit 1 | |
;; | |
esac | |
shift | |
done | |
# Load the rvm config. | |
rvm_ignore_rvmrc=${rvm_ignore_rvmrc:-0} | |
if [[ $rvm_ignore_rvmrc -eq 0 ]]; then | |
[[ -s /etc/rvmrc ]] && source /etc/rvmrc | |
[[ -s "$HOME/.rvmrc" ]] && source "$HOME/.rvmrc" | |
fi | |
rvm_path="${rvm_path:-"/usr/local/rvm"}" | |
export rvm_selfcontained=0 | |
rvm_group_name="${rvm_group_name:-"rvm"}" | |
__rvm_create_user_group "$rvm_group_name" | |
__rvm_add_user_to_group "${USER:-$(id | sed -e 's/^[^(]*(//' -e 's/).*$//')}" "$rvm_group_name" | |
echo "Creating the destination dir and making sure the permissions are correct" | |
mkdir -p "$rvm_path" | |
__rvm_system_wide_permissions "$rvm_path" | |
mkdir -p "$rvm_path/src/" | |
builtin cd "$rvm_path/src" | |
[[ -d "$PWD/rvm/" ]] && rm -rf "$PWD/rvm/" | |
git clone --depth 1 git://github.com/wayneeseguin/rvm.git || git clone http://github.com/wayneeseguin/rvm.git | |
builtin cd rvm | |
if [[ "${revision:-""}" ]]; then | |
echo "Checking out revision $revision" | |
git fetch --depth=256 | |
git checkout $revision | |
elif [[ "${version:-""}" ]]; then | |
echo "Checking out version $version" | |
git checkout $version | |
fi | |
echo "Running the install script." | |
bash ./scripts/install "$@" | |
__rvm_system_wide_permissions "$rvm_path" | |
echo "Setting up group permissions" | |
rvm_parent_dir="$(dirname "$rvm_path")" | |
for dir in bin share/man; do | |
__rvm_system_wide_permissions "$rvm_parent_dir/$dir" | |
done; unset dir | |
echo "Generating system wide rvmrc" | |
rm -f /etc/rvmrc | |
touch /etc/rvmrc | |
cat > /etc/rvmrc <<END_OF_RVMRC | |
# Setup default configuration for rvm. | |
# If an rvm install exists in the home directory, don't load this.' | |
if [[ ! -s "\$HOME/.rvm/scripts/rvm" ]]; then | |
umask g+w | |
export rvm_selfcontained=0 | |
export rvm_prefix="$rvm_parent_dir/" | |
fi | |
END_OF_RVMRC | |
echo "Generating $rvm_parent_dir/lib/rvm to load rvm" | |
mkdir -p "$rvm_parent_dir/lib/" | |
rm -f "$rvm_parent_dir/lib/rvm" | |
touch "$rvm_parent_dir/lib/rvm" | |
cat > "$rvm_parent_dir/lib/rvm" <<END_OF_RVM_SH | |
# Automatically source rvm | |
if [[ -s "\$HOME/.rvm/scripts/rvm" ]]; then | |
source "\$HOME/.rvm/scripts/rvm" | |
elif [[ -s "${rvm_path:=/usr/local/rvm}/scripts/rvm" ]]; then | |
source "${rvm_path:=/usr/local/rvm}/scripts/rvm" | |
fi | |
END_OF_RVM_SH | |
echo "Correct permissions on rvmrc and the rvm loader" | |
# Finally, ensure the rvmrc is owned by the group. | |
for file in /etc/rvmrc "$rvm_parent_dir/lib/rvm" ; do | |
__rvm_system_wide_permissions "$file" | |
done; unset file | |
echo "RVM is now installed. To use, source '$rvm_parent_dir/lib/rvm' to your shell profile." | |
unset rvm_parent_dir |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment