#!/bin/bash ############################################################################## # THIS IS THE PINTO INSTALLER # # This bash script will install pinto as a standalone application. # # By default, pinto and all of its dependencies will be built into the # ~/opt/local/pinto directory. You can change this location by setting the # PINTO_HOME environment variable before running this script. # # The purpose of a standalone installation is to isolate pinto from whatever # other Perl modules you may have in your environment. So if you ever upgrade # or change those modules, pinto will not be affected. Nor does installing # pinto affect any of the modules your other apps are using. # # The most common way to run this installer is like this: # # curl -L http://getpinto.stratopan.com | bash # # Or if you prefer to use wget then run this command: # # wget -O - http://getpinto.stratopan.com | bash # # After a succesful installation, you'll be instructed on how to amend your # ~/.profile (or ~/.bashrc, or whatever you prefer) so that pinto runs # naturally in your everyday shell environment. # # All the depndencies for pinto come from a curated repository hosted at # http://stratopan.com. That repository contains specific versions of all # the modules that pinto needs. So those may not be the latest versions, # but they are versions that I know will work (and that's the whole point # of having a pinto repository anyway). # # If this installer doesn't work for you, then you can fallback to installing # the App::Pinto module from CPAN. Again, cpanm(1) is really excellent for # that, but you can use cpan(1) too. When installing from CPAN, you'll be # getting the versions of modules that are in the CPAN index at that moment, # which may or may not be 100% compatible with pinto (usually they are, but # you never know). # # CONFIGURATION # # The following environment variables can be used to control the installation: # # PINTO_HOME # # Sets the directory where pinto will be installed. # Defaults to $HOME/opt/local/pinto # # PINTO_REPO_URL # # Sets the URL of the repository that provides pinto's dependencies # Defaults to https://www.stratopan.com/thaljef/OpenSource/pinto-release # # PINTO_INSTALLER_AGENT # # Sets the name of the tool that will be used to fetch cpanm. If set, # it must be either 'curl' or 'wget'. If not set, the installer will # fallback to either 'curl' or 'wget' (in that order) depending on what # you already have installed. # # PERL_CPANM_OPT # # Sets the default options for cpanm, which is used to install pinto. This # can be useful if you need to specify a certain agent such as lwp, curl, # or wget. See https://metacpan.org/module/cpanm for more details. # # Copyright 2013 Jeffrey Ryan Thalhammer # ############################################################################## set -ue #----------------------------------------------------------------------------- # You can set these variables beforehand to override defaults PINTO_REPO_URL=${PINTO_REPO_URL:="https://www.stratopan.com/thaljef/OpenSource/pinto-release"} PINTO_HOME=${PINTO_HOME:="$HOME/opt/local/pinto"} #----------------------------------------------------------------------------- # Decide which agent to use. Set PINTO_INSTALLER_AGENT to override if [ -z ${PINTO_INSTALLER_AGENT:-} ]; then if type curl > /dev/null 2>&1; then PINTO_INSTALLER_AGENT='curl' elif type wget > /dev/null 2>&1; then PINTO_INSTALLER_AGENT='wget' else echo "Must have curl or wget to install pinto" exit 1 fi fi #----------------------------------------------------------------------------- # Bootstrap cpanm PINTO_CPANM_URL=${PINTO_CPANM_URL:="https://raw.githubusercontent.com/thaljef/Pinto/master/etc/cpanm"} PINTO_SBIN="$PINTO_HOME/sbin" PINTO_CPANM_EXE="$PINTO_SBIN/cpanm" mkdir -p "$PINTO_SBIN" if [ $PINTO_INSTALLER_AGENT = 'curl' ]; then curl --silent --show-error --location $PINTO_CPANM_URL > "$PINTO_CPANM_EXE" elif [ $PINTO_INSTALLER_AGENT = 'wget' ]; then wget --no-verbose --output-document - $PINTO_CPANM_URL > "$PINTO_CPANM_EXE" else echo "Invalid PINTO_INSTALLER_AGENT ($PINTO_INSTALLER_AGENT)." echo "If set, PINTO_INSTALLER_AGENT must be 'curl' or 'wget'". exit 1; fi chmod 755 "$PINTO_CPANM_EXE" #----------------------------------------------------------------------------- # Do installation echo "Installing pinto into $PINTO_HOME" # Workaround for removal of "." from @INC in perl 5.26.0 export PERL_USE_UNSAFE_INC=1 "$PINTO_CPANM_EXE" --notest --quiet --mirror $PINTO_REPO_URL --mirror-only \ --local-lib-contained "$PINTO_HOME" --man-pages Pinto # TODO: send the build log and `perl -V` back for analysis if [ $? -ne 0 ] ; then echo "Installation failed."; exit 1; fi #----------------------------------------------------------------------------- # Remove scripts and man pages that aren't from pinto (cd "$PINTO_HOME/bin"; ls | grep -iv pinto | xargs rm -f) (cd "$PINTO_HOME/man/man1"; ls | grep -iv pinto | xargs rm -f) (cd "$PINTO_HOME/man/man3"; ls | grep -iv pinto | xargs rm -f) #----------------------------------------------------------------------------- # Create the etc/ directory PINTO_ETC="$PINTO_HOME/etc" mkdir -p "$PINTO_ETC" #----------------------------------------------------------------------------- # Write the bash setup file in etc/ PINTO_BASHRC="$PINTO_ETC/bashrc" cat > "$PINTO_BASHRC" <