#!/bin/bash

export LANG=$LANG:C
if [[ "$USER" == "root" ]]; then
	:;
else
	if [[ `command -v sudo` ]]; then
		if [[ $EUID -ne 0 ]]; then
			sudo "$0" "$@"
			exit
		fi
	else
		echo "Please run this as root or with sudo privileges."
		exit 0
	fi
fi

PRESENT=`cat /sys/devices/system/cpu/present`
CPU0=`lscpu | grep "Model name" | sed -n 1p | sed 's/Model name://g' | sed -r '1s/\s+//g'`
CPU0M=`lscpu | grep "CPU max MHz" | sed -n 1p | sed 's/CPU max MHz://g' | sed -r '1s/\s+//g' | sed 's/.0000//g'`
if [[ -f "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq" ]]; then
	sleep .25
	CPU0C=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq | sed 's/...$//');
fi
CPU1=`lscpu | grep "Model name" | sed -n 2p | sed 's/Model name://g' | sed -r '1s/\s+//g'`
CPU1M=`lscpu | grep "CPU max MHz" | sed -n 2p | sed 's/CPU max MHz://g' | sed -r '1s/\s+//g' | sed 's/.0000//g'`
if [[ -f "/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq" ]]; then
	sleep .25
	CPU1C=$(cat /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq | sed 's/...$//');
fi
if [[ -f "/sys/class/thermal/thermal_zone0/temp" ]]; then
	CPU0T=$(cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2);
fi
if [[ -f "/sys/class/thermal/thermal_zone1/temp" ]]; then
	CPU1T=$(cat /sys/class/thermal/thermal_zone1/temp|cut -c1-2);
fi
if [[ `ls /sys/class/hwmon/hwmon*[0-9]*/pwm1` ]] > /dev/null 2>&1; then
	if [[ `ls /sys/class/hwmon/hwmon*[0-9]*/fan1_input` ]] > /dev/null 2>&1 || \
	[[ `ls /sys/class/hwmon/hwmon*[0-9]*/pwm1_enable` ]] > /dev/null 2>&1; then
		FAN="true"
		HWMON=`ls /sys/class/hwmon/hwmon*[0-9]*/pwm1 | grep -ohE 'hwmon[0-9][^ ]' | sed 's/.$//'`
	fi
else
	FAN="false"
fi
if [[ `ls /sys/class/nvme/nvme[0-9]/hwmon[0-9]/temp[0-9]_input` ]] > /dev/null 2>&1; then
	NVME="true"
	NVMET=$(cat /sys/class/nvme/nvme[0-9]/hwmon[0-9]/temp[0-9]_input | cut -c1-2 | sed s/$/°C/ | tr '\n' ' ')
else
	NVME="false"
fi
if [[ `ls /sys/class/scsi_device/[0-9]:[0-9]:[0-9]:[0-9]/device/hwmon/hwmon[0-9]/temp1_input` ]] > /dev/null 2>&1; then
	SSD="true"
	SSDT=$(cat /sys/class/scsi_device/[0-9]:[0-9]:[0-9]:[0-9]/device/hwmon/hwmon[0-9]/temp1_input | cut -c1-2 | sed s/$/°C/ | tr '\n' ' ')
else
	SSD="false"
fi
# functions
count_high (){
echo -en "Processors:  "$CPU0; echo -en " @ $CPU0M"; echo -en "MHz $CPU0T°C"
echo -en "," $CPU1; echo -en " @ $CPU1M"; echo -e "MHz $CPU1T°C"
echo -en "Frequencies: "$CPU0C; echo -en "MHz $CPU1C"; echo -e "MHz"
}

count_low (){
echo -en "Processor:   "$CPU0; echo -en " @ $CPU0M"; echo -e "MHz $CPU0T°C"
echo -en "Frequency:   "$CPU0C; echo -e "MHz"
}

cpu_hwinfo (){
if [[ "$PRESENT" == "0-7" || "$PRESENT" == "0-5" ]]; then
	count_high;
fi
if [[ "$PRESENT" == "0-3" || "$PRESENT" == "0-1" || "$PRESENT" == "0" ]]; then
	count_low;
fi
}

fan_pwr (){
PWM=`cat /sys/class/hwmon/${HWMON}/pwm1`
if [[ `ls /sys/class/hwmon/${HWMON}/fan1_input` ]] > /dev/null 2>&1; then
	RPM=`cat /sys/class/hwmon/${HWMON}/fan1_input`
	echo -e "Fan:         RPM ${RPM}, PWR ${PWM}"
else
	if [[ "$PWM" == "0" ]]; then
		echo -e "Fan:         OFF, PWR ${PWM}"
	else
		echo -e "Fan:         ON, PWR ${PWM}"
	fi
fi
}

