From 199760b6cceaaf91b727f6f8985111649244a09f Mon Sep 17 00:00:00 2001
From: Marty Kandes <mkandes@sdsc.edu>
Date: Thu, 31 Dec 2020 16:10:23 -0800
Subject: [PATCH] Created new naked-singularity.sh helper script

Created the initial version of the new naked-singularity.sh helper
script. At present, the script only supports a first iteration of the
'install' command, which can be used to install Singularity from source
on a Linux system running either a CentOS or Ubuntu operating system.
---
 README.md            |   4 +-
 log.sh               |  55 ++++++++
 naked-singularity.sh | 309 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 366 insertions(+), 2 deletions(-)
 create mode 100644 log.sh
 create mode 100755 naked-singularity.sh

diff --git a/README.md b/README.md
index 8539912..fe9fdc4 100644
--- a/README.md
+++ b/README.md
@@ -53,8 +53,8 @@ University of California, San Diego
 
 ## Version
 
-1.1.0
+1.2.3
 
 ## Last Updated
 
-Sunday, December 27th, 2020
+Thursday, December 31st, 2020
diff --git a/log.sh b/log.sh
new file mode 100644
index 0000000..24ac853
--- /dev/null
+++ b/log.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+# ======================================================================
+#
+# NAME
+#
+#     log.sh
+#
+# DESCRIPTION
+#
+#     A library of bash functions for writing formatted log messages to
+#     standard output and standard error.
+#
+# USAGE
+#
+#     If you would like to use this library in your bash script, then 
+#     source it at the beginning of your bash script.
+#
+#         source log.sh
+#
+#     Once the library has been sourced, you can call functions from the 
+#     library in your bash script.
+#
+# AUTHOR
+#
+#     Marty Kandes, Ph.D.
+#     Computational & Data Science Research Specialist
+#     High-Performance Computing User Services Group
+#     San Diego Supercomputer Center
+#     University of California, San Diego
+#
+# LAST UPDATED
+#
+#     Monday, December 28th, 2020
+#
+# ----------------------------------------------------------------------
+
+log::output() {
+
+  echo "${@}" >&1
+
+}
+
+log::error() {
+
+  echo "ERROR :: ${@}" >&2
+
+}
+
+log::warning() {
+
+  echo "WARNING :: ${@}" >&2
+
+}
+
+# ======================================================================
diff --git a/naked-singularity.sh b/naked-singularity.sh
new file mode 100755
index 0000000..2823202
--- /dev/null
+++ b/naked-singularity.sh
@@ -0,0 +1,309 @@
+#!/usr/bin/env bash
+# ======================================================================
+# NAME
+#
+#   naked-singularity.sh
+#
+# DESCRIPTION
+#
+#   A bash script to help users work with Singularity on their Linux 
+#   desktop, laptop, or virtual machine.
+#
+# USAGE
+#
+#   Install Singularity from source.
+#
+#     ./naked-singularity.sh install
+#
+# LAST UPDATED
+#
+#   Thursday, December 31st, 2020
+#
+# ----------------------------------------------------------------------
+
+source log.sh
+
+# ----------------------------------------------------------------------
+# naked::install
+#
+#   Install Singularity (from source).
+#
+# Globals:
+#
+#   N/A
+#
+# Arguments:
+#
+#   @
+#
+# Returns:
+#
+#   True (0) if Singularity is installed sucessfully. False (1)
+#   if the installation fails.
+#
+# ----------------------------------------------------------------------
+
+naked::install() {
+
+  local singularity_version='3.5.2'
+  local go_version='1.15.6'
+  local -i use_rpm=1
+
+  local os_release_id=''
+  local os_release_version_id=''
+
+  while (("${#}" > 0)); do
+    case "${1}" in
+      -g | --go )
+        go_version="${2}"
+        shift 2
+        ;;
+      -r | --rpm )
+        use_rpm=0
+        shift 1
+        ;;
+      -s | --singularity )
+        singularity_version="${2}"
+        shift 2
+        ;;
+      *)
+        log::error "Command-line option ${1} not recognized or not supported."
+        return 1
+    esac
+  done
+
+  log::output 'Checking if Singularity is already installed ...'
+  singularity --version > /dev/null 2>&1
+  if [[ "${?}" -eq 0 ]]; then
+    log:error "Singularity is installed: $(singularity --version)"
+    return 1
+  else
+    log::output 'Singularity is not installed.'
+  fi
+
+  log::output 'Parsing /etc/os-release to identify operating system ...'
+  if [[ -f '/etc/os-release' ]]; then
+
+    grep '^ID=' /etc/os-release > /dev/null 2>&1
+    if [[ "${?}" -eq 0 ]]; then
+      grep '^ID=' /etc/os-release | grep '"' > /dev/null 2>&1
+      if [[ "${?}" -eq 0 ]]; then
+        os_release_id="$(grep '^ID=' /etc/os-release | cut -d '"' -f 2)"
+      else
+        os_release_id="$(grep '^ID=' /etc/os-release | cut -d '=' -f 2)"
+      fi
+      log::output "Operating system identified as ${os_release_id}."
+    else
+      log::error '/etc/os-release does not contain ID parameter.'
+      return 1
+    fi
+
+    grep '^VERSION_ID=' /etc/os-release > /dev/null 2>&1
+    if [[ "${?}" -eq 0 ]]; then
+      grep '^VERSION_ID=' /etc/os-release | grep '"' > /dev/null 2>&1
+      if [[ "${?}" -eq 0 ]]; then
+        os_release_version_id="$(grep '^VERSION_ID=' /etc/os-release | cut -d '"' -f 2)"
+      else
+        os_release_version_id="$(grep '^VERSION_ID=' /etc/os-release | cut -d '=' -f 2)"
+      fi
+      log::output "Operating system version identified as ${os_release_version_id}."
+    else
+      log::error '/etc/os-release does not contain VERSION_ID parameter.'
+      return 1
+    fi
+
+  else
+
+    log::error '/etc/os-release does not exist.'
+    return 1
+
+  fi
+
+  if [[ "${os_release_id}" = 'centos' ]]; then
+
+    log::output 'Running yum update ...'
+    sudo yum -y update
+
+    log::output 'Installing Singularity dependencies ...'
+    sudo yum -y groupinstall 'Development Tools'
+    sudo yum -y install epel-release
+    sudo yum -y install openssl-devel
+    sudo yum -y install libuuid-devel
+    sudo yum -y install libseccomp-devel
+    sudo yum -y install wget
+    sudo yum -y install squashfs-tools
+    sudo yum -y install cryptsetup
+
+  elif [[ "${os_release_id}" = 'ubuntu' ]]; then
+
+    log::output 'Running apt-get update ...'
+    sudo apt-get -y update
+
+    log::output 'Installing Singularity dependencies ...'
+    sudo apt-get -y install build-essential
+    sudo apt-get -y install libssl-dev
+    sudo apt-get -y install uuid-dev
+    sudo apt-get -y install libgpgme-dev
+    sudo apt-get -y install squashfs-tools
+    sudo apt-get -y install libseccomp-dev
+    sudo apt-get -y install wget
+    sudo apt-get -y install pkg-config
+    sudo apt-get -y install git
+    sudo apt-get -y install cryptsetup-bin
+
+  else
+
+    log::error 'Operating system not recognized or not supported.'
+    return 1
+
+  fi
+
+  mkdir -p /tmp/go
+  cd /tmp/go
+
+  log::output 'Installing Go ...'
+  export CGO_ENABLED=0
+  wget https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz
+  tar -xf go1.4-bootstrap-20171003.tar.gz
+  mv go 1.4
+  cd 1.4/src
+  ./make.bash
+
+  export GOROOT_BOOTSTRAP='/tmp/go/1.4'
+
+  cd /tmp/go
+
+  export CGO_ENABLED=1
+  git clone https://go.googlesource.com/go "${go_version}"
+  cd "${go_version}"
+  git checkout "go${go_version}"
+  cd src
+  ./all.bash
+
+  export GOROOT="/tmp/go/${go_version}"
+  export PATH="${GOROOT}/bin:${PATH}"
+
+  cd /tmp
+
+  log::output 'Installing Singularity ...'
+  wget "https://github.com/hpcng/singularity/releases/download/v${singularity_version}/singularity-${singularity_version}.tar.gz"
+  tar -xf "singularity-${singularity_version}.tar.gz"
+  cd singularity
+  ./mconfig #--prefix=/opt/singularity
+  make -C ./builddir
+  sudo make -C ./builddir install
+
+  log::output 'Checking if Singularity was installed successully ...'
+  singularity --version
+  if [[ "${?}" -ne 0 ]]; then
+    log::error 'Singularity installation failed!'
+    return 1
+  fi
+
+  log::output 'Singularity was installed successfully!'
+
+  return 0
+
+}
+
+# ----------------------------------------------------------------------
+# naked::help
+#
+#   Prints information on how to use this script to standard output.
+#
+# Globals:
+#
+#   N/A
+#
+# Arguments:
+#
+#   N/A
+#
+# Returns:
+#
+#   True (0) always.
+#
+# ----------------------------------------------------------------------
+
+naked::help() {
+
+  log::output 'USAGE: naked-singularity.sh <command> [options] {value}'
+  log::output ''
+  
+  return 0
+
+}
+
+# ----------------------------------------------------------------------
+# naked::main
+#
+#   Controls the execution of the script.
+#
+# Globals:
+#
+#   @
+#
+# Arguments:
+# 
+#   @
+#
+# Returns:
+#
+#   True (0) if the script executes without issue. False (1) if the 
+#   script fails to executre properly.
+# 
+# ----------------------------------------------------------------------
+
+naked::main() {
+
+  local naked_command=''
+
+  # If at least one command-line argument was provided by the user, 
+  # then start parsing the command-line arguments. Otherwise, throw
+  # an error.
+  if (( "${#}" > 0 )); then
+
+    naked_command="${1}"
+    shift 1
+
+    if [[ "${naked_command}" = 'install' ]]; then
+
+      naked::install "${@}"
+      if [[ "${?}" -ne 0 ]]; then
+        log::error 'Failed to run install command.'
+        exit 1
+      fi
+
+    elif [[ "${naked_command}" = 'help' || \
+            "${naked_command}" = '-h' || \
+            "${naked_command}" = '--help' ]]; then
+
+      naked::help 
+      if [[ "${?}" -ne 0 ]]; then
+        log::error 'Failed to run help command.'
+        exit 1
+      fi
+
+    else
+
+      log::error 'Command not recognized or not supported.'
+      exit 1
+
+    fi
+
+  else
+
+    log::error 'No command-line arguments were provided.'
+    exit 1
+
+  fi
+
+  exit 0
+
+}
+
+# ----------------------------------------------------------------------
+
+naked::main "${@}"
+
+# ======================================================================
-- 
GitLab