2010-12-09 44 views
3

Je vais avoir des problèmes avec le script suivant:Impossible de se connecter à distance à l'aide db tunnel ssh et activerecord

require 'rubygems' 
require 'active_record' 
require 'net/ssh/gateway' 

gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass") 
puts "true" if gateway.active? 
p = gateway.open('127.0.0.1', 3306, 3307) 

class MyClass < ActiveRecord::Base 
    establish_connection(
    :adapter => "mysql", 
    :host  => "127.0.0.1", 
    :username => "db_user", 
    :password => "db_pass", 
    :database => "mydb_production", 
    :port  => 3307 
) 
end 

puts MyClass.all.size 

gateway.shutdown! 

Quand je lance le script, il se bloque juste, à moins que je retire la requête activerecord. Je sais que je peux connecter en utilisant tunnel parce que je peux créer un tunnel à partir de la commande comme comme ceci:

ssh -f [email protected] -L 3307/127.0.0.1/3306 -N 

Ensuite, si je lance:

require 'rubygems' 
require 'active_record' 

class MyClass < ActiveRecord::Base 
    establish_connection(
    :adapter => "mysql", 
    :host  => "127.0.0.1", 
    :username => "db_user", 
    :password => "db_pass", 
    :database => "mydb_production", 
    :port  => 3307 
) 
end 

puts MyClass.all.size 

Il fonctionne très bien. Qu'est-ce que je fais mal?

Merci.

+0

Avez-vous essayé d'ouvrir la porte d'entrée dans un autre thread ou processus? Je crois que votre problème pourrait être causé par une impasse due à la façon dont MySQL pourrait essayer de faire des E/S sur votre tunnel ... – Romain

Répondre

2

Je pense que le commentaire est correct - le DB est en conflit avec la boucle d'événement dans le code ssh.

Essayez ceci:

require 'rubygems' 
    require 'active_record' 
    require 'net/ssh/gateway' 

    gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass") 
    puts "true" if gateway.active? 
    port = gateway.open('127.0.0.1', 3306, 3307) 
    fork.do 
    class MyClass < ActiveRecord::Base 
     establish_connection(
     :adapter => "mysql", 
     :host  => "127.0.0.1", 
     :username => "db_user", 
     :password => "db_pass", 
     :database => "mydb_production", 
     :port  => 3307 
    ) 
    end 

    puts MyClass.all.size 
    end 

    Process.wait 

    gateway.shutdown! 
8

J'ai pu obtenir ce travail sans une fourchette en utilisant la gemme mysql2

require 'rubygems' 
require 'active_record' 
require 'mysql2' 
require 'net/ssh/gateway' 

gateway = Net::SSH::Gateway.new(
    'remotehost.com', 
    'username' 
) 
port = gateway.open('127.0.0.1', 3306, 3307) 

class Company < ActiveRecord::Base 
    establish_connection(
    :adapter => "mysql2", 
    :host  => "127.0.0.1", 
    :username => "dbuser", 
    :password => "dbpass", 
    :database => "dbname", 
    :port  => 3307 
) 
end 
puts Company.all.size