[Phoenix-pm] Looking for ideas - Perl Telnet Monitor
Scott Walters
scott at illogics.org
Thu Jun 30 12:32:07 PDT 2005
No, I don't think I'm offering useful suggestions for the part he's actually having
problems with. Expect stuff I can't help with. Left to myself with this project,
I'd write the expect logic from scratch. But I think I missed a message or two. I
don't even know where Expect is going wrong controlling the other program, or
even what's being controlled.
-scott
On 0, aj at exiledplanet.org wrote:
> Aha! A possible solution emerges! Though I've forgotten what coroutines are. :-(
>
> --aj
>
> Scott Walters <scott at illogics.org> wrote:
> __________
> >Ahhh... okay, this is just a fragment, but it sounds like you're having the
> >standard problem of needing to monitor multiple IO handles -- in this case, at
> >least one user and one program launched for the user by the daemon.
> >
> >select() was designed for this, but it's painful for anything beyond trivial
> >applications. All operations must be atomic and must return back to the
> >"select loop". Hence things like POE were created. POE also has an event
> >loop which is little more than a select loop, but you're still restricted
> >to atomic operations that can't block or perform additional IO operations
> >in response to the one that just completed and must instead schedule them
> >for the future. You also don't get any variables that persist between
> >these atomic operations -- all of your data must be instance data or else
> >it's lost when you return back to the event handler. This is only marginally
> >better than a plain select loop. Perl's threads are unusable for any
> >case where the threads must share data or else they'd get the recommendation,
> >but for applications like this, I strongly advocate the Coro module. In
> >fact, there are two chapters on it in _Perl 6 Now_ [blatent self-plug
> >alert].
> >
> >Used like this, Coro provides essentially cooperative multithreading. You'd
> >still need IPC::Open2/IPC::Open3. Coro has a method to convert regular
> >file handles, such as those returned by IPC::Open2, into something that knows
> >how to cede the CPU rather than block on data.
> >
> >The structure would be something like this: a listener loop accepts connections
> >and creates a coroutine (the command prompt) for each connection accepted. The
> >command prompt accepts commands (obviously) and creates coroutines for each
> >command that doesn't complete instantly. These command coroutines use
> >IPC::Open2 or IPC::Open3 to open bi-directional or tri-directional pipes to
> >whichever system command is to be run (use the syntax that avoids invoking the
> >shell!). The command coroutines, after setting up the pipe, perform filtering
> >on the data, applying any coloring or highlighting. If a -more- prompt is
> >needed, a coroutine to manage (and filter) all of the command coroutines
> >should be created. Coro::Channel would be used to pass text, objects, etc,
> >between coroutines, but ultimately, one coroutine (the command prompt) would
> >be reading user input and one or more (the command coroutines or the
> >command-coroutine-manager-coroutine) coroutines would write to the user via
> >their socket.
> >
> >I hope this helps.
> >
> >-scott
> >
> >On 0, "Metz, Bobby W, WCS" <bwmetz at att.com> wrote:
> >> Yeh, I was looking at the buffer stuff last night. Believe expect has a
> >> similar "problem"...that's why I canned that script...plus I hate
> >> expect. :)
> >>
> >> -----Original Message-----
> >> From: Andrew Johnson [mailto:aj at exiledplanet.org]
> >> Sent: Wednesday, June 29, 2005 7:34 PM
> >> To: Metz, Bobby W, WCS
> >> Cc: phoenix-pm at pm.org
> >> Subject: Re: [Phoenix-pm] Looking for ideas - Perl Telnet Monitor
> >>
> >>
> >> On Wed, 2005-06-29 at 19:54 -0500, Metz, Bobby W, WCS wrote:
> >> > [snip]
> >> > IO, i.e. it looks like regular send/expect stuff to me. Anyone out
> >> > there ever do anything like this or know of some easy Perl trick to
> >> > monitor bi-dir IO on a TTY or Net:Telnet session without completing
> >> > taking control from the user typing. I'm sure the solution is staring
> >> > me in the face, but right now it eludes me.
> >>
> >> bidirectional IO that _doesn't_ take control from the user typing.
> >> Well, no. But you might try IPC::Open2 (I suppose you could capture
> >> your prog's STDIN and feed it to the telnet process, and pass back
> >> anything that is read from the telnet process's stdout handle). Check
> >> out Chapter 16 (Interprocess Communcation), section 3.3 (Bidirectional
> >> Communication) of /Programming Perl/. Since standard I/O buffering is
> >> probably going to "ruin your day" (the Camel's quote), you might also
> >> find IO::Select and the IO::Pty (avail on CPAN) module useful.
> >>
> >> Hope this helps.
> >>
> >> --aj
> >>
> >> _______________________________________________
> >> Phoenix-pm mailing list
> >> Phoenix-pm at pm.org
> >> http://mail.pm.org/mailman/listinfo/phoenix-pm
> >
>
>
> _______________________________________________
> Phoenix-pm mailing list
> Phoenix-pm at pm.org
> http://mail.pm.org/mailman/listinfo/phoenix-pm
More information about the Phoenix-pm
mailing list