#!/bin/bash

USER=$(whoami)
if test "${USER}" != "root" ; then
    echo "=> Necesitas privilegios de \"root\" para poder lanzar este programa ..."
    exit 1
fi

function mensaje() {
    echo -e "${1}"
}

function conftea4cups() {
    ## Imponemos que una determinada impresora la gestione tea4cups:
    IMPRESORA="${1}"
    FICHERO="/etc/cups/printers.conf"
    # Ponemos cada impresora en una única línea, separando los campos mediante un "^", para luego modificarlo con un sed:
    ## 1) Mediante el comando tr elinamos los saltos de línea: tr -s "\n" "^" < "${FICHERO}"
    ## 2) Separamos cada impresora configurada en cups en una línea diferente al saber que empiezan por un "<" (el </ es su cierre): sed -e "s#<[^/]#\n&#g"
    ## 3) Eliminamos las líneas comentadas y las líneas en blanco: sed -e "/^#.*/d" | sed -e "/^$/d"
    ## 4) Nos quedamos con la línea asociada a la impresora a configurarle el tea4cups: grep "<Printer[ ]*${IMPRESORA}"
    ## 3) Nos aseguramos de que no este ya definido el protocolo tea4cups para esa impresora: /tea4cups/!
    tr -s "\n" "^" < "${FICHERO}" | \
    sed -e "s#<[^/]#\n&#g" | \
    sed -e "/^#.*/d" | \
    sed -e "/^$/d" | \
    grep "<Printer[ ]*${IMPRESORA}" | \
    sed -e "/\^DeviceURI.*/ { /tea4cups:/! { s/\(DeviceURI[ ][^a-zA-Z]*\)\(.*\)/DeviceURI tea4cups:\/\2/g} }"
}

function checkprinter() {
    _IMPRESORA="${1}"
    PATRON="[[:space:]]{1}${_IMPRESORA}:"
    lpstat -v | grep -E "${PATRON}" && return 0 || return 1
}

function confpredeterminada() {
    _IMPRESORA="${1}"
    checkprinter "${_IMPRESORA}" && \
    lpadmin -d "${_IMPRESORA}" && \
    echo "=> Se ha configurado como impresora predeterminada: ${_IMPRESORA}" || \
    echo "=> ¡¡Error!! Problemas para configurar como predeterminada: ${_IMPRESORA}"
}

