From: John Yuan on
Hi,

I may shooting a wrong question, but I saw the same question here that
left unanswered and gone 60 days more, so I want to raise it once again.

I have 3 NIFs :

1. PPP1 (111.111.111.111):PPTP to VPN
 2. eth2 (192.168.0.2)  :LAN
 3. ppp3 (333.333.333.333):PPPoE to ASDL

and want to bind a specific interface to Mechanize agent somehow like :

agent.bind(Socket.sockaddr_in(80, "111.111.111.111"))
 agent.bind(Socket.sockaddr_in(80, "192.168.0.2"))
 agent.bind(Socket.sockaddr_in(80, "333.333.333.333"))

like the way Socket does. But I haven't have any luck yet.

Did anyone try yet or shouldn't expect Mechanize package working in this
way?

any suggestion would be appreciated !!

Thanks

John
--
Posted via http://www.ruby-forum.com/.

From: Walton Hoops on
On 3/29/2010 9:26 PM, John Yuan wrote:
> Hi,
>
> I may shooting a wrong question, but I saw the same question here that
> left unanswered and gone 60 days more, so I want to raise it once again.
>
> I have 3 NIFs :
>
> 1. PPP1 (111.111.111.111):PPTP to VPN
>  2. eth2 (192.168.0.2)  :LAN
>  3. ppp3 (333.333.333.333):PPPoE to ASDL
>
> and want to bind a specific interface to Mechanize agent somehow like :
>
> agent.bind(Socket.sockaddr_in(80, "111.111.111.111"))
>  agent.bind(Socket.sockaddr_in(80, "192.168.0.2"))
>  agent.bind(Socket.sockaddr_in(80, "333.333.333.333"))
>
> like the way Socket does. But I haven't have any luck yet.
>
> Did anyone try yet or shouldn't expect Mechanize package working in this
> way?
>
> any suggestion would be appreciated !!
>
> Thanks
>
> John
>
It doesn't work that way. Mechanize is a client, not a server. The NIC
used is decided by the destination IP and the routes in your Operating
System. Only server sockets can be bound to one or more IPs.

From: John Yuan on
Walton Hoops wrote:
> It doesn't work that way. Mechanize is a client, not a server. The NIC
> used is decided by the destination IP and the routes in your Operating
> System. Only server sockets can be bound to one or more IPs.

Thank you Walton,



I am afraid that your comment would be the most the answer after
spending quite sometime searching for solution. You helped me to put the
period to my approach.

It may not be Ruby specific problem, but let me explain the situation.
My client has 3 accounts on B2B site and all 3 accounts need to accessed
with specific IP address (3 different offices, 3 different IPs). I was
asked to write script to show consolidated inventory list over those 3
accounts.

So I sat up a Debian with 3 NICs, VPN/LAN/PPP to 3 different offices
network and “proxying” 3 different IPs to gather 3 account inventory
level and consolidate them “simultaneously”. Right now to change
interface, I manually change routing to NIFs when switching account, but
the process is slow and it's accessing account one by one, even though
the connections are simultaneously available, causing slight difference
of the inventory level by the time 3rd account was checked out.

My goal is to launch 3 threads of Mechanize agents to access the same
URI (inventory.b2b.com/login) through 3 different NIFs (ppp1/eth2/ppp3)
From: John W Higgins on
[Note: parts of this message were removed to make it a legal post.]

Good Evening,

On Tue, Mar 30, 2010 at 9:58 PM, John Yuan <johnyuan2000(a)gmail.com> wrote:

>
> My goal is to launch 3 threads of Mechanize agents to access the same
> URI (inventory.b2b.com/login) through 3 different NIFs (ppp1/eth2/ppp3)
> .
>


Your best bet might be to set up 3 proxies and have each of the Mechanize
clients hit a different proxy (using set_proxy for each instance) which
would push each request to the proxy's assigned server.

Something nice and simple like this should work (
http://github.com/igrigorik/em-proxy/blob/master/examples/line_interceptor.rb)
- you would need 3 changes to this file

1) Obviously line 3 needs to have a different port for each of the proxies
2) Line 4 would need to point to a different ip corresponding to each of the
three instances of inventory.b2b.com and the port would be 80 obviously
3) You don't want any substitution here so line 12 would simply be resp

In theory that should push the requests to the appropriate server for you
without a huge amount of work. I think you'll find em-proxy extremely
flexible in terms of getting this task done for you. As with anything that
messes with network traffic - there is some overhead - but you seem much
more concerned with concurrency than milliseconds of delay.

John

From: Alexey Bovanenko on
Hi. You cannot bind the client socket. You must bind only server
socket which recieves client connections. In your case you can use
proxy solution for specific sites or you can write paths for selected
sites in gateway table on your computer.

On 4/1/10, John W Higgins <wishdev(a)gmail.com> wrote:
> Evening,
>
> If you wish to run the example as is you need to run all three lines
>
> ruby examples/appserver.rb 81 - this runs a webserver which is referenced in
> line 4 of the line_interceptor example as the final destination. Think of it
> as a tiny tiny version of the webserver you are trying to connect to.
>
> ruby examples/line_interceptor.rb - this fires up the proxy - the error you
> are getting is that it is trying to connect to the server started just above
> which you are I'm guessing not running
>
> curl localhost - this uses curl to make a request that hits the proxy that
> then sends the request off to the appserver.rb to get the response -
> modifies the result and returns it to you.
>
> You will need rack installed to have appserver.rb work.
>
> Hope this helps move you along......
>
> John
>

--
Sent from my mobile device

With regards,
Alexei Bovanenko