The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Command::Interactive- handles interactive (and non-interactive) process invocation through a reliable and easily configured interface.

SYNOPSIS

This module can be used to invoke both interactive and non-interactive commands with predicatable results.

    use Command::Interactive;
    use Carp;

    # Simple, non-interactive usage
    my $result = Command::Interactive->new->run("cp foo /tmp/");
    croak "Could not copy foo to /tmp/: $result!" if($result);

    # Interactive usage supports output parsing
    # and automated responses to discovered strings
    my $password_prompt = Command::Interactive::Interaction->new({
        expected_string => 'Please enter your password:',
        response        => 'secret',
    });

    my $my_logging_fh;
    my $command = Command::Interactive->new({
        echo_output    => 1,
        output_stream  => $my_logging_fh,
        interactions   => [ $password_prompt ],
    });
    my $restart_result = $command->run("ssh user\@somehost 'service apachectl restart'");
    if($restart_result)
    {
        warn "Couldn't restart server!";
    }

FIELDS

always_use_expect (DEFAULT: FALSE)

Whether to use the Expect module to execute system commands. By default, Expect is only used if one or more interactions() are specified.

debug_logfile (DEFAULT: undef)

The name of a file to which lots of debugging information should be written. Typically useful only for maintainers. If you want to see what your command is doing, use echo_output() and a debugging filehandle (or just STDOUT).

echo_output (DEFAULT: FALSE)

Whether to echo output to the specified output_stream(). This allows users of Command::Interactive to see what is going on, but it also can clutter an interface with lots of superfluous command output. Use it wisely.

See web_format() for a discussion about how to format command output for web interfaces.

interactions (DEFAULT: [], the empty arrayref)

An array reference of Command::Interactive::Interaction objects that specify the interactions that may (or must) occur during the execution of the command. See Command::Interactive::Interaction for more information on specifying rules about command interactions.

output_stream (DEFAULT: STDOUT)

The stream object to which output should be sent when echo_output() is enabled. This is any object with a print() method; it needn't have a full IO-compliant interface.

timeout (DEFAULT: undef)

If defined, represents the timeout (in seconds) that Command::Interactive will wait for output when run() is called.

web_format (DEFAULT: FALSE)

Whether to format strings for web output when print command output as a result of echo_output(). If this is true, \r, \n, and \r\n will be replaced with "<br/>\n".

METHODS

run($command)

This method does the heavy lifting of Command::Interactive. If one or more interactions() are specified (or if always_use_expect() is true), then the heavy lifting is dispatched to _run_via_expect(); otherwise this method uses traditional perl open("$command |") approach.

$command is expected to be a scalar (string), properly escaped, that could be executed (e.g.) via system() or ``. No matter what command you provide, the bash file descriptors for stdout and stderr are tied together using '2>&1' unless you have done so already. This allows Command::Interactive to capture and react to both regular output and errors using the same mechanism.

run() returns undef if the command is successful, otherwise it returns a string describing why the command failed (or was thought to have failed).

The command you pass in via $command is expected to exit with status code 0 on success. If it returns something different, Command::Interactive will incorrectly conclude that the command failed and will return a message to that effect.

_show_output($chunk_of_output)

If echo_output() is true, this command prints any output from $command to the chosen output_stream(). If web_format() is true, the output is first formatted for HTML by replacing end-of-line characters with "<br/>\n".

_run_via_expect($command)

This method handles running commands with one or more interactions() (or for which always_use_expect() is true) via the Perl module Expect.

The return semantics of _run_via_expect() are identical to those of run().

_generate_instruction_list()

This method returns information to be passed to Expect's expect() method, as well as a bookkeeping array using for tracking number of times a given interaction has occurred.

_fixup_command_to_catch_stderr($original_command)

This method appends '2>&1' to the end of any command submitted to run(), except when that filehandle-tying string is already present in the command.

Returns the modified version of $original_command.

_log($line_to_log)

Used for internal logging purposes when debug_logfile() is defined. See the discussion of debug_logfile() for a better way to debug YOUR command's execution; this method is intended for consumption by developers of Command::Interactive.

AUTHOR

Binary.com, <perl@binary.com>

LICENSE

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.