Pagina 1 di 1

uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 16:35
da ZeroUno
E' notorio ormai che aggiornare slackware con swaret o slapt-get spesso genera casini.
L'ho sperimentato e mi sono ritrovato nei problemi del recentissimo topic "Dopo l'aggiornamento mi ha incasinato tutto".

Si, l'aggiornamento andrebbe fatto con upgradepkg --install-new, ma questo approccio ha il problema di dover scaricare a mano tutti i pacchetti nuovi o scaricarli in automatico con rsync, ma in questo caso però va scaricata l'intera distribuzione.
Il vantaggio di slapt-get e swaret è proprio il fatto che se la sbrigano loro a scaricare i file necessari. Io pensavo che slapt-get --dist-upgrade scaricasse anche i nuovi pacchetti, ma evidentemente mi sbagliavo.
Alla fine mi sono fatto uno script mio che vorrei porre alla vostra attenzione. Ancora c'è qualche bug e forse non è completo, ma il funzionamento è questo:
- scarica FILELIST.TXT PACKAGES.TXT ecc..
- determina i pacchetti da installare (consente di specificare una blacklist)
- installa il kernel nuovo e dai lilo -v
- installa glibc-solibs
- installa pkgtools
- installa il resto
- elimina tutti i pacchetti vecchi. Li determina da /var/log/packages, prendendo solo quelli che terminano per un numero. Si presume che quelli scaricati altrove abbiano un suffisso, tipo 'sl', 'as'... Comunque mostra la lista di cosa cancellerà e chiede uno per uno quali cancellare
- cerca i file .new e mostra la lista
- controlla se il file CHANGES_AND_HINTS.TXT è modificato dall'ultimo aggiornamento che è stato fatto e invita caldamente a leggerlo.

Ovviamente si può fare di meglio.
Ecco il codice:

Codice: Seleziona tutto

#!/bin/bash

#decommentare se si usa un proxy

#if [ -z $http_proxy ];then export http_proxy=192.168.0.1:8080;else export http_proxy;fi
#if [ -z $ftp_proxy ];then export ftp_proxy=192.168.0.1:8080;else export ftp_proxy;fi

# scegliere UNA SOLA sorgente
#SOURCE=ftp://ftp.slackware.com/pub/slackware/slackware-current/
SOURCE=ftp://ftp.eutelia.it/pub/Slackware_Mirror/slackware-current/
#SOURCE=http://ftp.eutelia.it/Slackware_Mirror/slackware-current/

SKIP="kde-i18n-[^i] koffice-l10n-[^i] aaa"
WORKPATH=/root/upgrade

function upgrade () {
        for PKG in $*;do
                echo
                PK=$(cat CURR|grep ^$PKG-[0-9])
                echo $PK
                PKPATH=$(cat FILELIST.TXT|grep /$PK.tgz$|awk '{print $8}')
                MD5=$(cat CHECKSUMS.md5|grep $PK.tgz$|awk '{print $1}')
                if [ -e $PK.tgz ];then
                        SUM=$(md5sum $PK.tgz 2>/dev/null|awk '{print $1}')
                        if [ "$MD5" != "$SUM" ];then
                                rm -f $PK.tgz
                        fi
                fi

                [ ! -e $PK.tgz ]&&wget $SOURCE/$PKPATH
                SUM=$(md5sum $PK.tgz 2>/dev/null|awk '{print $1}')
                if [ "$MD5" != "$SUM" ];then
                        echo "errore in md5 checksum (expecting $MD5 instead $SUM)"
                        echo "Aborting"
                        exit 1
                fi
                upgradepkg --install-new $PK.tgz
        done
}

mkdir -p $WORKPATH
cd $WORKPATH

GET="ChangeLog.txt CURRENT.WARNING CHANGES_AND_HINTS.TXT UPGRADE.TXT PACKAGES.TXT FILELIST.TXT CHECKSUMS.md5"
rm -f $GET
for FILE in $GET;do
        echo -n
       wget $SOURCE/$FILE
done

cat PACKAGES.TXT|grep "^PACKAGE NAME: "|awk '{print $3}'|sed s/.tgz$// > CURR
ls /var/log/packages > INST1
ls /var/log/packages|sed -e 's/-\([0-9][^-]*\)-\([^-]*\)-\([^-]*\)/\1 \2 \3/'|awk '{print $1 $2 $3 $4}' > INST2
cat INST2|grep [0-9]$ > SLACK
cat INST2|grep -v [0-9]$ > OTHER
>SKIP
for x in $SKIP;do echo $x >>SKIP;done
diff INST1 CURR|grep ^\>|grep -v -f SKIP|awk '{print $2}'>NEW
cat NEW|sed 's/-[0-9].*//'>NEWP
diff INST1 CURR|grep ^\<|grep -v -f SKIP|awk '{print $2}'|grep [0-9]$ >DELE

