firefox ne s'ouvre pas - cron, ruby, firewatir
-
02-07-2019 - |
Question
J'ai écrit un script ruby ??qui ouvre la page d'administration de Dlink dans Firefox et effectue une connexion ou une déconnexion ADSL.
Je pourrais exécuter ce script dans le terminal sans aucun problème. Mais si je le mets comme travail cron, il ne lance pas firefox.
Ceci est l'entrée que j'ai dans crontab
# connect to dataone
55 17 * * * ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
Je vois les entrées suivantes dans / tmp / cron_test. Il semble donc que le script ait effectivement été exécuté.
PROFILE:
i486-linux
/usr/bin/firefox -jssh
Mais je ne pouvais pas comprendre pourquoi je ne voyais pas Firefox s’ouvrir, pour que cette automatisation fonctionne. Voici /home/raguanu/Dropbox/nettie.rb
#!/usr/bin/ruby -w
require 'rubygems'
require 'firewatir'
require 'optiflag'
module Options extend OptiFlagSet
character_flag :d do
long_form 'disconnect'
description 'Mention this flag if you want to disconnect dataone'
end
flag :l do
optional
long_form 'admin_link'
default 'http://192.168.1.1'
description 'Dlink web administration link. Defaults to http://192.168.1.1'
end
flag :u do
optional
long_form 'user'
default 'admin'
description 'Dlink administrator user name. Defaults to "admin"'
end
flag :p do
optional
long_form 'password'
default 'admin'
description 'Dlink administrator password. Defaults to "admin"'
end
flag :c do
optional
long_form 'connection_name'
default 'bsnl'
description 'Dataone connection name. Defaults to "bsnl"'
end
extended_help_flag :h do
long_form 'help'
end
and_process!
end
class DlinkAdmin
include FireWatir
def initialize(admin_link = "http://192.168.1.1", user = 'admin', pwd = 'admin')
@admin_link, @user, @pwd = admin_link, user, pwd
end
def connect( connection_name = 'bsnl' )
goto_connection_page connection_name
# disconnect prior to connection
@browser.button(:value, 'Disconnect').click
# connect
@browser.button(:value, 'Connect').click
# done!
@browser.close
end
def disconnect( connection_name = 'bsnl' )
goto_connection_page connection_name
# disconnect
@browser.button(:value, 'Disconnect').click
# done!
@browser.close
end
private
def goto_connection_page( connection_name = 'bsnl')
@browser ||= Firefox.new
@browser.goto(@admin_link)
# login
@browser.text_field(:name, 'uiViewUserName').set(@user)
@browser.text_field(:name, 'uiViewPassword').set(@pwd)
@browser.button(:value,'Log In').click
# setup > dataone
@browser.image(:alt, 'Setup').click
@browser.link(:text, connection_name).click
end
end
admin = DlinkAdmin.new(Options.flags.l, Options.flags.u, Options.flags.p)
unless Options.flags.d?
admin.connect( Options.flags.c )
else
admin.disconnect( Options.flags.c )
end
Toute aide est appréciée.
La solution
Vous devez disposer d'un environnement DISPLAY pointant vers un serveur X valide. Cela peut impliquer de le définir sur la valeur ": 0.0 " (sans guillemets), de telle sorte qu'il fait référence à votre affichage standard local.
Cependant, il convient de garder quelques points à l’esprit: Vous pouvez exécuter un tampon de cadre virtuel X (xvfb), de sorte que Firefox l’utilise simplement lorsqu’il est affiché. Cela signifierait que Firefox serait capable de faire toutes ses opérations graphiques, mais qu'il serait indépendant de votre environnement graphique standard. Vous devrez définir la variable DISPLAY de manière à ce qu'elle pointe vers l'instance xvfb. Par exemple, si vous appelez xvfb comme suit:
Xvfb :1 -screen 0 1600x1200x32
Vous pourrez ensuite l'utiliser en définissant la variable DISPLAY sur: 1
Vous démarrez une instance firefox complète pour simplement connecter ou déconnecter votre modem. Vous pourrez probablement utiliser " curl " d'envoyer les requêtes HTTP appropriées au serveur, de sorte qu'il se connecte ou se déconnecte pour vous. Une façon simple de voir ce que vous devriez recréer consiste à installer un plugin Firefox tel que LiveHTTPHeaders et à noter les requêtes HTTP les plus importantes au fur et à mesure que vous effectuez les actions manuellement.
Il existe même une reliure rubis pour curl: libcurl pour Ruby . Le script résultant doit être beaucoup plus petit que votre script actuel.
Autres conseils
Les programmes exécutés à partir de cron n'ont pas votre environnement interactif. Par conséquent, ils ne possèdent pas de variable et DISPLAY et vous ne pouvez donc exécuter aucun programme X (graphique), par exemple. Firefox.
Je suggérerais de faire les connexions HTTP vous-même, en ruby, plutôt que d'essayer d'automatiser Firefox.
l'entrée de la crontab est incorrecte
c'est comme
#min hour day month dow user command
55 17 * * * ur_user_is_missing ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test