No description
Find a file
2024-07-06 22:40:42 -06:00
tests firmador 2024-05-17 17:56:44 -06:00
.gitignore debian & macosx 2024-05-05 19:21:58 -06:00
01-utils.sh pass env vars, shellcheck directives 2024-06-29 08:46:42 -06:00
02-language.sh pass env vars, shellcheck directives 2024-06-29 08:46:42 -06:00
03-install.sh pass env vars, shellcheck directives 2024-06-29 08:46:42 -06:00
04-main.sh pass env vars, shellcheck directives 2024-06-29 08:46:42 -06:00
Makefile pass env vars, shellcheck directives 2024-06-29 08:46:42 -06:00
README.org syntax hl 2024-07-06 22:40:42 -06:00

instalador-firma.sh

Script de instalación de firma digital. Busca ser compatible con el estándar de shell de POSIX a nivel de sintaxis, pero su funcionalidad está limitada a Linux y macOS.

#!/bin/sh

Utilidades

pseudo

``Pseudo sudo'' facilidad para ejecutar comandos como administrador.

alias pseudo='printf "%s" "$SUDO_PASSWORD" | sudo -Skp ""'

echo_debug

Notificaciones del estado del script. Uso: echo_debug "Mensaje"

echo_debug() {
    printf '\033[1mDEBUG:\033[0m \033[2m%s...\033[0m\n' "$1"
}

urlencode

Función para convertir texto al formato correcto de URL, existen programas externos o quizás se pueda lograr solamente con sed pero esta forma es más robusta. También es menos portable, pero el script depende de curl de todas formas.

Uso: printf 'hól#a' | urlencode, output: h%c3%b3l%23a

urlencode() {
    ENCODEDURL="$(curl -Gs -w '%{url_effective}' --data-urlencode @- ./ ||: )"
    printf '%s' "$ENCODEDURL" | sed 's/%0[aA]$//;s/^.*[?]//' # %0a al final de la línea es
}                                                            # un comportamiento no deseado.

get_asp_var

Esta función requiere de una variable $RESPONSE que sería el html respuesta de un request, a partir de esto, devuelve la string de data que tiene retorna al servicio en un request posterior.

get_asp_var() {
    i=0
    for VAR in __VIEWSTATE __VIEWSTATEGENERATOR __EVENTVALIDATION ; do
        VAL="$(printf '%s' "$RESPONSE" | grep "id=\"$VAR\"" | cut -d '"' -f 8 | urlencode)"
        [ "$i" != 0 ] && printf '&'
        printf '%s=%s' "$VAR" "$VAL"
        i=+1
    done
}

set_version

Sin ninguna dependiencia, solamente funciones incluidas en el estándar POSIX, determina la variable $VERSION que será utilizada para seleccionar automáticamente el fichero que debe descargar en get_archive.

Nota: Se desactiva el error de SC1090, ya que es una limitación de shellcheck y es una funcionalidad válida dentro del estándar POSIX.

set_version() {
    # shellcheck disable=SC1090
    for os in /etc/os-release /usr/lib/os-release; do
        [ -f $os ] && . $os && break
    done

    case "$ID" in
        centos) [ -n "$VERSION_ID" ] && [ "$VERSION_ID" -ge 9 ] &&
                          ID="fedora" ;;
        *suse*|sles|sled) ID="suse" ;;
        debian|ubuntu)    ID="debian" ;;
        fedora|rhel)      ID="fedora" ;;
        arch|manjaro)     ID="arch" ;;
        *)                ID="${ID_LIKE%% *}" ;;
    esac

    [ "$ID" = "ubuntu" ] && ID="debian"
    [ "$ID" = "rhel" ]   && ID="fedora"
    [ -f /System/Library/CoreServices/SystemVersion.plist ] && ID="macos"

    case "$ID" in
        debian) VERSION="Usuarios Linux (DEB 64bits)" ;;
        fedora) VERSION="Usuarios Linux (RPM 64bits)" ;;
        suse)   VERSION="Usuarios Linux (RPM 64bits)" ;;
        arch)   VERSION="Usuarios Linux (RPM 64bits)" ;;
        centos) VERSION="Usuarios Linux RPM (CentOS 7)" ;;
        macos)  VERSION="Usuarios MAC" ;;
        *) return 1 ;;
    esac
}