echo "Installing kernel"
KERN=$(cat NEWP|grep ^kernel-)
if [ -z "$KERN" ];then echo "no new kernel";else
        echo $KERN
        upgrade $KERN
        lilo -v
fi
echo

echo "Installing libraries"
LIBS=$(cat NEWP|grep ^glibc-solibs)
if [ -z "$LIBS" ];then echo "no new libraries";else
        echo $LIBS
        upgrade $LIBS
fi
echo

echo "Installing pkgtools"
TOOL=$(cat NEWP|grep ^pkgtools)
if [ -z "$TOOL" ];then echo "no new pkgtools";else
        echo $TOOL
        upgrade $TOOL
fi
echo

echo "Installing new packages"
NEWP=$(cat NEWP|egrep -v ^'kernel-|glibc-solibs|pkgtools')
if [ -z "$NEWP" ];then echo "no new packages remaining";else
        echo $NEWP
        upgrade $NEWP
fi
echo
echo
echo "Removing old Slackware Packages"
DELETMP=$(cat DELE)
DELE=""
for PKG in $DELE;do
        if [ -e /var/log/packages/$PKG ];then
                DELE="$DELE $PKG"
        fi
done
if [ -z "$DELE" ];then echo "no old packwages are installed";else
        echo $DELE
        ASK=""
        for PKG in $DELE;do
                if [ "$ASK" != "A" ];then
                        echo -n "Remove $PKG? (Yes/[N]o/All)"
                        read ASK
                fi
                if [ "$ASK" == "A" ];then
                        removepkg $PKG
                fi
                if [ "$ASK" == "Y" ];then
                        removepkg $PKG
                fi
        done
