#!/usr/bin/env perl
# Use the tcpmux to grab an oo list, or nodelist -- ksb
# $Id: fetcher.pl,v 1.4 2011/05/17 16:13:33 ksb Exp $
# This program has been replaced my "muxcat" and "muxsend", so it
# is mostly for reference only.  See those in local/bin/mux{cat,send}.
#
# $Compile: All%h
# $All: %JMK='-s' mk -mMeta %f >%j; hxmd -k OO -C %j '%f REF NODELIST'
# $All: %J%j%^: EndOfData
# $Meta: %f oo.ito.fedex.com oolist |tr -s '\\015\\012' '\\012\\012'

use lib '/usr/local/lib/sac/perl'.join('.', unpack('c*', $^V)),
	'/usr/local/lib/sac';

use strict;
use Socket;
use IO::Handle;

my($progname) = $0 || 'fetcher';
my($ito) = shift(@ARGV) || 'ito.fedex.com';	# or some other hostname
my($grab) = shift(@ARGV) || 'oolist';		# nodelist | oolist

my($ipout,$proto,$sockaddr);
$ipout = inet_aton($ito);
die "$progname: $ito: invalid hostname\n"
	unless defined($ipout);
$proto = getprotobyname('tcp');
$sockaddr = sockaddr_in(1, $ipout);
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) &&
connect SOCKET, $sockaddr || die "$progname: not able to construct a socket";
SOCKET->autoflush(1);

print SOCKET "$grab\r\n";
my $data;
$data = <SOCKET>;
if ('help' eq $grab) {
	;
} elsif ($data !~ m/^[+]/) {
	$data =~ s/[\r\n]//g;
	die "$progname: $ito: $grab: $data\n";
}

# Timeout if we can't get data in 3m, or have to wait 1m between lines.
local $SIG{ALRM} = sub {
	truncate STDOUT, 0;
	exit 69;	# EX_UNAVAILABLE
};
alarm(180);
while (read SOCKET, $data, 16384) {
	print STDOUT $data;
	alarm(60);
}
close(SOCKET);
exit 0;			# EX_OK
