Voila un list_patches (appelé par update manager) et la mise en évidence
des 2 gros bugs que j'ai identifiés. Le deuxième est un bug de la locale
Fr

Avec modif mais pas dans Convertdate

real     1:01.4
user       11.4
sys        10.2

Avec modif aussi dans Convertdate (comme il y a bug de locale on affiche
une erreur différente)

real       46.6
user       11.2
sys         9.4


Sans modif

real     1:05.2
user       11.5
sys        10.2




bash-3.00# date
jeudi, 12 janvier 2006, 10:06:57 CET
bash-3.00# LC_ALL=C date
Thu Jan 12 10:07:58 CET 2006

On voit que la locale  change pas mal de choses


Je constate que chez Sun de manière générale on ignore deux FONDAMENTAUX
de la programmation en shell (et aussi de la sécurité) :

1) Tout script sans exception devrait commencer par :
#!/bin/ksh
export PATH="/usr/bin:/usr/sbin"

2) Tout script système devrait ignorer la locale et la troisième ligne
devrait être
export LC_ALL=C

====

J'ai commenté les bugs et modifié des lignes pour limiter les
exécutables lancés
j'evite ainsi un fork de grep et 5 cut par boucle (on boucle autant de
fois qu'il y a de patchs installés. Je n'ai pas testé faute de temps,
mais j'espère que cela va faire réagir les abonnés de Sun.fr (je peux
leur envoyer le script en attaché s'ils le souhaitent)




#!/bin/ksh
#
# ident "@(#)list_patches.sh    1.8     05/04/29 SMI"
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

export PKG                # A quoi servent ces 3 exports ?? a rien
export CONVERTED_DATE
export HRS MINS SECS     

PATCH_HISTORY_DIR=/var/sadm/patch
PACKAGE_HISTORY_DIR=/var/sadm/pkg
PKGINFO_PATCH_FILE=/tmp/pkginfo_patch.$$

function convertDate {
    YEAR=$6

    MONTH_ENG=$2
    case "$MONTH_ENG" in
    Jan ) MONTH=01;;
    Feb ) MONTH=02;;
    Mar ) MONTH=03;;
    Apr ) MONTH=04;;
    May ) MONTH=05;;
    Jun ) MONTH=06;;
    Jul ) MONTH=07;;
    Aug ) MONTH=08;;
    Sep ) MONTH=09;;
    Oct ) MONTH=10;;
    Nov ) MONTH=11;;
    Dec ) MONTH=12;;
    * ) MONTH=00;;
    esac

    DAY=$3
    if [ "$DAY" -lt 10 ]
    then
        DAY="0"$DAY
    fi

    TIME=$4
    #HRS=`echo $4 | cut -d ':' -f 1`
    #MINS=`echo $4 | cut -d ':' -f 2`
    #SECS=`echo $4 | cut -d ':' -f 3`
    TIMEZONE=$5
    
    CONVERTED_DATE=$YEAR$MONTH$DAY
    #CONVERTED_TIME=$HRS$MINS$SECS
    IFS=":" set  -- $TIME                    # évite 3 fork de cut
    CONVERTED_TIME=$1$2$3
    CONVERTED_TIMEZONE=$TIMEZONE
}

rm -f $PKGINFO_PATCH_FILE

# set up for a premature exit
trap 'rm -f $PKGINFO_PATCH_FILE; exit 0' 1 2 3 15

if [[ $1 = "-p" ]]; then

    # Example :
    # Patch: 117515-05 Obsoletes:  Requires:  Incompatibles:  Packages:
SUNWawbsvr, SUNWfwbsvr
    #for PATCHID in `showrev -p | grep '^Patch:' | cut -f2 -d' '`
    for PATCHID in `showrev -p | cut -c 8-16`
    do
        echo $PATCHID.id=$PATCHID

        # Get synopsis and release date from README

        if [ -f $PATCH_HISTORY_DIR/$PATCHID/README.$PATCHID ]
        then
            #SYNOPSIS=`grep "^Synopsis: "
$PATCH_HISTORY_DIR/$PATCHID/README.$PATCHID | cut -f2- -d':'`
            #echo $PATCHID.syn=$SYNOPSIS

            # Example :
            # Synopsis: SunOS 5.10_x86: patch e1000g driver
            SYNOPSIS=`grep "^Synopsis: "
