openmamba-headserver-tools/bin/openmamba-upstream-updates

282 lines
7.6 KiB
Bash
Executable File

#!/bin/bash
#
# openmamba upstream updates - find upstream packages updates from different internet resources
# Based on distrowatch packages update checker
# Copyright (c) 2004-2012 by Silvan Calarco <silvan.calarco@mambasoft.it>
#
[ -r /etc/sysconfig/openmamba-central ] || {
echo "Error: this program must be run as root; aborting." >&2
exit 1
}
. /etc/sysconfig/openmamba-central
DISTROMATIC_PREFIX=/distribution/distromatic.html?
DISTROMATIC_REPOSITORY=devel
DISTDB=/etc/autodist/distdb
DISTDBDIR=/etc/autodist/distdb.d
XORG_RELEASE=X11R7.6
[ -r $DISTDB ] && {
. $DISTDB
[ -d $DISTDBDIR ] && \
for f in `ls $DISTDBDIR/*.db`; do
. $f
done
}
[ -r $PKGLIST_FILE ] || {
echo "Error: file $PKGLIST_FILE cannot be read; aborting." >&2
exit 1
}
[ -r $ALIASES_DB ] || {
echo "Error: file $ALIASES_DB cannot be read; aborting." >&2
exit 1
}
function usage()
{
echo "openmamba-upstream-updates - finds upstream packages updates from different internet resources"
echo
echo "Usage:"
echo "openmamba-upstream-updates [-h|-m][-r repository]"
echo
echo " -h: generate distromatic HTML output"
echo " -m: show missing packages only"
echo " -q: produces quite output"
echo " -r repository: specify the repository (default: devel)"
echo " -o repository: specify the repository for output data (default: devel-autodist)"
echo
}
get_job_vector() {
local JNAME=$1
# resolve JOB_NAME from distdb
# note: if JOB_NAME contains a "-" it can't be a distdb JOB, so skip it
if [ "${JNAME/-/}" = "${JNAME}" ]; then
local jobtmpfile=`tempfile`
# hack to get an array variable named as $j assigned to the JOB array
echo "echo \${$JNAME[*]}" > $jobtmpfile
JOB=(`. $jobtmpfile`)
rm -f $jobtmpfile
else
JOB=()
fi
if [ ${#JOB[*]} -eq 0 ]; then
# create a default job with given JOB_NAME
JOB=($JNAME "" "")
elif [ ${#JOB[*]} -eq 1 ]; then
# no variables defined, add an empty job
JOB=(${JOB[*]} "" "")
fi
JOB_PKGS=(${JOB[0]//,/ })
JOB_VARNAMES=(${JOB[1]//,/ })
}
function version_compare()
{
local A B
A=$1
B=$2
# if [ ${A/[a-zA-Z_]*} -gt ${B/[a-zA-Z_]*} ]; then
# return 1
# elif [[ "$A" < "$B" ]]; then
# return 2
# else
if [[ "$A" > "$B" ]]; then
return 1
elif [[ "$A" < "$B" ]]; then
return 2
fi
# fi
return 0
}
function version_find_bigger()
{
local VER1 VER2 FPOS CUTVER1 CUTVER2
VER1=$1
VER2=$2
FPOS=1
while true; do
CUTVER1=`echo $VER1. | cut -d. -f $FPOS`
CUTVER2=`echo $VER2. | cut -d. -f $FPOS`
if [ "$CUTVER1" -a ! "$CUTVER2" ]; then
return 1
elif [ "$CUTVER2" -a ! "$CUTVER1" ]; then
return 2
elif [ ! "$CUTVER1" -a "$CUTVER2" ]; then
return 0
else
version_compare $CUTVER1 $CUTVER2
case $? in
1) return 1 ;;
2) return 2 ;;
esac
fi
FPOS=`expr $FPOS + 1`
done
return 0
}
while [ "$1" ]; do
case $1 in
-h) distromatic_html=1 ;;
-m) if [ "$distromatic_html" ]; then
echo "Error: options -h and -m cannot be used together."
usage
exit 1
else
missing_only=1
fi ;;
-r) [ "$2" ] || {
echo "Error: option -r requires repository name as parameter"
usage
exit 1
}
DISTROMATIC_REPOSITORY=$2
shift
;;
-q) quiet=1 ;;
*) echo "Error: invalid option $1."; usage; exit 1 ;;
esac
shift
done
CACHE_DIR=${local_ftp}/$DISTROMATIC_REPOSITORY/autoupdate/
PKGLIST_FILE=${local_ftp}/$DISTROMATIC_REPOSITORY/srcpkglist
BUILDLIST_FILE=$CACHE_DIR/upstream-updates.in
CONFIG_DIR=$CACHE_DIR
UPDATES_DB=$CACHE_DIR/upstream-updates
ALIASES_DB=$CACHE_DIR/aliases
MANUALVER_DB=$CACHE_DIR/manualver
tmpfile=`tempfile`
# parse X.org stable packages list
[ "$quiet" ] || echo "Parsing X.org release ftp directory..." >&2
curl -s ftp://ftp.x.org/pub/$XORG_RELEASE/src/everything/ -l | sed "s|\.tar\..*||" | sort -u |
while read line; do
if [ "$line" ]; then
ver=`echo $line | sed "s|.*-||"`
pkg="${line/-$ver}"
alias=`grep "^$pkg " $ALIASES_DB`
if [ ! "$alias" -a "${pkg:0:5}" == "xf86-" ]; then
alias="$pkg xorg-drv-${pkg/xf86-}"
else
[ "$alias" ] || alias=`grep "^lib$pkg " $ALIASES_DB`
fi
[ "$pkg" -a "$ver" ] && echo "$pkg $ver ${alias/* /}" >> $tmpfile
fi
done
# parse Gnome stable packages list
[ "$quiet" ] || echo "Parsing GNOME stable versions file..." >&2
curl -s http://people.gnome.org/~vuntz/tmp/versions/versions-stable | grep -v "^#" |
while read line; do
if [ "$line" ]; then
IFS=":"
set -- $line
pkg="$2"
ver="$3"
alias=`grep "^$pkg " $ALIASES_DB`
[ "$alias" ] || alias=`grep "^lib$pkg " $ALIASES_DB`
[ "$pkg" -a "$ver" ] && echo "$pkg $ver ${alias/* /}" >> $tmpfile
fi
done
# parse distrowatch.com packages list
[ "$quiet" ] || echo "Parsing Distrowatch packages list..." >&2
lynx -width 300 -dump http://distrowatch.com/packages.php |
while read line; do
[ "`echo $line | grep "Package Version Note"`" ] && start_print=1
[ "`echo $line | grep "____________________"`" ] && unset start_print
[ "$start_print" ] && {
set -- $line
pkg="${1/\[*\]/}"
ver="${2/\[*\]/}"
alias=`grep "^$pkg " $ALIASES_DB`
echo "$pkg $ver ${alias/* /}" >> $tmpfile
}
done
cat $tmpfile | sort -uf > $UPDATES_DB
rm -f $tmpfile
unset lastpkg
while read pkg ver alias; do
if [ "$pkg" = "$lastpkg" ]; then
echo "Warning: duplicate found: $pkg lastver: $lastver ver: $ver" >&2
fi
lastpkg=$pkg
lastver=$ver
done < $UPDATES_DB
> $UPDATES_DB.missing
> $BUILDLIST_FILE
while read pkg ver alias; do
unset pkgline
unset found_manual
unset found_alias
pkgline=`grep "^$pkg " $MANUALVER_DB` && found_manual=1
if [ ! "$found_manual" ]; then
if [ "$alias" ]; then
get_job_vector $alias
lastjob=${#JOB_PKGS[*]}
pkgline=`grep "^${JOB_PKGS[$lastjob-1]} " $PKGLIST_FILE` && found_alias=1
else
get_job_vector $pkg
lastjob=${#JOB_PKGS[*]}
pkgline=`grep "^${JOB_PKGS[$lastjob-1]} " $PKGLIST_FILE`
[ "$pkgline" ] || {
get_job_vector lib${pkg}
lastjob=${#JOB_PKGS[*]}
pkgline=`grep "^${JOB_PKGS[$lastjob-1]} " $PKGLIST_FILE` && {
found_alias=1
alias=lib${pkg}
}
}
fi
fi
if [ "$pkgline" ]; then
set -- $pkgline
pkgname=$1
pkgver=$2
version_find_bigger $pkgver ${ver/-/.}
vercmp=$?
[ "$found_manual" ] && pkgname=$3
if [ ! "$missing_only" ]; then
[ "$found_alias" -o "$found_manual" ] && nameadd="$pkg" || unset nameadd
unset veradd
[ ${vercmp} = 2 ] && veradd="<font color=red>$ver</font>"
[ ${vercmp} = 1 ] && veradd="$ver"
# [ "${ver/-/}" != "$pkgver" ] && veradd="<font color=red>$ver</font>" || unset veradd
[ "$veradd" -o "$nameadd" ] && {
[ "$veradd" -a "$nameadd" ] && \
verappend="($nameadd;$veradd)" ||
verappend="(${nameadd}${veradd})"
} || unset verappend
if [ "$distromatic_html" = "1" ]; then
echo "<a href=\"${DISTROMATIC_PREFIX}tag=${DISTROMATIC_REPOSITORY}&pkg=${JOB_PKGS[0]}.source\">${JOB_PKGS[0]} $pkgver</a> $verappend<br>"
else
echo "$pkg $pkgver ($ver)"
fi
[ $vercmp = 2 ] && {
if [ "$found_alias" ]; then
echo "$alias +$ver 0" >> $BUILDLIST_FILE
else
echo "$pkg +$ver 0" >> $BUILDLIST_FILE
fi
}
fi
else
echo "$pkg ($ver)" >> $UPDATES_DB.missing
fi
done < $UPDATES_DB