Firefox не открывается - cron, ruby, firewatir - PullRequest
2 голосов
/ 27 сентября 2008

Я написал скрипт ruby, который открывает страницу администрирования dlink в Firefox и выполняет ADSL-подключение или отключение.

Я мог бы запустить этот скрипт в терминале без проблем. Но если я поставлю это как работу cron, это не вызовет firefox.

У меня есть запись в crontab

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

Я вижу следующие записи в / tmp / cron_test. Похоже, скрипт действительно запустился.

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

Но я не мог понять, почему я не вижу, как открывается Firefox, чтобы эта автоматизация работала. Вот / 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

Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2008

Вам необходимо иметь среду DISPLAY, указывающую на действительный X-сервер. Для этого может потребоваться установить значение «: 0.0» (без кавычек), чтобы оно относилось к вашему местному стандарту DISPLAY.

Однако следует иметь в виду несколько вещей: Вы можете запустить виртуальный фрейм-буфер X (xvfb), чтобы Firefox просто использовал его для отображения. Это будет означать, что Firefox сможет выполнять все свои графические операции, но он не будет зависеть от вашей стандартной графической среды. Вам нужно будет соответствующим образом установить переменную DISPLAY, чтобы она указывала на экземпляр xvfb. Например, если вы вызываете xvfb следующим образом:

Xvfb :1 -screen 0 1600x1200x32

Тогда вы сможете использовать это, установив для переменной DISPLAY значение: 1

Вы запускаете полноценный экземпляр Firefox, чтобы просто подключить или отключить модем. Скорее всего, вы сможете использовать «curl» для отправки соответствующих HTTP-запросов на сервер, чтобы он выполнял подключение или отключение для вас. Один из простых способов увидеть, что вы должны воссоздать, - это установить плагин Firefox, такой как LiveHTTPHeaders, и записать наиболее важные HTTP-запросы при выполнении действий вручную.

Есть даже рубиновая привязка для curl: libcurl для Ruby . Результирующий скрипт должен быть намного меньше вашего текущего скрипта.

1 голос
/ 27 сентября 2008

Программы, запускаемые из cron, не имеют вашей интерактивной среды. Поэтому у них нет переменной DISPLAY, и поэтому вы не можете запускать X (графические) программы, например Firefox.

Я бы предложил выполнить HTTP-соединения самостоятельно, в ruby, а не пытаться автоматизировать Firefox.

0 голосов
/ 27 сентября 2008

неправильная запись в crontab

это как

#min  hour  day  month  dow  user                command
55    17    *    *      *    ur_user_is_missing  ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
...