Projekt

Allgemein

Profil

Feature #237 » show_photoTANs.txt

hiner, 28.06.2021 14:17

 
#!/usr/bin/perl -w
use strict;

my $desc=<<'DESC';
Continuous scan of last aqbanking logfile for images used as photo TANs.
Usable in parallel to aqbanking-cli.

Usage: perl show_photoTANs.pl [OPTION ...] [LOGFILES] [SHOW]
OPTION : -t : test output
-v : print filename(s)
LOGFILES : including directory and name (use wild cards)
SHOW : (optional) command/program to show a png image

If the program reaches end-of-file of the currently read logfile, it will
look for a newer logfile and use that file.

Only the currently last picture in a logfile is shown.
The picture must be closed to enable the search for the next picture.
© H. Ruprecht : usable according to GNU public license (no warrenty)
DESC

my $defLogFiles = "~/.aqbanking/backends/aqhbci/data/banks/de/*/logs/*.log";
my $defShow = "eog"; # command to show the image (LINUX)
my $imageFile = "x.png";

my $test=0; my $verbose=0;
while ($ARGV[0] && substr($ARGV[0],0,1) eq "-") {
my $option=shift;
$test++ if $option=~/t/;
$verbose++ if $option=~/v/;
print $desc,"\ndefaults: ",$defLogFiles," ",$defShow,"\n"
if $option=~/h/i;
}
my $logFiles=$ARGV[0] || $defLogFiles;
my $showImage=$ARGV[1] || $defShow;

my $startImage = chr(0x89)."PNG\r\n".chr(0x1a)."\n";
my $endImage = "IEND".chr(0xAE).chr(0x42).chr(0x60).chr(0x82);

my $logFile=findLogFile($logFiles);
die "No logfile found in $logFiles\n" unless $logFile;

$|=1;
print ">" if $test;
my $n=0;

do {
print "Using $logFile\n" if $verbose;
$logFile=readNextImage($logFile,$logFiles);
}
until $logFile eq "";

sub findLogFile {
my $files = shift;
my $file=""; my $rdt=0;
my @files=glob($files);
foreach my $next (@files) {
my $rdtNext=(lstat($next))[9];
next if $rdtNext<$rdt;
$file=$next;
$rdt=$rdtNext;
}
return $file;
} # findLogFile

sub readNextImage {
my ($logFile, $logFiles) = @_;
open(my $log,$logFile) || die "$logFile open error: $!\n";
binmode($log);
my $full="";
while (1) {
my $part=<$log>;
if (!defined($part)) { # eof($log)
if (findImage($full)) { $full=""; }
elsif ($logFiles=~/[\*\?]/) {
my $newFile=findLogFile($logFiles);
if ($newFile ne $logFile) {
close($log);
return $newFile;
}
}
sleep(1);
next;
}
$full.=$part;
}
} # readNextImage
sub findImage {
my $full= shift;
my $image="";
while ((my $pS=index($full,$startImage))>=0) {
my $pE=index($full,$endImage,$pS);
if ($pE<0) {
last if $image ne "";
sleep(1);
return;
}
$image=substr($full,$pS,$pE-$pS);
$n++;
$full=substr($full,$pE+1);
}
if ($image eq "") { sleep(1); return; }
open(IMG,'>',"$imageFile") || die "$imageFile open error: $!\n";
print IMG $image;
close(IMG);
system("$showImage $imageFile");
return 1;
} # findImage
    (1-1/1)