#!/bin/bash
# Permet la migration d'une base d'usagers de la version 1.6.3 vers une version ultérieure
#    Combinaisons testée par votre serviteur  :
#    d'une version 1.6 vers 1.7-rc3 ou 1.8
#    ou d'une version 1.7 vers 1.8 ou d'une version 1.8 vers 2.4 ou la 2.5
# Janvier 2010 Michel GAUDET revue en mars 2012.
#
#  Michel GAUDET
#  Centre de Calcul et des Systèmes d'Information
#  Ecole Nationale Supérieure des Mines de Paris
#  60-62, Boulevard Saint Michel
#  75272 PARIS cedex 06 FRANCE
#  Tel  : 01.40.51.92.03  Fax : 01.40.51.93 01
#  mail : michel.gaudet@mines-paristech.fr
#
#  A adapter en éditant le mot de passe root d'accès à MySQL 
#  dispo dans /root/ALCASAR-passwords.txt à la fin de l'installation.
#
#  Avant de l'effacer il est fait une sauvegarde de la base : sauvegarde-radius-date
#  En cas d'erreur il est donc possible de revenir en arrière pas l'interface d'admin
#  en rechargeant la base par la sauvegarde.
#
#  Executable en root ou en sysadmin
#
MOTDEPASSMYSQL="xxxxxxx"
AUTHENTIFDB="-u root -p$MOTDEPASSMYSQL"
BASE="/usr/bin/mysql $AUTHENTIFDB radius"
CMDDUMP="/usr/bin/mysqldump $AUTHENTIFDB radius"
DUMP=sauvegarde-radius-`date +%F-%Hh-%Mmn-%Ss`
VER=0


# Determination de la version ALCASAR destinataire 
# en interrogeant la version de mysql utilisée.
# 5.0.24a-log = 1.6 
# 5.0.81 = 1.7 
# 5.1.40 = 1.8
# 5.1.42 = 1.9
# 5.1.46 = 2.0
# 5.1.55 = 2.1/2.2
# 5.1.58 = 2.3
# 5.1.60 = 2.4
# 5.1.61 = 2.5
#


cat <<EOF

***********************************************************************************

Nouvelle version (du 12 mars 2012) du script de migration de la base radius.

   Il permet de transférer une base sauvegardée sur un portail ALCASAR version >= 1.6 
   vers un portail d'une version <= 2.5.

   Pour un importation vers une version 2.5 il corrige également une incohérence 
   entre les tables pour le champs UserName.

***********************************************************************************

EOF

CMD="$BASE status"
VERSACT=`$CMD | egrep 'Ver .* Distrib'| sed 's/.* Distrib \(.*\),.*$/\1/' `
echo "Version Actuelle de la base : $VERSACT"

echo "ATTENTION : vous allez effacer la base 'radius' actuelle pour la remplacer par une base issue d'une version ALCASAR précédente"
echo -n "   ETES VOUS SUR (O/N) ? N : "
read REP 
if [ "x$REP" != "xO" ] ; then
   echo "Operation annulée"
   exit 1
fi   

while [ $VER != 1.6 -a $VER != 1.7 -a $VER != 1.8 -a $VER != 1.9 -a $VER != 2.0 -a $VER != 2.1 -a $VER != 2.2 -a $VER != 2.3 -a $VER != 2.4 -a $VER != 2.5 ] ; do
   echo -n "Quelle est la version d'ALCASAR de la base de départ (1.6 à 2.3) ? :"
   read VER
done
echo -n "Quelle base voulez vous importer (nom du fichier dump) ? :"
read DB
if [ ! -f "$DB" ] ; then
   echo -e "Fichier $DB non trouvé \n Operation annulée"
   exit 1
fi

# Problème avec le jeu de caractère utilisé.
# à partir de la version 2.0 tout est passé en UTF8 d'où ces modifs du dump de la base d'origine.
# On teste d'abord si on peut générer le nouveau dump modifié
#
if cp $DB $DB.new  > /dev/null 2>&1 ; then
  case $VERSACT in 
      5.1.46|5.1.55|5.1.58|5.1.60|5.1.61) 
              sed -e 's/CHARSET=latin1/CHARSET=utf8 COLLATE=utf8_unicode_ci/g' \
                  -e 's/\(varchar([0-9]*) \)CHARACTER SET utf8 .* \(NOT NULL.*\)/\1\2/' \
                  -e 's/\(varchar([0-9]*) \)CHARACTER SET utf8 .* \(DEFAULT.*\)/\1\2/' \
                  -e 's/\(varchar([0-9]*) \)/\1COLLATE utf8_unicode_ci /' \
                  < $DB.new > $DB.$$
              iconv -f latin1 -t utf8 < $DB.$$ > "$DB.$$"2
              mv "$DB.$$"2 $DB.new
              rm "$DB.$$" ;;

      *) ;;
  esac
