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