#!/bin/bash

set -e

# Define some colours
BOLD="[1m"
FBLK="[30m"
FRED="[31m"
FGRN="[32m"
FYLW="[33m"
FBLU="[34m"
FPPL="[35m"
FCYN="[36m"
FWHT="[37m"
F_ORANGE="[38;5;178m"
F_ORANGE2="[38;5;172m"
F_PURPLE="[38;5;090m"
F_TEAL="[38;5;024m"
F_SEA="[38;5;026m"
F_YELLOW="[38;5;178m"
F_GREEN="[38;5;041m"
F_GREEN2="[38;5;034m"
F_RED="[38;5;196m"
F_CYAN="[38;5;038m"
F_DARKBLUE="[38;5;018m"
F_DARKPURPLE="[38;5;053m"
F_PURPLE="[38;5;129m"
F_DARKGREY="[38;5;233m"
F_MIDGREY="[38;5;236m"
F_MIDGREY2="[38;5;243m"
F_BLUE="[38;5;019m"
F_LIGHTBLUE="[38;5;039m"
F_GOLD="[38;5;220m"
F_LIGHTCYAN="[38;5;195m"
F_LIGHTYELLOW="[38;5;230m"
B_DARKBLUE="[48;5;017m"
F_BRIGHTYELLOW="[38;5;226m"
F_DARKGREY="[38;5;241m"
F_BRIGHTGREEN="[38;5;118m"
F_BRIGHTORANGE="[38;5;214m"
F_MIDGREEN="[38;5;112m"
F_PINK="[38;5;198m"
F_BRIGHTPINK="[38;5;219m"
F_VIOLET="[38;5;177m"
F_DARKRED="[38;5;161m"
F_STEEL="[38;5;81m"
CLR="[0m"
BRED="[41m"
BGRN="[42m"

#ARROW="►"
ARROW=">"
PRIMARY_COLOUR="${F_BRIGHTYELLOW}"
COLON="${F_DARKGREY}:${CLR}"
NA="${F_DARKGREY}N/A${CLR}"

section() {
  TITLE="$1"
  TEXT="$2"

  #ARROW_COLOUR="${F_LIGHTYELLOW}"
  ARROW_COLOUR="[38;5;113m"
  TITLE_COLOUR="${F_LIGHTCYAN}"

  echo " ${ARROW_COLOUR}${ARROW}${CLR} ${TITLE_COLOUR}${TITLE}${CLR}|${TEXT}"
}

subsection() {
  TEXT="$1"

  echo "   ${F_DARKGREY}>${CLR}|${TEXT}"
}

format() {
  COLOUR="$1"
  TEXT="$2"

  echo "${COLOUR}${TEXT}${CLR}"
}

in_brackets() {
  TEXT="$1"

  echo "${F_DARKGREY}(${CLR}${TEXT}${F_DARKGREY})${CLR}"
}

prefix() {
  COLOUR="$1"
  PREFIX="$2"
  TEXT="$3"

  echo "${COLOUR}${PREFIX}${COLON} ${TEXT}"
}

show_hostname() {
  HOSTNAME="$(format ${F_BRIGHTYELLOW} $(hostname -f))"
  section "Host" "${HOSTNAME}"
}

show_os() {
  OS_DESCRIPTION=$(lsb_release -s -d)

  COLOUR_1=${F_BRIGHTORANGE}
  COLOUR_2=${F_ORANGE2}
  COLOUR_3=${F_ORANGE}

  DESCRIPTION=$(format ${COLOUR_1} "${OS_DESCRIPTION}")
  RELEASE=$(format ${COLOUR_2} "$(lsb_release -s -r)")
  CODENAME=$(format ${COLOUR_2} "$(lsb_release -s -c)")
  KERNEL=$(format ${COLOUR_2} "$(uname -r)")
  ARCH=$(format ${COLOUR_2} "$(uname -m)")

  OS_RELEASE=$(prefix ${COLOUR_3} Release "${RELEASE}")
  OS_CODENAME=$(in_brackets ${CODENAME})
  OS_KERNEL=$(prefix ${COLOUR_3} "Kernel " "${KERNEL}")
  OS_ARCH=$(in_brackets ${ARCH})
  
  section "OS" "${DESCRIPTION}"
  subsection "${OS_RELEASE} ${OS_CODENAME}"
  subsection "${OS_KERNEL} ${OS_ARCH}"
}

