Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I control an interactive Unix application programmatically through Perl?

I have inherited a 20-year-old interactive command-line unix application that is no longer supported by its vendor. We need to automate some tasks in this application.

The most troublesome of these is creating thousands of new records with slightly different parameters (e.g. different identifiers, different names). The records have to be created in sequence, one at a time, which would take many months (and therefore dollars) to do manually. In most cases, creating a record has a very predictable pattern of keying in commands, reading responses, keying in further commands, etc. However, some record creation operations will result in error conditions ('record with this identifier already exists') that require a different set of commands to be exit gracefully.

I can see a few different ways to do this:

  • Named pipes. Write a Perl script that runs the target application with STDIN and STDOUT set to named pipes then sends the target application the sequence of commands to create a record with the required parameters, and then instructs the target application to exit and shut down. We then run the script as many times as required with different parameters.

  • Application. Find another Unix tool that can be used to script interactive programs. The only ones I have been able to find though are expect, but this does not seem top be maintained; and chat, which I recall from ages ago, and which seems to do more-or-less what I want, but appears to be only for controlling modems.

One more potential complication: I think the target application was written for a VT100 terminal and it uses some sort of escape sequences to do things like provide highlighting.

My question is what approach should I take? One of these, or something completely different? I quite like the idea of using named pipes and then having a Perl script that opens the FIFOs and reads and writes as required, as it provides a lot of flexibility, but from what I have read it seems like there's a lot of potential problems if I go down this path.

Thanks in advance.

like image 646
Anon Gordon Avatar asked Sep 24 '09 11:09

Anon Gordon


People also ask

How do I run a Perl 5 script on Linux?

If you are using a UNIX-compatible system (such as Linux, Solaris, or a BSD ), most chances are that Perl 5 is already installed there. To verify that, type perl -v inside a command shell, and check that the version of Perl is recent enough. If so, you can easily run Perl scripts there.

Is there a Perl REPL for Linux?

12.4k 14 59 89 I've created perli, a Perl REPL that runs on Linux, macOS, and Windows. Its focus is automatic result printing, convenient documentation lookups, and easy inspection of regular-expression matches. You can see screenshots here.

What is application control in powerbroker for Unix&Linux?

This application control capability is built into PowerBroker for Unix & Linux. PowerBroker is the gold-standard solution for application control, privilege management, activity logging, and file integrity monitoring on Unix and Linux.

How do I know if Perl is installed on Linux?

If you are using a UNIX-compatible system (such as Linux, Solaris, or a BSD ), most chances are that Perl 5 is already installed there. To verify that, type perl -v inside a command shell, and check that the version of Perl is recent enough.


1 Answers

I'd definitely stick to Perl for the extra flexibility, as chaos suggested. Are you aware of the Expect perl module? It's a lot nicer than the named pipe approach.

Note also with named pipes, you can't force the output coming back from your legacy application to be unbuffered, which could be annoying. I think Expect.pm uses pseudo-ttys to get around this problem, but I'm not sure. See the discussion in perlipc in the section "Bidirectional Communication with Another Process" for more details.

like image 51
ire_and_curses Avatar answered Sep 19 '22 23:09

ire_and_curses