fi
echo
echo "Searching for new config files"
cat /var/log/packages/*|grep '\.new'$ >FCONF
for CONF in $(cat FCONF|sort -u);do
        CNF=$(echo $CONF|sed s/.new$//)
        if [ -e /$CONF -a -e /$CNF ];then
                echo /$CONF
        fi
done

rm CURR DELE FCONF INST1 INST2 NEW NEWP OTHER SKIP SLACK
echo

LAST=$(ls CHANGES_AND_HINTS.TXT*|tail -1)
TODAY=$(date +%Y-%m-%d)
diff CHANGES_AND_HINTS.TXT $LAST >/dev/null 2>&1
OUT=$?
if [ $OUT -eq 0 ];then
        exit
fi
echo "PLEASE READ 'CHANGES_AND_HINTS.TXT' FILE FOR SPECIAL POSTINSTALLATIONS PROCEDURE!!!!"
if [ $OUT -eq 1 ];then
        echo "AND COMPARE IT WITH $LAST"
fi
echo
cp CHANGES_AND_HINTS.TXT CHANGES_AND_HINTS.TXT-$TODAY
qualsiasi idea per migliorarlo è ben accetta.

Ciao,
01

Re: uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 16:49
da conraid
ZeroUno ha scritto: - scarica FILELIST.TXT PACKAGES.TXT ecc..
- determina i pacchetti da installare (consente di specificare una blacklist)
- installa il kernel nuovo e dai lilo -v
- installa glibc-solibs
- installa pkgtools
- installa il resto
Il kernel installalo dopo e lilo dallo per ultimo. Per prima cosa glibc-solibs e pkgtools. A volte serve anche altro, purtroppo va sempre letto UPGRADE.TXT

Re: uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 17:12
da ZeroUno
conraid ha scritto: Il kernel installalo dopo e lilo dallo per ultimo. Per prima cosa glibc-solibs e pkgtools. A volte serve anche altro, purtroppo va sempre letto UPGRADE.TXT
UPGRADE.TXT mi sembra uguale da anni. Piuttosto va letto il CHANGES_AND_HINTS.
Effettivamente il controllo che ho messo alla fine, cioè se esiste un aggiornamento di CHANGES_AND_HINTS lo volevo spostare all'inizio (e mi sa che è quello che farò). L'idea è che se non ci sono state modifiche a questo file dall'ultimo aggiornamento, non ho motivi particolarmente importanti da necessitarne la lettura. E comunque questo script non vuole sostituire la lettura di questo file (sarebbe una pretesa troppo grande), ma solo un piccolo aiuto per automatizzare l'automatizzabile (download selettivo e upgrade).

Sul fatto che il kernel vada aggiornato dopo le glibc-solibs avrei i miei dubbi.
Per esempio non si può aggiornare alle glibc-solibs attuali se non si possiede almeno un 2.6.16; ma è vero anche, effettivamente, che installare le glibc-solibs dopo aver aggiornato il kernel e senza reboot equivale ad aggiornarle con il vecchio kernel. A questo ci penserò, anche perchè al kernel volevo dedicare un po' più di tempo (prima di aggiornarlo dovrei effettuare il test della consistenza che avrebbe lilo.conf dopo l'upgrade, ed eventualmente impedire l'aggiornamento). In ogni caso il lilo -v va dato immediatamente dopo l'aggiornamento del kernel (che sia prima o dopo).
(Comunque c'è anche la direttiva SKIP per chi non vuole aggiornare il kernel e preferisce farlo da solo)

Grazie dei consigli.
01

Re: uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 17:46
da conraid
ZeroUno ha scritto:
conraid ha scritto: Il kernel installalo dopo e lilo dallo per ultimo. Per prima cosa glibc-solibs e pkgtools. A volte serve anche altro, purtroppo va sempre letto UPGRADE.TXT
UPGRADE.TXT mi sembra uguale da anni.
Non è proprio così. Per esempio prima si consigliava di upgradare anche sed prima di tutto il resto, solo nell'ultimo UPGRADE.TXT è stato tolto questo riferimento. E per aggiornare alla 12 già diceva che bisogna va fare tutto con il 2.6.18
Indicare un kernel inferiore quando di default nella 12 c'è il 21 non mi sembra cosa da Pat :-)

Re: uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 18:06
da ZeroUno
conraid ha scritto:Non è proprio così. Per esempio prima si consigliava di upgradare anche sed prima di tutto il resto, solo nell'ultimo UPGRADE.TXT è stato tolto questo riferimento.
Mi sembra anche, però, che CHANGES_AND_HINTS.TXT non esisteva prima della 12.0; comunque il mio script scarica anche UPGRADE.TXT e ChangeLogs.txt
Indicare un kernel inferiore quando di default nella 12 c'è il 21 non mi sembra cosa da Pat :-)
Versions of the linux kernel less than 2.6.16 will not work - the lowest
kernel version that glibc supports is 2.6.16, so don't bother trying anything
older than that.
Ho fatto le modifiche che dicevo sopra. Non ho potuto testarlo un gran chè; spero che non ci siano errori.

Codice: Seleziona tutto

#!/bin/bash

# ver 0.02



# decommentare se si usa un proxy
if [ -z $http_proxy ];then export http_proxy=127.0.0.1:5865;fi
if [ -z $ftp_proxy ];then export ftp_proxy=127.0.0.1:5865;fi

#SOURCE=ftp://ftp.slackware.com/pub/slackware/slackware-current/
SOURCE=ftp://ftp.eutelia.it/pub/Slackware_Mirror/slackware-current/
#SOURCE=http://ftp.eutelia.it/Slackware_Mirror/slackware-current/
SKIP="kde-i18n-[^i] koffice-l10n-[^i] xfce-4"
WORKPATH=/root/upgrade

function upgrade () {
        for PKG in $*;do
                echo
                PK=$(cat CURR|grep ^$PKG-[0-9])
                echo $PK
                PKPATH=$(cat FILELIST.TXT|grep /$PK.tgz$|awk '{print $8}')
                MD5=$(cat CHECKSUMS.md5|grep $PK.tgz$|awk '{print $1}')
                if [ -e $PK.tgz ];then
                        SUM=$(md5sum $PK.tgz 2>/dev/null|awk '{print $1}')
                        if [ "$MD5" != "$SUM" ];then
                                rm -f $PK.tgz
                        fi
                fi

                [ ! -e $PK.tgz ]&&wget $SOURCE/$PKPATH
                SUM=$(md5sum $PK.tgz 2>/dev/null|awk '{print $1}')
                if [ "$MD5" != "$SUM" ];then
                        echo "errore in md5 checksum (expecting $MD5 instead $SUM)"
                        echo "Aborting"
                        exit 1
                fi
                upgradepkg --install-new $PK.tgz
        done
}

mkdir -p $WORKPATH
cd $WORKPATH

GET="ChangeLog.txt CURRENT.WARNING CHANGES_AND_HINTS.TXT UPGRADE.TXT PACKAGES.TXT FILELIST.TXT CHECKSUMS.md5"
rm -f $GET
for FILE in $GET;do
        echo -n
        wget $SOURCE/$FILE
done

LAST=$(ls CHANGES_AND_HINTS.TXT-*|tail -1)
diff CHANGES_AND_HINTS.TXT $LAST >/dev/null 2>&1
OUT=$?

if [ $OUT -gt 0 ];then
        echo "A NEW 'CHANGES_AND_HINTS.TXT' WAS RELEASED"
        echo "I RECOMAND TO READ IT 'BEFORE' INSTALLATION"
        if [ $OUT -eq 1 ];then
                echo "YOU MAY COMPARE IT WITH $LAST"
        fi
        echo
        echo -n "Are you read it? (Y/[N]) "
        read ASK
        if [ "$ASK" != "Y" ];then
                echo "You can find CHANGES_AND_HINTS.TXT in $WORKPATH"
                exit 0
        fi
fi
echo


cat PACKAGES.TXT|grep "^PACKAGE NAME: "|awk '{print $3}'|sed s/.tgz$// > CURR
ls /var/log/packages > INST1
ls /var/log/packages|sed -e 's/-\([0-9][^-]*\)-\([^-]*\)-\([^-]*\)/\1 \2 \3/'|awk '{print $1 $2 $3 $4}' > INST2
cat INST2|grep [0-9]$ > SLACK
cat INST2|grep -v [0-9]$ > OTHER
>SKIP
for x in $SKIP;do echo $x >>SKIP;done
diff INST1 CURR|grep ^\>|grep -v -f SKIP|awk '{print $2}'>NEW
cat NEW|sed 's/-[0-9].*//'>NEWP
diff INST1 CURR|grep ^\<|grep -v -f SKIP|awk '{print $2}'|grep [0-9]$ >DELE



