#!/bin/bash
set -o errexit

# N4IRS 10/14/2020

################################################
#                                              #
#         Collect data from the host           #
# The purpose of this script is to figure out  #
# the type of system running. These routines   #
# can be used in other scripts to control      #
# script processing                            #
#                                              #
################################################
#
# Functions must be defined before they are used

# Data sources
# /proc/cpuinfo
# uname
# lsb_release
# /proc/device-tree
# /sys/class/thermal/thermal_zone0/temp
# /sys/firmware/devicetree/base/model?
# add hardware MAC?

# Need to verify programs used are installed
# bc

###################################################
SCRIPT_VERSION="Host information script v .1.6.0" #
SCRIPT_AUTHOR="N4IRS"                             #
SCRIPT_DATE="10/27/2020"                          #
###################################################

echo
echo $SCRIPT_VERSION $SCRIPT_DATE

if [ "$1" != "" ]; then
    case $1 in
        -v|-V|--version) echo $SCRIPT_VERSION; exit 0 ;;
        -a|-A|--author) echo $SCRIPT_AUTHOR; exit 0 ;;
        -d|-D|--date) echo $SCRIPT_DATE; exit 0 ;;
          *) echo "Unknown parameter passed: $1"; exit 1 ;;
    esac
fi

function get_pi_version() {
  declare -r REVCODE=$(awk '/Revision/ {print $3}' /proc/cpuinfo)
  declare -rA REVISIONS=(
        [0002]="Model B Rev 1.0 (256 MB RAM)"
        [0003]="Model B Rev 1.0 + ECN0001 (256 MB RAM)"
        [0004]="Model B Rev 2.0 (256 MB RAM)"
        [0005]="Model B Rev 2.0 (256 MB RAM)"
        [0006]="Model B Rev 2.0 (256 MB RAM)"
        [0007]="Model A Mounting holes (256 MB RAM)"
        [0008]="Model A Mounting holes (256 MB RAM)"
        [0009]="Model A Mounting holes (256 MB RAM)"
        [000d]="Model B Rev 2.0 (512 MB RAM)"
        [000e]="Model B Rev 2.0 (512 MB RAM)"
        [000f]="Model B Rev 2.0 (512 MB RAM)"
        [0010]="Model B+ Rev 1.0 (512 MB RAM)"
        [0011]="Compute Module 1 Rev 1.0 (512 MB RAM)"
        [0012]="Model A+ Rev 1.1 (256 MB RAM)"
        [0013]="Model B+ Rev 1.2 (512 MB RAM)"
        [0014]="Compute Module 1 Rev 1.0 (512 MB RAM)"
        [0015]="Model A+ Rev 1.1 256 MB or 512 MB RAM"
        [900021]="Model A+ Rev 1.1 (512 MB RAM)"
        [900032]="Model B+ Rev 1.2 (512 MB RAM)"
        [900092]="Zero Rev 1.2 (512 MB RAM)"
        [900093]="Zero Rev 1.3 (512 MB RAM)"
        [9000c1]="Zero W Rev 1.1 (512 MB RAM)"
        [9020e0]="3 Model A+ (512 MB RAM)"
        [920092]="Zero Rev 1.2 (512 MB RAM)"
        [920093]="Zero Rev 1.3 (512 MB RAM)"
        [900061]="Compute Module 1 Rev 1.1"
        [a01040]="2 Model B (1 GB RAM)"
        [a01041]="2 Model B (1 GB RAM)"
        [a02082]="3 Model B (1 GB RAM)"
        [a020a0]="Compute Module 3 Rev 1.0 (1 GB RAM)"
        [a020d3]="3 Model B+ (1 GB RAM)"
        [a21041]="2 Model B (1 GB RAM)"
        [a22042]="2 Model B (1 GB RAM)"
        [a22082]="3 Model B (1 GB RAM)"
        [a220a0]="Compute Module 3 Rev 1.0 (1 GB RAM)"
        [a32082]="3 Model B (1 GB RAM)"
        [a52082]="3 Model B (1 GB RAM)"
        [a22083]="3 Model B (1 GB RAM)"
        [a02100]="Compute Module 3+ Rev 1.0 (1 GB RAM)"
        [a03111]="4 Model B (1 GB RAM)"
        [b03111]="4 Model B (2 GB RAM)"
        [c03111]="4 Model B (4 GB RAM)"
        [b03112]="4 Model B Rev 1.2 (2 GB RAM)"
        [c03112]="4 Model B Rev 1.2 (4 GB RAM)"
        [d03114]="4 Model B Rev 1.4 (8 GB RAM)"
  )
RPI_REVCODE=${REVCODE}
RPI_REVISION=${REVISIONS[${REVCODE}]}
}