run (){
if [[ -f "/proc/device-tree/model" ]]; then
	MODEL=$(tr -d '\0' </proc/device-tree/model)
	echo -en "── $MODEL"
	echo -e " (`uname -r`)"
fi
echo -e "CPU usage:  " `top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
if [[ -f "/sys/devices/system/cpu/present" ]]; then cpu_hwinfo; fi
echo -e "Online:     " $(lscpu | grep -w "On-line CPU(s) list:" | sed "s/On-line CPU(s) list:/ /g" | sed -e "s/\s\{3,\}//g")
if [[ "$FAN" == "true" ]]; then fan_pwr; fi
if [[ "$NVME" == "true" ]]; then echo -e "NVMe:        ${NVMET}"; fi
if [[ "$SSD" == "true" ]]; then echo -e "SSD:         ${SSDT}"; fi
echo -e "Governor:   " $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
echo -e "Memory:     " $(free -h | sed 's/i//g' | sed 's/Mem://g' | awk '{print $1" "$2}' | sed -n 'n;p')
echo -e "Entropy:    " $(cat /proc/sys/kernel/random/entropy_avail)
echo -e "Uptime:     " $(uptime)
}

update_sysinfo (){
if [[ -f "/usr/local/bin/sysinfo" ]]; then
	mv /usr/local/bin/sysinfo /usr/local/bin/sysinfo.orig
	mv /usr/local/bin/smon /usr/local/bin/smon.orig
	wget -cq ${GHURL}/scripts/sysinfo -P /usr/local/bin/
	wget -cq ${GHURL}/scripts/smon -P /usr/local/bin/
	if [ -f /usr/local/bin/sysinfo ]; then
		chmod +x /usr/local/bin/sysinfo
		rm -f /usr/local/bin/sysinfo.orig
		ls -ls /usr/local/bin/sysinfo
	else
		mv /usr/local/bin/sysinfo.orig /usr/local/bin/sysinfo
	fi
	if [[ -f "/usr/local/bin/smon" ]]; then
		chmod +x /usr/local/bin/smon
		rm -f /usr/local/bin/smon.orig
		ls -ls /usr/local/bin/smon
	else
		mv /usr/local/bin/smon.orig /usr/local/bin/smon
	fi
fi
}

update_motd (){
# remove
if [[ -f "/etc/default/dynamic-motd" ]]; then rm -f /etc/default/dynamic-motd; fi
if [[ -f "/etc/update-motd.d/00-header" ]]; then rm -f /etc/update-motd.d/00-header; fi
if [[ -f "/etc/update-motd.d/10-uname" ]]; then rm -f /etc/update-motd.d/10-uname; fi
if [[ -f "/etc/update-motd.d/15-brand" ]]; then rm -f /etc/update-motd.d/15-brand; fi
if [[ -f "/etc/update-motd.d/20-sysinfo" ]]; then rm -f /etc/update-motd.d/20-sysinfo; fi
if [[ -f "/etc/update-motd.d/90-dynamic-motd" ]]; then rm -f /etc/update-motd.d/90-dynamic-motd; fi
# download
wget -cq $GHURL/scripts/00-header -P /etc/update-motd.d/
wget -cq $GHURL/scripts/15-brand -P /etc/update-motd.d/
wget -cq $GHURL/scripts/20-sysinfo -P /etc/update-motd.d/
wget -cq $GHURL/scripts/90-dynamic-motd -P /etc/update-motd.d/
# check
if [[ -f "/etc/update-motd.d/00-header" ]]; then
	chmod +x /etc/update-motd.d/00-header
	ls -ls /etc/update-motd.d/00-header
fi
if [[ -f "/etc/update-motd.d/15-brand" ]]; then
	chmod +x /etc/update-motd.d/15-brand
	ls -ls /etc/update-motd.d/15-brand
fi
if [[ -f "/etc/update-motd.d/20-sysinfo" ]]; then
	chmod +x /etc/update-motd.d/20-sysinfo
	ls -ls /etc/update-motd.d/20-sysinfo
fi
if [[ -f "/etc/update-motd.d/90-dynamic-motd" ]]; then
	chmod +x /etc/update-motd.d/90-dynamic-motd
	ls -ls /etc/update-motd.d/90-dynamic-motd
fi
# default dynamic motd
MOTD=`cat /etc/os-release | grep -w 'NAME=' | sed 's/NAME="//g' | sed 's/"//g' | sed 's/ GNU\/Linux//g'`
sh -c "echo '# DYNAMIC MOTD VARIABLES' > /etc/default/dynamic-motd"
sh -c "echo 'H_POS="'"-c"'"' >> /etc/default/dynamic-motd"
sh -c "echo 'B_POS="'"-r"'"' >> /etc/default/dynamic-motd"
echo BRANDING='"'false'"' | tee -a /etc/default/dynamic-motd
echo MOTD='"'${MOTD} Pi'"' | tee -a /etc/default/dynamic-motd
sh -c "echo 'T_FONT="'"small"'"' >> /etc/default/dynamic-motd"
sh -c "echo 'T_FILTER="'"metal"'"' >> /etc/default/dynamic-motd"
sh -c "echo 'MENUCONFIG="'"false"'"' >> /etc/default/dynamic-motd"
if [[ -f "/etc/default/dynamic-motd" ]]; then ls -ls /etc/default/dynamic-motd; fi
}

if [ $# -eq 0 ]; then
	echo -e "Missing options!"
	echo "(run $0 -h for help)"
	echo ""
	exit 0
fi

while getopts "eruh" OPTION; do
	case $OPTION in

		e)
			nano /etc/default/dynamic-motd
			;;
		r)
			run
			;;
		u)
			if [[ `curl -I https://github.com 2>&1 | grep 'HTTP/2 200'` ]]; then
				GHURL="https://raw.githubusercontent.com/pyavitz/rpi-img-builder/master/files/"
				update_sysinfo;
				update_motd;
			else
				echo -e "Requires a internet connection."
				exit 0;
			fi
			;;
		h)
			echo ""
			echo -e "\t-e\tEdit dynamic motd"
			echo -e "\t-r\tRun script"
			echo ""
			exit 0
			;;
	esac
done
