#!/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 # [ -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="$ver" [ ${vercmp} = 1 ] && veradd="$ver" # [ "${ver/-/}" != "$pkgver" ] && veradd="$ver" || unset veradd [ "$veradd" -o "$nameadd" ] && { [ "$veradd" -a "$nameadd" ] && \ verappend="($nameadd;$veradd)" || verappend="(${nameadd}${veradd})" } || unset verappend if [ "$distromatic_html" = "1" ]; then echo "${JOB_PKGS[0]} $pkgver $verappend
" 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