Compare commits

...

13 commits

20 changed files with 613 additions and 233 deletions

104
bin/nodemecu Normal file → Executable file
View file

@ -8,6 +8,7 @@ fi
config=/etc/nodemecu.conf
source $config
source $funciones
[ -z $1 ] && exit
@ -16,58 +17,59 @@ com=$1
case $com in
start)
if [ -z $interval ]; then
echo "Asegurese de haber establecido 'intervalo' de regitro y envio de datos."
exit 1
fi
if [ -z $name ]; then
echo "Asegurese de haber establecido el 'nombre' de dispositivo."
exit 1
fi
echo "El modo de operación es '$mode', puede cambiar el modo con el comando:"
echo "'nomecu modo MODE' donde 'MODE' puede ser 'test' para generar y enviar datos simulados o 'sensores' para enviar datos tomados de los sensores."
echo ""
read -p "Desea continuar? Presione 'enter' para continuar o 'ctrl-c' para cancelar..."
echo "*/$interval * * * * /opt/nodemecu/data_gen.sh" > /tmp/nodemecu.crontab
crontab -u root /tmp/nodemecu.crontab
echo ""
echo "Se enviarán datos cada $interval minutos."
echo ""
exit
;;
stop)
crontab -u root -r
echo "Se detuvo la toma y envio de datos."
echo ""
;;
intervalo)
if [[ $1 == intervalo && $2 -ge 1 && $2 -le 60 ]]; then
sed -i 's/interval=[0-9]*/interval='$2'/' $config
echo "intervalo seteado en $2"
exit
else
echo "Establezca un valor entre 1 y 60."
exit 1
fi
;;
nombre)
parametros=$*
nombre=$(echo $parametros | sed 's/nombre //g' | sed 's/ /_/g')
if [[ "$nombre" =~ ^[a-zA-Z0-9_]+$ ]];then
sed -i 's/name=[a-z A-Z 0-9]*/name='"$nombre"'/' $config
else
echo "El nombre solo puede contener carateres alfanumericos."
fi
;;
monitor)
$install_dir/monitor.sh
;;
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'
"
;;
*)
exit
;;
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

View file

View file

@ -1,53 +0,0 @@
#!/bin/bash
source /etc/nodemecu.conf
case $mode in
test)
lecturas="id:dummy_plug-01 ts:$(date +%s) tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR ts:$(date +%s) tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 AD_ARDUINO id:dummy_plug-02 ts:$(date +%s) tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR ts:$(date +%s) tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 AD_ARDUINO id:dummy_plug-03 ts:$(date +%s) tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR ts:$(date +%s) tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 AD_ARDUINO id:dummy_plug-04 ts:$(date +%s) tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR ts:$(date +%s) tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 END"
;;
esac
for i in $lecturas;do
case $i in
id*)
sensores="$sensores { $(echo \"id\":\"$(echo $i | cut -d ":" -f 2)\", \"sensores\": [ )"
;;
ts*)
sensores="$sensores { $(echo \"timestamp\": $(echo $i | cut -d ":" -f 2),)"
;;
tp*)
sensores="$sensores $(echo \"type\": \"$(echo $i | cut -d ":" -f 2)\",)"
;;
vl*)
sensores="$sensores $(echo \"value\": $(echo $i | cut -d ":" -f 2),)"
;;
un*)
sensores="$sensores $(echo \"unit\": \"$(echo $i | cut -d ":" -f 2)\",)"
;;
er*)
sensores="$sensores $(echo \"error\": $(echo $i | cut -d ":" -f 2) })"
;;
AD_SENSOR)
sensores="$sensores,"
;;
AD_ARDUINO)
sensores="$sensores]},"
;;
END)
sensores="$sensores]}"
;;
esac
done
counter=$(cat $install_dir/counter)
uuid="$(uuidgen)"
timestamp="$(date +%s)"
json="{\"transaction_uuid\":\"$uuid\",\"controller_id\":\"$name\",\"timestamp\":\"$timestamp\",\"error_code\":\"10\",\"coordinates\":{\"lat\":1,\"lng\":1},\"battery_status\":\"98\",\"sample\":\"0\",\"storage\":\"uso del almacenamiento\",\"arduinos\":[$sensores]}"
touch /opt/nodemecu/lock
file=$(date +%Y%m%d%H%M%S)-$(uuidgen)
for ((i=1 ; i <=3 ; i++));do
if echo $json | jsonlint-php 2> /dev/null;then
echo $json > /opt/nodemecu/stack/$file && rm /opt/nodemecu/lock && echo $((counter+1)) > $install_dir/counter && break
else
echo "$(date +%Y-%m-%d-%H:%M:%S) - No se pudo obtener información." >> /opt/nodemecu/errors.log && sleep 1
fi
done