else
  echo -e "Impossible ecrire $DB.new\n Opération annulée"
  exit 1
fi


# Traitement different suivant la base de depart et la version d'ALCASAR
if         { [ $VER = '1.6' ] && egrep -q 'Server *version.*5.0.24a-log' $DB.new  ;} \
	|| { [ $VER = '1.7' ] && egrep -q 'Server *version.*5.0.81' $DB.new  ;} \
	|| { [ $VER = '1.8' ] && egrep -q 'Server *version.*5.1.40' $DB.new  ;} \
	|| { [ $VER = '1.9' ] && egrep -q 'Server *version.*5.1.42' $DB.new  ;} \
	|| { [ $VER = '2.0' ] && egrep -q 'Server *version.*5.1.46' $DB.new  ;} \
	|| { [ $VER = '2.1' ] && egrep -q 'Server *version.*5.1.55' $DB.new  ;} \
	|| { [ $VER = '2.2' ] && egrep -q 'Server *version.*5.1.55' $DB.new  ;} \
	|| { [ $VER = '2.3' ] && egrep -q 'Server *version.*5.1.58' $DB.new  ;} \
	|| { [ $VER = '2.4' ] && egrep -q 'Server *version.*5.1.60' $DB.new  ;} \
	|| { [ $VER = '2.5' ] && egrep -q 'Server *version.*5.1.61' $DB.new  ;} ; then

  $CMDDUMP >  $DUMP
  
  CMD='DROP DATABASE `radius` ;'
  CMD=$CMD' CREATE DATABASE `radius` ;'
  
  echo $CMD | $BASE
  
  $BASE < $DB.new
  
  if [ $VER = '1.6' ] && egrep -q 'Server version.*5.0.24a-log' $DB.new ; then
  
    CMD='DROP TABLE `nas` ;'
    CMD=$CMD' ALTER TABLE  `radacct` ADD COLUMN xascendsessionsvrkey varchar(10) NULL DEFAULT NULL ;'
    CMD=$CMD' ALTER TABLE  `radpostauth` DROP COLUMN `pass` ;'
    CMD=$CMD' ALTER TABLE `radpostauth` CHANGE COLUMN `user` `UserName` varchar(64) collate utf8_unicode_ci NOT NULL default "" ;'
    CMD=$CMD' ALTER TABLE  `radpostauth` CHANGE COLUMN `date` `authdate` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP ;'
    CMD=$CMD' ALTER TABLE  `usergroup` RENAME TO `radusergroup` ;'
    
    echo $CMD | $BASE
    
    CMD="SET @saved_cs_client     = @@character_set_client; SET character_set_client = utf8;"
    
    echo $CMD | $BASE
  fi 

# Une incohérence entre la taille du username (varchar(64) sauf pour userinfo en varchar(30)) entre tables est corrigée ici 

  if [ $VERSACT = '5.1.61' ] && grep -iq '`UserName` varchar(30)' $DB.new ; then
    CMD='ALTER TABLE `userinfo` CHANGE COLUMN `UserName` `UserName` varchar(64) ;'

    echo $CMD | $BASE 

  fi

# Si on est en alcasar version > 1.7 on est en version de FreeRadius > 2.0 et on a une colonne en plus dans radacct.
# A vérifier quand même. C'est vérifié pour Alcasar V1.8

  case $VERSACT in 
      5.0.81|5.1.40|5.1.42|5.1.46|5.1.55|5.1.58|5.1.60) 
          CMD='ALTER TABLE  `radacct` ADD COLUMN `groupname` varchar(64) NOT NULL DEFAULT "" ;'
          echo $CMD | $BASE ;;
      *) ;;
  esac

else
     echo "Erreur de version ou de base. Operation annulée"
fi

