#!/bin/sh
# is it virtual?

# vi(1) :se tabstop=4

# give to stdout: virtual, physical, or uknown (and possibly some more details)
# return respectively 0, 1, or 2
# for multiple hosts, exit value is that of last
# if no arguments, do for host executed on,
# otherwise ssh to argument host(s) and check
# if SSH_OPTS is set in environment, also pass that along to ssh(1)

case "$#" in
	0)
		rc=2
				virtual=unknown
				PATH=`
					for d in /bin /usr/bin /sbin /usr/sbin /usr/lib/acct/ /usr/local/bin /usr/local/sbin /usr/sfw/bin "$HOME"/bin
					    do [ -d "$d" ] ||
					    continue
					    case x"$PATH" in
					        x"$d"|x"$d":*|x*:"$d"|x*:"$d":*)
					            continue ;;
					        *)
					            PATH=${PATH:+$PATH:}"$d" ;;
					    esac
					done
					echo "$PATH"
				`
				uname_s=`uname -s` || {
					echo "$virtual"
					1>&2 echo "$0: error executing: uname -s"
					exit 2
				}
				case "$uname_s" in
					SunOS)
						t=`mktemp` || {
							echo "$virtual"
							1>&2 echo "$0: mktemp failed, aborting"
							exit 2
						}
						prtdiag >"$t" 2>&1 || {
							echo "$virtual"
							1>&2 echo "$0: prtdiag failed to write output, aborting"
							rm "$t"
							exit 2
						}
						product_name=`egrep VMware "$t"`
						r="$?"
						case "$r" in
							0)
								virtual=virtual
		                        echo "$virtual $product_name" | {
									tr '\012' ' '
									echo
								}
								rm "$t"
								exit 0
							;;
							1)
								product_name=$(egrep 'Oracle Corporation SUN BLADE' "$t")
								r="$?"
								case "$r" in
									0)
										virtual=physical
										echo "$virtual $product_name"
										rm "$t"
										exit 0
									;;
									1)
										echo "$virtual"
										1>&2 cat "$t"
										# fall through for rm & exit
									;;
									*)
										echo "$virtual"
										1>&2 echo "$0: egrep failure, aborting"
										# fall through for rm & exit
									;;
								esac
								rm "$t"
								exit 2
							;;
							*)
								echo "$virtual"
								1>&2 echo "$0: egrep failure, aborting"
								rm "$t"
								exit 2
							;;
						esac
					;;
					Linux)
						product_name=$(
							cat < /sys/devices/virtual/dmi/id/product_name 2>>/dev/null ||
							cat < /sys/class/dmi/id/product_name
						)
						case "$product_name" in
							'Bochs'|'HVM domU'|'Standard PC (i440FX + PIIX, 1996)'|'VMware'*)
								virtual=virtual
								echo "$virtual $product_name"
								exit 0
							;;
							'PDSMi'|'Precision M6600'|*'BladeCenter HS22'*|*'ProLiant BL460c Gen'[89]*|*'ProLiant DL360p Gen8'*|*'SUN BLADE X6270 M2 SERVER MODULE'*|'VIA694X/686A')

								virtual=physical
								echo "$virtual $product_name"
								exit 1
							;;
							*)
								echo "$virtual $product_name"
								exit 2
							;;
						esac
					;;
					*)
						virtual=unknown
						echo "$virtual"
						1>&2 echo "$0: Don't know how to determine virtual or not for this ($uname_s) operating system."
						exit 2
					;;
				esac
			rc="$?"
		exit "$rc"

	;;
	*)
		rc=2
		for host
		do
			ssh -anx -o BatchMode=yes $SSH_OPTS "$host" '
				virtual=unknown
				PATH=`
					for d in /bin /usr/bin /sbin /usr/sbin /usr/lib/acct/ /usr/local/bin /usr/local/sbin /usr/sfw/bin "$HOME"/bin
					    do [ -d "$d" ] ||
					    continue
					    case x"$PATH" in
					        x"$d"|x"$d":*|x*:"$d"|x*:"$d":*)
					            continue ;;
					        *)
					            PATH=${PATH:+$PATH:}"$d" ;;
					    esac
					done
					echo "$PATH"
				`
				uname_s=`uname -s` || {
					echo "$virtual"
					1>&2 echo "$0: error executing: uname -s"
					exit 2
				}
				case "$uname_s" in
					SunOS)
						t=`mktemp` || {
							echo "$virtual"
							1>&2 echo "$0: mktemp failed, aborting"
							exit 2
						}
						prtdiag >"$t" 2>&1 || {
							echo "$virtual"
							1>&2 echo "$0: prtdiag failed to write output, aborting"
							rm "$t"
							exit 2
						}
						product_name=`egrep VMware "$t"`
						r="$?"
						case "$r" in
							0)
								virtual=virtual
		                        echo "$virtual $product_name" | {
									tr '\''\012'\'' '\'' '\''
									echo
								}
								rm "$t"
								exit 0
							;;
							1)
								product_name=$(egrep '\''Oracle Corporation SUN BLADE'\'' "$t")
								r="$?"
								case "$r" in
									0)
										virtual=physical
										echo "$virtual $product_name"
										rm "$t"
										exit 0
									;;
									1)
										echo "$virtual"
										1>&2 cat "$t"
										# fall through for rm & exit
									;;
									*)
										echo "$virtual"
										1>&2 echo "$0: egrep failure, aborting"
										# fall through for rm & exit
									;;
								esac
								rm "$t"
								exit 2
							;;
							*)
								echo "$virtual"
								1>&2 echo "$0: egrep failure, aborting"
								rm "$t"
								exit 2
							;;
						esac
					;;
					Linux)
						product_name=$(
							cat < /sys/devices/virtual/dmi/id/product_name 2>>/dev/null ||
							cat < /sys/class/dmi/id/product_name
						)
						case "$product_name" in
							'\''Bochs'\''|'\''HVM domU'\''|'\''Standard PC (i440FX + PIIX, 1996)'\''|'\''VMware'\''*)
								virtual=virtual
								echo "$virtual $product_name"
								exit 0
							;;
							'\''Intense-PC'\''|'\''PDSMi'\''|'\''Precision M6600'\''|*'\''BladeCenter HS22'\''*|*'\''ProLiant BL460c Gen'\''[89]*|*'\''ProLiant DL360p Gen8'\''*|*'\''SUN BLADE X6270 M2 SERVER MODULE'\''*)
								virtual=physical
								echo "$virtual $product_name"
								exit 1
							;;
							*)
								echo "$virtual $product_name"
								exit 2
							;;
						esac
					;;
					*)
						virtual=unknown
						echo "$virtual"
						1>&2 echo "$0: Don'\''t know how to determine virtual or not for this ($uname_s) operating system."
						exit 2
					;;
				esac
			'
			rc="$?"
		done
		exit "$rc"
	;;
esac
