El libre pensamiento para un internet libre

No estas registrado.  

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#1 28-08-2018 10:07:35

Fisgon
Usuario

Registrado: 27-10-2016
Mensajes: 42

Ayuda para crear script en openwrt + nodogsplash

Hola a todos!!!

Pues sin mucho preámbulo les comento que instale openwrt y nodogsplash en un cacharro chino como este:

ZBT WR8305RT

(No se dejen impresionar por las cuatro antenas, es un truño;  solo 2 están conectadas con su vivo y malla, las restantes son un simple cable conectado a masa )

La intención inicial fue crear un pequeño portal cautivo que reparte wifi gratuito, sin loguin y que  re direccióne a una pagina de facebook,  lo que pude llevar a cabo sin tanta pena ni gloria, la web esta llena de información para ese propósito.

El nodogsplash  como pagina de inicio muestra una pagina html guardada dentro del router y su apariencia es mas o menos asi:

splash

La imagen marcada con la flecha roja es la que se le tiene que dar "click"  para "aceptar" y poder navegar.

La imagen  se almacena en /etc/nodogsplash/htdocs/images/splash.jpg.....  Y de ahí surge la idea del script.

Dicha idea, es que de manera diaria esa imagen cambie a cierta hora durante los siete días de la semana, creo se puede implementar con cron, pero ni idea como (es mi segunda instalación de openwrt en un router y no lo convertí en un ladrillo tongue tongue tongue).

¿Podrían orientarme como crear el script?
¿Cual seria el lugar ideal para guardar esas siete imágenes dentro del router?
¿Sera necesario el reinicio del router después del cambio de dicha imagen?

Les agradezco cualquier orientación.

Saludos!!!!!

Ultima edición por Fisgon (28-08-2018 10:29:24)

Desconectado

Anuncio

Wifi-libre.com: El libre pensamiento para un internet libre / Regístrese ahora

#2 28-08-2018 12:01:01

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

yo por ejemplo tengo un script que me limpia la memoria ram y swap a cada hora con cron. en mi caso tengo que añadirlo al archivo mio de configuración. en la ruta:

/etc/crontab

y este sería el archivo mio.

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
0  *	* * *	root	/bin/liberarswap
0  8	* * *	root	sdmem -v
#

   
si te fijas bien en la linea 15 (root    /bin/liberarswap) pone un cero que es el equivalente a 1 hora
al principio te pone en el comentario como va para cada hora o dia, en esta linea

# m h dom mon dow user	command

donde:

m este corresponde al minuto en que se va a ejecutar el script, el valor va de 0 a 59 minutos
h la hora exacta, es manejada en formato de 24 horas, los valores van de 0 a 23, siendo 0 las 12:00 de la medianoche.
dom hace referencia al día del mes, por ejemplo se puede especificar 15 si se quiere ejecutar cada dia 15
dow significa el día de la semana, puede ser numérico (0 a 7, donde 0 y 7 son domingos) o las 3 primeras letras del día en inglés: mon, tue, wed, thu, fri, sat, sun.
user define el usuario que va a ejecutar el comando, puede ser root, u otro usuario diferente siempre y cuando tenga permisos de ejecución del script.
command se refiere al comando o a la ruta absoluta del script a ejecutar, ejemplo: /home/usuario/scripts/script.sh, si llamas a un script este debe ser ejecutable

en tu caso yo lo haria asi para no liarte mucho. y no te haría falta ningún script.
solamente juega, con las horas que quieres que se cambie una u otra imagen.

# m h dom mon dow user	command
59  *    * * *    root    /ruta/de la imagen
59  1    * * *    root    /ruta/de la imagen
59  2    * * *    root    /ruta/de la imagen
59  3    * * *    root    /ruta/de la imagen
59  4    * * *    root    /ruta/de la imagen
59  5    * * *    root    /ruta/de la imagen
59  6    * * *    root    /ruta/de la imagen



espero que con esto te oriente un poco y te sea de utilidad.

Ultima edición por crash (28-08-2018 13:02:13)

Desconectado

#3 28-08-2018 12:51:15

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,902