39
desinstalar Executable file
View file

@ -0,0 +1,39 @@
#!/bin/bash
source /etc/nodemecu.conf
if [ $UID -ne 0 ]; then
echo "Ejecute 'sudo $0'"
exit
fi
seguro="Si, Estoy Seguro."
echo "Está a punto de desinstalar nodemecu, esta acción eliminará todos los archivos de instalacion y registros que se hayan tomado sin posiblidad de recuperación, haga un backup de:
- /etc/nodemecu.conf
- $directorio_instalacion
- $log
Para continuar escriba la frase '$seguro'.
"
read -p "frase: " frase
if [ "$frase" = "$seguro" ];then
rm /etc/nodemecu.conf
rm /usr/bin/nodemecu
crontab -u root -r
rm -rf $directorio_instalacion
systemctl stop nodemecu.service
systemctl disable nodemecu.service
rm /lib/systemd/system/nodemecu.service
systemctl daemon-reload
else
echo "La frase de seguridad no concuerda.
"
fi

179
funciones Normal file
View file

@ -0,0 +1,179 @@
#!/bin/bash
#set -x
get_stack () {
if [[ ! -z $1 && $1 == "wc" ]];then
ls -I "*.sign" $registros | wc -l
else
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"
}
funcion_datos_simulados() {
lecturas="id:dummy_plug-01 tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 AD_ARDUINO id:dummy_plug-02 tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 AD_ARDUINO id:dummy_plug-03 tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 AD_ARDUINO id:dummy_plug-04 tp:temp vl:$(( $RANDOM % 20 + 15 )) un:C er:99 AD_SENSOR tp:hum vl:$(( $RANDOM % 50 + 35 )) un:percent er:99 END"
}
funcion_datos_sensores() {
peticiones=1
arduinos=( 0x01 0x02 )
for arduino_id in ${arduinos[@]};do
lectura_arduino=($(timeout 3 $arduinos_py $arduino_id))
let "bloques = (${#lectura_arduino[@]} - 1) / 4"
lecturas="$lecturas id:${lectura_arduino[0]}"
indice=1
vueltas=1
while [ $vueltas -le $bloques ]; do
lecturas="$lecturas tp:${lectura_arduino[$indice]} vl:${lectura_arduino[$(expr $indice + 1 )]} un:${lectura_arduino[$(expr $indice + 2 )]} er:${lectura_arduino[$(expr $indice + 3 )]}"
if [ $vueltas -lt $bloques ]; then
lecturas="$lecturas AD_SENSOR"
fi
let "indice = $indice + 4 "
((vueltas++))
done
if [ $peticiones -lt ${#arduinos[@]} ];then
lecturas="$lecturas AD_ARDUINO"
fi
((peticiones++))
done
lecturas="$lecturas END"
}
funcion_configurar() {
local comando=$1
local parametro=$2
local parametros=$*
local url_regex='(https?|HTTPS?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
local nuevo_modo='(test|sensores)'
case $comando in
nombre)
while :;do
nuevo_nombre=$(echo $parametros | sed 's/nombre //g' | sed 's/ /_/g')
if [[ "$nuevo_nombre" =~ ^[a-zA-Z0-9_]+$ ]];then
sed -i 's/nombre='$nombre'/nombre='$nuevo_nombre'/' $config
echo "nombre: $nuevo_nombre"
break
else
echo "El nombre solo puede contener carateres alfanumericos."
read -p "nombre: " parametro
fi
done
;;
servidor)
while :;do
if [[ $parametro =~ $url_regex ]]; then
sed -i 's}servidor='$servidor'}servidor='"$parametro"'}' $config
echo "Servidor $parametro"
break
else
echo "Intruzca una url válida."
read -p "url: " parametro
fi
done
;;
intervalo)
while :;do
if [[ $parametro -ge 1 && $parametro -le 60 ]]; then
sed -i 's/intervalo=[0-9]*/intervalo='$parametro'/' $config
echo "Intervalo seteado en $parametro"
break
else
echo "Establezca un valor entre 1 y 60."
read -p "Intervalo: " parametro
fi
done
;;
modo)
while :;do
if [[ $parametro =~ $nuevo_modo ]]; then
sed -i 's/modo='$modo'/modo='$parametro'/' $config
break
else
echo "Los modos posibles son 'test' y 'sensores'"
read -p "modo: " parametro
fi
done
esac
}
funcion_captura() {
if [ "$1" = "iniciar" ]; then
if [ -z $intervalo ]; then
echo "Asegurese de haber establecido 'intervalo' de regitro y envio de datos."
exit 1
fi
if [ -z $nombre ]; then
echo "Asegurese de haber establecido el 'nombre' de dispositivo."
exit 1
fi
echo "Iniciando la captura de datos en modo '$modo'"
echo ""
read -p "Desea continuar? Presione 'enter' para continuar o 'ctrl-c' para cancelar..."
echo "*/$intervalo * * * * $directorio_instalacion/generador_json" > /tmp/nodemecu.crontab
crontab -u root /tmp/nodemecu.crontab
echo ""
echo "Se tomarán datos cada $intervalo minutos."
echo ""
exit
elif [ "$1" = "detener" ]; then
crontab -u root -r
echo "Se detuvo la toma de datos."
echo ""
else
echo "Ingrese una orden válida: 'iniciar' o 'detener'."
fi
}

