Автоматичне оновлення для Midori


11

Я використовую Raspberry Pi для створення неінтерактивного веб-кіоску - певної веб-сторінки (вимірювання від віддаленої станції моніторингу), яка відображатиметься на екрані в повноекранному режимі, вміст часто оновлюється через AJAX.

Зараз існує досить багато рішень, щоб перетворити малину в кіоск, і я впевнений, що зможу це зробити просто чудово, але кіоск повинен бути зовсім не потребує обслуговування. Особливо в ситуації, коли живлення вимикається, потім повертається, але якось інфраструктура маршрутизатора / модема / мережі не зовсім вийшла в Інтернет.

У цій ситуації Midori створить сторінку про "не в змозі підключитися" або щось подібне, і вона буде застрягати так, поки хтось знову не перемкне живлення - оскільки веб-сторінка, що включає власний механізм автоматичного оновлення, не вдалося завантажити!

Тепер, як я можу змусити Midori завантажувати сторінку, коли мережа знову доступна, або щось подібне (автоматично оновлювати завжди кожні 15 хвилин або тривати оновлення, поки сторінка не завантажиться чи щось подібне?)?

Якщо такий варіант недоступний для Midori, чи можете ви порадити якесь інше рішення?


Зараз у мене немає доступу до Pi, а також до Midori, але, можливо, у Midori є підтримка dbus? Ви можете спробувати запустити qdbus(з пакета libqt4-dbus) або якийсь подібний інструмент і шукати там Midori. Тоді ви, швидше за все, можете викликати оновлення сторінки.
Арн

Ще краще: здається, у Midori щось вбудоване . Можливо, ви можете спробувати це і опублікувати відповідь тут.
Арн

Чи моя відповідь не була корисною? Чи хотіли б ви написати сценарій bash замість Python? Якщо вам потрібно використовувати crontab, чи є помилки, на які ви можете відповісти?
xxmbabanexx

@xxmbabanexx: Це було корисно, і я обов'язково прийму це, якщо не з’явиться кращих. Я знайшов альтернативне рішення, яке опублікую після того, як буде повністю розроблене. Я все ще сподіваюся, що хтось придумає рішення, яке не виконуватиме оновлення, якщо сторінка працює добре, але якщо цього не відбудеться, ваша відповідь цілком прийнятна, і я прийму це.
СФ.

@sf. Дякуємо за додаткову інформацію. Як тільки я закінчу домашнє завдання з математики, я відредагую свій сценарій, щоб включити перевірку підключення до мережі.
xxmbabanexx

Відповіді:


6

Якщо припустити, що у вашій системі є Python, є альтернатива cron. Я створив швидкий сценарій Python 2.7.3, який буде перезавантажувати Midori кожні 5 хвилин.

#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. 

Якщо вам потрібно змінити кількість часу відпочинку, просто змініть rest_timeзмінну.

Новий сценарій

Як ви сказали, що вам потрібна програма, щоб бути "розумною", я її відредагував, щоб зробити так. Під час використання цієї програми, будь ласка, не відкривайте Midori вручну; відкрити його зі сценарію. У мене є дивна звичка збиватися через швидкого набору, якщо ви робите інше. Він також працює на Python 2.7.3. Якщо ви не хочете робити всю цю копію та вставляти, будь ласка, відвідайте мою вставку коду.

"""
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)

8

На всякий випадок, коли хтось заходить і шукає оновлену відповідь, у Midori тепер є варіант командного рядка --inactivity-reset=SECONDS(або -iкоротко).

У поєднанні з -aможливістю ви можете домогтися браузера, який постійно перезапускається, у режимі кіоску кожні х секунд.

напр

midori -a http://www.google.com/ -i 120 -e Повний екран

Відкриється http://www.google.com/ у повноекранному вікні та оновить сторінку через 2 хвилини бездіяльності. ( -eвиконує команду)


4

Я вирішив підійти до цього з іншої сторони, переважно незалежно від браузера.

Браузер запускається в режимі кіоску, вказуючи на певний локальний документ:

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>

Тепер у цьому файлі значення тайм-аута коригується таким чином, щоб містити два звичайних автоматичних оновлення віддаленої сторінки плюс деякі, і reload_urlвстановлюється його URL.

У віддаленій сторінці є фрагмент, який виконується кожного разу, коли його оновлення виконується правильно:

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

Якщо трапиться щось погане - сторінка не завантажується, завантажується як 404 або помилка, або javascript зупиняється з будь-якої причини, або якесь переспрямування викрадення перештовхує нас на іншу сторінку, якщо два послідовних повідомлення про оновлення не приходять, кадр сторожової сторінки скидає URL до оригіналу, який автоматично виконує перезавантаження.

Зауважте, спробу ... улов полягає в тому, щоб запобігти проблемам зі старими браузерами, які можуть не підтримувати постМессаж. Це не буде проблемою з кіоском, оскільки ми контролюємо навколишнє середовище і завжди можемо запевнити, що буде використаний правильний браузер. OTOH, на випадкових клієнтських комп'ютерах без кадру для прослуховування повідомлень операція postMessage не працює, доки вона не спричинить помилку переривання сценарію, тому спробуйте ..


3

Я використовую xdotool для імітації натискання клавіш 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

а потім у своєму crontab я щохвилини запускаю цей сценарій

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.