Re: Ayuda para crear script en openwrt + nodogsplash

¡Hola Fisgon! smile

¿Podrían orientarme como crear el script?

Me gustaría saber que pasa cuando cambias la imagen en el directorio  /etc/nodogsplash/htdocs/images/ ¿Se recarga automáticamente y se ve la nueva imagen en el portal?
Luego tienes muchas formas de poner esto de pie. Hay el comando watch que fue pensado para ejecutar código cada x tiempo. Sino se puede hacer un bucle "infinito" con una pausa de x horas (la orden sleep hace esto). Para este tipo de tareas bash es lo adecuado y haces que el script arranque al inicio y lo tienes.

creo se puede implementar con cron

Es otra opción.   

¿Cual seria el lugar ideal para guardar esas siete imágenes dentro del router?

No hay realmente un lugar ideal... Lo ideal es lo que se adapta mejor a tus deseos. Para mi sería poner las imágenes en una carpeta a dentro de  /etc/nodogsplash/htdocs. [email protected] las pondrían en un directorio que tienen para alojar imágenes de programas y botones.
La ruta es indiferente, lo importante es que te parezca lógico a ti.

Desconectado

#4 29-08-2018 10:37:11

Fisgon
Usuario

Registrado: 27-10-2016
Mensajes: 42

Re: Ayuda para crear script en openwrt + nodogsplash

Gracias cash y kcdtv  por responder!!   

Después de leerlos creo sera necesario emplear una mezcla de crontab y bash.

kcdtv escribió:

Me gustaría saber que pasa cuando cambias la imagen en el directorio  /etc/nodogsplash/htdocs/images/ ¿Se recarga automáticamente y se ve la nueva imagen en el portal?

No lo se a ciencia cierta kcdtv, no puedo probar por no tener el router conmigo, pero después de leer a cash con respecto a  liberar memoria y swap, no vendría mal reiniciar el sistema después de que el script cambie la imagen.

Replanteo cuales son las necesidades del script:

* Guardare en /etc/nodogsplash/htdocs/images/ 7 imágenes con los nombres de la semana (Monday.jpg, Tuesday.jpg...Sunday.jpg)

*El scrip cuando lo "llame" cron o watch (a las ocho de la mañana por ejemplo) deberá saber que dia de la semana es:

[email protected]:~# date +'%A'
Wednesday
[email protected]:~# 

El valor que devuelve  "date +'%A'" de alguna manera quiero usarlo para buscar en las imágenes jpg la coincidencia en el nombre,  la copie y renombre como splash.jpg en la misma carpeta y reinicia el sistema.

Nuevamente les agradezco su tiempo, y Saludos!!

Ultima edición por Fisgon (29-08-2018 10:42:02)

Desconectado

#5 29-08-2018 12:14:35

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

el script puede ser así.

#!/bin/bash
time=`date +'%A'`
path=/etc/nodogsplash/htdocs/images
	if [[ $time = 'Sunday' ]] || [[ $time = 'sunday' ]] || [[ $time = 'domingo' ]]; then
		cp $path/sunday.jpg $path/splash.jpg
		echo $time imagen copiada
	elif [[ $time = 'Monday' ]] || [[ $time = 'monday' ]] || [[ $time = 'lunes' ]]; then
		cp $path/monday.jpg $path/splash.jpg
		echo $time imagen copiada
	elif [[ $time = 'Tuesday' ]] || [[ $time = 'tuesday' ]] || [[ $time = 'martes' ]]; then
		cp $path/tuesday.jpg $path/splash.jpg
		echo $time imagen copiada
	elif [[ $time = 'Wednesday' ]] || [[ $time = 'wednesday' ]] || [[ $time = 'miércoles' ]] || [[ $time = 'miercoles' ]]; then
		cp $path/wednesday.jpg $path/splash.jpg
		echo $time imagen copiada
	elif [[ $time = 'Thursday' ]] || [[ $time = 'thursday' ]] || [[ $time = 'jueves' ]]; then
		cp $path/thursday.jpg $path/splash.jpg
		echo $time imagen copiada
	elif [[ $time = 'Friday' ]] || [[ $time = 'friday' ]] || [[ $time = 'viernes' ]]; then
		cp $path/friday.jpg $path/splash.jpg
		echo $time imagen copiada
	elif [[ $time = 'Saturday' ]] || [[ $time = 'saturday' ]] || [[ $time = 'sábado' ]] || [[ $time = 'sabado' ]]; then
		cp $path/saturday.jpg $path/splash.jpg
		echo $time imagen copiada
	else 
		echo ningún día corresponde con el día de la semana
	fi

