Compare commits
13 commits
fb78ca2ae6
...
2be22e95ae
Author | SHA1 | Date | |
---|---|---|---|
2be22e95ae | |||
08a7ddae91 | |||
296b45fcf6 | |||
af9032371d | |||
277209e09f | |||
a8477a9f98 | |||
1d750f315e | |||
e1f2ab46bb | |||
15f540f32f | |||
11b1b9886e | |||
fd4fde4e5c | |||
9ebc511ab0 | |||
48062b3f1e |
20 changed files with 613 additions and 233 deletions
76
bin/nodemecu
Normal file → Executable file
76
bin/nodemecu
Normal file → Executable file
|
@ -8,6 +8,7 @@ fi
|
||||||
|
|
||||||
config=/etc/nodemecu.conf
|
config=/etc/nodemecu.conf
|
||||||
source $config
|
source $config
|
||||||
|
source $funciones
|
||||||
|
|
||||||
[ -z $1 ] && exit
|
[ -z $1 ] && exit
|
||||||
|
|
||||||
|
@ -16,54 +17,55 @@ com=$1
|
||||||
|
|
||||||
case $com in
|
case $com in
|
||||||
|
|
||||||
start)
|
configurar)
|
||||||
if [ -z $interval ]; then
|
echo "Complete los cambios a continuación:
|
||||||
echo "Asegurese de haber establecido 'intervalo' de regitro y envio de datos."
|
"
|
||||||
exit 1
|
echo "Nombre del dispositivo."
|
||||||
fi
|
read -p "nombre: " -a entrada_usuario
|
||||||
if [ -z $name ]; then
|
funcion_configurar nombre ${entrada_usuario[@]}
|
||||||
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 ""
|
echo ""
|
||||||
read -p "Desea continuar? Presione 'enter' para continuar o 'ctrl-c' para cancelar..."
|
echo "Servidor de entrega de datos."
|
||||||
echo "*/$interval * * * * /opt/nodemecu/data_gen.sh" > /tmp/nodemecu.crontab
|
read -p "servidor (ej. https://url.del/servidor): " entrada_usuario
|
||||||
crontab -u root /tmp/nodemecu.crontab
|
funcion_configurar servidor $entrada_usuario
|
||||||
echo ""
|
echo ""
|
||||||
echo "Se enviarán datos cada $interval minutos."
|
echo "Intervalo de toma de muestras, entre 1 y 60 minutos."
|
||||||
|
read -p "intervalo: " entrada_usuario
|
||||||
|
funcion_configurar intervalo $entrada_usuario
|
||||||
echo ""
|
echo ""
|
||||||
exit
|
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'
|
||||||
|
"
|
||||||
;;
|
;;
|
||||||
stop)
|
|
||||||
crontab -u root -r
|
nombre)
|
||||||
echo "Se detuvo la toma y envio de datos."
|
funcion_configurar $@
|
||||||
echo ""
|
;;
|
||||||
|
servidor)
|
||||||
|
funcion_configurar $@
|
||||||
;;
|
;;
|
||||||
intervalo)
|
intervalo)
|
||||||
if [[ $1 == intervalo && $2 -ge 1 && $2 -le 60 ]]; then
|
funcion_configurar $@
|
||||||
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)
|
modo)
|
||||||
|
funcion_configurar $@
|
||||||
parametros=$*
|
;;
|
||||||
nombre=$(echo $parametros | sed 's/nombre //g' | sed 's/ /_/g')
|
captura)
|
||||||
if [[ "$nombre" =~ ^[a-zA-Z0-9_]+$ ]];then
|
funcion_captura $2
|
||||||
sed -i 's/name=[a-z A-Z 0-9]*/name='"$nombre"'/' $config
|
|
||||||
else
|
|
||||||
echo "El nombre solo puede contener carateres alfanumericos."
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
monitor)
|
monitor)
|
||||||
$install_dir/monitor.sh
|
$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
|
exit
|
||||||
|
|
53
data_gen.sh
53
data_gen.sh
|
@ -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
39
desinstalar
Executable 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
179
funciones
Normal 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
|
||||||
|
}
|
||||||
|
|
10
functions
10
functions
|
@ -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
80
generador_json
Executable 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
77
instalador
Executable 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.
|
||||||
|
"
|
42
install.sh
42
install.sh
|
@ -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 ""
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
76
nodemecu
Executable file
76
nodemecu
Executable 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
24
nodemecu.conf.ejemplo
Normal 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
|
|
@ -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
|
|
|
@ -2,7 +2,9 @@
|
||||||
Description=Procesador de pila y transmisor de datos Nodemecu.
|
Description=Procesador de pila y transmisor de datos Nodemecu.
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart=/opt/nodemecu/register.sh
|
Restart=on-failure
|
||||||
|
RestartSec=5s
|
||||||
|
ExecStart=/opt/nodemecu/registrador
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
47
register.sh
47
register.sh
|
@ -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
69
registrador
Executable 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
13
test
Executable file
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if timeout 1 python arduinos.py 0x05; then
|
||||||
|
|
||||||
|
echo respondio
|
||||||
|
else
|
||||||
|
echo "No respondio, erro $?"
|
||||||
|
|
||||||
|
fi
|
13
uninstall.sh
13
uninstall.sh
|
@ -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
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue