2008-09-27 3 views
2

Я написал сценарий ruby, который открывает страницу администрирования dlink в firefox и выполняет ADSL-соединение или разъединение.firefox not opening - cron, ruby, firewatir

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

Это запись я в кронтаб

# 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

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

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

Xvfb :1 -screen 0 1600x1200x32 

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

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

Существует даже связка рубина для завитка: libcurl for Ruby. Итоговый скрипт должен быть намного меньше, чем ваш текущий скрипт.

+0

Также обратите внимание, что просто установка переменной DISPLAY может оказаться недостаточной для присоединения к существующему дисплею, так как могут быть файлы конфигурации и файлы полномочий, которые должны быть расположены через переменные среды. например XAUTHORITY –

+0

@Roshan и @Douglas: DISPLAY =: 0.0 в crontab решили проблему. Я согласен с тем, что я мог бы сделать это легче. Я экспериментировал с FireWatir, так что это показалось мне полезным в данный момент. Когда я получу шанс, я попробую более легкий подход. Еще раз спасибо. – rpattabi

+0

+1 - firefox --display =: 0.0 URL решил ту же проблему для меня ... спасибо. – deuberger

0

записи кронтаб неправильно

это как

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

Пользовательское поле требуется только для системы crontab, а не для индивидуального crontab каждого пользователя. –

+0

@mana: Дуглас прав. Я мог бы работать cron jobs без имени пользователя. Также, как вы видите в вопросе, я мог бы запустить работу cron. Просто я не мог видеть firefox на дисплее. – rpattabi

1

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

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

Смежные вопросы