Fix a small file handle "leak" pointed out by jjshoe on #asterisk.
[asterisk/asterisk.git] / contrib / scripts / astcli
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Net::Telnet;
5 use Getopt::Long;
6
7 # Created by: David Van Ginneken
8 # Bird's the Word Technologies
9 # davevg@btwtech.com
10 #
11 # And distributed under the terms of the GPL
12 #
13 my ($user, $pw, $host, $port) = (undef, undef, 'localhost', 5038);
14
15 process_credentials('/etc/astcli.conf');
16 process_credentials("$ENV{HOME}/.astcli");
17 GetOptions("username=s" => \$user, "secret=s" => \$pw, "host=s" => \$host, "port=s" => \$port);
18
19 my $action = join(" ", @ARGV);
20
21 &usage if (!defined $user || !defined $pw);
22
23 my $tc = new Net::Telnet (Timeout => 10,
24     Errmode => "die",
25     Host    => $host,
26     Port    => $port);
27 # Login with our username and secret.
28 $tc->open  ();
29 $tc->print ("Action: Login");
30 $tc->print ("Username: $user");
31 $tc->print ("Secret: $pw");
32 $tc->print ("Events: off");
33 $tc->print (""); 
34 # Check for login success.
35 my ($pre, $match) = $tc->waitfor ("/Message: .*/");
36 unless (($pre =~ m/Success/) && ($match =~ m/Authentication/)) {
37   print "Server Authentication failed.\n";
38   exit;
39 }
40
41 # Send a single command to the manager connection handle (global $tc).
42 # Assumes things always work well :-)
43 sub send_command($) {
44         my $command = shift;
45
46         $tc->print ("Action: Command");
47         $tc->print ("Command: $command");
48         $tc->print ("");
49         my ($pre, undef) = $tc->waitfor ("/--END COMMAND--.*/");
50         $pre =~ s/^\n\n//g;
51         $pre =~ s/Privilege: Command\n//;
52         $pre =~ s/Response: Follows\n//;
53         print $pre;
54 }
55
56 # If the user asked to send commands from standard input:
57 if ($action eq '-') {
58         while (<>) {
59                 chomp;
60                 send_command($_)
61         }
62         exit 0;
63 }
64
65 # Otherwise just send the command:
66 send_command($action);
67
68 # parses a configuration file into the global $user and $pw.
69 sub process_credentials {
70         # Process the credentials found..
71         my $file = shift;
72
73         # silently fail if we can't read the file:
74         return unless (-r $file);
75         open (my $fh, "<$file") or return;
76         while (<$fh>) {
77                 chomp;
78                 (undef,$user) = split(/[,=]/, $_) if $_ =~ /user(name)?[,=]/i;
79                 (undef,$pw) = split(/[,=]/, $_) if $_ =~ /(secret|passw(or)?d|pwd?)[,=]/i;
80                 (undef,$host) = split(/[,=]/, $_) if $_ =~ /host(name)?[,=]/i;
81                 (undef,$port) = split(/[,=]/, $_) if $_ =~ /port(num|no)?[,=]/i;
82         }
83         close ($fh);
84 }
85
86 sub usage {
87         print STDERR "astcli [-u <username> -s <passwd>] [-h host] [-p port] <cli-command>\n";
88         print STDERR "       (command '-' - take commands from input)\n";
89         exit;
90 }
91