diff --git a/bin/nodemecu b/bin/nodemecu index fa990aa..03295ec 100755 --- a/bin/nodemecu +++ b/bin/nodemecu @@ -32,6 +32,10 @@ case $com in read -p "intervalo: " entrada_usuario funcion_configurar intervalo $entrada_usuario echo "" + echo "Creando juego de llaves" + source $config + generate_private_key + echo "" echo "El modo de operación por defecto es 'test' y se envían datos simulados, cambie a 'sensores' con el comando 'sudo nodemecu modo sensores' " ;; @@ -54,6 +58,14 @@ case $com in monitor) $install_dir/monitor.sh ;; + cllave) + if [ -z $nombre ]; then + echo "Debe establecer primero el nombre del dispositivo" + else + echo "Creando juego de llaves" + generate_private_key + fi + ;; *) exit diff --git a/funciones b/funciones index 22f9dcb..264b551 100644 --- a/funciones +++ b/funciones @@ -2,14 +2,37 @@ #set -x get_stack () { if [[ ! -z $1 && $1 == "wc" ]];then - ls $registros | wc -l + ls -I "*.sign" $registros | wc -l else - ls $registros | tail -1 + ls -I "*.sign" $registros | tail -1 fi } +# Generar una llave privada ECDSA si no existe +generate_private_key () { + test -f "$private_key" && return 1 + + ssh-keygen -t ecdsa -f "$private_key" -N "" -m PEM +} + +# Firmar el archivo usando la llave privada. +# +# Uso: sign_file archivo.json +# Devuelve: archivo.json.sign +sign_file () { + local _file="$1" + + test ! -f "$_file" && return 1 + + if ! openssl dgst -sha512 -sign "$private_key" "$_file" | base64 | tr -d "\n" > "$_file.sign" ; then + rm -f "$_file.sign" + return 1 + fi + + echo "$_file.sign" +} diff --git a/generador_json b/generador_json index d2597b2..c825477 100755 --- a/generador_json +++ b/generador_json @@ -14,7 +14,7 @@ case $modo in ;; sensores) funcion_datos_sensores - ; + ;; esac diff --git a/instalador b/instalador index bdedf90..ac71ead 100755 --- a/instalador +++ b/instalador @@ -38,6 +38,7 @@ mkdir -v $registros_corruptos mkdir -v $envios_fallidos mkdir -v $historicos mkdir -v $registros +mkdir -v $private_key_dir echo " Copiado de archivos " diff --git a/nodemecu b/nodemecu new file mode 100755 index 0000000..03295ec --- /dev/null +++ b/nodemecu @@ -0,0 +1,76 @@ +#!/bin/bash +if [ $UID -ne 0 ]; then + echo "Ejecute 'sudo $0'" + exit +fi + +# LECTURA FICHERO DE CONFIGURACION + +config=/etc/nodemecu.conf +source $config +source $funciones + +[ -z $1 ] && exit + + +com=$1 + +case $com in + + configurar) + echo "Complete los cambios a continuación: + " + echo "Nombre del dispositivo." + read -p "nombre: " -a entrada_usuario + funcion_configurar nombre ${entrada_usuario[@]} + echo "" + echo "Servidor de entrega de datos." + read -p "servidor (ej. https://url.del/servidor): " entrada_usuario + funcion_configurar servidor $entrada_usuario + echo "" + echo "Intervalo de toma de muestras, entre 1 y 60 minutos." + read -p "intervalo: " entrada_usuario + funcion_configurar intervalo $entrada_usuario + echo "" + echo "Creando juego de llaves" + source $config + generate_private_key + echo "" + echo "El modo de operación por defecto es 'test' y se envían datos simulados, cambie a 'sensores' con el comando 'sudo nodemecu modo sensores' + " + ;; + + nombre) + funcion_configurar $@ + ;; + servidor) + funcion_configurar $@ + ;; + intervalo) + funcion_configurar $@ + ;; + modo) + funcion_configurar $@ + ;; + captura) + funcion_captura $2 + ;; + monitor) + $install_dir/monitor.sh + ;; + cllave) + if [ -z $nombre ]; then + echo "Debe establecer primero el nombre del dispositivo" + else + echo "Creando juego de llaves" + generate_private_key + fi + ;; + + *) + exit + ;; + +esac + + diff --git a/nodemecu.conf.ejemplo b/nodemecu.conf.ejemplo index 24b48ff..a6c13d8 100644 --- a/nodemecu.conf.ejemplo +++ b/nodemecu.conf.ejemplo @@ -20,3 +20,5 @@ contador=$directorio_instalacion/contador lock=$directorio_instalacion/lock funciones=$directorio_instalacion/funciones arduinos_py=$directorio_instalacion/arduinos.py +private_key_dir=$directorio_instalacion/llaves +private_key=$private_key_dir/$nombre.pem diff --git a/registrador b/registrador index 8d21ba0..bf9655b 100755 --- a/registrador +++ b/registrador @@ -11,14 +11,17 @@ for registro_json in $registros/*;do done while :;do + + # archivo a procesar + file=$(get_stack) + # si no hay servidor definido se reinicia el bucle # espera el intervalo definido o 1 minuto. - [ -z $servidor ] && echo "no se ha definido un servidor de entrega" && sleep ${intervalo:-1}m && continue + #[ -z $servidor ] && echo "no se ha definido un servidor de entrega" && sleep ${intervalo:-1}m && continue # si no hay nada en el directorio registros reinicia el bucle # espera el intervalo definido o 1 minuto. - file=$(get_stack) [ -z $file ] && sleep ${intervalo:-1}m && continue # si no respone el ping reinica el bucle @@ -34,20 +37,19 @@ while :;do # echo "$(date +%Y-%m-%d-%H:%M:%S) - $url - $test_url" >> /opt/nodemecu/errors.log && sleep 300 && continue #fi - - sing_file $registros/$file + # firma de registros + sign_file $registros/$file firma="$(cat $registros/$file.sign)" - local_transaction_uuid=$(jq -r '."transaction_uuid"' $registros/$file) - remote_transaction=$(curl -s --connect-timeout 0,9 --show-error -w "~%{http_code}" -X POST -H "X-Signature: $firma" -H "Content-Type: application/json" -d @$registros/$file $servidor 2> $curl_err) + remote_transaction=$(curl -s --connect-timeout 1,5 --show-error -w "~%{http_code}" -X POST -H "X-Signature: $firma" -H "Content-Type: application/json" -d @$registros/$file $servidor 2> $curl_err) remote_response="$(echo $remote_transaction | cut -d '~' -f 1)" server_error="$(echo $remote_transaction | cut -d '~' -f 2)" if [ ${#remote_response} -eq 36 ];then if [ $local_transaction_uuid == $remote_response ]; then - mv $registros/$file $historicos + mv $registros/$file $registros/$file.sign $historicos echo -e "$remote_response: \e[92mOK\e[0m" fi else