tags:

views:

69

answers:

3

Alright, some of you might have noticed I've been working on this problem off and on for about 3 weeks. I cannot figure out for the life of me whats going on.. Below is the perl script that saves input from USB card reader which acts like a keyboard. The machine is an embedded system running off of a compact flash drive, using voyage linux.

use strict;
use Time::Local;

open(MATCH,'swipe_match.txt');
my @matches = <MATCH>;
close(MATCH);

my $error = qr/[+%;]E\?/;

while(1) {
        my $text = <STDIN>;
        my $text1 = <STDIN>;
        my $text2 = <STDIN>;
        if (($text && $text1 && $text2) or ($text && $text1) or $text) {
                my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(); $year += 1900;
                $mon+=1;
                my $timestamp = "$mon/$mday/$year $hour:$min:$sec";
                chomp $text;
        chomp $text1;
        chomp $text2;

#               my $matched = 0;
#               foreach my $test (@matches) {
#                       chomp $test;
#                       $matched = 1 if ($text =~ /$test/i);
#               }
#               if ($matched) {
#                       system("aplay /SWIPE/good.wav >/dev/null 2>/dev/null");
#               } else {
#                       system("aplay /SWIPE/bad.wav >/dev/null 2>/dev/null");
#               }

        # write out the swipe even if its bad...
        open(LOG,'>>/DATA/SWIPES.TXT');
        print LOG $text."\t".$text1."\t".$text2."\t".$timestamp."\n";
        close(LOG);

        if ($text =~ $error or $text1 =~ $error or $text2 =~ $error) {
                        system("aplay /SWIPE/bad.wav >/dev/null 2>/dev/null");
        }
        else {
                        system("aplay /SWIPE/good.wav >/dev/null 2>/dev/null");
        }
        }
}
exit;

I did not write this script, and the person who did write it, is long gone. Currently I have 2 machines. One of which is working and the other is the one Im trying to get to work. Im trying to figure out how this script gets input (on the machine that is working). I can open the log file /DATA/SWIPES.TXT and view the actual swipes. Currently there are no running processes on the machine that would affect the script, here are the processes:

  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:29 init [2]
    2 ?        S<     0:00 [kthreadd]
    3 ?        S<     0:04 [ksoftirqd/0]
    4 ?        S<     3:21 [events/0]
    5 ?        S<     0:00 [khelper]
   44 ?        S<     0:00 [kblockd/0]
   46 ?        S<     0:00 [kacpid]
   47 ?        S<     0:00 [kacpi_notify]
   94 ?        S<     0:00 [kseriod]
  134 ?        S      0:00 [pdflush]
  135 ?        S      0:06 [pdflush]
  136 ?        S<     0:00 [kswapd0]
  137 ?        S<     0:00 [aio/0]
  138 ?        S<     0:00 [nfsiod]
  795 ?        S<     0:00 [kpsmoused]
  800 ?        S<     0:00 [rpciod/0]
 1627 ?        S<     0:00 [ksuspend_usbd]
 1631 ?        S<     0:00 [khubd]
 1646 ?        S<     0:00 [ata/0]
 1648 ?        S<     0:00 [ata_aux]
 1794 ?        S<s    0:00 udevd --daemon
 2913 ?        Ss     0:00 pump -i eth0
 2979 ?        Ss     0:00 /usr/sbin/rpc.idmapd
 3060 ?        S      0:01 /usr/sbin/syslogd --no-forward
 3083 ?        Ss     0:00 /usr/sbin/sshd
 3099 ?        S      0:00 /usr/sbin/inetutils-inetd
 3122 ?        Ss     0:00 /usr/sbin/pptpd
 3138 ?        Ss     0:00 /usr/sbin/cron
 3149 ?        SLs    0:33 /usr/sbin/watchdog
 3167 tty2     Ss+    0:00 /sbin/mingetty tty2
 3169 tty3     Ss+    0:00 /sbin/rungetty tty3
 3170 tty4     Ss+    0:00 /sbin/rungetty tty4
 3173 tty5     Ss+    0:00 /sbin/getty 38400 tty5
 3175 tty6     Ss+    0:00 /sbin/getty 38400 tty6
15677 ?        Ss     0:00 sshd: root@pts/0
15679 pts/0    Ss     0:00 -bash
15710 ?        Z      0:00 [watchdog] <defunct>
15711 pts/0    R+     0:00 ps x

So, from there, I don't know where to go. Can anyone give me any suggestions or hints as to how this script is actually receiving the input from the usb reader. Also, it some how receives the input while not being logged in. The machine is an embedded machine, I turn it on, and it accepts swipes and saves them, using the perl script.

A: 

The key bits are here:

while(1) {
  my $text = <STDIN>;

The USB card reader is set up to direct its input to STDIN, since it's acting like a keyboard. When it finishes reading a card it sends a carriage return. The "input" then gets read by Perl and stuck into $text, then it waits for the next swipe. Once three swipes are done (the three <STDIN> lines) then it processes the information and writes it to the file. Then, since you're in a while(1) loop, it just loops back to the top of the loop and waits for more input.

You can simulate this on a different computer by running the program, then when it's waiting for input you type in some text and finish it with the Enter key. Do that three times to simulate the three swipes, and the program should process it.

CanSpice
yes but the program is not running on the machine? Nor would it be running in the foreground.
Dalton Conley
A: 

The script is reading from stdin, so you need to find where/who is calling this script and see what is being piped in on stdin.

Have you checked the system's cron jobs? You might find a hint by looking at the timestamp and ownership of the /DATA/SWIPES.TXT file.

Ether
+1  A: 

Take a look at udev, among other things it can: "Launch a script when a device node is created or deleted (typically when a device is attached or unplugged)"

http://www.reactivated.net/writing_udev_rules.html

mazianni