Actualización automática para Midori

11

Estoy usando Raspberry Pi para crear un quiosco web no interactivo: una página web específica (mediciones desde una estación de monitoreo remota) que se mostrará en una pantalla en modo de pantalla completa, el contenido se actualiza con frecuencia a través de AJAX.

Ahora hay bastantes soluciones para convertir Raspberry en un quiosco, y estoy bastante seguro de que podré hacerlo bien, pero el quiosco debería estar libre de mantenimiento. Especialmente en una situación en la que se corta la energía, luego se vuelve a encender, pero de alguna manera la infraestructura del enrutador / módem / red no se puso en línea.

En esa situación, Midori abrirá una página sobre "no se puede conectar" o algo así y se quedará atascado de esta manera hasta que alguien vuelva a encenderlo, ¡ya que la página web que incluye su propio mecanismo de actualización automática no se cargó!

Ahora, ¿cómo puedo obligar a Midori a cargar la página cuando la red vuelva a estar disponible o algo similar (actualización automática cada 15 minutos más o menos, o seguir actualizando hasta que la página se cargue o algo así)?

Si esa opción no está disponible para Midori, ¿puede recomendar alguna otra solución?

SF.
fuente
No tengo acceso a un Pi en este momento, y tampoco a Midori, pero ¿tal vez Midori tiene soporte para dbus? Puede intentar ejecutar qdbus(desde el paquete libqt4-dbus) o alguna herramienta similar y buscar Midori allí. Entonces lo más probable es que puedas activar una actualización de la página.
Arne
Aún mejor: parece que Midori tiene algo incorporado . Tal vez puedas probar eso y publicar una respuesta aquí.
Arne
¿Mi respuesta no fue útil? ¿Te gustaría que escribiera un script bash en lugar de Python? Si necesita usar crontab, ¿hay algún error con el que pueda responder?
xxmbabanexx
@xxmbabanexx: Fue útil y seguramente lo aceptaré si no aparecen otros mejores. He encontrado una solución alternativa que publicaré una vez que esté completamente desarrollada. Todavía espero que a alguien se le ocurra una solución que no realice una actualización si la página funciona bien, pero si eso no sucede, su respuesta es perfectamente aceptable y la aceptaré.
SF.
@sf. Gracias por la información adicional. Una vez que termine mi tarea de matemáticas, editaré mi script para incluir la verificación de la conexión de red.
xxmbabanexx

Respuestas:

6

Suponiendo que tiene Python en su sistema, hay una alternativa a cron. He creado un script rápido de Python 2.7.3 que volverá a cargar Midori cada 5 minutos.

#This program reloads midori every 5 minutes

#Redifine the variables below as you see fit

rest_time = 300 #Rest time is set to 300 seconds (5 minutes) 


import subprocess as sub #Imports terminal commands (needed for reload)
from time import sleep #Import sleep (allows an infinite loop to become dormant)

while True: #This is an infinite loop. This means that our script won't stop.
    sub.call(["midori", "-e", "Reload"]) #This forwards our command to the terminal
    sleep(rest_time) #Wait rest_time second(s), then start the loop again. 

Si necesita cambiar la cantidad de tiempo de descanso, simplemente cambie la rest_timevariable.

Nuevo guión

Como dijiste que necesitabas que el programa fuera "inteligente", lo edité para que sea así. Cuando use este programa, no abra Midori manualmente; ábralo desde el guión. Tengo una extraña costumbre de fallar debido al Speed ​​Dialer si lo haces de otra manera. También se ejecuta en Python 2.7.3. Si no desea hacer toda esa copia y pegar, visite mi pastebin del código.

"""
Midori Kiosk Reloader.
Created by xxmbabanexx

NOTE: This program opens Midori automatically. DO NOT OPEN IT MANUALLY, SIMPLY CLICK ON THIS PROGRAM.

KEYS

1 = Connection Complete. All is well.

0 = Connection Incomplete. Something is wrong.
"""


#Change these variables to your liking.

host = "www.google.com" #Put your desired host URL/IP between the quotes

port = 80 #Set to default port of 80. If your host uses something else, please change it.

recheck_time = 10 #The number of seconds the program will wait to ping the server. Change this at your leisure. 

