#!/bin/bash
#
# Purpose: display or set date from a host via http
#
# Requires: bash, ping, head, date, grep & sed
# Autor:  Daniel Lange, http://daniel-lange.com/software/
# License: GPL v3 or later, http://www.gnu.org/licenses/
#
# Version: v0.1, 08-10-22, initial release
#

if [ "$1" = "-h" -o "$1" = "--help" ] ; then
 echo "$0 v0.1 (c) Daniel Lange, 2008. Released under the GNU GPL v3 or later."
 echo "Usage: $0 <-d|-s> <HOST>"
 echo "       -d = display date (default)"
 echo "       -s = set date (may require root privileges)"
 echo "      HOST = FQDN of the server to retrieve the Date: header from"
 echo "            (default: www.google.com)"
 exit 0
fi

if [ "$1" != "-d" -a "$1" != "-s" ] ; then
 echo "Error: either -d or -s expected as first argument".
 exit 1
fi

if [ "$#" -gt 2 ] ; then
 echo "Error: too many arguments, use -h for help"
 exit 2
fi

DATE_OPTION="$1"
DATE_HOST="${2:-www.google.com}"

ping -q -c 1 -w 10 -W 10 $DATE_HOST > /dev/null 2>&1

if [ $? -ne 0 ] ; then
 echo "Error: Host $DATE_HOST not found (or ping missing)."
 exit 3
fi

exec 3<>/dev/tcp/$DATE_HOST/80
echo -e "GET / HTTP/1.0\n\n">&3
LC_ALL=C LANG=en_EN date --rfc-2822 --utc $DATE_OPTION "$(head <&3 | grep -i "Date: " | sed -e s/Date\:\ //I)"
exec 3<&-