# Collect system info

cache_uname() {
    uname_kernel_name="$(uname -s)"
    uname_nodename="$(uname -n)"
    uname_kernel_release="$(uname -r)"
    uname_kernel_version="$(uname -v)"
    uname_machine="$(uname -m)"
    uname_operating_system="$(uname -o)"
}

get_cpuinfo_prop () {
  target_line=$(grep -m1 ^"$1" /proc/cpuinfo || true)
  cpuinfo_prop="${target_line##*: }"
}

command_exists () {
    type "$1" &> /dev/null ;
}

function echo2() {
   if [ -n "$2" ]
   then
      echo "$1" "$2" "$3" | xargs
   fi
}

# Process LSB results if available
if command_exists lsb_release ; then
        lsb_id=$(lsb_release -is)
        lsb_release=$(lsb_release -rs)
        lsb_codename=$(lsb_release -cs)
fi

# Process Device Tree results if available
if [[ -d "/proc/device-tree" && ! -L " /proc/device-tree" ]] ; then
        [ -f "/proc/device-tree/model" ] && DEVTREE_MODEL=$(tr -d '\0' </proc/device-tree/model)
        [ -f "/proc/device-tree/compatible" ] && DEVTREE_COMPATABLE=$(tr -d '\0' </proc/device-tree/compatible)
        [ -f "/proc/device-tree/serial" ] && DEVTREE_SERIAL=$(tr -d '\0' </proc/device-tree/serial)
fi

# Process /proc/cpuinfo results
get_cpuinfo_prop "model name" ; CPUINFO_MODEL=$cpuinfo_prop
get_cpuinfo_prop "Hardware" ; CPUINFO_HARDWARE=$cpuinfo_prop
get_cpuinfo_prop "Revision" ; CPUINFO_REVISION=$cpuinfo_prop
get_cpuinfo_prop "Serial" ; CPUINFO_SERIAL=$cpuinfo_prop

# Process uname results
cache_uname

# Process current stats
FREE_MEM=$(free -m | awk 'NR==2{printf "%s MB used of %s MB (%.2f%%)\n", $3,$2,$3*100/$2 }')
DISK_USED=$(df -h | awk '$NF=="/"{printf "%d GB used of %d GB (%s)\n", $3,$2,$5}')
CPU_LOAD=$(top -bn1 | grep load | awk '{printf "%.2f\n", $(NF-2)}')

if [ -f /sys/class/thermal/thermal_zone0/temp ] ; then
	if command_exists bc ; then
		cpu=$(</sys/class/thermal/thermal_zone0/temp)
		cpu=$(echo "$cpu / 100 * 0.1" | bc)
		cpuf=$(echo "(1.8 * $cpu) + 32" | bc)
		TEMPERATURE="$cpu C ($cpuf F)"
	fi
fi

ARCHITECURE=$(dpkg --print-architecture)

# Process getconf results if available
if command_exists getconf ; then
        getconf_long_bit=$(getconf LONG_BIT)
fi

HOSTNAME=$(hostname)

# FTDI Latency Timer Note: This needs work
filename="/sys/bus/usb-serial/devices/ttyUSB0/latency_timer"
if [ -a "$filename" ]
then
        serial_latency=$(cat $filename)
fi

