meta données pour cette page
  •  

Ceci est une ancienne révision du document !


Update de geonetwork

2017/05/18 17:45:03. cmartin

Contient un script à lancer pour faire les mises à jour de geonetwork. Tout ce qu'il faut c'est connaitre le dossier qui contient le WAR de geonetwork et un nouveau WAR.

<note importante> valable pour les installations de geonetwork faites en déployant un WAR, pas en utilisant le JAR d'installation.


Testé pour passage de geonetwork 3.0.4 à 3.2.1

SANS GARANTIE </note>

Précautions

AVANT de lancer le script :

  • avoir unecopie de la base de données
  • avoir une copie du dossier de geonetwork (tar ou autre)

En cas d'échec ça permettra de remettre les choses comme il faut.

Avant de lancer le script

Arreter tomcat avant de lancer le script !!

fonctionnement du script

DOIT ÊTRE LANCÉ SOUS LE COMPTE ROOT

  1. inspection du war actuel
  2. détection des fichiers ajoutés
  3. détection des fichiers modifiés (comme connexion à une BDD)
  4. inspection du nouveau WAR
  5. mise en place du nouveau WAR dans le dossier
  6. déploiement du nouveau WAR
  7. suppression des fichiers obsoletes
  8. propose de remettre les fichiers modifiés (mais il faut vérifier manuellement que les modifs sont toujours valables, sinon, patatra)
  9. suppression du cache

Après utilisation du script

Redémarrage de tomcat à votre charge.

Le script

note perso:
Ce script est dans le git IUEM des sysadmins.

Cliquer sur le titre pour télécharger.

update-geonetwork
#! /bin/bash
# encoding: utf-8
 
<<'42'
Author : Christophe Martin, Christophe•Martin@univ-brest•fr
 
                          Copyright (C) UMR6538, 2015
 
               FRENCH                 |             ENGLISH
 -------------------------------------+--------------------------------------
 Ce logiciel est un programme         |  This software is a computer program
 informatique servant à mettre à      |  whose purpose is to update
 jour geonetwork.                     |  geonetwork.
                                      |
 Ce logiciel est régi par la licence  |  This software is governed by the
 CeCILL soumise au droit français et  |  CeCILL license under French law and
 respectant les principes de          |  abiding by the rules of
 diffusion des logiciels libres.      |  distribution of free software.  You
 Vous pouvez utiliser, modifier       |  can  use, modify and/ or
 et/ou redistribuer ce programme      |  redistribute the software under the
 sous les conditions de la licence    |  terms of the CeCILL license as
 CeCILL telle que diffusée par le     |  circulated by CEA, CNRS and INRIA
 CEA, le CNRS et l'INRIA sur le site  |  at the following URL
 "http://www.cecill.info/".           |  "http://www.cecill.info/".
                                      |
 En contrepartie de l'accessibilité   |  As a counterpart to the access to
 au code source et des droits de      |  the source code and  rights to
 copie, de modification et de         |  copy, modify and redistribute
 redistribution accordés par cette    |  granted by the license, users are
 licence, il n'est offert aux         |  provided only with a limited
 utilisateurs qu'une garantie         |  warranty  and the software's
 limitée.  Pour les mêmes raisons,    |  author,  the holder of the economic
 seule une responsabilité restreinte  |  rights,  and the successive
 pèse sur l'auteur du programme,  le  |  licensors  have only  limited
 titulaire des droits patrimoniaux    |  liability.
 et les concédants successifs.        |
                                      |
 A cet égard  l'attention de          |  In this respect, the user's
 l'utilisateur est attirée sur les    |  attention is drawn to the risks
 risques associés au chargement,  à   |  associated with loading,  using,
 l'utilisation,  à la modification    |  modifying and/or developing or
 et/ou au développement et à la       |  reproducing the software by the
 reproduction du logiciel par         |  user in light of its specific
 l'utilisateur étant donné sa         |  status of free software, that may
 spécificité de logiciel libre, qui   |  mean  that it is complicated to
 peut le rendre complexe à manipuler  |  manipulate,  and  that  also
 et qui le réserve donc à des         |  therefore means  that it is
 développeurs et des professionnels   |  reserved for developers  and
 avertis possédant  des               |  experienced professionals having
 connaissances  informatiques         |  in-depth computer knowledge. Users
 approfondies.  Les utilisateurs      |  are therefore encouraged to load
 sont donc invités à charger  et      |  and test the software's suitability
 tester  l'adéquation  du logiciel à  |  as regards their requirements in
 leurs besoins dans des conditions    |  conditions enabling the security of
 permettant d'assurer la sécurité de  |  their systems and/or data to be
 leurs systèmes et ou de leurs        |  ensured and,  more generally, to
 données et, plus généralement, à     |  use and operate it in the same
 l'utiliser et l'exploiter dans les   |  conditions as regards security.
 mêmes conditions de sécurité.        |
                                      |
 Le fait que vous puissiez accéder à  |   The fact that you are presently
 cet en-tête signifie que vous avez   |   reading this means that you have
 pris connaissance de la licence      |   had knowledge of the CeCILL license
 CeCILL, et que vous en avez accepté  |   and that you accept its terms.
 les termes.                          |
 