page_to_open_to = "www.google.com" #This is the webpage the kiosk will open to. Put the url between the quotes.


#Excersise caution when changing these vars.

last = -1 #undefined state
up = -1 #Undefined state



"""
#---------------- Main code. Do NOT touch unless you KNOW what you are doing. ------------
"""
#Import modules

import subprocess as sub
from time import sleep
import socket
import threading

sub.Popen(["midori", "-a", page_to_open_to]) #open midori


#Check if internet is up
addr = (host, port) #the connection addr


while True:
    last = up #reset checking var
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #create socket
    try: #attempt to ping, change vars
        s.connect(addr)
        up = 1
        print "\n"
    except socket.error: #if error when pinging, change vars
        up = 0
        print "\n"

    print "LAST CHECK:", last
    print "CURRENT CHECK:", up
    if last == 0 and up == 1:
        print "Reloading Midori.\n"
        sub.call(["midori", "-e", "Reload"])
    s.close()


    sleep(recheck_time)
xxmbabanexx
fuente
8

En caso de que alguien venga y esté buscando una respuesta actualizada, Midori ahora tiene una opción de línea de comando --inactivity-reset=SECONDS(o -ipara abreviar).

Junto con la -aopción, puede lograr un navegador que se reinicia constantemente en modo quiosco cada x segundos.

p.ej

midori -a http://www.google.com/ -i 120 -e Pantalla completa

Abrirá http://www.google.com/ en una ventana de pantalla completa y actualizará la página después de 2 minutos de inactividad. ( -eejecuta un comando)

encogerse
fuente
4

Decidí abordarlo desde un lado diferente, en su mayoría independiente del navegador.

El navegador se inicia en modo quiosco, apuntando a un documento local específico:

watchdog.html

<!DOCTYPE html>
<html>
    <head>
        <title>Monitoring</title>
        <script type="text/javascript">
        <!--
        var reload_url="http://example.org/watched.html";
        var to = 10000;  // Watchdog timeout: 10s.
        var wd;
        var ifr;
        function setup_watchdog()
        {
            ifr=document.getElementById("frame1");
            window.onmessage = function(e){
                if (e.data == 'tyrp') {
                    window.clearTimeout(wd);
                    wd = window.setTimeout(wdf,to);
                }
            };
            ifr.src = reload_url;
            wd = window.setTimeout(wdf,to);
        }

        function wdf()
        {
            ifr.src = reload_url;
            wd = window.setTimeout(wdf,to);
        }
        // -->
        </script>
    </head>
    <body onload="setup_watchdog()" style="margin: 0; overflow: hidden;">
        <iframe id="frame1" src="#" 
        style="position:absolute; left: 0px; width: 100%; top: 0px; height: 100%; margin:0; padding:0; border:0px none transparent;"></iframe>
    </body>
</html>

Ahora en este archivo, el valor de tiempo de espera se ajusta para contener dos actualizaciones automáticas normales de la página remota más algunas, y reload_urlse establece en su URL.

La página remota tiene un fragmento que se ejecuta cada vez que su actualización se realiza correctamente:

try {
    window.top.postMessage('tyrp', '*');
} catch(e){}

Si sucede algo malo: la página no se carga, se carga como 404 o error o su javascript se detiene por cualquier motivo, o alguna redirección de secuestro nos empuja a una página diferente, si dos mensajes de actualización consecutivos no llegan, el marco de vigilancia restablece la URL al original, que realiza automáticamente la recarga.

Tenga en cuenta que el intento ... catch es evitar problemas con navegadores antiguos que pueden no ser compatibles con postMessage. Esto no será un problema con el quiosco ya que controlamos el entorno y siempre podemos asegurar que se usará el navegador correcto. OTOH, en computadoras cliente aleatorias sin el marco escuchando los mensajes, la operación postMessage no funciona, siempre y cuando no cause un error de aborto de script, por lo tanto, intente ... capturar.

SF.
fuente
3

Yo uso el xdotool para simular una pulsación de tecla f5

pi@data-integrity-pi ~/log $ cat ~/bin/refresh_kiosk.sh
DISPLAY=:0 xdotool search --name ci-monitor windowactivate --sync key F5 >> ~/log/tmp.log 2>&1

y luego en mi crontab ejecuto ese script cada minuto

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Jamie Cook
fuente