You are not logged in.

#1 2008-11-06 10:42:06

bsdson.tw
Member
From: Taiwan
Registered: 2005-05-06
Posts: 161

saveSyu - a pacman wrapper to savely upgrade your system

This wrapper will evaluate the "upgrade level" of every packages that could be upgraded.

The "upgrade level" is defined as follows:

Assuming version number looks like x.y.z-p. And we consider that:
x is a major version number, y is a normal version number, and z is a minor version number, and p is a packaging version number.

If a version number looks like 1-2, we consider 1 is the major.
And if it looks like 1.2-3, we consider 1 is the major, and 2 is the normal.
And if it looks like 1.2.3.4-5, we consider 1 is the major, 2.3 is the normal, and 4 is the minor.

And,
level 19: packaging change
             x1=x2 y1=y2 z1=z2, only p1 != p2
level 25: minor upgrade
             x1=x2 y1=y2, z1 != z2, but 1 week old
level 29: minor upgrade
             x1=x2 y1=y2, z1 != z2
level 35: normal upgrade
             x1=x2, y1!=y2, but 2 weeks old
level 39: normal upgrade
             x1=x2, y1!=y2
level 45: major upgrade
             x1!=x2, but 4 weeks old
level 49: major upgrade, x1!=x2

While invoking, you should specify a threshold that you think is save to upgrade, and the wrapper - saveSyu, will invoke pacman to upgrade only those packages under the threshold.

Here comes...

#!/bin/bash

# save upgrade
# we can create some upgrade policy, for example:
# the package is one month old, or
# the package is a "packaging upgrade" (which means "the same
# software version", different "packaging version"), or
# the package is a "minor upgrade", x.y.z -> x.y.?
# the package is not in core (nor extra)

# function(s)

# assume version number looks like x.y.z-p
# others include:
# x.y.y.z-p
# x.y-p
# y-p
#
# level 19: packaging change, x1=x2 y1=y2 z1=z2, only p1 != p2
# level 25: minor upgrade, x1=x2 y1=y2, z1 != z2, but 1 week old
# level 29: minor upgrade, x1=x2 y1=y2, z1 != z2
# level 35: normal upgrade, x1=x2, y1!=y2, but 2 weeks old
# level 39: normal upgrade, x1=x2, y1!=y2
# level 45: major upgrade, x1!=x2, but 4 weeks old
# level 49: major upgrade, x1!=x2
# other criteria including:
#  which repository (not in core, in community, etc.)
#  minor upgrade, but packaging number is not 1 (which means it has been (bug) fixed)

evaluate_upgrade_level() {
    # init
    ONE_WEEK=$((1 * 7 * 24 * 60 * 60))
    TWO_WEEKS=$((2 * $ONE_WEEK))
    FOUR_WEEKS=$((4 * $ONE_WEEK))

    old_ver=$1
    new_ver=$2
    repo=$3
    date=$(date -d "$4" +%s)
    now=$(date +%s)

    # parse
    old_tmp=${old_ver%-*}
    old_pkg=${old_ver#$old_tmp-}
    old_major=${old_tmp%%.*}
    old_minor=${old_tmp##*.}
    old_normal=${old_tmp#$old_major.}
    old_normal=${old_normal%.$old_minor}
    echo old_ver=$old_ver major=$old_major normal=$old_normal minor=$old_minor pkg=$old_pkg

    new_tmp=${new_ver%-*}
    new_pkg=${new_ver#$new_tmp-}
    new_major=${new_tmp%%.*}
    new_minor=${new_tmp##*.}
    new_normal=${new_tmp#$new_major.}
    new_normal=${new_normal%.$new_minor}
    echo new_ver=$new_ver major=$new_major normal=$new_normal minor=$new_minor pkg=$new_pkg

    age=$(($now - $date))
    echo date=$date now=$now age=$age

    if [ "$old_major" = "$new_major" -a "$old_normal" = "$new_normal" -a "$old_minor" = "$new_minor" ] ; then
        level=19
    elif [ "$old_major" = "$new_major" -a "$old_normal" = "$new_normal" ] ; then
        if [ $age -gt $ONE_WEEK ] ; then
            level=25
        else
            level=29
        fi
    elif [ "$old_major" = "$new_major" ] ; then
        if [ $age -gt $TWO_WEEKS ] ; then
            level=35
        else
            level=39
        fi
    else
        if [ $age -gt $FOUR_WEEKS ] ; then
            level=45
        else
            level=49
        fi
    fi
    echo level=$level
    return $level
}

# init
SUDO=sudo
PACMAN=pacman
ARCH=i686
TMP_FILE=/tmp/$(basename $0).tmp

if [ 0 -eq $# ] ; then
    echo usage: $0 threshold
    exit 4
fi

threshold=$1

# get upgrade list
"$SUDO" "$PACMAN" -Syu --print-uris | grep ".pkg.tar.gz$" >"$TMP_FILE"

targets=""
# analyse "upgrade level"
while read uri ; do
    pkg=$(basename "$uri")
    pkg=${pkg%-$ARCH.pkg.tar.gz}
    pkg=${pkg%.pkg.tar.gz}
    name=${pkg%-*-*}
    new_ver=${pkg#$name-}
    old_ver=$("$PACMAN" -Qi "$name" | grep "^Version")
    old_ver=$(echo $old_ver)
    old_ver=${old_ver#Version : }
    repo=$(basename $(dirname $(dirname $(dirname "$uri"))))
    date=$("$PACMAN" -Si "$name" | grep "^Build Date")
    date=$(echo $date)
    date=${date#Build Date : }
    echo name=$name repo=$repo old_ver=$old_ver new_ver=$new_ver date=$date

    evaluate_upgrade_level "$old_ver" "$new_ver" "$repo" "$date"
    level=$?

    if [ $level -lt $threshold ] ; then
        echo save
        targets="$targets $name"
    fi

    echo
done <"$TMP_FILE"

# do it!
echo $targets
"$SUDO" "$PACMAN" -S $targets

Last edited by bsdson.tw (2008-11-07 10:14:36)

Offline

#2 2008-11-07 10:16:10

Heller_Barde
Member
Registered: 2008-04-01
Posts: 245

Re: saveSyu - a pacman wrapper to savely upgrade your system

nice idea! but i like to live life on the edge tongue
will be useful for server stuff. will give it a spin when i set up my server with arch

Offline

#3 2008-11-08 00:41:59

KurtKraut
Member
Registered: 2008-03-05
Posts: 17

Re: saveSyu - a pacman wrapper to savely upgrade your system

This could be essencial for those people how need to save bandwith.

Offline

#4 2008-11-09 13:49:38

filou.linux
Member
From: Zurich
Registered: 2008-04-17
Posts: 87

Re: saveSyu - a pacman wrapper to savely upgrade your system

I just set up a server! Great Idea. Can someone provide a PKGBUILD for this?

Offline

Board footer

Powered by FluxBB