View file

@ -1,10 +0,0 @@
get_stack () {
if [[ ! -z $1 && $1 == "wc" ]];then
ls /opt/nodemecu/stack | wc -l
else
ls /opt/nodemecu/stack | tail -1
fi
}

80
generador_json Executable file
View file

@ -0,0 +1,80 @@
#!/bin/bash
source /etc/nodemecu.conf
source $funciones
conteo=$(cat $contador)
uuid="$(uuidgen)"
marca_de_tiempo="$(date +%s)"
case $modo in
test)
funcion_datos_simulados
;;
sensores)
funcion_datos_sensores
;;
esac
# ARMADO DE FICHERO JSON
for i in $lecturas;do
case $i in
id*)
sensores="$sensores { $(echo \"id\":\"$(echo $i | cut -d ":" -f 2)\", \"sensores\": [ )"
;;
tp*)
sensores="$sensores { $(echo \"type\": \"$(echo $i | cut -d ":" -f 2)\",)"
;;
vl*)
sensores="$sensores $(echo \"value\": $(echo $i | cut -d ":" -f 2),)"
;;
un*)
sensores="$sensores $(echo \"unit\": \"$(echo $i | cut -d ":" -f 2)\",)"
;;
er*)
sensores="$sensores $(echo \"error\": $(echo $i | cut -d ":" -f 2) })"
;;
AD_SENSOR)
sensores="$sensores,"
;;
AD_ARDUINO)
sensores="$sensores]},"
;;
END)
sensores="$sensores]}"
;;
esac
done
json="{\"transaction_uuid\":\"$uuid\",\"controller_id\":\"$nombre\",\"timestamp\":\"$marca_de_tiempo\",\"error_code\":\"10\",\"coordinates\":{\"lat\":1,\"lng\":1},\"battery_status\":\"98\",\"sample\":\"0\",\"storage\":\"uso del almacenamiento\",\"arduinos\":[$sensores]}"
touch $lock
file=$(date +%Y%m%d%H%M%S -d @$marca_de_tiempo)-$uuid
if echo $json | jsonlint-php 2> /dev/null;then
echo $json > $registros/$file && rm $lock && echo $((conteo+1)) > $contador
else
echo "$(date +%Y-%m-%d-%H:%M:%S -d @$marca_de_tiempo) - No se pudo obtener información." >> $log
rm $lock
fi
exit
# habia una razon para esto, ya va a saltar
for ((i=1 ; i <=3 ; i++));do
if echo $json | jsonlint-php 2> /dev/null;then
echo $json > /opt/nodemecu/stack/$file && rm /opt/nodemecu/lock && echo $((counter+1)) > $contador && break
else
echo "$(date +%Y-%m-%d-%H:%M:%S) - No se pudo obtener información." >> /opt/nodemecu/errors.log && sleep 1
fi
done

77
instalador Executable file
View file

