#!/bin/bash

prerequisites(){
failed=0;
missing="(not found)";
[[ $1 ]] && output=": &&" || output="echo";
$output -e "$w_l  CHECK for binaries\n  ==================\n";

# check for a forgotten and unusable 'upx' and remove this crap
[ -x "$bindir"/upx ] && "$bindir"/upx -V &>/dev/null || rm -f "$bindir"/upx &>/dev/null;

for e in "${binvars[@]}";
do
	if hash "$e" 2>/dev/null; then
		einfo=$(which "$e");
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$w_l  have\t$g_l$e $y_l$einfo";
	else
		failed=1;
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$r_l  need\t$w_l$e $r_l$missing";
	fi;
done;

if hash upx 2>/dev/null; then
	upxversion=($(upx -V | awk 'NR==1 { verok=$2>=3.91; printf "%.2f %i", $2, verok }'));
	$output -n -e "$w_l  have$g_l  upx$y_l\t\t"$w_l"Version$P ${upxversion[0]}";
	if [ ${upxversion[1]} == 1 ]; then
		$output -e "$g_l ok";
	else
		$output -e "$r_l nok";
		failed=1;
	fi
fi

$output -e " \n $w_l CHECK for headers\n  =================\n" ;

for e in "${headervars[@]}";
do
	e1=$(find /usr/include/* | grep -m1 "$e");
	if [ ${#e1} -gt 8 ]; then
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$w_l  have\t$g_l$e$y_l $e1"
	else
		failed=1;
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$r_l  need\t$w_l$e$r_l $missing";
	fi;
done;

$output -e " \n $w_l CHECK for libraries\n  ===================\n" ;

for e in "${libvars[@]}";
do
	e1=$(find /usr/lib* 2>/dev/null | grep -m1 "$e");
	if [ ${#e1} -gt 8 ]; then
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$w_l  have\t$g_l$e$y_l $e1"
	else
		failed=1;
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$r_l  need\t$w_l$e$r_l $missing";
	fi;
done;

if [ "$(uname -m)" == "x86_64" ]; then
	$output -e " \n $w_l CHECK for zlib32\n  ================\n" ;
	e="zlib32";
	e1="/usr/lib/libz.so";
	e2="/usr/lib32/libz.so.1";
	if [ -f $e1 ]; then
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$w_l  have\t$g_l$e$y_l $e1"
	elif [ -f $e2 ]; then
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$w_l  have\t$g_l$e$y_l $e2"
	else
		failed=1;
		printf -v pad %40s; e=$e$pad; e=${e:0:15};
		$output -e "$r_l  need\t$w_l$e$r_l $missing";
	fi
fi

return $failed;
}

# Parameters (all optional):
#   $1: installer name (or "auto")
#   $2: add architecture (not implemented yet)
#
# Example:
#   syscheck debian_os
#     call installer 'debian_os' (Do not care about the actual Linux distribution.)

syscheck(){
[[ $1 ]] && [ "$1" != "auto" ] && override="$1";now=$2;
if [ -d "$osdir" ];then cd "$osdir";x=(*); for i in "${x[@]}";do source "$i"; done fi
binvars=( dialog grep gawk wget tar bzip2 svn xz upx patch gcc make scp sshpass openssl dos2unix );
headervars=( crypto.h libusb.h pcsclite.h pthread.h );
libvars=( libccidtwin.so );
sanity=1;

if ! prerequisites silent || [ "$now" == "now" ]; then
	clear; s3logo;
	prerequisites;
	sanity=0;
	installer="unknown";
	# Debian and Ubuntu
	[ -f /etc/debian_version ] && installer="debian_os";
	# CentOS and Redhat
	[ -f /etc/redhat-release ] && installer="redhat_os";
	# Manjaro (/etc/os-release)
	[ -f /etc/manjaro-release ] && installer="manjaro_os";
	# SuSE (/etc/SuSE-release is depreciated -> check for YaST2)
	[ -d /etc/YaST2 ] && installer="suse_os";
	# Optional override via parameter
	#[[ $override ]] && installer=$override;
	echo -e "\n$w_l  Selected installer:    $P$installer\n";
	if type -t "$installer" >/dev/null; then
		$installer && prerequisites silent && sanity=1;
	else
		echo -e "\n$r_l  Needs manual installation.";
	fi
	echo -e "$re_";
fi

return $sanity;
}
