diff --git a/README.md b/README.md index 75809fc..9fb7f4d 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,89 @@ -node-install-script -=================== +# Automated node.js installers for OS X and Ubuntu -A script to install basic development tools for node (git, node, gcc, etc) +A script to install basic development tools for node.js - git, node, gcc, pkg-config, etc -Works for any recent version of Ubuntu or OS X. +Pick one: + +* [OS X](#apple-os-x) +* [Ubuntu Linux](#ubuntu-linux) +* [TL;DR](#tldr) +* [Important Notes](#other-things-you-should-know) + +## Screencast + +[How to Setup a VPS for node.js Development](https://www.youtube.com/watch?v=ypjzi1axH2A) - [(3:06 installing node.js](https://www.youtube.com/watch?v=ypjzi1axH2A#t=186)) + +## TL;DR + +If you kinda know what you're doing already: + +**node.js + dev tools** ```bash -# Specify the version of node to install -echo "v0.11.14" > /tmp/NODE_VER - -# And install away! -curl -fsSL bit.ly/easy-install-node | bash +echo "Current node.js version is $(curl -fsSL https://nodejs.org/dist/index.tab | head -2 | tail -1 | cut -f 1)" +curl -fsSL bit.ly/iojs-dev -o /tmp/iojs-dev.sh; bash /tmp/iojs-dev.sh ``` -**For older versions of Ubuntu**: +**node.js only** (no git, gcc, etc) ```bash -wget -nv bit.ly/easy-install-node -O - | bash +# To install a specific version rather than defaulting to latest +# latest version at time of writing are v1.8.4, v2.5.0, and v3.1.0 +echo "v2.5.0" > /tmp/IOJS_VER + +# node.js without development dependencies +curl -fsSL bit.ly/iojs-min | bash + +# Ubuntu without curl +wget -nv bit.ly/iojs-min -O - | bash ``` +## Apple OS X + +First you need to **Install XCode Command Line Tools** + +```bash +xcode-select --install +``` + +Then you need to **Accept the XCode License** by running any command installed by Xcode with sudo. We'll use git. + +```bash +sudo git --version +``` + +You can scroll to the bottom by hitting shift+G (capital G). + +Type `agree` and hit enter to accept the license. + +Now you can install node.js + +```bash +curl -fsSL bit.ly/iojs-dev -o /tmp/iojs-dev.sh; bash /tmp/iojs-dev.sh +``` + +*TODO*: Make it easier to accepting the license (automatic?) + +## Ubuntu Linux + +```bash +wget -nv bit.ly/iojs-dev -O /tmp/iojs-dev.sh; bash /tmp/iojs-dev.sh +``` + +## Other things you should know + This is what gets installed: -* fail2ban (not necessary for development, but should be on every server) * rsync * curl * wget * git * xcode / brew / build-essential / pkg-config / gcc -* node +* node (including npm) * jshint -Screencast -========== +**NOTE**: If `fail2ban` is not already securing ssh, you will be asked to install it. -[How to Setup a VPS for Node.js Development](https://www.youtube.com/watch?v=ypjzi1axH2A) - [(3:06 installing node](https://www.youtube.com/watch?v=ypjzi1axH2A#t=186)) Front-End Extras ================ diff --git a/setup-mavericks.bash b/setup-deps-mavericks.bash similarity index 61% rename from setup-mavericks.bash rename to setup-deps-mavericks.bash index cc2fd9d..3c17651 100644 --- a/setup-mavericks.bash +++ b/setup-deps-mavericks.bash @@ -1,10 +1,19 @@ #!/bin/bash # curl -fsSL https://ldsconnect.org/setup-osx.bash | bash -c -NODE_VER=${1} +NO_FAIL2BAN=${1} echo "" echo "" +echo "Checking for" +echo "" +echo " * XCode Command Line Tools" +echo " * wget" +echo " * pkg-config" +echo " * node" +echo " * iojs" +echo " * jshint" +echo "" # XCode # testing for which git, gcc, etc will not work because the tools are aliased to the install script @@ -31,8 +40,6 @@ if [ -z "$(xcode-select --print-path 2>/dev/null)" ] || [ -z "$(git --version 2> echo "It looks like the other install is finishing up." echo "This installation will begin in one minute." sleep 60 -else - echo "XCode Command Line Tools already installed" fi # homebrew @@ -48,46 +55,18 @@ fi if [ -z "$(which wget | grep wget)" ]; then echo "installing wget..." brew install wget -else - echo "wget already installed" fi # http://www.fail2ban.org/wiki/index.php/HOWTO_Mac_OS_X_Server_(10.5) if [ -z "$(which fail2ban-server | grep fail2ban)" ]; then - echo "installing fail2ban..." - brew install fail2ban - sudo cp -fv /usr/local/opt/fail2ban/*.plist /Library/LaunchDaemons - sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.fail2ban.plist -else - echo "fail2ban already installed" + if [ -z "${NO_FAIL2BAN}" ]; then + brew install fail2ban + sudo cp -fv /usr/local/opt/fail2ban/*.plist /Library/LaunchDaemons + sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.fail2ban.plist + fi fi if [ -z "$(which pkg-config | grep pkg-config)" ]; then echo "installing pkg-config..." brew install pkg-config -else - echo "pkg-config already installed" -fi - -# node -if [ -n "$(which node | grep node 2>/dev/null)" ]; then - NODE_VER="" - - if [ "${NODE_VER}" == "$(node -v 2>/dev/null)" ]; then - echo node ${NODE_VER} already installed - else - echo "" - echo "HEY, LISTEN:" - echo "node is already installed as $(node -v | grep v)" - echo "" - echo "to reinstall please first run: rm $(which node)" - echo "" - fi -fi - -if [ -n "${NODE_VER}" ]; then - echo "installing node ${NODE_VER}..." - curl -fsSL "http://nodejs.org/dist/${NODE_VER}/node-${NODE_VER}.pkg" -o "/tmp/node-${NODE_VER}.pkg" - sudo /usr/sbin/installer -pkg "/tmp/node-${NODE_VER}.pkg" -target / - sudo chown -R $(whoami) /usr/local 2>/dev/null fi diff --git a/setup-deps-ubuntu.bash b/setup-deps-ubuntu.bash new file mode 100644 index 0000000..9d38e22 --- /dev/null +++ b/setup-deps-ubuntu.bash @@ -0,0 +1,37 @@ +#!/bin/bash + +# curl -fsSL https://ldsconnect.org/setup-linux.bash | bash -c + +NO_FAIL2BAN=${1} + +echo "" +echo "" +echo "Checking for" +echo "" +echo " * build-essential" +echo " * rsync" +echo " * wget" +echo " * curl" +echo " * pkg-config" +echo " * node" +echo " * iojs" +echo " * jshint" +echo "" + +echo "updating apt-get..." +sudo bash -c "apt-get update -qq -y < /dev/null" > /dev/null + +# fail2ban +if [ -z "$(which fail2ban-server | grep fail2ban)" ]; then + if [ -z "${NO_FAIL2BAN}" ]; then + echo "installing fail2ban..." + sudo bash -c "apt-get install -qq -y fail2ban < /dev/null" > /dev/null + fi +fi + +# git, wget, curl, build-essential +if [ -z "$(which pkg-config | grep pkg-config)" ] || [ -z "$(which git | grep git)" ] || [ -z "$(which wget | grep wget)" ] || [ -z "$(which curl | grep curl)" ] || [ -z "$(which gcc | grep gcc)" ] || [ -z "$(which rsync | grep rsync)" ] +then + echo "installing git, wget, curl, build-essential, rsync, pkg-config..." + sudo bash -c "apt-get install -qq -y git wget curl build-essential rsync pkg-config < /dev/null" > /dev/null 2>/dev/null +fi diff --git a/setup-min.sh b/setup-min.sh new file mode 100644 index 0000000..6f70f13 --- /dev/null +++ b/setup-min.sh @@ -0,0 +1,226 @@ +#!/bin/bash + +# Installs node.js only (no development dependencies) for both Ubuntu and OS X + +# +# See https://github.com/coolaj86/node-install-script +# + +# curl -fsSL bit.ly/nodejs-min | bash +# wget -nv bit.ly/nodejs-min -O - | bash + +# curl -fsSL https://example.com/setup-min.bash | bash +# wget -nv https://example.com/setup-min.bash -O - | bash + +NODEJS_NAME="node" +NODEJS_BASE_URL="https://nodejs.org" +BASE_URL="https://raw.githubusercontent.com/coolaj86/iojs-install-script/master" +OS="unsupported" +ARCH="" +NODEJS_VER="" +SETUP_FILE="" + +clear + +######################### +# Which OS and version? # +######################### + +if [ "$(uname | grep -i 'Darwin')" ]; then + OSX_VER="$(sw_vers | grep ProductVersion | cut -d':' -f2 | cut -f2)" + OSX_MAJOR="$(echo ${OSX_VER} | cut -d'.' -f1)" + OSX_MINOR="$(echo ${OSX_VER} | cut -d'.' -f2)" + OSX_PATCH="$(echo ${OSX_VER} | cut -d'.' -f3)" + + # + # Major + # + if [ "$OSX_MAJOR" -lt 10 ]; then + echo "unsupported OS X version (os 9-)" + exit 1 + fi + + if [ "$OSX_MAJOR" -gt 10 ]; then + echo "unsupported OS X version (os 11+)" + exit 1 + fi + + # + # Minor + # + if [ "$OSX_MINOR" -le 5 ]; then + echo "unsupported OS X version (os 10.5-)" + exit 1 + fi + + # Snow + if [ "$OSX_MINOR" -eq 6 ]; then + OS='snow' + fi + + # Lion + if [ $OSX_MINOR -eq 7 ]; then + OS='lion' + fi + + # Mountain Lion + if [ "$OSX_MINOR" -eq 8 ]; then + OS='mountain' + fi + + # Mavericks, Yosemite + if [ "$OSX_MINOR" -ge 9 ]; then + OS='mavericks' + fi + + if [ -n "$(sysctl hw | grep 64bit | grep ': 1')" ]; then + ARCH="64" + else + ARCH="32" + fi +elif [ "$(uname | grep -i 'Linux')" ]; then + if [ ! -f "/etc/issue" ]; then + echo "unsupported linux os" + exit 1 + fi + + if [ -n "$(arch | grep 64)" ]; then + ARCH="64" + else + ARCH="32" + fi + + if [ "$(cat /etc/issue | grep -i 'Ubuntu')" ]; then + OS='ubuntu' + elif [ "$(cat /etc/issue | grep -i 'Raspbian')" ]; then + OS='raspbian' + elif [ "$(cat /etc/issue | grep -i 'Fedora')" ]; then + OS='fedora' + fi +else + echo "unsupported unknown os (non-mac, non-linux)" + exit 1 +fi + +case "${OS}" in + fedora) + echo "FEDORA not yet supported (feel free to pull request)" + exit 1 + ;; + ubuntu) + SETUP_FILE="ubuntu" + ;; + raspbian) + SETUP_FILE="ubuntu" + ;; + yosemite) + # mavericks + SETUP_FILE="mavericks" + ;; + mavericks) + SETUP_FILE="mavericks" + ;; + mountain) + echo "Mountain Lion not yet supported (feel free to pull request)" + exit 1 + ;; + lion) + echo "Lion not yet supported (feel free to pull request)" + exit 1 + ;; + snow) + echo "Snow Leopard not yet supported (feel free to pull request)" + exit 1 + ;; + *) + echo "unsupported unknown os ${OS}" + exit 1 + ;; +esac + +####################### +# Download installers # +####################### + +echo "Preparing to install io.js (and common development dependencies) for ${OS}" "${ARCH}" + +INSTALL_FILE="setup-node-${SETUP_FILE}.bash" +if [ ! -e "/tmp/${INSTALL_FILE}" ] +then + if [ -n "$(which curl)" ]; then + curl --silent "${BASE_URL}/${INSTALL_FILE}" \ + -o "/tmp/${INSTALL_FILE}" || echo 'error downloading os setup script' + elif [ -n "$(which wget)" ]; then + wget --quiet "${BASE_URL}/${INSTALL_FILE}" \ + -O "/tmp/${INSTALL_FILE}" || echo 'error downloading os setup script' + else + echo "Found neither 'curl' nor 'wget'. Can't Continue." + exit 1 + fi +fi + +if [ ! -e "/tmp/${INSTALL_FILE}" ] +then + echo "Error Downloading Install File" + exit 1 +fi + +######################### +# Which io.js VERSION ? # +######################### + +if [ -f "/tmp/NODEJS_VER" ]; then + NODEJS_VER=$(cat /tmp/NODEJS_VER | grep v) +elif [ -f "/tmp/IOJS_VER" ]; then + NODEJS_VER=$(cat /tmp/IOJS_VER | grep v) +fi + +if [ -n "$NODEJS_VER" ]; then + NODEJS_VERT=$(echo ${NODEJS_VER} | cut -c 2- | cut -d '.' -f1) + + if [ $NODEJS_VERT -ge 1 ] && [ $NODEJS_VERT -lt 4 ] + then + echo "Selecting io.js instead of node.js for this version (>= 1.0.0 < 4.0.0)" + NODEJS_BASE_URL="https://iojs.org" + NODEJS_NAME="iojs" + fi +fi + +if [ -z "$NODEJS_VER" ]; then + if [ -n "$(which curl)" ]; then + NODEJS_VER=$(curl -fsSL "$NODEJS_BASE_URL/dist/index.tab" | head -2 | tail -1 | cut -f 1) \ + || echo 'error automatically determining current io.js version' + elif [ -n "$(which wget)" ]; then + NODEJS_VER=$(wget --quiet "$NODEJS_BASE_URL/dist/index.tab" -O - | head -2 | tail -1 | cut -f 1) \ + || echo 'error automatically determining current io.js version' + else + echo "Found neither 'curl' nor 'wget'. Can't Continue." + exit 1 + fi +fi + +# +# node +# +if [ -n "$(which node | grep node 2>/dev/null)" ]; then +# node of some version is already installed + if [ "${NODEJS_VER}" == "$(node -v 2>/dev/null)" ]; then + echo node ${NODEJS_VER} is already installed + else + echo "" + echo "HEY, LISTEN:" + echo "" + echo "node.js is already installed as node $(node -v | grep v)" + echo "" + echo "to reinstall please first run: rm $(which node)" + echo "" + fi + + NODEJS_VER="" +fi + +if [ -n "${NODEJS_VER}" ]; then + bash "/tmp/${INSTALL_FILE}" "${NODEJS_VER}" +fi + +echo "" diff --git a/setup-node-mavericks.bash b/setup-node-mavericks.bash new file mode 100644 index 0000000..13388f4 --- /dev/null +++ b/setup-node-mavericks.bash @@ -0,0 +1,24 @@ +NODEJS_VER=${1} +NODEJS_VERT=$(echo ${NODEJS_VER} | cut -c 2- | cut -d '.' -f1) + +NODEJS_NAME="node" +NODEJS_BASE_URL="https://nodejs.org" + + +if [ $NODEJS_VERT -ge 1 ] && [ $NODEJS_VERT -lt 4 ] +then + echo "Selecting io.js instead of node.js for this version (>= 1.0.0 < 4.0.0)" + NODEJS_BASE_URL="https://iojs.org" + NODEJS_NAME="iojs" +fi + +NODEJS_REMOTE="$NODEJS_BASE_URL/dist/${NODEJS_VER}/${NODEJS_NAME}-${NODEJS_VER}.pkg" +NODEJS_PKG="/tmp/${NODEJS_NAME}-${NODEJS_VER}.pkg" + +if [ -n "${NODEJS_VER}" ]; then + echo "installing ${NODEJS_NAME} as ${NODEJS_NAME} ${NODEJS_VER}..." + curl -fsSL "${NODEJS_REMOTE}" -o "${NODEJS_PKG}" + sudo /usr/sbin/installer -pkg "${NODEJS_PKG}" -target / + + sudo chown -R $(whoami) /usr/local 2>/dev/null +fi diff --git a/setup-node-ubuntu.bash b/setup-node-ubuntu.bash new file mode 100644 index 0000000..cd96ffd --- /dev/null +++ b/setup-node-ubuntu.bash @@ -0,0 +1,47 @@ +NODEJS_VER=${1} +NODEJS_VERT=$(echo ${NODEJS_VER} | cut -c 2- | cut -d '.' -f1) + +NODEJS_NAME="node" +NODEJS_BASE_URL="https://nodejs.org" + +if [ $NODEJS_VERT -ge 1 ] && [ $NODEJS_VERT -lt 4 ] +then + echo "Selecting io.js instead of node.js for this version (>= 1.0.0 < 4.0.0)" + NODEJS_BASE_URL="https://iojs.org" + NODEJS_NAME="iojs" +fi + +if [ -n "$(arch | grep 64)" ]; then + ARCH="x64" +elif [ -n "$(arch | grep armv7l)" ]; then + ARCH="armv7l" +elif [ -n "$(arch | grep armv6l)" ]; then + ARCH="armv6l" +else + ARCH="x86" +fi + +NODEJS_REMOTE="${NODEJS_BASE_URL}/dist/${NODEJS_VER}/${NODEJS_NAME}-${NODEJS_VER}-linux-${ARCH}.tar.gz" +NODEJS_LOCAL="/tmp/${NODEJS_NAME}-${NODEJS_VER}-linux-${ARCH}.tar.gz" +NODEJS_UNTAR="/tmp/${NODEJS_NAME}-${NODEJS_VER}-linux-${ARCH}" + +if [ -n "${NODEJS_VER}" ]; then + echo "installing ${NODEJS_NAME} as ${NODEJS_NAME} ${NODEJS_VER}..." + + if [ -n "$(which curl 2>/dev/null)" ]; then + curl -fsSL ${NODEJS_REMOTE} -o ${NODEJS_LOCAL} || echo 'error downloading ${NODEJS_NAME}' + elif [ -n "$(which wget 2>/dev/null)" ]; then + wget --quiet ${NODEJS_REMOTE} -O ${NODEJS_LOCAL} || echo 'error downloading ${NODEJS_NAME}' + else + echo "'wget' and 'curl' are missing. Please run the following command and try again" + echo "\tsudo apt-get install --yes curl wget" + exit 1 + fi + + tar xf ${NODEJS_LOCAL} -C /tmp/ + rm ${NODEJS_UNTAR}/{LICENSE,CHANGELOG.md,README.md} + sudo rsync -a "${NODEJS_UNTAR}/" /usr/local/ + + + sudo chown -R $(whoami) /usr/local +fi diff --git a/setup-ubuntu.bash b/setup-ubuntu.bash deleted file mode 100644 index 695685e..0000000 --- a/setup-ubuntu.bash +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# curl -fsSL https://ldsconnect.org/setup-linux.bash | bash -c - -NODE_VER=${1} - -echo "" -echo "" - -echo "updating apt-get..." -sudo bash -c "apt-get update -qq -y < /dev/null" > /dev/null - -# fail2ban -if [ -z "$(which fail2ban-server | grep fail2ban)" ]; then - echo "installing fail2ban..." - sudo bash -c "apt-get install -qq -y fail2ban < /dev/null" > /dev/null -fi - -# git, wget, curl, build-essential -if [ -z "$(which pkg-config | grep pkg-config)" ] || [ -z "$(which git | grep git)" ] || [ -z "$(which wget | grep wget)" ] || [ -z "$(which curl | grep curl)" ] || [ -z "$(which gcc | grep gcc)" ] || [ -z "$(which rsync | grep rsync)" ] -then - echo "installing git, wget, curl, build-essential, rsync, pkg-config..." - sudo bash -c "apt-get install -qq -y git wget curl build-essential rsync pkg-config < /dev/null" > /dev/null 2>/dev/null -fi - -# node -if [ -n "$(which node | grep node 2>/dev/null)" ]; then - NODE_VER="" - - if [ "${NODE_VER}" == "$(node -v 2>/dev/null)" ]; then - echo node ${NODE_VER} already installed - else - echo "" - echo "HEY, LISTEN:" - echo "node is already installed as $(node -v | grep v)" - echo "" - echo "to reinstall please first run: rm $(which node)" - echo "" - fi -fi - -if [ -n "${NODE_VER}" ]; then - if [ -n "$(arch | grep 64)" ]; then - ARCH="x64" - else - ARCH="x86" - fi - echo "installing node ${NODE_VER}..." - curl -fsSL "http://nodejs.org/dist/${NODE_VER}/node-${NODE_VER}-linux-${ARCH}.tar.gz" \ - -o "/tmp/node-${NODE_VER}-linux-${ARCH}.tar.gz" - pushd /tmp - tar xf /tmp/node-${NODE_VER}-linux-${ARCH}.tar.gz - rm node-${NODE_VER}-linux-x64/{LICENSE,ChangeLog,README.md} - sudo rsync -a "/tmp/node-${NODE_VER}-linux-${ARCH}/" /usr/local/ - sudo chown -R $(whoami) /usr/local -fi diff --git a/setup.bash b/setup.bash index 3f9adfd..393f02c 100644 --- a/setup.bash +++ b/setup.bash @@ -1,27 +1,30 @@ #!/bin/bash +# Installs node.js + dependencies for both Ubuntu and OS X + +# +# See https://github.com/coolaj86/node-install-script +# + # curl -fsSL https://example.com/setup.bash | bash # wget -nv https://example.com/setup.bash -O - | bash -BASE_URL="https://raw.githubusercontent.com/coolaj86/node-install-script/master" - -if [ -n "$(which node 2>/dev/null || false)" ]; then - echo "" - echo "HEY, LISTEN:" - echo "node is already install as $(node -v | grep v)" - echo "" - echo "to reinstall please first run: rm $(which node)" - echo "" -fi - -if [ -f "/tmp/NODE_VER" ]; then - NODE_VER=$(cat /tmp/NODE_VER | grep v) -fi -if [ -z "$NODE_VER" ]; then - NODE_VER="v0.11.14" -fi +NODEJS_NAME="node" +NODEJS_BASE_URL="https://nodejs.org" +BASE_URL="https://raw.githubusercontent.com/coolaj86/iojs-install-script/master" +NO_FAIL2BAN="" OS="unsupported" ARCH="" +NODEJS_VER="" +SETUP_FILE="" + +clear + + + +######################### +# Which OS and version? # +######################### if [ "$(uname | grep -i 'Darwin')" ]; then OSX_VER="$(sw_vers | grep ProductVersion | cut -d':' -f2 | cut -f2)" @@ -75,9 +78,7 @@ if [ "$(uname | grep -i 'Darwin')" ]; then else ARCH="32" fi - elif [ "$(uname | grep -i 'Linux')" ]; then - if [ ! -f "/etc/issue" ]; then echo "unsupported linux os" exit 1 @@ -91,43 +92,45 @@ elif [ "$(uname | grep -i 'Linux')" ]; then if [ "$(cat /etc/issue | grep -i 'Ubuntu')" ]; then OS='ubuntu' + elif [ "$(cat /etc/issue | grep -i 'Raspbian')" ]; then + OS='raspbian' elif [ "$(cat /etc/issue | grep -i 'Fedora')" ]; then OS='fedora' fi - else - echo "unsupported unknown os (non-mac, non-linux)" exit 1 - fi case "${OS}" in fedora) - echo "sudo yum" - echo "wget --quiet ${BASE_URL}/setup-fedora.bash -O /tmp/install-node.bash || echo 'error downloading os setup script'" + echo "FEDORA not yet supported (feel free to pull request)" + exit 1 ;; ubuntu) - wget --quiet "${BASE_URL}/setup-ubuntu.bash" -O /tmp/install-node.bash || echo 'error downloading os setup script' + SETUP_FILE="ubuntu" + ;; + raspbian) + SETUP_FILE="ubuntu" ;; yosemite) # mavericks - curl --silent "${BASE_URL}/setup-mavericks.bash" -o /tmp/install-node.bash || echo 'error downloading os setup script' + SETUP_FILE="mavericks" ;; mavericks) - curl --silent "${BASE_URL}/setup-mavericks.bash" -o /tmp/install-node.bash || echo 'error downloading os setup script' + SETUP_FILE="mavericks" ;; mountain) - echo "wget cltools" - echo "curl --silent ${BASE_URL}/setup-mountain.bash -o /tmp/install-node.bash || echo 'error downloading os setup script'" + echo "Mountain Lion not yet supported (feel free to pull request)" + exit 1 ;; lion) - echo "wget cltools" - echo "curl --silent ${BASE_URL}/setup-lion.bash -o /tmp/install-node.bash || echo 'error downloading os setup script'" + echo "Lion not yet supported (feel free to pull request)" + exit 1 ;; snow) - echo "wget gcc-0.6.pkg" - echo "curl --silent ${BASE_URL}/setup-snow.bash -o /tmp/install-node.bash || echo 'error downloading os setup script'" + echo "Snow Leopard not yet supported (feel free to pull request)" + exit 1 ;; *) echo "unsupported unknown os ${OS}" @@ -135,15 +138,144 @@ case "${OS}" in ;; esac -echo "${OS}" "${ARCH}" -bash /tmp/install-node.bash "${NODE_VER}" + + + +####################### +# Download installers # +####################### + +echo "Preparing to install ${NODEJS_NAME} (and common development dependencies) for ${OS}" "${ARCH}" + +INSTALL_DEPS_FILE="setup-deps-${SETUP_FILE}.bash" +INSTALL_FILE="setup-node-${SETUP_FILE}.bash" +if [ ! -e "/tmp/${INSTALL_DEPS_FILE}" ] +then + if [ -n "$(which curl)" ]; then + curl --silent "${BASE_URL}/${INSTALL_DEPS_FILE}" \ + -o "/tmp/${INSTALL_DEPS_FILE}" || echo 'error downloading os deps script: '"${BASE_URL}/${INSTALL_DEPS_FILE}" + curl --silent "${BASE_URL}/${INSTALL_FILE}" \ + -o "/tmp/${INSTALL_FILE}" || echo 'error downloading os setup script: '"${BASE_URL}/${INSTALL_FILE}" + elif [ -n "$(which wget)" ]; then + wget --quiet "${BASE_URL}/${INSTALL_DEPS_FILE}" \ + -O "/tmp/${INSTALL_DEPS_FILE}" || echo 'error downloading os deps script: '"${BASE_URL}/${INSTALL_DEPS_FILE}" + wget --quiet "${BASE_URL}/${INSTALL_FILE}" \ + -O "/tmp/${INSTALL_FILE}" || echo 'error downloading os setup script: '"${BASE_URL}/${INSTALL_FILE}" + else + echo "Found neither 'curl' nor 'wget'. Can't Continue." + exit 1 + fi +fi + +if [ ! -e "/tmp/${INSTALL_DEPS_FILE}" ] +then + echo "Error Downloading Install File" + exit 1 +fi + + +################ +# DEPENDENCIES # +################ + +if [ -z "$(which fail2ban-server | grep fail2ban)" ]; then + echo "" + echo "Your server didn't come with fail2ban preinstalled!!!" + echo "Among other things, fail2ban secures ssh so that your server isn't reaped by botnets." + echo "" + echo "Since you're obviosly connecting this computer to a network, you should install fail2ban before continuing" + echo "" + echo "Install fail2ban? [Y/n]" + echo "(if unsure, just hit [enter])" + read INSTALL_FAIL2BAN + + if [ "n" == "${INSTALL_FAIL2BAN}" ] || [ "no" == "${INSTALL_FAIL2BAN}" ] || [ "N" == "${INSTALL_FAIL2BAN}" ] || [ "NO" == "${INSTALL_FAIL2BAN}" ]; then + echo "" + echo "I don't think you understand: This is important." + echo "" + echo "Your server will be under constant attack by botnets via ssh." + echo "It only takes a few extra seconds to install and the defaults are adequate for protecting you." + echo "" + echo "Change your mind?" + echo "Ready to install fail2ban? [Y/n]" + read INSTALL_FAIL2BAN + if [ "n" == "${INSTALL_FAIL2BAN}" ] || [ "no" == "${INSTALL_FAIL2BAN}" ] || [ "N" == "${INSTALL_FAIL2BAN}" ] || [ "NO" == "${INSTALL_FAIL2BAN}" ]; then + clear + echo "you make me sad :-(" + sleep 0.5 + echo "but whatever, it's your funeral..." + sleep 1 + NO_FAIL2BAN="nope" + else + echo "Phew, dodged the bullet on that one... Will install fail2ban.. :-)" + fi + fi +fi + +bash "/tmp/${INSTALL_DEPS_FILE}" "${NO_FAIL2BAN}" + +######################### +# Which node.js VERSION ? # +######################### + +if [ -f "/tmp/NODEJS_VER" ]; then + NODEJS_VER=$(cat /tmp/NODEJS_VER | grep v) +elif [ -f "/tmp/IOJS_VER" ]; then + NODEJS_VER=$(cat /tmp/IOJS_VER | grep v) +fi + +if [ -n "$NODEJS_VER" ]; then + NODEJS_VERT=$(echo ${NODEJS_VER} | cut -c 2- | cut -d '.' -f1) + + if [ $NODEJS_VERT -ge 1 ] && [ $NODEJS_VERT -lt 4 ] + then + echo "Selecting io.js instead of node.js for this version (>= 1.0.0 < 4.0.0)" + NODEJS_BASE_URL="https://iojs.org" + NODEJS_NAME="iojs" + fi +fi + +if [ -z "$NODEJS_VER" ]; then + if [ -n "$(which curl)" ]; then + NODEJS_VER=$(curl -fsSL "$NODEJS_BASE_URL/dist/index.tab" | head -2 | tail -1 | cut -f 1) \ + || echo "error automatically determining current ${NODEJS_NAME} version" + elif [ -n "$(which wget)" ]; then + NODEJS_VER=$(wget --quiet "$NODEJS_BASE_URL/dist/index.tab" -O - | head -2 | tail -1 | cut -f 1) \ + || echo "error automatically determining current ${NODEJS_NAME} version" + else + echo "Found neither 'curl' nor 'wget'. Can't Continue." + exit 1 + fi +fi + +# +# node +# +if [ -n "$(which node | grep node 2>/dev/null)" ]; then +# node of some version is already installed + if [ "${NODEJS_VER}" == "$(node -v 2>/dev/null)" ]; then + echo node ${NODEJS_VER} is already installed + else + echo "" + echo "HEY, LISTEN:" + echo "" + echo "node.js is already installed as node $(node -v | grep v)" + echo "" + echo "to reinstall please first run: rm $(which node)" + echo "" + fi + + NODEJS_VER="" +fi + +if [ -n "${NODEJS_VER}" ]; then + bash "/tmp/${INSTALL_FILE}" "${NODEJS_VER}" +fi # jshint if [ -z "$(which jshint | grep jshint)" ]; then echo "installing jshint..." npm install --silent jshint -g > /dev/null -else - echo "jshint already installed" fi echo ""