$PATCH_HISTORY_DIR/$PATCHID/README.$PATCHID`
            echo $PATCHID.syn=${SYNOPSIS#Synopsis: }
            #RELEASE_DATE=`grep "^Date: "
$PATCH_HISTORY_DIR/$PATCHID/README.$PATCHID | cut -f2 -d':'`
            #****** BUG convertDate do nothing with arg1
            #convertDate $RELEASE_DATE
            RELEASE_DATE=`grep "^Date: "
$PATCH_HISTORY_DIR/$PATCHID/README.$PATCHID`
            # Example :
            # Date: Dec/19/2005
            convertDate ${RELEASE_DATE#Date: }
            echo $PATCHID.rel=$CONVERTED_DATE
        else
            echo $PATCHID.syn=
            echo $PATCHID.rel=
        fi

        # Get package list and backout info from pkginfos

        BKO=false
        grep "^PATCH" $PACKAGE_HISTORY_DIR/*/pkginfo >
$PKGINFO_PATCH_FILE 2> /dev/null
        # Exemple : lines like
        # /var/sadm/pkg/SUNWscpu/pkginfo:PATCH_INFO_118844-20=Installed:
lundi,  7 novembre 2005, 14:47:00 CET From: styx           Obsoletes:
118851-02 118860-01 118993-03 119206-01 119208-01 119565-01 119830-01
119859-02 120320-01 118863-01 119590-03 119720-01 Requires: 118344-05
Incompatibles:
        PKGS=`grep ":PATCH_INFO_$PATCHID" $PKGINFO_PATCH_FILE | cut -f5
-d'/'`
        # SUNWscpu ...
        for PKG in $PKGS
        do
                if [ -f $PACKAGE_HISTORY_DIR/$PKG/save/$PATCHID/undo.Z ]
                then
                        BKO=true
                fi
        done
        echo $PATCHID.pkg=$PKGS
        echo $PATCHID.bko=$BKO

        # Now get the required, obsoletes and incompats info
        if [ -n "$PKG" ]
        then
                PATCH_INFO=`grep
"$PACKAGE_HISTORY_DIR/$PKG/pkginfo:PATCH_INFO_$PATCHID"
$PKGINFO_PATCH_FILE | cut -f2 -d'='`
                # Example :
                # Installed: lundi, 7 novembre 2005, 14:47:00 CET From:
styx        Obsoletes: 118851-02 118860-01 118993-03 119206-01 119208-01
119565-01 119830-01 119859-02 120320-01 118863-01 119590-03 119720-01
Requires: 118344-05 Incompatibles:
                INS=`echo $PATCH_INFO | sed 's/Installed:
\(.*\)From:.*$/\1/'`
                # Example in Fr locale : lundi, 16 mai 2005, 16:29:48
CEST
                #BUG convertDate doesn't work with locale other than C
or En
                convertDate $INS
                echo $PATCHID.ins=$CONVERTED_DATE $CONVERTED_TIME
$CONVERTED_TIMEZONE
                OBS=`echo $PATCH_INFO | sed 's/.*Obsoletes:
\(.*\)Requires:.*$/\1/'`
                echo $PATCHID.obs=$OBS
                REQ=`echo $PATCH_INFO | sed 's/.*Requires:
\(.*\)Incompatibles:.*$/\1/'`
                echo $PATCHID.req=$REQ
                INC=`echo $PATCH_INFO | sed
's/.*Incompatibles:\(.*\)$/\1/'`
                echo $PATCHID.inc=$INC
        fi
    done

    rm -f $PKGINFO_PATCH_FILE

else
    if [ "$1" = "-z" ]
    then
        EXITNUM=`/usr/sbin/zoneadm list -c | wc -l`
        exit $EXITNUM
    else
        showrev -p | grep '^Patch:'
    fi
fi

-- 
Christian Pélissier
Office National d'Études et de Recherches Aérospatiales
BP 72 92322 Chatillon
Tel: 33 1 46 73 44 19, Fax: 33 1 46 73 41 50


_______________________________________________
Solaris_fr liste de diffusion en français pour Solaris, sur toutes architectures
[email protected]
http://x86.sun.com/mailman/listinfo/solaris_fr

Répondre à