lo llamarías con cron así. sin las comillas en el usuario. esto buscaría cada hora
mira los ejemplos anteriores para el tiempo que quieras que sea activado.

0  *	* * *	"root o usuario"	ruta del script

espero que esto te sirva.

Ultima edición por crash (29-08-2018 12:57:45)

Desconectado

#6 29-08-2018 12:41:06

Fisgon
Usuario

Registrado: 27-10-2016
Mensajes: 42

Re: Ayuda para crear script en openwrt + nodogsplash

Gracias crash!!!!

Lo voy a probar, regreso con los resultados!!!

Salkudos!!!

Desconectado

#7 29-08-2018 12:59:06

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

lo he corregido porque tenía un error, ahora está bien. vuelve a copiarlo.
asi te debe de salir cuando lo ejecutes en terminal.

[email protected]:~$ '/home/aries/Escritorio/timer'
miércoles imagen copiada

a mi me da error porque no existe ese directorio ni esa imagen.

[email protected]:~$ '/home/aries/Escritorio/timer'
cp: no se puede efectuar `stat' sobre '/etc/nodogsplash/htdocs/images/wednesday.jpg': No existe el archivo o el directorio
miércoles imagen copiada
Fisgon escribió:

la copie y renombre como splash.jpg en la misma carpeta y reinicia el sistema.

¿es necesario que reinicie el sistema?
si es necesario añade al final del script

reboot

y ponlo en algún directorio con usuario root el script
por ejemplo

/bin/  /sbin/  /usr/bin/   /usr/sbin/  

si vas usar reboot entonces en el cron tienes que poner para que solo se reinicie una vez por dia

59  23	* * *	root 	ruta del script

Ultima edición por crash (29-08-2018 15:26:28)

Desconectado

#8 29-08-2018 16:42:32

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,902

Re: Ayuda para crear script en openwrt + nodogsplash

Mucha complicación... wink
Si se trata de sobrescribir splash.png por la imagen del dia se puede hacer en una linea

 cp -f /etc/nodogsplash/htdocs/images/$( date +'%A').png /etc/nodogsplash/htdocs/images/splash.png

El comando cp copia la imagen del día ( $( date +'%A').png ) y "aplasta"  ( opción -f) la imagen splash.png
Cuando es lunes se copia la imagen monday.png y se renombra splash.png (eliminando la antigua splash.png que era una copia de sunday.png )
Para cron supongo que se podría redactar una linea así:   

0 0 * * * cp -f /etc/nodogsplash/htdocs/images/$( date +'%A').png /etc/nodogsplash/htdocs/images/splash.png 

Desconectado

#9 29-08-2018 17:42:15

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

pero no se si no lo interpretará como dos archivos diferentes y dará error, al no llevar comillas `
yo no lo he probado asi como dices kcdtv

puedes probar como mas te guste, tambien puedes poner la linea de kcdtv en un script y llamarlo simplemente en el cron.

para gustos los colores.

Desconectado

#10 29-08-2018 20:10:24

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,902

Re: Ayuda para crear script en openwrt + nodogsplash