get_archive

Utiliza urlencode y get_asp_var para realizar el procedimiento de descarga. Necesita que $VERSION esté definida (después de ejecutar set_version) ya que utilizará este parámetro para consultar en el servicio el instalador que debe descargar (el más actualizado de y correspondiente al sistema).

get_archive() {
    URL="https://soportefirmadigital.com/sfdj/dl.aspx"
    VERSION="$(printf '%s' "$VERSION" | urlencode)"
    RESPONSE="$(curl -s --compressed "$URL" -o -)"
    ASP_VARS="$(get_asp_var)"

    FILE="$(curl -s "$URL" --data-raw "$ASP_VARS" --data-raw "ctl00%24certContents%24ddlInstaladores=$VERSION" |
        grep 'hiddenISO.*value="' | sed 's/^.*value="//g;s/".*$//g')"
    [ -z "$FILE" ] && return 1

    TEMPKEY="$(curl -s --compressed "$URL" --data-raw "$ASP_VARS" \
        --data-raw "__EVENTTARGET=ctl00%24certContents%24LinkButton3" \
        --data-raw "ctl00%24certContents%24hiddenISO=$FILE" \
        --data-raw "ctl00%24certContents%24txtSerialNumber=$SERIAL" \
        --data-raw "ctl00%24certContents%24chkConfirmo=on" \
        -o - | sed '/tempkey/!d;s/.*tempkey=//g;s/".*$//g')"
    [ -z "$TEMPKEY" ] && return 1

    printf '%s %s' "$FILE" "$TEMPKEY"
}

set_menu (revisar)

(No creo que este sea necesario)

set_menu() {
    if [ -z "$MENU" ] ; then
	command -v zenity > /dev/null && MENU="zenity" && return 0
	command -v kdialog > /dev/null && MENU="kdialog" && return 0
	MENU="term"
    fi
}

menu

Esto más que nada es una forma de abreviar los comandos y de mantener consistente la ejecución principal, de manera que se llama a esta función y determina desde un lugar cómo proceder con la notificación y entrada del usuario.

Nota: SC2034 se desactiva porque a pesar de que $nil es una variable sin utilizar, permite la portabilidad del script con otras implementaciones.

menu() {
    MODE="$1" PROMPT="$2"

    if [ "$MENU" = "zenity" ] ; then
	echo_debug "MENU: $MENU MODE: $MODE PROMPT: $PROMPT" > /dev/stderr # DEBUG
	[ "$MODE" = "info"  ] && zenity --title "$TITLE" --text "$PROMPT" --info
	[ "$MODE" = "error" ] && zenity --title "$TITLE" --text "$PROMPT" --error > /dev/stderr
	[ "$MODE" = "entry" ] && zenity --title "$TITLE" --text "$PROMPT" --entry
	[ "$MODE" = "pass"  ] && zenity --title "$TITLE" --password

    elif [ "$MENU" = "term" ] ; then
	# shellcheck disable=SC2034
	[ "$MODE" = "info" ]  &&
	    printf '\n\033[1m\033[34m=== %s ===\033[0m\n%s ENTER' "$TITLE" "$PROMPT" >/dev/stdin &&
	    read -r nil

	[ "$MODE" = "error" ] &&
	    printf '\n\033[1m\033[31m=== %s ===\033[0m\n%s\n'     "$TITLE" "$PROMPT" >/dev/stderr

	[ "$MODE" = "entry" ] &&
	    printf '\n\033[1m\033[34m=== %s ===\033[0m\n%s\n -> ' "$TITLE" "$PROMPT" >/dev/stdin &&
	    IFS= read -r entry &&
	    printf '%s' "$entry"

	[ "$MODE" = "pass" ] &&
	    printf '\n\033[1m\033[34m=== %s ===\033[0m\n%s\n -> ' "$TITLE" "$PROMPT" >/dev/stdin &&
	    IFS= read -r passwd &&
	    printf '%s' "$passwd"
    fi
}