Skip to content
Snippets Groups Projects
astcli 2.31 KiB
Newer Older
  • Learn to ignore specific revisions
  • Tilghman Lesher's avatar
    Tilghman Lesher committed
    #!/usr/bin/perl -w
    
    
    use strict;
    use Net::Telnet;
    use Getopt::Long;
    
    # Created by: David Van Ginneken
    # Bird's the Word Technologies
    # davevg@btwtech.com
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
    #
    # And distributed under the terms of the GPL
    #
    my ($user, $pw, $host, $port) = (undef, undef, 'localhost', 5038);
    
    process_credentials('/etc/astcli.conf');
    process_credentials("$ENV{HOME}/.astcli");
    GetOptions("username=s" => \$user, "secret=s" => \$pw, "host=s" => \$host, "port=s" => \$port);
    
    
    my $action = join(" ", @ARGV);
    
    &usage if (!defined $user || !defined $pw);
    
    my $tc = new Net::Telnet (Timeout => 10,
        Errmode => "die",
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
        Host    => $host,
        Port    => $port);
    
    # Login with our username and secret.
    $tc->open  ();
    $tc->print ("Action: Login");
    $tc->print ("Username: $user");
    $tc->print ("Secret: $pw");
    $tc->print ("Events: off");
    $tc->print (""); 
    # Check for login success.
    my ($pre, $match) = $tc->waitfor ("/Message: .*/");
    unless (($pre =~ m/Success/) && ($match =~ m/Authentication/)) {
      print "Server Authentication failed.\n";
      exit;
    }
    
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
    # Send a single command to the manager connection handle (global $tc).
    # Assumes things always work well :-)
    sub send_command($) {
    	my $command = shift;
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
    	$tc->print ("Action: Command");
    	$tc->print ("Command: $command");
    	$tc->print ("");
    	my ($pre, undef) = $tc->waitfor ("/--END COMMAND--.*/");
    	$pre =~ s/^\n\n//g;
    	$pre =~ s/Privilege: Command\n//;
    	$pre =~ s/Response: Follows\n//;
    	print $pre;
    }
    
    # If the user asked to send commands from standard input:
    if ($action eq '-') {
    	while (<>) {
    		chomp;
    		send_command($_)
    	}
    	exit 0;
    }
    
    # Otherwise just send the command:
    send_command($action);
    
    # parses a configuration file into the global $user and $pw.
    
    sub process_credentials {
    	# Process the credentials found..
    	my $file = shift;
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
    
    	# silently fail if we can't read the file:
    	return unless (-r $file);
    	open (my $fh, "<$file") or return;
    
    	while (<$fh>) {
    		chomp;
    		(undef,$user) = split(/[,=]/, $_) if $_ =~ /user(name)?[,=]/i;
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
    		(undef,$pw) = split(/[,=]/, $_) if $_ =~ /(secret|passw(or)?d|pwd?)[,=]/i;
    		(undef,$host) = split(/[,=]/, $_) if $_ =~ /host(name)?[,=]/i;
    		(undef,$port) = split(/[,=]/, $_) if $_ =~ /port(num|no)?[,=]/i;
    
    Tilghman Lesher's avatar
    Tilghman Lesher committed
    	print STDERR "astcli [-u <username> -s <passwd>] [-h host] [-p port] <cli-command>\n";
    	print STDERR "       (command '-' - take commands from input)\n";