function confimpresora() {
    # Recibimos los siguientes parámetros: (al menos los 3 primeros)
    ## 1) La URL de Internet donde localizar el PPD. De ella extraemos el nombre del PPD y la ruta de DESTINO
    ## 2) El nombre con el que queremos que aparezca la impresora en el sistema
    ## 3) El tipo de conexión (p.e. tea4cups:/socket://192.168.1.100:9100)
    ## 4) Se indica con "1" o un "0" si queremos que sea la impresora predeterminada
    MENSAJE="=> ¡¡Debes incluir al menos 3 parametros para la configuración de la impresora!!"
    MENSAJE+="\nEj. vx-conf-impresoras instalar \
    \n\tURLPPD[http://migasfree.educa.aragon.es/ppds/ies-benjamin-jarnes-fuentes/Ricoh-Aficio_MP_7502-pxlmono-Ricoh.ppd] \
    \n\tNombreImpr[Imp-Conserjeria] \
    \n\tProtocolo[socket://ip:9100] \
    \n\tpredeterminada[0|1] \
    \n\tTIME_GAP_MAX[300] \
    \n\tUSERCODEPRINT[tucodigo] \
    \n\tNOMBREPRINT[tunombre] \
    \n\tMODO_PASS_HIDDEN[0|1] \
    \n\tPASSRETENCION[0000] \
    \n\tLOCKEDRICOHNX[0|1] \
    \n\tSHOWUSERCODEPRINT[0|1] \
    \n\tSHOWNOMBREPRINT[0|1]"
    
    (( ${#} < 3 )) && mensaje "${MENSAJE}" && return 1
    
    NOMBRE="${2}"
    CONEXION="${3}"
    IP="$(echo "${CONEXION}" | awk -F "//" '{ print $2 }' | cut -d":" -f1)"
    PREDETERMINADA="${4:-0}"
    if checkprinter "${NOMBRE}" ; then
        (( "${PREDETERMINADA}" == 1 )) && confpredeterminada "${NOMBRE}"
        echo "=> Ya existe una impresora configurada con ese nombre: ${NOMBRE}" && \
        exit 0
    fi
    
    if [ "${1}" != "null" ] ; then
        PPD="${1}"
        NOMBREPPD="$(basename "${PPD}")"
        DIR="/usr/share/cups/model/vitalinux"
        DESTINO="${DIR}/${NOMBREPPD}"
    else
        DESTINO="null"
    fi
    
    CONFOPTSTEA4CUPS="${5:-false}"
    TIME_GAP_MAX="${6:-300}"
    USERCODEPRINT="${7:-tucodigo}"
    NOMBREPRINT="${8:-tunombre}"
    MODO_PASS="${9:-0}"
    PASSRETENCION="${10:-0000}"
    LOCKEDRICOHNX="${11:-0}"
    SHOWUSERCODEPRINT="${12:-1}"
    SHOWNOMBREPRINT="${13:-1}"
    
    if ${CONFOPTSTEA4CUPS} && [ -x "/usr/bin/vx-tea4cups-confoptions-cli" ] ; then
        if vx-tea4cups-confoptions-cli \
        "TIME_GAP_MAX=${TIME_GAP_MAX}" \
        "MODO_PASS=${MODO_PASS}" \
        "PASSRETENCION=${PASSRETENCION}" \
        "USERCODEPRINT=${USERCODEPRINT}" \
        "NOMBREPRINT=${NOMBREPRINT}" \
        "LOCKEDRICOHNX=${LOCKEDRICOHNX}" \
        "SHOWUSERCODEPRINT=${SHOWUSERCODEPRINT}" \
        "SHOWNOMBREPRINT=${SHOWNOMBREPRINT}" ; then
            echo "=> Se han configurado las opciones de tea4cups deseadas ..."
        else
            echo "=> Problemas para configurar las opciones de tea4cups deseadas ..."
        fi
        # Añadimos la seccion en tea4cups.conf con el nombre de la impresora:
        FICH="/etc/cups/tea4cups.conf"
        if [ -f "${FICH}" ] && \
        ! crudini --get "${FICH}" "${NOMBRE}" "posthook_usercodeinfo" > /dev/null 2>&1 ; then
            echo "=> Añadimos la sección: [${NOMBRE}] en ${FICH}"
            SECCION="[${NOMBRE}]\n"
            SECCION+="posthook_usercodeinfo : /usr/bin/vx-imprimir-con-usercode-info\n"
            SECCION+="prehook_usercode : /usr/bin/vx-imprimir-con-usercode"
            echo -e "${SECCION}" | tee -a /etc/cups/tea4cups.conf
        fi
    else
        echo "=> No se han modificado las opciones de tea4cups ..."
    fi
    
    # Comprobamos si existe el PPD de destino:
    if [[ ! -f "${DESTINO}" && "${DESTINO}" != "null" ]] ; then
        # Comprobamos si existe el directorio de destino de los PPDs
        [[ ! -d "${DIR}" ]] && mkdir -p "${DIR}"
        # Descargamos el PPD
        wget "${PPD}" -P "${DIR}" || return 1
    else
        echo "=> El PPD ya esta disponible o es nulo: ${DESTINO}"
    fi
    # Configuramos la impresora indicada:
    if [ "${DESTINO}" == "null" ] ; then
        lpadmin -p "${NOMBRE}" -E -v "${CONEXION}" && \
        echo "=> Se ha configurado la impresora: ${NOMBRE}" || \
        echo "=> ¡¡Error!! Problemas para configurar la impresora: ${NOMBRE}"
    else
        lpadmin -E -v "${CONEXION}" -p "${NOMBRE}" -P "${DESTINO}" \
        -o pdftops-renderer-default=pdftocairo -o pdftops-max-image-resolution-default=300 && \
        echo "=> Se ha configurado la impresora: ${NOMBRE}" || \
        echo "=> ¡¡Error!! Problemas para configurar la impresora: ${NOMBRE}"
    fi
    # Comprobamos si queremos que sea la impresora predeterminada:
    (( "${PREDETERMINADA}" == 1 )) && confpredeterminada "${NOMBRE}"
    # Habilitamos la impresora: (la opción -E de lpadmin debería garantizar lo siguiente)
    cupsenable "${NOMBRE}"
    cupsaccept "${NOMBRE}"
    return 0
}

function filtros_konica()
{
    # Instalamos los filtros de konica:
    DIR="/usr/lib/cups/filter"
    if test -d "${DIR}" ; then
        cd "${DIR}" || return
        if ! test -f "${DIR}/KMbeuEmpPS.pl" ; then
            wget http://migasfree.educa.aragon.es/ppds/ies-torreespejos/KMbeuEmpPS.pl
            chmod +x "${DIR}/KMbeuEmpPS.pl" && \
            echo "=> Se ha instalado el filtro de konica: KMbeuEmpPS.pl"
        else
            echo "=> Ya esta disponible el filtro de konica: KMbeuEmpPS.pl"
        fi
        if ! test -f "${DIR}/KMbeuEnc.pm" ; then
            wget http://migasfree.educa.aragon.es/ppds/ies-torreespejos/KMbeuEnc.pm
            chmod +x "${DIR}/KMbeuEnc.pm"
            echo "=> Se ha instalado el filtro de konica: KMbeuEnc.pm"
        else
            echo "=> Ya esta disponible el filtro de konica: KMbeuEnc.pm"
        fi
    fi
}

function eliminar_impresoras_mal_instaladas()
{
    # Eliminamos impresoras mal instaladas (protocolo /dev/null):
    for NOMBRE in $(lpstat -v | grep "/dev/null" | cut -d" " -f3 | cut -d":" -f1) ; do
        if (lpstat -v | grep "${NOMBRE}:" &> /dev/null) ; then
            lpadmin -x "${NOMBRE}"
        fi
    done
}

function eliminar_impresoras_diferentes_a() {
    # Eliminamos la Impresoras existen diferentes a las pasadas como parámetros.
    ## Creamos un listado de impresoras a mantener separadas por un "\|" para que lo reconozca el grep (p.e. "CUPS-PDF-Printer\|DCP-7045N")
    LISTA_IMPRESORAS="${1}"
    shift
    until test -z "${1}" ; do
        LISTA_IMPRESORAS="${LISTA_IMPRESORAS}\|${1}"
        shift
    done
    
    for IMPRESORA in $( lpstat -v | cut -d" " -f3 | cut -d":" -f1 | grep -v "${LISTA_IMPRESORAS}" ) ; do
        if (lpstat -v | grep "${IMPRESORA}:" &> /dev/null) ; then
            lpadmin -x "${IMPRESORA}"
        fi
    done
}

function eliminar_impresoras() {
    NUM_IMPRESORAS="$(lpstat -e 2>/dev/null | grep -c .)"
    if (( ${NUM_IMPRESORAS} == 0 )) ; then
        echo "# No hay impresoras configuradas en el sistema, nada que eliminar."
        return 0
    else
        # Comprobamos si el parámetro es "all" y eliminamos todas las impresoras del sistema:
        if [[ "${1}" == "all" ]] ; then
            echo "# Eliminamos todas las ${NUM_IMPRESORAS} impresoras configuradas en el sistema:"
            lpstat -e | while read -r IMPRESORA; do
                echo "#> Eliminando: ${IMPRESORA}"
                lpadmin -x "${IMPRESORA}"
            done
            return 0
        fi
        # Eliminamos las Impresoras pasadas como parámetros.
        until test -z "${1}" ; do
            IMPRESORA="${1}"
            if lpstat -e 2>/dev/null | grep -qE "^${IMPRESORA}$" ; then
                lpadmin -x "${IMPRESORA}"
            fi
            shift
        done
    fi
}


# Para llamar a la función a ejecutar pasada como parámetro, acompañado este a su vez de sus parámetros, se puede hacer uso de "$@":
## "$@"
## En este caso analizaremos los parámetros para controlar desde aquí lo que le llega a cada función:

if ! test -z "${1}" ; then
    OPCION="${1}"
    shift
    # Calculamos cuantos parámetros acompañan a la OPCION elegida:
    NUMPAR="$#"
fi

case "${OPCION}" in
    "instalar" )
        confimpresora "$@" && \
        echo "=> Se ha terminado de configurar la impresora: ${2}" || \
        exit 3
    ;;
    "eliminar" )
        eliminar_impresoras "$@"
    ;;
    "eleminar_diferentes_a" )
        eliminar_impresoras_diferentes_a "$@"
    ;;
    "tea4cups" )
        if ! test -z "${1}" ; then
            conftea4cups "${1}"
        else
            mensaje "Debes introducir como parámetro el nombre de la impresora a configurarle el tea4cups"
            exit 1
        fi
    ;;
    "filtroskonica" )
        filtros_konica
    ;;
esac

# Eliminamos aquellas impresoras que no se hayan instalado correctamente: /dev/null
eliminar_impresoras_mal_instaladas
# Reiniciamos cups para que surta efecto toda la configuración hecha:
sleep 1
#/etc/init.d/cups restart &> /dev/null
systemctl restart cups.service

exit 0