Domanda

Ho scritto uno script ruby ??che apre la pagina di amministrazione di dlink in Firefox e fa una connessione o disconnessione ADSL.

Potrei eseguire questo script nel terminale senza alcun problema. Ma se lo metto come cron job, non si accende firefox.

Questa è la voce che ho in crontab

# connect to dataone
55 17 * * * ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test

Vedo le seguenti voci in / tmp / cron_test. Quindi sembra che lo script sia stato effettivamente eseguito.

PROFILE: 
i486-linux
/usr/bin/firefox -jssh

Ma non sono riuscito a capire perché non ho visto aprire Firefox, perché questa automazione funzionasse. Ecco /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

Qualsiasi aiuto è apprezzato.

È stato utile?

Soluzione

Devi avere un ambiente DISPLAY che punta a un X-server valido. Ciò potrebbe comportare l'impostazione del valore "0,0:" (senza virgolette), in modo tale che faccia riferimento al DISPLAY standard locale.

Ci sono alcune cose da tenere a mente: È possibile eseguire un buffer di frame virtuale X (xvfb), in modo che Firefox lo usi semplicemente come viene visualizzato. Ciò significherebbe che Firefox sarebbe in grado di fare tutte le sue operazioni grafiche, ma che sarebbe indipendente dal tuo ambiente grafico standard. Dovrai impostare la variabile DISPLAY in modo appropriato in modo che punti all'istanza xvfb. Ad esempio, se invochi xvfb come segue:

Xvfb :1 -screen 0 1600x1200x32

Quindi potrai usarlo impostando la variabile DISPLAY su: 1

Stai avviando un'istanza completa di Firefox per connettere o disconnettere semplicemente il tuo modem. Molto probabilmente saresti in grado di utilizzare " curl " per inviare le richieste HTTP appropriate al server, in modo tale che esegua una connessione o disconnessione per l'utente. Un modo banale per vedere cosa dovresti ricreare sarebbe installare un plug-in Firefox come LiveHTTPHeaders e annotare le richieste HTTP più importanti mentre esegui le azioni manualmente.

Esiste anche un legame rubino per il ricciolo: libcurl for Ruby . Lo script risultante dovrebbe essere molto più piccolo del tuo script corrente.

Altri suggerimenti

I programmi eseguiti da cron non hanno il tuo ambiente interattivo. Pertanto non hanno una variabile DISPLAY e quindi non è possibile eseguire alcun programma X (grafico), ad es. Firefox.

Suggerirei di fare tu stesso le connessioni HTTP, in ruby, piuttosto che provare ad automatizzare Firefox.

la voce crontab è errata

è come

#min  hour  day  month  dow  user                command
55    17    *    *      *    ur_user_is_missing  ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top