# Get internal / external IP
INTERNAL=`ip a | grep glo | awk '{print $2}' | head -1 | cut -f1 -d/`
EXTERNAL=`wget -q -T5 -O - http://icanhazip.com/ | tail`
MAC=`cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address`

# Determine type of system

# Get Armbian info if available
if [ -f /etc/armbian-release ]
then
        source /etc/armbian-release
        system_type=Armbian
	# cat /run/machine.id
fi

# Get TI Debian if info available
if [ -f /boot/SOC.sh ]
then
        source /boot/SOC.sh
        system_type=TI_Debian
fi

# Get Raspberry Pi info if available
if [[ $DEVTREE_MODEL =~ .*Raspberry.* ]]
then
        get_pi_version
        system_type="Raspberry Pi"
	IMG_DATE=$(awk '/reference/ {print $5}' /etc/rpi-issue)
fi

# Get Intel / AMD info if available
if [ $uname_machine == "x86_64" ] || [ $uname_machine == "i686" ]
then
        system_type=Intel-AMD
fi

# system_type=unknown
echo ""

# Display results

# if [[ $system_type == unknown ]]
# then
        echo "=== $system_type ==="
	echo2 "Raspberry Pi" "$RPI_REVISION" "($RPI_REVCODE)"

        echo2 "Device Tree model =" "$DEVTREE_MODEL"
        echo2 "Device Tree compatable =" "$DEVTREE_COMPATABLE"
        echo2 "Device Tree serial number =" "$DEVTREE_SERIAL"
        echo2 "Node name =" "$uname_nodename"
        echo2 "Host name =" "$HOSTNAME"
        echo2 "Machine =" "$uname_machine"
        # echo ""
        echo2 "CPU model =" "$CPUINFO_MODEL"
        echo2 "CPU hardware =" "$CPUINFO_HARDWARE"
        echo2 "CPU revision =" "$CPUINFO_REVISION"
        echo2 "CPU serial =" "$CPUINFO_SERIAL"
	# echo ""
        echo2 "Board =" "$BOARD"
        echo2 "Board name =" "$BOARD_NAME"
        echo2 "Board family =" "$BOARDFAMILY"
        echo2 "Version =" "$VERSION"
        echo2 "Linux family =" "$LINUXFAMILY"
        echo2 "Branch =" "$BRANCH"
        echo2 "ARCH =" "$ARCH"
	# echo ""
        echo2 "format =" "$format"
        echo2 "bootloader_location =" "$bootloader_location"
        echo2 "boot_fstype =" "$boot_fstype"
        echo2 "serial tty =" "$serial_tty"
        echo2 "usbnet mem =" "$usbnet_mem"
	# echo ""
        echo2 "Operating system =" "$uname_operating_system"
        echo2 "ID =" "$lsb_id"
        echo2 "Release =" "$lsb_release"
        echo2 "Codename =" "$lsb_codename"
	echo2 "Debian package architecture =" "$ARCHITECURE"
	echo2 "Image date =" "$IMG_DATE"
        # echo ""
        echo2 "Kernel name =" "$uname_kernel_name"
        echo2 "Kernel release =" "$uname_kernel_release"
        echo2 "Kernel version =" "$uname_kernel_version"
	echo2 "Data width (bits) =" "$getconf_long_bit"
        # echo ""
        echo2 "Memory =" "$FREE_MEM"
        echo2 "Disk =" "$DISK_USED"
        echo2 "CPU load =" "$CPU_LOAD"
	echo2 "Temperature =" "$TEMPERATURE"
        echo2 "FTDI latency timer =" "$serial_latency"
	echo2 "IP Address =" "Internal: $INTERNAL  MAC Address: $MAC"
	# echo

# fi

# lshw
# lscpu
# dmidecode
# inxi
# https://github.com/dylanaraps/neofetch/blob/master/neofetch

# root@dvswitch-server:/home/dvswitch# cat /etc/rpi-issue
# Raspberry Pi reference 2020-09-05

# awk '{if(NR==1) print $0}' /etc/rpi-issue
