1
|
#!/usr/bin/perl
|
2
|
#
|
3
|
# moncmd - send a command to the mon server
|
4
|
#
|
5
|
# original file is modified to suit for the operation in this webmin module of msclinux--dt 09 Sept 2001
|
6
|
#
|
7
|
# Jim Trocki, trockij@transmeta.com
|
8
|
#
|
9
|
# $Id: moncmd 1.2 Fri, 12 Jan 2001 08:13:31 -0800 trockij $
|
10
|
#
|
11
|
# Copyright (C) 1998, Jim Trocki
|
12
|
#
|
13
|
# This program is free software; you can redistribute it and/or modify
|
14
|
# it under the terms of the GNU General Public License as published by
|
15
|
# the Free Software Foundation; either version 2 of the License, or
|
16
|
# (at your option) any later version.
|
17
|
#
|
18
|
# This program is distributed in the hope that it will be useful,
|
19
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
20
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
21
|
# GNU General Public License for more details.
|
22
|
#
|
23
|
# You should have received a copy of the GNU General Public License
|
24
|
# along with this program; if not, write to the Free Software
|
25
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
26
|
#
|
27
|
use Getopt::Std;
|
28
|
use Socket;
|
29
|
use English;
|
30
|
|
31
|
getopts ("ahf:l:s:p:rd");
|
32
|
|
33
|
sub usage;
|
34
|
sub do_cmd;
|
35
|
|
36
|
$MONSERVER = $ENV{"MONHOST"}
|
37
|
if (defined ($ENV{"MONHOST"}));
|
38
|
$MONSERVER = $opt_s if ($opt_s);
|
39
|
$MONPORT = $opt_p || getservbyname ("mon", "tcp") || 2583;
|
40
|
|
41
|
if ($opt_h) {
|
42
|
usage;
|
43
|
}
|
44
|
|
45
|
if (!defined ($MONSERVER)) {
|
46
|
die "No host specified or found in MONHOST\n";
|
47
|
}
|
48
|
|
49
|
$SIG{INT} = \&handle_sig;
|
50
|
$SIG{TERM} = \&handle_sig;
|
51
|
|
52
|
#
|
53
|
# does the input come from stdin or a file?
|
54
|
#
|
55
|
if ($opt_f) {
|
56
|
if ($opt_f eq "-") {
|
57
|
$H = STDIN;
|
58
|
#print LOG "READING H from STDIN<br>";
|
59
|
} else {
|
60
|
open (IN, $opt_f) ||
|
61
|
die "could not open input file: $!\n";
|
62
|
$H = IN;
|
63
|
#print LOG "READING H from IN<br>";
|
64
|
}
|
65
|
|
66
|
} elsif (!@ARGV) {
|
67
|
if (-t STDIN) {
|
68
|
print <<EOF
|
69
|
You did not give a command on the command line nor a -f flag and
|
70
|
the program is running interactively (e.g. reading from terminal).
|
71
|
This is not supported. Exiting
|
72
|
EOF
|
73
|
;
|
74
|
exit 1;
|
75
|
}
|
76
|
|
77
|
$H = STDIN;
|
78
|
}
|
79
|
|
80
|
#
|
81
|
# get auth info
|
82
|
#
|
83
|
if ($opt_a) {
|
84
|
#open (LOG,">/tmp/monlog");
|
85
|
if ($opt_l) {
|
86
|
$USER = $opt_l;
|
87
|
#print LOG "USER READ FROM -l OPTION =$USER\n";
|
88
|
} else {
|
89
|
die "could not determine username\n"
|
90
|
unless defined ($USER = getpwuid($EUID));
|
91
|
#print LOG "USER DEFAULT TAKEN=$USER\n";
|
92
|
}
|
93
|
|
94
|
if (-t STDIN) {
|
95
|
#print LOG "READING PASSWD FROM STDIN\n";
|
96
|
system "stty -echo";
|
97
|
print "Password: ";
|
98
|
chop ($PASS = <STDIN>);
|
99
|
print "\n";
|
100
|
system "stty echo";
|
101
|
die "invalid password\n" if ($PASS =~ /^\s*$/);
|
102
|
|
103
|
} elsif (!@ARGV) {
|
104
|
$cmd = <$H>;
|
105
|
#print LOG "READING CMD FROM $H\n";
|
106
|
#print LOG "CMD:$cmd\n";
|
107
|
while (defined ($cmd) && $cmd =~ /user=|pass=/i) {
|
108
|
#while (defined ($cmd) && $cmd =~ /user|pass/i) {
|
109
|
chomp $cmd;
|
110
|
#print LOG "CMD AFTER CHOMP:$cmd\n";
|
111
|
if ($cmd =~ /^user=(\S+)$/i) {
|
112
|
$USER=$1 if (!defined ($USER));
|
113
|
#print LOG "READING USER FROM $H:$USER\n";
|
114
|
} elsif ($cmd =~ /^pass=(\S+)$/i) {
|
115
|
$PASS=$1;
|
116
|
#print LOG "READING PASSWD FROM $H:$PASS\n";
|
117
|
}
|
118
|
|
119
|
$cmd = <$H>;
|
120
|
$cmd1=$cmd;
|
121
|
#print LOG "FINAL CMD: $cmd\n";
|
122
|
}
|
123
|
|
124
|
}
|
125
|
|
126
|
die "inadequate authentication information supplied\n"
|
127
|
if ($USER eq "" || $PASS eq "");
|
128
|
}
|
129
|
|
130
|
#
|
131
|
# set up TCP socket
|
132
|
#
|
133
|
$iaddr = inet_aton ($MONSERVER) ||
|
134
|
die "Unable to find server '$MONSERVER'\n";
|
135
|
|
136
|
if ($MONPORT =~ /\D/) { $MONPORT = getservbyname ($MONPORT, 'tcp') }
|
137
|
$paddr = pack_sockaddr_in ($MONPORT, $iaddr);
|
138
|
$proto = getprotobyname ('tcp');
|
139
|
|
140
|
socket (MON, PF_INET, SOCK_STREAM, $proto) ||
|
141
|
die "could not create socket: $!\n";
|
142
|
connect (MON, $paddr) ||
|
143
|
die "could not connect: $!\n";
|
144
|
|
145
|
select (MON); $| = 1; select (STDOUT);
|
146
|
|
147
|
#if( defined(my $line = <MON>)) {
|
148
|
# chomp $line;
|
149
|
# unless( $line =~ /^220\s/) {
|
150
|
# die "didn't receive expected welcome message\n";
|
151
|
# }
|
152
|
#} else {
|
153
|
# die "error communicating with mon server: $!\n";
|
154
|
#}
|
155
|
|
156
|
#
|
157
|
# authenticate self to the server if necessary
|
158
|
#
|
159
|
if ($opt_a) {
|
160
|
($l, @out) = do_cmd(MON, "login $USER $PASS");
|
161
|
die "Could not authenticate\n"
|
162
|
if ($l =~ /^530/);
|
163
|
}
|
164
|
|
165
|
|
166
|
if ($opt_f or !@ARGV) {
|
167
|
#$cmd = <$H> if ($opt_f || !@ARGV);
|
168
|
$cmd = (<$H>||$cmd1) if ($opt_f || !@ARGV);
|
169
|
$l = "";
|
170
|
#print LOG "ENTERING TO SEND THE CMD:$cmd\n";
|
171
|
while (defined ($cmd) && defined ($l)) {
|
172
|
#
|
173
|
# send the command
|
174
|
#
|
175
|
chomp $cmd;
|
176
|
#print LOG "SENDING THE CMD:$cmd\n";
|
177
|
($l, @out) = do_cmd (MON, $cmd);
|
178
|
last if (!defined ($l));
|
179
|
for (@out) {
|
180
|
print "$_\n";
|
181
|
}
|
182
|
print "$l\n";
|
183
|
|
184
|
$cmd = <$H>;
|
185
|
}
|
186
|
close ($H);
|
187
|
|
188
|
} else {
|
189
|
($l, @out) = do_cmd (MON, "@ARGV");
|
190
|
for (@out) {
|
191
|
print "$_\n";
|
192
|
}
|
193
|
print "$l\n";
|
194
|
}
|
195
|
|
196
|
#
|
197
|
# log out
|
198
|
#
|
199
|
do_cmd (MON, "quit");
|
200
|
|
201
|
close(MON);
|
202
|
|
203
|
#close(LOG);
|
204
|
|
205
|
#
|
206
|
# submit a command to the server, wait for a response
|
207
|
#
|
208
|
sub do_cmd {
|
209
|
my ($fd, $cmd) = @_;
|
210
|
my ($l, @out);
|
211
|
|
212
|
return ("", undef) if ($cmd =~ /^\s*$/);
|
213
|
|
214
|
@out = ();
|
215
|
print $fd "$cmd\n";
|
216
|
#print LOG "SUBMITTING CMD:$cmd\n";
|
217
|
while (defined($l = <$fd>)) {
|
218
|
chomp $l;
|
219
|
if ($l =~ /^(\d{3}\s)/) {
|
220
|
last;
|
221
|
}
|
222
|
push (@out, $l);
|
223
|
}
|
224
|
|
225
|
($l, @out);
|
226
|
}
|
227
|
|
228
|
|
229
|
#
|
230
|
# usage
|
231
|
#
|
232
|
sub usage {
|
233
|
print <<EOF;
|
234
|
|
235
|
usage: moncmd [-a] [-l login] [-s host] [-p port] [-f file] commands
|
236
|
|
237
|
Valid commands are:
|
238
|
quit
|
239
|
reset [stopped]
|
240
|
term
|
241
|
list group "groupname"
|
242
|
list disabled
|
243
|
list alerthist
|
244
|
list failurehist
|
245
|
list successes
|
246
|
list failures
|
247
|
list opstatus
|
248
|
list pids
|
249
|
list watch
|
250
|
stop
|
251
|
start
|
252
|
loadstate
|
253
|
savestate
|
254
|
set "group" "service" "variable" "value"
|
255
|
get "group" "service" "variable"
|
256
|
disable service "group" "service"
|
257
|
disable host "host" ["host"...]
|
258
|
disable watch "watch"
|
259
|
enable service "group" "service"
|
260
|
enable host "host" ["host"...]
|
261
|
enable watch "watch"
|
262
|
EOF
|
263
|
exit 0;
|
264
|
}
|
265
|
|
266
|
|
267
|
#
|
268
|
# signal handler
|
269
|
#
|
270
|
sub handle_sig {
|
271
|
system "stty echo";
|
272
|
exit;
|
273
|
}
|