Enlightened Monks!

I'm trying to log user sessions with a program that does not support activity logging. I've decided to write a wrapper - some simple shell, that would pass a given line of input to this program, and at the same time log this line to a file. My initial code looks like this:

#!/usr/bin/perl -w use strict; use Term::ReadLine; use POSIX qw(strftime); my $username = getlogin(); my %cfg = ( shell => '/bin/bash', dateformat => '[%Y%m%d-%H%M%S] ', logpath => '/tmp/sessionlogs/', logname => "$username.session.log", ); my @prohibited_cmds = ( 'mc', '/usr/bin/mc', ); open LOGFILE, ">>$cfg{logpath}$cfg{logname}" or die "Cannot open log f +ile!"; print LOGFILE "-----------------------------------\n"; print LOGFILE strftime $cfg{dateformat}, localtime; print LOGFILE "Session started for $username.\n"; my $term = new Term::ReadLine 'Shellwrapper'; $SIG{'INT'} = 'IGNORE'; while (defined ($_ = $term->readline('SH+log> '))) { if ((/^\s*quit\s*$/) or (/^\s*exit\s*$/)) { print LOGFILE strftime $cfg{dateformat}, localtime; print LOGFILE "$_\n"; last; } # first log timestamp and commandline print LOGFILE strftime $cfg{dateformat}, localtime; print LOGFILE "$_\n"; # then execute system "$cfg{shell} -c '$_'"; print "\n"; } print LOGFILE strftime $cfg{dateformat}, localtime; print LOGFILE "Session terminated for $username.\n"; close LOGFILE;

I've substituted the program with bash, and simplified the code a bit, but this is roughly it. And it seems to work, too. The logfile looks like this:

----------------------------------- [20120516-222413] Session started for testuser17. [20120516-222419] test shellexample [20120516-222420] exit [20120516-222420] Session terminated for testuser17.

The problem is, that this works only a line at a time. And all tasks that require a few related lines of input - like set a variable, set another variable, and then run a command - well, they won't work.

So, I'm starting to think: maybe I should run the wrapper shell, run the program, and then establish some communication between the two. Now, I'm looking at IPC::Run3, but all the examples that I have found are using run3 once, with a fixed STDIN, and I'm looking for a scenario, when I'm gathering input, and passing it to the program continuously.

So, here are my questions (thanks for the patience): am I looking at the right tool for the job, and can it be done with IPC::Run3? If yes, could you provide some example? If not, what should I use? What problems should I be aware of?

Regards,
Luke Jefferson


In reply to Logging user input to a file, and passing it to an external program, at the same time by blindluke

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.