42
 
set -e # stop on error
 
# setp variable-name1 variable-name2
setp() {
  eval "$1=\${$2}"
}
# setv var-name value
setv() {
  eval "$1=\$2"
}
warn() {
  echo "$@" >&2
}
fatal() {
  warn "$@"
  exit
  kill $$
}
 
# ouinon [-default oui|non] question
# return code :
#                0 oui
#                1 non
#exemple
# ouinon -default non 'aimez vous le saucisson ?' && 'echo vous êtes gourmand'
ouinon() {
  local def=
  local rep
  if test '-default' = "$1"; then
    case "$2" in 
    ([yYoO]|oui|Oui|oUi|ouI|OUi|OuI|oUI|OUI|yes|YES|Yes|YEs|YeS|yES|yEs|yeS)
      def=0
    ;;
    ([nN]|non|Non|nOn|noN|NOn|NoN|nON|NON|no|No|nO|NO)
      def=1
    ;;
    esac
    shift
    shift 2>/dev/null || :
  fi
 
  while : ; do
  read -p "$1 (o/n) : " rep
  case "$rep" in
  ([yYoO]|oui|Oui|oUi|ouI|OUi|OuI|oUI|OUI|yes|YES|Yes|YEs|YeS|yES|yEs|yeS)
    return 0
  ;;
  ([nN]|non|Non|nOn|noN|NOn|NoN|nON|NON|no|No|nO|NO)
    return 1
  ;;
  esac
  done
}
 
 
# question varname "question text"
question() {
  local __vname=$1 __rep __value
  setp __value "$__vname"
  shift
  printf '%s ' "$@"
  printf "(%s) " "$__value"
  read __rep
  test "$__rep" || __rep=$__value
  setv "$__vname" "$__rep"
}
 
#
# MAIN Main main
#
 
missing=
for cmd in diff tar sed unzip less tee find split xargs sed; do
  test "$(type -p $cmd)" || missing="$missing${missing+ }$cmd"
done
test "$missing" &&
  fatal "Les commandes suivantes manquent : $missing"
 
# approuver la licence
{
echo
echo
echo "      +-----------------------------------------------------------+"
echo "      |                                                           |"
echo "      |  Attention, ce logiciel est potentiellement dangereux     |"
echo "      |                                                           |"
echo "      | Veuillez prendre connaissance de la licence d'utilisation |"
echo "      |                                                           |"
echo "      +-----------------------------------------------------------+"
echo
echo
sed -ne '/^Autho/,/^42/p' "$0" |
  sed -e '/^42$/d'
} | less
if ! ouinon -default non "Accepetez vous les risques et la licence ?"
then
  fatal "Ok, fin du programme"