echo "Installing libraries"
LIBS=$(cat NEWP|grep ^glibc-solibs)
if [ -z "$LIBS" ];then echo "no new libraries";else
        echo $LIBS
        upgrade $LIBS
fi
echo

echo "Installing pkgtools"
TOOL=$(cat NEWP|grep ^pkgtools)
if [ -z "$TOOL" ];then echo "no new pkgtools";else
        echo $TOOL
        upgrade $TOOL
fi
echo

echo "Installing new packages"
NEWP=$(cat NEWP|egrep -v ^'kernel-|glibc-solibs|pkgtools')
if [ -z "$NEWP" ];then echo "no new packages remaining";else
        echo $NEWP
        upgrade $NEWP
fi
echo

echo "Installing kernel"
KERN=$(cat NEWP|grep ^kernel-)
if [ -z "$KERN" ];then echo "no new kernel";else
        echo $KERN
        ERR=0
        for IMAGE in $(cat /etc/lilo.conf|egrep -w 'image'|sed 's/=/ /'|awk '{print $2}');do
                if [ "$IMAGE" != "/boot/vmlinuz" ];then
                        IMG=$(echo "$IMAGE"|cut -f2-)
                        grep $IMG /var/log/packages/kernel-* && ERR=1
                fi
        done
        if [ $ERR -eq 1 ];then
                echo "I can't upgrade kernel!"
                echo "At least a kernel image in lilo.conf will be deleted if I upgrade"
        else
                upgrade $KERN
                lilo -v
        fi
fi

echo
echo
echo "Removing old Slackware Packages"
DELETMP=$(cat DELE|grep -v ^kernel-)
DELE=""
for PKG in $DELE;do
        if [ -e /var/log/packages/$PKG ];then
                DELE="$DELE $PKG"
        fi
done
if [ -z "$DELE" ];then echo "no old packwages are installed";else
        echo $DELE
        ASK=""
        for PKG in $DELE;do
                if [ "$ASK" != "A" ];then
                        echo -n "Remove $PKG? (Yes/[N]o/All)"
                        read ASK
                fi
                if [ "$ASK" == "A" ];then
                        removepkg $PKG
                fi
                if [ "$ASK" == "Y" ];then
                        removepkg $PKG
                fi
        done