@ -0,0 +1,77 @@
#!/bin/bash
#set -x
configuracion=nodemecu.conf.ejemplo
source $configuracion
if [ $UID -ne 0 ]; then
echo "Ejecute 'sudo $0'"
exit
fi
if [ -d $directorio_instalacion ] ; then
echo "nodemecu ya se encuentra instalado"
exit
fi
ficheros="bin arduinos.py contador generador_json funciones monitor monitor_web nodemecu.service registrador desinstalar"
# Dependencias
echo "1. Instalando dependencias
"
#pip install pyserial
#apt update && apt install -y jsonlint
echo ""
# Directorio de instalación
echo "2. Creando directorios y copiando archivos"
echo "
Creación de directorios
"
mkdir -vp $directorio_instalacion/archives/historical
mkdir -v $directorio_instalacion/archives/logs
mkdir -v $registros_corruptos
mkdir -v $envios_fallidos
mkdir -v $historicos
mkdir -v $registros
mkdir -v $private_key_dir
echo "
Copiado de archivos
"
cp -vr $ficheros $directorio_instalacion
cp -v $configuracion /etc/nodemecu.conf
echo "
Enlaces a binarios
"
chmod 755 $directorio_instalacion/bin/nodemecu
ln -vs $directorio_instalacion/bin/nodemecu /usr/bin/nodemecu
echo "
Fichero de logs
"
touch $log
ls $log
echo "3. Configurando systemd
"
cp nodemecu.service /lib/systemd/system/
systemctl daemon-reload
echo "
4. Configurar
"
echo "- Ejecute 'sudo nodemecu configurar' para comenzar.
"
echo "-Ejecute 'sudo nodemecu modo sensores' para obtener datos desde sensores.
"
echo "- Ejecute 'sudo nodemecu captura iniciar' para comenzar a tomar datos de sensores o datos de prueba.
"
echo "- Ejecute 'sudo systemctl start nodemecu.service' para iniciar el envío de datos.
"

View file

@ -1,42 +0,0 @@
#!/bin/bash
files="data_gen.sh monitor.sh register.sh uninstall.sh monitor.web bin functions counter"
config=nodemecu.conf.sample
source $config
echo -e "1. Instalando dependencias"
#sudo apt update && sudo apt install -y jq uuid-runtime dnsmasq dnsutils
sudo pip install pyserial
echo ""
# Estructura de directorios
echo -e "2. Creando directorios y copiando archivos"
sudo mkdir -vp $install_dir/archives/historical
sudo mkdir -vp $install_dir/archives/logs
sudo mkdir $historical
sudo mkdir $stack
echo ""
sudo cp -vr $files $install_dir
sudo cp -v $config /etc/nodemecu.conf
sudo ln -s $install_dir/bin/nodemecu /usr/bin/nodemecu
sudo touch $log
echo ""
echo "3. Configurando systemd"
sudo cp nodemecu.service /lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable nodemecu.service
sudo systemctl start nodemecu.service
sudo systemctl status nodemecu.service
echo ""
echo ". Alias de comandos."
echo "alias nodemecu='sudo nodemecu'" >> $HOME/.bashrc
echo ""
echo "Ejecute 'source ~/.bashrc' para aplicar los cambios."
echo ""

View file

76
nodemecu Executable file
View file

@ -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

24
nodemecu.conf.ejemplo Normal file
View file

@ -0,0 +1,24 @@
nombre=
servidor=
intervalo=
modo=test
# AJUSTES GENERALES
# SE RECOMIENDA NO MODIFICAR ESTAS LINEAS
curl_err=/tmp/curl_err
historical_file_size=1440
logs_file_size=1440
directorio_instalacion=/opt/nodemecu
registros=$directorio_instalacion/registros
historicos=$directorio_instalacion/historicos
log=/var/log/nodemecu_errors.log
registros_corruptos=$directorio_instalacion/corruptos
envios_fallidos=$directorio_instalacion/fallidos
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

View file

@ -1,16 +0,0 @@
url=https://ectomobile.sutty.nl/transactions
name=
interval=
mode=test
# AJUSTES GENERALES
# SE RECOMIENDA NO MODIFICAR ESTAS LINEAS
curl_err=/tmp/curl_err
historical_file_size=1440
logs_file_size=1440
install_dir=/opt/nodemecu
stack=$install_dir/stack
historical=$install_dir/historical
log=$install_dir/errors.log
corrupt=$install_dir/corrupt

View file