show_net() {
  INET_DEFAULT=$(ip ro show default | grep -Po "dev \w+" | head -n1 | awk '{ print $2 }')
  INET6_DEFAULT=$(ip -6 ro show default | grep -Po "dev \w+" | head -n1 | awk '{ print $2 }')

  MAC_ADDR=$(ip addr show dev ${INET_DEFAULT} | grep "link/ether" | awk '{ print $2 }')
  INET_ADDR=$(ip addr show dev ${INET_DEFAULT} | grep "inet " | grep "scope global" | awk '{ print $2 }' | head -n1)
  INET6_ADDR=$(ip addr show dev ${INET6_DEFAULT} | grep "inet6 " | grep "scope global" | awk '{ print $2 }' | head -n1)

  if [[ -z ${INET6_ADDR} ]]; then
    INET6_ADDR=${NA}
  fi

  PRIMARY_IFACE="$(format ${F_LIGHTBLUE} ${INET_DEFAULT})"
  PRIMARY_IP4="$(format ${F_LIGHTBLUE} ${INET_ADDR})"
  PRIMARY_IP6="$(format ${F_LIGHTBLUE} ${INET6_ADDR})"
  PRIMARY_MAC="$(format ${F_LIGHTBLUE} ${MAC_ADDR})"

  PRIMARY="$(prefix ${F_STEEL} NIC ${PRIMARY_IFACE})"
  MAC="$(in_brackets ${PRIMARY_MAC})"

  section "Net" "${PRIMARY} ${MAC}"
  subsection "$(prefix ${F_STEEL} IP4 ${PRIMARY_IP4})"
  subsection "$(prefix ${F_STEEL} IP6 ${PRIMARY_IP6})"
}

show_hardware() {
  if [[ "$(lsb_release -i)" =~ "Raspbian" ]]; then
    SYSINFO="$(pinout | egrep -o '(Pi Model [0-9][A-Z]\+?\s? V[0-9]\.[0-9])')"

    SYSTEM=$(format ${F_VIOLET} "${SYSINFO}")
  else
    MANUFACTURER=$(dmidecode -s system-manufacturer)
    PRODUCT_NAME=$(dmidecode -s system-product-name)

    SYSINFO=$(format ${F_VIOLET} "${MANUFACTURER}")

    if [[ -z ${MANUFACTURER} ]]; then
      SYSTEM=${NA}
    else
      if [[ ! -z ${PRODUCT_NAME} ]]; then
        PRODUCT=$(format ${F_VIOLET} "${PRODUCT_NAME}")
        PRODUCT_DISPLAY=$(in_brackets "${PRODUCT}")
        SYSINFO="${SYSINFO} ${PRODUCT_DISPLAY}"
      fi

      SYSTEM=$(format ${F_VIOLET} "${SYSINFO}")
    fi
  fi

  MEM_B=$(cat /proc/meminfo | grep MemTotal | awk '{ print $2 }')
  let MEM_MB="${MEM_B}/1024"
  MEMORY=$(format ${F_VIOLET} "${MEM_MB}M")

  PROCESSOR=$(format ${F_VIOLET} "$(cat /proc/cpuinfo | grep 'model name' | head -n1 | awk -F': ' '{ print $2 }')")
  CPUS=$(in_brackets $(format ${F_VIOLET} x$(cat /proc/cpuinfo | grep processor | wc -l)))

  DISKS=$(lsblk | grep disk | awk '{ print $1"|"$4 }')

  STORAGE=""

  for DISK in ${DISKS}; do
    DEVICE=$(format ${F_VIOLET} $(echo ${DISK} | cut -f1 -d"|"))
    SIZE=$(in_brackets $(format ${F_VIOLET} $(echo ${DISK} | cut -f2 -d"|")))

    STORAGE="${STORAGE}${DEVICE} ${SIZE} "
  done

  if [[ -z ${STORAGE} ]]; then
    STORAGE=${NA}
  fi

  SYS=$(prefix ${F_BRIGHTPINK} Sys "${SYSTEM}")
  CPU=$(prefix ${F_BRIGHTPINK} CPU "${PROCESSOR} ${CPUS}")
  MEM=$(prefix ${F_BRIGHTPINK} Mem "${MEMORY}")
  DSK=$(prefix ${F_BRIGHTPINK} Disk "${STORAGE}")

  section "H/w" "${SYS}"
  subsection "${CPU}"
  subsection "${MEM}  ${DSK}"
}

show_uptime() {
  COLOUR_1=${F_BRIGHTGREEN}
  COLOUR_2=${F_GREEN2}
  COLOUR_3=${F_GREEN}

  AGO=$(format ${COLOUR_1} "$(uptime -p | cut -c4-)")
  BOOT=$(format ${COLOUR_2} "$(uptime -s)")
  BUILT=$(format ${COLOUR_2} "$(stat / | grep "Birth" | sed 's/Birth: //g' | cut -b 2-20)")
  BOOT_DATE=$(prefix ${COLOUR_3} Booted "${BOOT}")
  BUILT_DATE=$(prefix ${COLOUR_3} "Built " "${BUILT}")

  section "Up" "${AGO}"
  subsection "${BOOT_DATE}"
  subsection "${BUILT_DATE}"
}

sections() {
  show_hostname
  show_os
  show_uptime
  show_net
  show_hardware
}

cat <<EOF

 [38;5;235m--[38;5;033mSystem[38;5;235m----------------------------------------------------------------------[0m
$(sections | column -t -s "|")

EOF