pero no se si no lo interpretará como dos archivos diferentes y dará error, al no llevar comillas `
yo no lo he probado asi como dices kcdtv

El archivo se llamará siempre splash.png y no son necesarias comillas extras: No hay ningún espacio en las rutas y no tiene que haber. 
PoC:
La imagen "splash" es la de martes:
script_openwrt.jpg
Ejecuto el comando cp con -f y es ahora (día de hoy miércoles) la imagen del miércoles
script_openwrt_2.jpg

para gustos los colores.

No existe esto "de los gustos y colores" en programación. big_smile
Será siempre mejor hacer algo (cuando es posible) en una linea simple en lugar de hacer una condición múltiple if-elif-if con nada más ni menos que siete condiciones a iterar.  smile
El tiempo de ejecución y el desgaste de recursos es menor (sin hablar de la sintaxis) . 
Con una condición if-elif-fi múltiple el interprete debe ir hasta el final de bucle: Repasa primero todo de if a fi.
Y si no encuentra el fi final sale en estado de error.
Una vez que ha encontrado su fi evaluá las condiciones que ha almacenado.
Para por fin ejecutar la orden deseada.
Ves de inmediato haciendo el camino que es mucho más complicado que ejecutar la linea de orden que se encuentra con una simple sustitución de variable wink
  Las condiciones y los bucles son siempre sinónimos de perdida de recursos... Si se pueden evitar, se deben evitar.
  El código será más limpio, la ejecución será más directa con lo cuál será también más eficiente a la hora de ejecutar la tarea . smile

Desconectado

#11 29-08-2018 21:02:12

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

el ejemplo en consola está muy bien, pero estaba hablando de cron, no de la terminal, en la terminal ya se que no hace falta comillas.

Desconectado

#12 30-08-2018 09:55:30

Fisgon
Usuario

Registrado: 27-10-2016
Mensajes: 42

Re: Ayuda para crear script en openwrt + nodogsplash

Hola!!!!   

Madre miá!!!!.... que elegante eso de:

[email protected]:~$ echo "$( date +'%A').jpg"
jueves.jpg

Lo intente mil veces con; pam

 [email protected]:~$ echo "$ date +'%A'.jpg"
$ date +'%A'.jpg

y se me vino el mundo encima!!!!   Me faltaban los paréntesis!!  yikes

Pues nada... que funciona de perfecto
consola

La pagina con la imagen del día!!!!
nodogsplash


Pues ya Mañana configuro cron que hoy me muero de sueño, pero la sonrisa aun no la pierdo!!

Gracias cash y kdctv por su tiempo , muy agradecido con uds,!

Ultima edición por Fisgon (30-08-2018 10:18:25)

Desconectado

#13 30-08-2018 19:11:26

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,902

Re: Ayuda para crear script en openwrt + nodogsplash

Ojo con una cosa:
No había entendido que quería decir crash en su penúltimo mensaje y tiene razón.
Si redactas la orden en tu linea contrab no funciona porque, si he bien entendido, no permite  sustitución por ordenes.
Y tampoco se puede declarar una variable para recoger el día... Complicado... Lo hago desde ubuntu y esto es lo que dicen:

name = value

       where  the  spaces  around the equal-sign (=) are optional, and any subsequent non-leading
       spaces in value will be part of the value assigned to  name.   The  value  string  may  be
       placed  in quotes (single or double, but matching) to preserve leading or trailing blanks.
      The value  string  is  not  parsed  for  environmental  substitutions  or  replacement  of
       variables
, thus lines like

           PATH = $HOME/bin:$PATH

       will not work as you might expect. And neither will this work

           A=1
           B=2
           C=$A $B

  No puedes usar el valor de una variable (o ejecutar una orden) para declarar una variable. 
No he visto forma de darle vuelto esto.
Así que me parece que debes hacer un script (de una sola linea... tongue) y ejecutarlo con crontab.
  Si haces un reboot puede ser importante tener en cuenta esto:

One solution for cron is to use a delay and touch a file in /etc before reboot:

# Reboot at 4:30am every day
# Note: To avoid infinite reboot loop, wait 70 seconds
# and touch a file in /etc so clock will be set
# properly to 4:31 on reboot before cron starts.
30 4 * * * sleep 70 && touch /etc/banner && reboot

Cron and crontab @ OpenWRT wiki

Desconectado

#14 30-08-2018 20:01:45

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

el problema de cron es que está pensado para órdenes simples como
por ejemplo: el comando de limpieza de memoria ram

sdmem -v

si intentas ejecutar un comando que se compone de varias partes como es cp. da error
porque entiende que es el comando copiar, mas un archivo, mas otro archivo, al haber un espacio entre archivos
en ese caso se debería usar las comillas y si encima esto va con variables sustitutorias, entonces ya te falla por todos lados.

`cp -f copia-de-archivo salida-de-archivo`

esa sería la teoría de cron, como dije anteriormente yo no lo he probado así nunca, es preferible hacerlo en un script e indicar la ruta de el.

por eso en el primer mensaje dije que él "el script puede ser así" como una idea de como hacerse.

Desconectado

#15 30-08-2018 22:54:00

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,902

Re: Ayuda para crear script en openwrt + nodogsplash

El comando cp funciona sin comillas (con crontab)  si pones las rutas tal cuál... 
Así funciona

* * * * *  cp -f /etc/nodogsplash/htdocs/images/jueves.png /etc/nodogsplash/htdocs/images/splash.png 

El problema viene cuando quieres ejecutar una orden en el propio comando, "la sustitución por comandos". No la hace con lo cuál no puede pillar la imagen, le falta el día.
  Así no funciona

* * * * *  cp -f /etc/nodogsplash/htdocs/images/$( date +'%A').png /etc/nodogsplash/htdocs/images/splash.png

No permite la sustitución de cadenas por variables o ordenes y he probado con apostrofes, comas simples y dobles y todas las sintaxis posibles , solo puedes hacer una variable caca=pipi lo que no aporta gran cosa...
Solo ha sido pensado para crear o modificar variables de entorno simples.
Bueno... Es lo que hay... Se pone la linea en una archivo y se ejecuta como un script desde crontab. No hay fallos

Desconectado

#16 30-08-2018 23:21:10

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

bueno algo más que hemos aprendido, porque yo no había probado nunca antes así.
siempre he puesto comandos simples o scripts.
la verdad que cron es bueno, pero hasta que le cojes el truquillo, es un poco confuso.

Desconectado

#17 04-09-2018 06:26:04

Fisgon
Usuario

Registrado: 27-10-2016
Mensajes: 42

Re: Ayuda para crear script en openwrt + nodogsplash

Vale, crash, cierto todos hemos aprendido algo,  como conclusión les digo que va bien el script para  cambia la imagen. pero el smartphone guarda en cache la pagina y aunque cambie muestra la anterior. En cambio si un smartphone no se ha conectado al ap antes, si  muestra la pagina correspondiente al dia.  Pero mañana mostrara la de hoy que ya guardo en la cache . roll roll roll

Saludos y gracias kcdtv y cash  por su ayuda!!

Ultima edición por Fisgon (04-09-2018 06:29:13)

Desconectado

#18 04-09-2018 17:06:27

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,902

Re: Ayuda para crear script en openwrt + nodogsplash

Maldita sea la cache...

Desconectado

#19 07-09-2018 14:33:05

crash
Expulsado

Registrado: 25-10-2017
Mensajes: 1,049

Re: Ayuda para crear script en openwrt + nodogsplash

siempre puedes poner en el html, una recomendación de que limpien la memoria caché antes de ejecutar la conexión.

por ejemplo algo asi, justo debajo del boton de la imagen.

<p>Se recomienda que antes de ejecutar la conexión se libere la memoria caché del navegador</p>

Desconectado

Anuncio

Wifi-libre.com: El libre pensamiento para un internet libre / Regístrese ahora

Temas similares

Tema Respuestas Vistas Ultimo mensaje
0 28 Ayer 16:15:47 por kcdtv
6 395 24-08-2019 23:58:27 por brunete
(Duda) Infinitum 2.4 por thoh13
4 4300 24-08-2019 04:30:14 por roberto721
107 22905 23-08-2019 17:17:50 por kcdtv
83 51726 20-08-2019 12:47:20 por kcdtv

Pie de página

Información del usuario

Ultimo usuario registrado: cbs2303
Usuarios registrados conectados: 1
Invitados conectados: 14

Conectados: bavalu

Estadisticas de los foros

Número total de usuarios registrados: 1,588
Número total de temas: 1,343
Número total de mensajes: 13,585

Máx. usuarios conectados: 255 el 30-07-2019 10:48:17