#!/usr/bin/perl # # conmux-attach -- attach commands to the console # # Attach stand alone commands to a console stream. You can specify # which of the commands file descriptors are connected to which of the # 'steams' in the multiplexor; the console input/output and the user # output. # # (C) Copyright IBM Corp. 2004, 2005, 2006 # Author: Andy Whitcroft # # The Console Multiplexor is released under the GNU Public License V2 # use FindBin; use IO::Socket; use Getopt::Long qw(:config no_auto_abbrev); # Find our internal libraries. use lib $FindBin::Bin; use Conmux; my $P = 'conmux-attach'; my ($in, $out, $err); # Usage. GetOptions( 'i|stdout=s' => \$in, 'o|stdin=s' => \$out, 'e|stderr=s' => \$err, 'b|bot=s' => \$bot, ) or exit; if ($in eq '' && $out eq '' && $err eq '') { $in = 'client'; $out = 'client'; } if ($#ARGV < 1) { print STDERR "$P: ...\n"; exit 1; } my ($mux, $app) = @ARGV; shift; $app =~ s@.*/@@; $app =~ s@\s.*$@@; $app = $bot if ($bot); # # Connect to the client channel. # sub conmux_connect { my ($mux, $type) = @_; if (!$cache{$mux, $type}) { my $con = Conmux::connect($mux); my %r = Conmux::sendCmd($con, 'CONNECT', { 'id' => 'bot:' . $app, 'to' => 'console', 'type' => $type } ); die "$P: $mux: connect failed - $r{'status'}\n" if ($r{'status'} ne "OK"); $cache{$mux, $type} = $con; } $cache{$mux, $type}; } if ($in) { my $to = conmux_connect($mux, $in); open(STDIN, "<&", $to) || die "$P: unable to hand off socket to stdin - $!\n"; } if ($out) { my $to = conmux_connect($mux, $out); open(STDOUT, ">&", $to) || die "$P: unable to hand off socket to stdout - $!\n"; } if ($err) { my $to = conmux_connect($mux, $err); open(STDERR, ">&", $to) || die "$P: unable to hand off socket to stderr - $!\n"; } exec @ARGV;