#!/usr/local/bin/perl
#
# moncmd - send a command to the mon server
#
# original file is modified to suit for the operation in this webmin module of msclinux--dt 09 Sept 2001
#
# Jim Trocki, trockij@transmeta.com
#
# $Id: moncmd 1.2 Fri, 12 Jan 2001 08:13:31 -0800 trockij $
#
# Copyright (C) 1998, Jim Trocki
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
use Getopt::Std;
use Socket;
use English;
getopts ("ahf:l:s:p:rd");
sub usage;
sub do_cmd;
$MONSERVER = $ENV{"MONHOST"}
if (defined ($ENV{"MONHOST"}));
$MONSERVER = $opt_s if ($opt_s);
$MONPORT = $opt_p || getservbyname ("mon", "tcp") || 2583;
if ($opt_h) {
usage;
}
if (!defined ($MONSERVER)) {
die "No host specified or found in MONHOST\n";
}
$SIG{INT} = \&handle_sig;
$SIG{TERM} = \&handle_sig;
#
# does the input come from stdin or a file?
#
if ($opt_f) {
if ($opt_f eq "-") {
$H = STDIN;
#print LOG "READING H from STDIN
";
} else {
open (IN, $opt_f) ||
die "could not open input file: $!\n";
$H = IN;
#print LOG "READING H from IN
";
}
} elsif (!@ARGV) {
if (-t STDIN) {
print </tmp/monlog");
if ($opt_l) {
$USER = $opt_l;
#print LOG "USER READ FROM -l OPTION =$USER\n";
} else {
die "could not determine username\n"
unless defined ($USER = getpwuid($EUID));
#print LOG "USER DEFAULT TAKEN=$USER\n";
}
if (-t STDIN) {
#print LOG "READING PASSWD FROM STDIN\n";
system "stty -echo";
print "Password: ";
chop ($PASS = );
print "\n";
system "stty echo";
die "invalid password\n" if ($PASS =~ /^\s*$/);
} elsif (!@ARGV) {
$cmd = <$H>;
#print LOG "READING CMD FROM $H\n";
#print LOG "CMD:$cmd\n";
while (defined ($cmd) && $cmd =~ /user=|pass=/i) {
#while (defined ($cmd) && $cmd =~ /user|pass/i) {
chomp $cmd;
#print LOG "CMD AFTER CHOMP:$cmd\n";
if ($cmd =~ /^user=(\S+)$/i) {
$USER=$1 if (!defined ($USER));
#print LOG "READING USER FROM $H:$USER\n";
} elsif ($cmd =~ /^pass=(\S+)$/i) {
$PASS=$1;
#print LOG "READING PASSWD FROM $H:$PASS\n";
}
$cmd = <$H>;
$cmd1=$cmd;
#print LOG "FINAL CMD: $cmd\n";
}
}
die "inadequate authentication information supplied\n"
if ($USER eq "" || $PASS eq "");
}
#
# set up TCP socket
#
$iaddr = inet_aton ($MONSERVER) ||
die "Unable to find server '$MONSERVER'\n";
if ($MONPORT =~ /\D/) { $MONPORT = getservbyname ($MONPORT, 'tcp') }
$paddr = pack_sockaddr_in ($MONPORT, $iaddr);
$proto = getprotobyname ('tcp');
socket (MON, PF_INET, SOCK_STREAM, $proto) ||
die "could not create socket: $!\n";
connect (MON, $paddr) ||
die "could not connect: $!\n";
select (MON); $| = 1; select (STDOUT);
#if( defined(my $line = )) {
# chomp $line;
# unless( $line =~ /^220\s/) {
# die "didn't receive expected welcome message\n";
# }
#} else {
# die "error communicating with mon server: $!\n";
#}
#
# authenticate self to the server if necessary
#
if ($opt_a) {
($l, @out) = do_cmd(MON, "login $USER $PASS");
die "Could not authenticate\n"
if ($l =~ /^530/);
}
if ($opt_f or !@ARGV) {
#$cmd = <$H> if ($opt_f || !@ARGV);
$cmd = (<$H>||$cmd1) if ($opt_f || !@ARGV);
$l = "";
#print LOG "ENTERING TO SEND THE CMD:$cmd\n";
while (defined ($cmd) && defined ($l)) {
#
# send the command
#
chomp $cmd;
#print LOG "SENDING THE CMD:$cmd\n";
($l, @out) = do_cmd (MON, $cmd);
last if (!defined ($l));
for (@out) {
print "$_\n";
}
print "$l\n";
$cmd = <$H>;
}
close ($H);
} else {
($l, @out) = do_cmd (MON, "@ARGV");
for (@out) {
print "$_\n";
}
print "$l\n";
}
#
# log out
#
do_cmd (MON, "quit");
close(MON);
#close(LOG);
#
# submit a command to the server, wait for a response
#
sub do_cmd {
my ($fd, $cmd) = @_;
my ($l, @out);
return ("", undef) if ($cmd =~ /^\s*$/);
@out = ();
print $fd "$cmd\n";
#print LOG "SUBMITTING CMD:$cmd\n";
while (defined($l = <$fd>)) {
chomp $l;
if ($l =~ /^(\d{3}\s)/) {
last;
}
push (@out, $l);
}
($l, @out);
}
#
# usage
#
sub usage {
print <