#!/bin/sh

myname=`basename $0`
longname=$0
opts="v"

channel_present()
{
	if smart channel --show $1 2>&1 | grep -q baseurl >/dev/null; then
		return 0
	fi
	return 1
}

usage()
{
cat << EOT

  $myname command [arguments]

  command is one of

    help:          show this help screen
    init:          initialize
    uninit:        undo initialization
    install:       install packages in [arguments]
    update:        update all jannet software on the system
    restore:       restore a previous jannet software version state
    info:          query information about installed software packages
    info-projects: query information about installed software projects
    checklog:      update the installation log file if necessary
    rpmnew:        remove superfluous rpmnew files and show conflicts
                   for others
    build-date:    show installed jannet packages along with build date
    built-today:   show installed jannet packages that were built today

EOT
	if [ "$1" ]; then
		exit $1
	fi
}

get_opts()
{
    set -- `getopt $opts $*`
    while [ "$1" != -- ] ; do
	case "$1" in
	    -v)
		opt_verbose=true
		;;
	    *)
		eusage
		;;
	esac
	shift
    done
    shift
}

create_ldconfig_state()
{
	echo "=== automatically created by $myname update script"
	echo "--- files"
	ls /etc/ld.so.conf.d
	echo "--- directories"
	find /etc/ld.so.conf.d -type f | xargs cat | sort -u
}

check_ldconfig()
{
	local state=/var/log/jw-build-ldconf.state
	[ -f $state ] && create_ldconfig_state | diff $state - >/dev/null 2>&1 && return
	echo -n "running ldconfig ... "
	/sbin/ldconfig
	create_ldconfig_state > $state
	echo "done."
}

list_all_packages()
{
	rpm -qa --queryformat '%{NAME}: %{URL}\n' | \
		grep -i '^[^ ]\+:.*\(jannet\.de\|janware\.com\)' | \
		sed 's/\(^[^ ]\+\) *:.*/\1/; s/[	 ]*$//' |\
		sort -u
}

list_all_projects()
{
	list_all_packages | xargs rpm -qa --queryformat '%{SOURCERPM}: %{URL}\n' | \
		sed 's/\(^[^ ]\+\) *:.*/\1/; s/[	 ]*$//; s/-[0-9]\+.*//' |\
		sort -u
}

cmd_rpmnew()
{
	local file

	list_all_packages |
	xargs rpm -ql |
	while read file; do
		if [ -e "$file.rpmnew" ]; then
			if diff -q $file $file.rpmnew; then
				if [ -L "$file" ]; then
					echo ========== skipping link $file
					diff $file.rpmnew $file
					continue
				fi
				echo mv $file.rpmnew $file
				sudo mv $file.rpmnew $file
			else
				echo =========== $file
				diff $file.rpmnew $file
			fi
		fi
	done
}

cmd_diff()
{
	local file

	list_all_packages |
	xargs rpm -qV |
	sed '/^....L\|^..5/ !d; s%[^/]*/%/%' |
	while read file; do
		if diff -q $file $file.rpmnew; then
			if [ -L "$file" ]; then
				echo ========== skipping link $file
				diff $file.rpmnew $file
				continue
			fi
			echo mv $file.rpmnew $file
			sudo mv $file.rpmnew $file
		else
			echo =========== $file
			diff $file.rpmnew $file
		fi
	done
}

cmd_build_date()
{
	list_all_packages |
		xargs rpm -q --queryformat '%{BUILDTIME} %{NAME}\n' |
		sort -n |
		sed 's/-run\|-devel//' |
		sort -u |
		while read t p; do
			echo `date --date=@$t --rfc-3339=seconds` $p
		done
}

cmd_built_today()
{
	local today=`date +'%Y-%m-%d'`
	cmd_build_date | grep $today | cut -d' ' -f3
}

cmd="$1"
shift
get_opts $*

case $cmd in

init)
	if ! channel_present ftp.jannet.de; then
		echo -n "adding installation source ... "
		sudo smart channel -y --add ftp.jannet.de \
			type=yast2 \
			baseurl=ftp://dspadm:dspasswd@ftp.jannet.de/pub/packages/linux/suse/10.1/inst-source \
			>/dev/null 2>&1
		if channel_present; then echo done; else echo failed; fi
	fi
	;;

uninit)
	if channel_present ftp.jannet.de; then
		echo -n "removing installation source ... "
		sudo smart channel -y --remove ftp.jannet.de >/dev/null 2>&1
		echo done
	fi
	;;

update)
	sudo smart update ftp.jannet.de
	sudo smart upgrade -y
	check_ldconfig
	;;

install)
	sudo smart update ftp.jannet.de
	if [ -f $1 ]; then
		sudo smart install -y `cat $1`
	else
		sudo smart install -y $*
	fi
	check_ldconfig
	;;
restore)
	echo "not yet implemented, sorry" >&2
	;;
checklog)
	line=`jannet info | tr -s " "`
	echo $line
	;;
info)
	if [ "$opt_verbose" = true ]; then
		list_all_packages | xargs rpm -qi
	else
		list_all_packages | xargs rpm -q
	fi
	;;
info-projects)
	list_all_projects
	;;
cpp-glib)
	sudo rpm -U --replacefiles --replacepkgs --oldpackage \
		ftp://dspadm@ftp.jannet.de/pub/packages/linux/suse/10.1/inst-source/rpm/i586/glib2-2.8.5-19.i586.rpm
	check_ldconfig
	;;
rpmnew)
	cmd_rpmnew $@
	;;
diff)
	cmd_diff $@
	;;
build-date)
	cmd_build_date
	;;
built-today)
	cmd_built_today
	;;
help)
	usage 0
	;;
*)
	usage 1
	;;

esac