fi
 
 
# 
geodir=/var/lib/tomcat8/webapps/geonetwork
while : ; do
  question geodir "Quel est le dossier de geonetwork ? "
 
  case "$geodir" in
  (/*)
    geodir=${geodir%/}
    test "$geodir" -a -r "$geodir.war" && {
      test -d "$geodir" || {
        warn "Hum \"$geodir\" n'est pas un dossier..."
        continue
      }
      break
    }
    warn "Impossible de lire \"$geodir.war\" le dossier est-il vraiment le bon ?"
    continue
  ;;
  (exit) exit 0 ;;
  (*) warn "Pas un dossier absolu" ;;
  esac
done
 
newwar=
while : ; do
  question newwar Ou se trouve votre nouveau war '?'
  case "$geodir" in
  (exit) exit 0 ;;
  (*)
    test exit = "$newwar" && {
      echo "bye bye"
      exit
    }
    test -r "$newwar" || {
      warn "Fichier illisible ou inexistant"
      continue
    }
    test "$geodir.war" = "$newwar" && {
      warn "Pas bon. $newwar devrait être le war actuel, pas le nouveau."
      continue
    }
    case "$newwar" in
    (/*) : ;;
    (*) newwar=$PWD/$newwar ;;
    esac
    cmp "$geodir.war" "$newwar" && {
      warn "$newwar et $geodir.war sont les mêmes. Mise à jour impossible."
      continue
    }
    break
  ;;
  esac
done
 
echo "geodir : $geodir"
echo "oldwar : $geodir.war"
echo "newwar : $newwar"
 
if ouinon -default oui "On va maintenant tout modifier. Continuer ?"
then
  :
else
  echo "Bye bye"
  exit
fi
 
cd /tmp
 
# Arreter tomcat
warn Arret de tomcat8
systemctl stop tomcat8
 
warn "inspection du war actuel"
rm -rf geonetwork-old ; mkdir geonetwork-old ; cd geonetwork-old
unzip -q "$geodir.war"
 
warn recherche des fichiers modifies et des fichiers ajoutes.
# faire et conserver un diff
diff -Bbwur . "$geodir" | tee /tmp/diff-geonetwork >/dev/null
 
# Conserver les fichiers avec différence
tar cCf "$geodir" /tmp/fichiers_diff.tar $(
  awk '/^diff/ { print $3 }' /tmp/diff-geonetwork
)
 
# extraire liste des fichiers présents dans le dossier, non présents dans le WAR et les conserver
tar cCf "$geodir" /tmp/fichiers_en_plus.tar $(
  sed -ne '/^Only in /{s///;s,: ,/,;p}' /tmp/diff-geonetwork |
  sed -e "s^$geodir/"
)
# Lister ces fichiers en plus (on liste le tar, il pourrait y avoir des dossiers...)
tar tf /tmp/fichiers_en_plus.tar |
  grep -v '/$' |
  sort -o /tmp/liste.enplus-old
 
warn installation du nouveau war dans "$geodir.war"
# installer le nouveau war
rm "$geodir.war"
cp "$newwar" "$geodir.war"
 
# dézipper le nouveau war 
warn deploiement du nouveau war
cd "$geodir"
unzip -q -o "$geodir.war" # ecrabouiller tous les fichiers. répondre "all"
 
# lister la totalité des fichiers et dossiers présents 
find . -type f |  sed -e 's,^\./,,' | sort -o /tmp/liste.total
 
warn inspection du nouveau war
# lister le contenu du nouveau war
unzip -qql "$newwar" |
  awk 'ok && ! /\/ *$/ { print $NF } /META-INF/ { ok=1 }' |
  sed -e 's,^\./,,' |
  sort -o /tmp/liste.nouveau
 
warn determination des fichiers obsoletes
# Les fichiers à enlever sont donc :
# total - nouveau - enplus
# Prepare pour soustraction
sed -e 's/^/^/' -e 's/$/$/' -e 's/\./\\./g' /tmp/liste.enplus-old >/tmp/liste.enplus.regexp
sed -e 's/^/^/' -e 's/$/$/' -e 's/\./\\./g' /tmp/liste.nouveau >/tmp/liste.nouveau.regexp
 
# La liste des trucs qu'il faut enlever est donc :
#grep -v -f /tmp/liste.enplus.regexp /tmp/liste.total |
#  grep -v -f /tmp/liste.nouveau.regexp |
#  tee /tmp/liste.a-detruire >/dev/null
# 
# Mais on risque de faire peter la mémoire car il y a trop de regexp dans les
# fichiers. On va les splitter et progresser par étapes. On peut pas non plus
# fabriquer un pipe immense, pour la même raison, donc, fichiers intermédiaires...
# Naz...
split -l 100 -a 4 /tmp/liste.enplus.regexp /tmp/liste.enplus.regexp.partial.
split -l 100 -a 4 /tmp/liste.nouveau.regexp /tmp/liste.nouveau.regexp.partial.
 
cp /tmp/liste.total /tmp/liste.total.000
set -- /tmp/liste.total.000 /tmp/liste.total.001
for i in /tmp/liste.enplus.regexp.partial.* /tmp/liste.nouveau.regexp.partial.*
do
  echo "$2" >/tmp/liste.a.supprimer # se souvenir du fichier resultat
  grep -v -f "$i" "$1" >"$2"
  set -- $2 $1
done
: echo fichier reduit est $(</tmp/liste.a.supprimer)
cd "$geodir"
warn suppression des fichiers obsoletes
xargs -d \\n rm <$(</tmp/liste.a.supprimer)
 
# Remettre les fichiers modifiés
if ouinon -default oui "Remettre les fichiers modifiés
$(
  tar tf /tmp/fichiers_diff.tar | head -12 |
  sed -e 's/^/  /'
)
Et peut-etre d'autres. ils sont dans /tmp/fichiers_diff.tar
"
then
  tar xf /tmp/fichiers_diff.tar
fi
 
warn suppression du cache
# Supprimer le cache
rm -rf \
  WEB-INF/data/data/resources/htmlcache/formatter-cache/public/* \
  WEB-INF/data/data/resources/htmlcache/formatter-cache/private/* \
  WEB-INF/data/data/resources/htmlcache/formatter-cache/info-store.*.db \
  WEB-INF/data/wro4j-cache.trace.db WEB-INF/data/wro4j-cache.h2.db
 
warn don des fichiers a tomcat8:
chown -hR tomcat8: /var/lib/tomcat8/.
 
 
echo "Fini. a vous de redemarrer le serveur tomcat8"

Auteur

Christophe Martin 2017/05/18 17:45:44