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:

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 :stuck_out_tongue: :stuck_out_tongue: :P).

¿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!!!

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.

[code]# /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
#[/code]

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.

¡Hola Fisgon! :slight_smile:

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.

Es otra opción.

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. Otr@s 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.

Gracias cash y kcdtv por responder!!

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

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:

root@OpenWrt:~# date +'%A' Wednesday root@OpenWrt:~#

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

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.

Gracias crash!!!

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

Salkudos!!!

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

aries@aries:~$ '/home/aries/Escritorio/timer' miércoles imagen copiada

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

aries@aries:~$ '/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

¿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

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 

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.

[quote]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[/quote]
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:

Ejecuto el comando cp con -f y es ahora (día de hoy miércoles) la imagen del miércoles

No existe esto “de los gustos y colores” en programación. :smiley:
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. :slight_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 . :slight_smile:

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.

Hola!!!

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

agd@Linux:~$ echo "$( date +'%A').jpg" jueves.jpg

Lo intente mil veces con; :pam:

agd@Linux:~$ echo "$ date +'%A'.jpg" $ date +'%A'.jpg

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

Pues nada… que funciona de perfecto

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

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,!

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:

[quote] 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[/quote]

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… :P) y ejecutarlo con crontab.
Si haces un reboot puede ser importante tener en cuenta esto:

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

[code]# 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[/code][/quote]
Cron and crontab @ OpenWRT wiki

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.

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

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.

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 . :rolleyes: :rolleyes: :rolleyes:

Saludos y gracias kcdtv y cash por su ayuda!!

Maldita sea la cache…

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>