@ -2,7 +2,9 @@
Description=Procesador de pila y transmisor de datos Nodemecu.
[Service]
ExecStart=/opt/nodemecu/register.sh
Restart=on-failure
RestartSec=5s
ExecStart=/opt/nodemecu/registrador
[Install]
WantedBy=multi-user.target

View file

@ -1,47 +0,0 @@
#!/bin/bash
#set -e
source /etc/nodemecu.conf
source /opt/nodemecu/functions
# Revisando stack
for filename in /opt/nodemecu/stack/*;do
test "$filename" = "/opt/nodemecu/stack/\*" || break
jsonlint-php $filename > /dev/null || mv -v $filename $corrupt
done
while :;do
ping -c 1 fsf.org > /dev/null 2>&1 || continue
test_url="$(curl -s -X POST -o /dev/null -w "%{http_code}" $url)"
if [ $test_url -eq 404 ];then
echo "$(date +%Y-%m-%d-%H:%M:%S) - $url - $test_url" >> /opt/nodemecu/errors.log && sleep 300 && continue
fi
[ -f $install_dir/lock ] && continue
file=$(get_stack)
[ -z $file ] && continue
local_transaction_uuid=$(jq -r '."transaction_uuid"' $stack/$file)
remote_transaction=$(curl -s --connect-timeout 0,9 --show-error -w "~%{http_code}" -X POST -H "Content-Type: application/json" -d @$stack/$file $url 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 $stack/$file $historical
echo -e "$remote_response: \e[92mOK\e[0m"
fi
else
echo -e "$local_transaction_uuid: \e[91mFAIL\e[0m"
# errores
unset srv_msg
unset curl_msg
err_time=$(date +%Y-%m-%d-%H:%M:%S)
[ ! -z "$remote_response" ] && srv_msg="- $( echo $remote_response | grep -o '<body.*>.*</body>')"
[ -s "$curl_err" ] && curl_msg="- $(</tmp/curl_err)"
echo $err_time - $local_transaction_uuid - server status: $server_error $srv_msg $curl_msg >> $log
rm $curl_err
fi
done
exit

69
registrador Executable file
View file

@ -0,0 +1,69 @@
#!/bin/bash
source /etc/nodemecu.conf
source $funciones
# Revisando stack
for registro_json in $registros/*;do
test "$registro_json" = "/opt/nodemecu/stack/\*" || break
jsonlint-php $registro_json > /dev/null || mv -v $registro_json $registros_corruptos
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
# si no hay nada en el directorio registros reinicia el bucle
# espera el intervalo definido o 1 minuto.
[ -z $file ] && sleep ${intervalo:-1}m && continue
# si no respone el ping reinica el bucle
ping -c 1 fsf.org > /dev/null 2>&1 || continue
# si el fichero 'lock' existe (se esta creando un nuevo registro) reinicia el bucle
[ -f $lock ] && continue
# se testea que el servidor responda
#test_url="$(curl -s -X POST -o /dev/null -w "%{http_code}" $servidor)"
#if [ $test_url -eq 404 ];then
# echo "$(date +%Y-%m-%d-%H:%M:%S) - $url - $test_url" >> /opt/nodemecu/errors.log && sleep 300 && continue
#fi
# 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 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 $registros/$file.sign $historicos
echo -e "$remote_response: \e[92mOK\e[0m"
fi
else
echo -e "$local_transaction_uuid: \e[91mFAIL\e[0m"
# errores
unset srv_msg
unset curl_msg
err_time=$(date +%Y-%m-%d-%H:%M:%S)
[ ! -z "$remote_response" ] && srv_msg="- $( echo $remote_response | grep -o '<body.*>.*</body>')"
[ -s "$curl_err" ] && curl_msg="- $(</tmp/curl_err)"
echo $err_time - $local_transaction_uuid - server status: $server_error $srv_msg $curl_msg >> $log
rm $curl_err
fi
done
exit

13
test Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash
if timeout 1 python arduinos.py 0x05; then
echo respondio
else
echo "No respondio, erro $?"
fi

View file

@ -1,13 +0,0 @@
#!/bin/bash
sudo rm /etc/nodemecu.conf
sudo rm /usr/bin/nodemecu
sudo crontab -u root -r
sudo rm -rf /opt/nodemecu/
sed -i '/*sudo nodemecu*/d' $HOME/.bashrc
sudo rm /lib/systemd/system/nodemecu.service
sudo systemctl stop nodemecu.service
sudo systemctl disable nodemecu.service
sudo systemctl daemon-reload