#!/bin/bash
#
# editauidlist
#
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Este script debe ejecutarse
#
# DESPUES de haber activado vmailmgr y dspam-deliver
# con soporte para S=nnnn (vmailmgr-12 y dspam-tools-0.6.4)
#
# y
#
# ANTES de la primera vez que ejecutemos comprime-maildir.
#
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#
# Se asegura de que los uid de los mensajes 
# coincidan con lo que el cliente de correo POP3 veia antes de la
# compresion inicial.
#
# Edita el archivo dovecot-uidlist para poner uid's permanentes
# para los archivos, modificando tambien el nombre del archivo
# para reflejar la adicion de ,S=nnnn que hara comprime-maildir
# despues.
# 
#
# Copyright 2017 asic-linux, S.A. de C.V.
# Todos los derechos reservados
#




FECHA="20170913"
VERSION="1.0.0"

DEBUG=0
USA_MONDIR=0

######################################################
#                  Funciones utiles                  #
######################################################


MONDIR="/var/log/mon"
MONFILE=${MONDIR}/`basename $0`

#
# trim
#
# Elimina espacios al principio y al final de una cadena
#
# Devuelve el resultado en stdin
#

trim () {


echo $@ | sed 's/^[[:blank:]]*//; s/[[:blank:]]*$//'

}

termina_error() {
   # Registramos el suceso en MONDIR
   if [ $USA_MONDIR -gt 0 ]; then
      [ -d "$MONDIR" ] || mkdir -p "$MONDIR"
      if [ $? -gt 0 ]; then
         echo "*** Error al crear $MONDIR" >&2
      else
         echo ----- `date` ----- >> $MONFILE
         echo "*** error: $1" >> "$MONFILE"
         if [ -r $ERRFILE ]; then
            cat $ERRFILE >> "$MONFILE"
         fi
      fi
   fi


   # Informamos via stderr
   echo "*** error: $1" >&2
   if [ -r $ERRFILE ]; then
      cat $ERRFILE >&2
   fi

   rm -f $ERRFILE
   if [ "$2" ]; then
      exit $2
   else
      exit 1
   fi
}


despliega_uso() {
cat << EOF
Uso: $(basename $0) [opciones] <maildir>

Opciones:

   -V             Muestra el numero de version
   -c <config>    Ruta al archivo de configuracion (Default: /etc/$(basename $0).conf) 

EOF
}


crea_temp() {
   # Archivo temporal
   local retfile=`mktemp ${TMPBASE}/$(basename $0).XXXXXX`
   if [ $? -gt 0 ]; then
      termina_error "Error al crear archivo temporal en $TMPBASE"
      exit 1
   fi
   
   echo $retfile
}

crea_temp_dir() {
   # Directorio temporal
   local retdir=`mktemp -d ${TMPBASE}/$(basename $0).XXXXXX`
   if [ $? -gt 0 ]; then
      termina_error "Error al crear directorio temporal en $TMPBASE"
      exit 1
   fi
   
   echo $retdir
}

#######################################################
#                      Defaults                       #
#######################################################

# Direccion del administrador del sistema
[ "$ADMIN" ] || ADMIN="izto@asic-linux.com.mx"

# Archivo de configuracion
[ "$CONFIGFILE" ] || CONFIGFILE="/etc/$(basename $0).conf"

# Ruta para archivos temporales
[ "$TMPBASE" ] || TMPBASE="/tmp"



#######################################################
#              Procesamos las opciones                #
#######################################################

while getopts ":Vc:" opt; do
  case $opt in
    V)
      echo "$(basename $0) $VERSION, $FECHA"
      exit 0
      ;;
    c)
      CONFIGFILE="$OPTARG"
      ;;
    \?)
      echo "$(basename $0): Opcion invalida: -$OPTARG" >&2
      despliega_uso
      exit 1
      ;;
    :)
      echo "$(basename $0): Opcion -$OPTARG requiere un argumento" >&2
      exit 1
      ;;
  esac
done

shift $(($OPTIND-1))

# Log de errores
ERRFILE=$( crea_temp ) || termina_error "Error al crear el archivo ERRFILE"

# Leemos el archivo de configuracion
if [ -f "$CONFIGFILE" ]; then
   source "$CONFIGFILE" 2>>$ERRFILE || termina_error "Leyendo el archivo de configuracion $CONFIGFILE"
fi

#####################################################
#             Argumentos posicionales               #
#####################################################


mdir="$1"
uidlist="${mdir}/dovecot-uidlist"

#####################################################
#            Verificaciones de sanidad              #
#####################################################

if [[ -z "$mdir" ]]; then
   despliega_uso
   exit 1
fi

[[ -d "$mdir/cur" && -d "$mdir/tmp" && -d "$mdir/new" ]] || termina_error "$mdir no parece ser un maildir."
[[ -f "$uidlist" ]] || termina_error "No puedo leer $uidlist"




#####################################################
#                 Bucle principal                   #
#####################################################


uidtmp=$(crea_temp)

main () {

cat << EOF

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Este script debe ejecutarse

DESPUES de haber activado vmailmgr y dspam-deliver
con soporte para S=nnnn (vmailmgr-12 y dspam-tools-0.6.4)

y

ANTES de la primera vez que ejecutemos comprime-maildir.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


EOF

echo "Oprime ENTER para continuar"
read junk

( head -n1 "$uidlist"
  tail -n $(( $(wc -l < "$uidlist") - 1 )) "$uidlist" | while read l; do
   f=$(trim $(echo $l | cut -f2 -d:) )
   opts=$(trim $(echo $l | cut -f1 -d:) )

#echo "l: $l"
#echo "f: $f"
#echo "opts: x${opts}x"


   ### Primero procesamos la P ###
   # Tiene un Pxxxxxxxxx?
   e=" P[^ ]+"
   if [[ $opts =~ $e ]]; then :
#echo "Ya tiene un Pxxxxxxx"
#echo "lo dejamos como esta"
      # Lo dejamos como esta
   else
   # Tiene un P blabla:? (P vacio)
      e=" P"
      if [[ $opts =~ $e ]]; then
         #Cambiamos la P por el nombre del archivo original
#         echo "Tiene un P vacio"
#         echo "Cambiamos la P por P + el nombre del archivo original (${f})"
         opts=$(echo $opts | sed -r "s#P#P${f}#g")
      else
      # Si no tiene un P, se lo ponemos con el nombre del archivo original
#      echo "No tiene un P"
#      echo "Se lo ponemos con el nombre del archivo original"
         opts=$(echo "${opts} P${f}")
      fi
   fi

   ### Al final cambiamos el nombre del archivo agregando la bandera S=nnnn ###
   e=",S=[0-9]+"
   if ! [[ $f =~ $e ]]; then
      fsize=$(stat -c %s "${mdir}"/cur/${f}* 2>/dev/null)
      if [[ $fsize ]]; then
         f="${f},S=${fsize}"
      fi
   fi

   echo "${opts} :${f}"

  done ) > $uidtmp

  uidbk="${TMPBASE}/uidlist-$(basename ${mdir}).${$}"
  echo "Sobreescribiendo $uidlist, respaldo en $uidbk"
  cp -v "$uidlist" "$uidbk" || termina_error "Respaldando $uidlist"
  mv -v $uidtmp "$uidlist"

}

main

rm -f $ERRFILE
rm -f $uidtmp

exit $?