fi
echo
echo "Searching for new config files"
cat /var/log/packages/*|grep '\.new'$ >FCONF
for CONF in $(cat FCONF|sort -u);do
        CNF=$(echo $CONF|sed s/.new$//)
        if [ -e /$CONF -a -e /$CNF ];then
                echo /$CONF
        fi
done

rm CURR DELE FCONF INST1 INST2 NEW NEWP OTHER SKIP SLACK
echo

TODAY=$(date +%Y-%m-%d)
if [ $OUT -eq 0 ];then
        exit
fi
echo "PLEASE Remember to read 'CHANGES_AND_HINTS.TXT' file for special post-installations procedure."
if [ $OUT -eq 1 ];then
        echo "Compare it with $LAST"
fi
echo
echo "You can find it in $WORKPATH"
echo
cp CHANGES_AND_HINTS.TXT CHANGES_AND_HINTS.TXT-$TODAY
Ciao,
01

Re: uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 18:13
da meritil
senza offesa per ZeroUno ma c'è slackpkg per fare gli upgrade massicci...

man slackpkg ha scritto:Slackpkg can be used to upgrade the whole distribution. The usual way
is to do:

# slackpkg update

# slackpkg install-new

# slackpkg upgrade-all

# slackpkg clean-system


:thumbright:



ps@zerouno: magari ti è utile il funzionamento di slackpkg per migliorare lo script

Re: uno script per aggiornare slackware

Inviato: lun 18 feb 2008, 18:15
da conraid
ZeroUno ha scritto:
conraid ha scritto:Non è proprio così. Per esempio prima si consigliava di upgradare anche sed prima di tutto il resto, solo nell'ultimo UPGRADE.TXT è stato tolto questo riferimento.
Mi sembra anche, però, che CHANGES_AND_HINTS.TXT non esisteva prima della 12.0; comunque il mio script scarica anche UPGRADE.TXT e ChangeLogs.txt
Aspetta, che altrimenti non ci capiamo.
Intanto c'era anche nella 11, ma quel che intendo io era che il tuo script dovrebbe seguire quel che indica UPGRADE.TXT, che è la procedura consigliata da Pat per aggiornare da una versione all'altra
E tranne che nell'ultimo (da 12 a current) indicava di aggiornare sed prima dei pacchetti.
Non stavo a sindacare cosa scarichi. UPGRADE.TXT andrebbe letto prima di aggiornare, ma se lo fai in automatico non deve leggerlo l'utente ma tu quando fai lo script
Tutto qui

Re: uno script per aggiornare slackware

Inviato: mar 19 feb 2008, 9:59
da ZeroUno
meritil ha scritto:senza offesa per ZeroUno ma c'è slackpkg per fare gli upgrade massicci...
sinceramente avevo dimenticato del tutto l'esistenza di slackpkg (non l'ho mai usato).
grazie della segnalazione. gli do una occhiata.

Matteo

Re: uno script per aggiornare slackware

Inviato: mar 19 feb 2008, 10:25
da ZeroUno
conraid ha scritto:Non stavo a sindacare cosa scarichi. UPGRADE.TXT andrebbe letto prima di aggiornare, ma se lo fai in automatico non deve leggerlo l'utente ma tu quando fai lo script
si, avevo capito, ma mi sembra che il mio script segua UPGRADE.TXT

1. Upgrade your glibc shared libraries.
2. Upgrade your package utilities:
3. Upgrade everything else (and install new packages):
4. Make sure your system will boot.
5. Fix your config files.

ad eccezione del passare in runlevel 1 (non avrei la rete, a meno di non effettuare prima il download e poi l'installazione)

quello che lo script invece non può seguire è il CHANGES_AND_HINTS. tra l'altro in slackware 12.0-stable UPGRADE.TXT è un link a CHANGES_AND_HINTS.


a proposito, una curiosità... nell'attuale current da ftp.slackware.com c'è una cosa strana...
10/20/08 07:39 4,253 UPGRADE.TXT
cioè 20/ott/2008 (comunque il FILELIST.TXT mostra 2007)

comunque non è una critica... effettivamente l'UPGRADE.TXT mi rende un po' più impegnativo lo script, rispetto al CHANGES_AND_HINTS. Il mio script è costruito sull'attuale UPGRADE.TXT, ma il fatto che la 11.0 mostra un passo in più (sed) e, se la memoria non mi tradisce, qualc'una delle precedenti chiedeva anche l'aggiornamento di tar, mi rende un po' più di studio.
Ci penserò.

Tu continua a mandarmi note e consigli, comunque.

Ciao,
01

Re: uno script per aggiornare slackware

Inviato: mar 19 feb 2008, 10:50
da ZeroUno
mmm
credo che dovrò abbandonare il progetto

dubito di poter fare un qualcosa di superiore di slackpkg.
Se una nuova versione del mio script usasse slackpkg, dovrebbe diventare.

#!/bin/bash
slackpkg $*
exit $?

;)

Al massimo ne posso fare un frontend grafico, ma per adesso non ne ho intenzione.

Ciao,
01