From: Kilian Saffran Date: Tue, 12 Mar 2019 18:39:22 +0000 (+0100) Subject: auto commit on 2019-03-12 19:39 X-Git-Url: http://cloud.dks.lu/git/?a=commitdiff_plain;h=8d01888298223f56cf2dcdad701c93f93ffa4147;p=dks_server.git auto commit on 2019-03-12 19:39 --- diff --git a/bin/dkssync.pl b/bin/dkssync.pl new file mode 100644 index 0000000..ecf8873 --- /dev/null +++ b/bin/dkssync.pl @@ -0,0 +1,338 @@ +#!/usr/local/ActivePerl-5.14/bin/perl + +use strict; +use Net::FTP; +use File::Basename; +use Data::Dumper; +use Getopt::Long; +use Archive::Tar; +use File::Path qw (remove_tree make_path); +my $host=""; +my $user=""; +my $pwd=""; +my $dir=""; +my $import = 0; +my $export=0; +my $backup=0; +my $restore=""; +#my $list=0; +my $ftp = undef; +my $time = 0; +my $clean = 0; +my $getcfg = ""; +#my $folder = ""; +my $test = 0; +my $os = $^O; +#import example: -i -h www.dks.lu -u fripo@dks.lu -p hootee3y -d sync +#backup local example: -b -d "D:\workspace\planer\backup\1347954617" +#backup remote example: -b -h www.dks.lu -u fripo@dks.lu -p hootee3y -d "D:\workspace\planer\backup\1347954617" +#list backupfiles: -l -d "D:\workspace\planer\backup" -h www.dks.lu -u fripo@dks.lu -p hootee3y +GetOptions("host|h=s" => \$host, + "user|u=s" => \$user, + "password|p=s" => \$pwd, + "dir|d=s" => \$dir, + "export|e" => \$export, + "import|i" => \$import, + "backup|b" => \$backup, + "restore|r=s" => \$restore, + #"backuplist|l" => \$list, + "clean|c" => \$clean, + "getcfg|g=s" => \$getcfg, + "test" => \$test, + #"folder|f=s" => \$folder, + "time|t=i" => \$time); +my $tar = Archive::Tar->new; + +chdir(dirname($0)); +$dir =~ s/\\/\//g; + +if ($getcfg ne ""){ + my @l = split(dirname($0)); + my $nn = pop(@l); + my $rcfg = ""; + if ($getcfg eq "stdbackuppath"){ + if ($os eq "MSWin32"){ + $rcfg = $ENV{APPDATA}."\\$nn\\backup"; + }elsif ($os eq "darwin"){ + $rcfg = $ENV{HOME}."/Application/$nn/backup"; + } + make_path($rcfg); + }elsif($getcfg eq "stdsyncpath"){ + if ($os eq "MSWin32"){ + $rcfg = $ENV{APPDATA}."\\$nn\\sync"; + }elsif ($os eq "darwin"){ + $rcfg = $ENV{HOME}."/Application/$nn/sync"; + } + make_path($rcfg); + } + print $rcfg; + exit(0); +} + +if ($host ne ""){ + &ftpconnect(); +} + +if ($test == 1){ + if(defined($ftp)){ + print "1"; + &ftpdisconnect(); + }else { + print "0"; + } + exit(0); +} + +if ($import == 1){ + chdir($dir); + my @rfiles = (); + # my $sync = 0; + if(defined($ftp)){ + $ftp->cwd('sync'); + my $r = $ftp->get('sync.tgz','sync.tgz'); + if ((defined($r)) && (-f $dir.'/sync.tgz')){ + $tar->extract_archive('sync.tgz',1); + } +# $sync = 1; + unlink("sync.tgz"); + } +# if ($sync == 1){ + my $lf = &getlocalsyncfiles($dir); + foreach my $x (keys%${lf}){ + print $dir."/".$x."\n"; + } +# } +} elsif ($export == 1){ + my $name = "sync.tgz"; + chdir($dir); + my $lf = &getlocalsyncfiles($dir); + unlink($name); + my @ltarfiles = (); + foreach my $l (keys %{$lf}){ + push @ltarfiles, $l; + } + if (scalar(@ltarfiles) > 0){ + $tar->add_files(@ltarfiles); + $tar->write($name,COMPRESS_GZIP); + if(defined($ftp)){ + $ftp->cwd('sync'); + $ftp->put($name,$name); + unlink($name); + } + } +} elsif ($clean == 1){ + remove_tree($dir,{ 'keep_root' => 1}); +} elsif ($backup == 1){ + #my $bdir = substr($dir,0,rindex($dir,'/')); + #my $cdir = substr($dir,length($bdir)+1); + my @mt = localtime(); + $mt[5] = $mt[5] + 1900; + $mt[4] = $mt[4] + 1; + if ($mt[4] < 10){ $mt[4] = "0".$mt[4];} + if ($mt[3] < 10){ $mt[3] = "0".$mt[3];} + if ($mt[2] < 10){ $mt[2] = "0".$mt[2];} + if ($mt[1] < 10){ $mt[1] = "0".$mt[1];} + if ($mt[0] < 10){ $mt[0] = "0".$mt[0];} + my $name = $mt[5].$mt[4].$mt[3].$mt[2].$mt[1].$mt[0]."_backup.tgz"; + chdir($dir); + my $lf = &readlocal($dir); + unlink($name); + my @ltarfiles = (); + foreach my $l (keys %{$lf}){ + push @ltarfiles, $l; + } + if (-d $dir.'/container'){ + my $alf = &readlocalall($dir.'/container'); + foreach my $al (keys %{$alf}){ + push @ltarfiles, 'container/'.$al; + } + } + $tar->add_files(@ltarfiles); + $tar->write($name,COMPRESS_GZIP); + #if(defined($ftp)){ + # $ftp->cwd('backup'); + # $ftp->put($name,$name); + #} + foreach my $x (@ltarfiles){ + unlink($x); + } + if (-d $dir.'/container'){ + remove_tree($dir.'/container',{ 'keep_root' => 0}); + } + #remove_tree($dir); + print $name."\n"; +}elsif ($restore ne ""){ + my $dir = dirname($restore); + chdir($dir); + my @files = $tar->extract_archive($restore,1); + if (-d $dir){ + print $dir; + }else{ + print "ERROR"; + } +}else { + print "Keine Verbindung zum Server!\n"; +} +if (defined($ftp)){ + &ftpdisconnect(); +} + +#elsif ($list == 1){ +# chdir($dir); +# my $lf = &readlocalfile($dir); +# my $rf = (); +# if (defined($ftp)){ +# $ftp->cwd('backup'); +# $rf = &readftpfile(); +# } +# foreach my $r (keys(%{$rf})){ +# if (!exists($lf->{$r})){ +# $lf->{$r} = $rf->{$r}; +# } +# } +# foreach my $l (sort {$b <=> $a} keys(%{$lf})){ +# my $t = substr($l,0,index($l,"_")); +# print $l." (".&utime_to_time($t).")\n"; +# } +#} + +sub readlocal(){ + my $cdir = shift; + my $ret = (); + opendir(XX,$cdir) or die $cdir." does not exist"; + while (my $d = readdir(XX)){ + #print $d."\n"; + if (substr($d,0,1) eq "."){ next; } + if ((-f $cdir.'/'.$d) && ($d =~ /\.xml$/)){ + my @stat = stat($cdir.'/'.$d); + $ret->{$d}->{mtime} = $stat[9]; + $ret->{$d}->{size} = $stat[7]; + } + } + closedir(XX); + return $ret; +} + +sub readlocalall(){ + my $cdir = shift; + my $ret = (); + opendir(XX,$cdir) or die $cdir." does not exist"; + while (my $d = readdir(XX)){ + #print $d."\n"; + if (substr($d,0,1) eq "."){ next; } + if (-f $cdir.'/'.$d){ + my @stat = stat($cdir.'/'.$d); + $ret->{$d}->{mtime} = $stat[9]; + $ret->{$d}->{size} = $stat[7]; + } + } + closedir(XX); + return $ret; +} + +sub getlocalsyncfiles(){ + my $cdir = shift; + my $ret = (); + opendir(XX,$cdir) or die $cdir." does not exist"; + while (my $d = readdir(XX)){ + #print $d."\n"; + if (substr($d,0,1) eq "."){ next; } + if ((-f $cdir.'/'.$d) && ($d =~ /\.xml$/)){ + my @stat = stat($cdir.'/'.$d); + $ret->{$d}->{mtime} = $stat[9]; + $ret->{$d}->{size} = $stat[7]; + } + } + closedir(XX); + return $ret; +} + + +sub readlocalfile(){ + my $cdir = shift; + my $ret = (); + opendir(XX,$cdir) or die $cdir." does not exist"; + while (my $d = readdir(XX)){ + #print $d."\n"; + if (substr($d,0,1) eq "."){ next; } + if ((-f $cdir.'/'.$d) && ($d =~ /\.tgz$/)){ + my @stat = stat($cdir.'/'.$d); + $ret->{$d}->{mtime} = $stat[9]; + $ret->{$d}->{size} = $stat[7]; + } + } + closedir(XX); + return $ret; +} + +sub readftpfile(){ + my @rtxt = $ftp->ls(); + my $ret = (); + foreach my $r (@rtxt){ + if ($r =~ /\.tgz/){ + my $t = $ftp->mdtm($r); + $ret->{$r}->{mtime} = $t; + my $s = $ftp->size($r); + $ret->{$r}->{size} = $s; + } + } + return $ret; +} + +sub ftpconnect(){ + $ftp = Net::FTP->new($host,'Timeout' => 30, 'Passive' => 1); + if (defined($ftp)){ + $ftp->login($user,$pwd); + $ftp->binary; + } + +} + +sub ftpdisconnect(){ + $ftp->quit(); +} + +sub utime_to_time(){ + my $utime = shift; + my @lx = localtime($utime); + $lx[5] = $lx[5] +1900; + $lx[4] = $lx[4] + 1; + + if ($lx[4] <10) {$lx[4] = "0".$lx[4];} + if ($lx[3] <10) {$lx[3] = "0".$lx[3];} + if ($lx[2] <10) {$lx[2] = "0".$lx[2];} + if ($lx[1] <10) {$lx[1] = "0".$lx[1];} + if ($lx[0] <10) {$lx[0] = "0".$lx[0];} + return $lx[3].".".$lx[4].".".$lx[5]." ".$lx[2].":".$lx[1].":".$lx[0]; +} + +#sub dlgopendir($){ +# my $path = shift; +# my $mw = Tkx::widget->new(".",-topmost => 1,); +# my $scrw = Tkx::winfo('screenwidth', $mw); +# $scrw += 100; +# my $scrh = Tkx::winfo('screenheight', $mw); +# $scrh += 100; +# $mw->g_wm_title("DKSSync"); +# $mw->g_wm_geometry("50x50-".$scrw."-".$scrh); +# $mw->g_wm_maxsize(0, 0); +# $mw->g_wm_iconify(); +# &opendirbrowser($mw,$path); +# Tkx::MainLoop(); +# return $dir; +#} +# +#sub opendirbrowser($){ +# my $parent = shift; +# my $path = shift; +# my $dir = Tkx::tk___chooseDirectory( +# -parent => $parent, +# -initialdir => $path, +# -mustexist => 1, +# ); +# if ($os eq "MSWin32"){ +# $dir =~ s/\//\\/g; +# } +# print $dir; +# exit(0); +#} diff --git a/bin/pdfextract.pl b/bin/pdfextract.pl new file mode 100644 index 0000000..26d5748 --- /dev/null +++ b/bin/pdfextract.pl @@ -0,0 +1,155 @@ +#!C:\Perl\bin\perl.exe + +use strict; +use warnings; +use Getopt::Long; +use File::Basename; +my $pdffile=""; +my $toolsdir=dirname($0); +GetOptions("pdf|p=s" => \$pdffile); + +if (! -e $pdffile) { + print "incomplete input!\n"; + exit(1); +} +if (-e $pdffile.'.txt'){ + unlink($pdffile.'.txt'); +} +if (-e $pdffile.'.csv'){ + unlink($pdffile.'.csv'); +} + +my $sep = '/'; +if ($^O eq "Win32") { + $sep = "\\"; +} +if (! -e $toolsdir.$sep.'pdftotext.exe'){ + exit(2); +} + my $cmd = '"'.$toolsdir.$sep.'pdftotext.exe" -table -eol unix "'.$pdffile.'" "'.$pdffile.'.txt"'; + my $st = system($cmd); + my $jdata = (); + if (($st == 0) && (-e $pdffile.".txt")){ + my @pdata = (); + open(PDFDATA,$pdffile.".txt"); + while (my $l = ) { + chomp($l); + if ($l ne "") { + push @pdata,$l; + } + } + close(PDFDATA); + my $caccount = ""; + my $stmtnum = ""; + my $r = 0; + my $cpos = ""; + foreach my $p (@pdata){ + if ($p =~ /^\s+Konto\s+:/ ) { + $cpos = ""; + ($caccount) = $p =~ m/.+IBAN\s+(.+)$/; + next; + }elsif ($p =~ /Kontoauszug Nr\./){ + $cpos = ""; + ($stmtnum) = $p =~ m/^Kontoauszug Nr\.\s(\d+).+$/; + next; + }elsif ($p =~ /^\d\d\.\d\d\s+[GUT|UEBER|SEPA]/){ + $cpos = ""; + $r++; + my ($type,$trdate,$trval,$trsign) = $p =~ m/\d\d\.\d\d\s+(.+)\s+(\d\d\.\d\d\.\d\d)\s+([\d|,|\.]+)\s([+|-])$/; + $type =~ s/\s//g; + $trsign =~ s/\+//; + $trval=~ s/\.//g; + $trdate = substr($trdate,0,6).'20'.substr($trdate,-2); + $jdata->{$r}->{"Account"} = $caccount; + $jdata->{$r}->{"StatementNumber"} = $stmtnum; + $jdata->{$r}->{"BookingDate"} = $trdate; + $jdata->{$r}->{"Amount"} = $trsign.$trval; + $jdata->{$r}->{"TransactionIdent"} = ""; + $jdata->{$r}->{"Message"} = ""; + $jdata->{$r}->{"ForeignAccountOwner"} = ""; + $jdata->{$r}->{"Bank"} = ""; + $jdata->{$r}->{"TransferAccount"} = ""; + $jdata->{$r}->{"TransferCosts"} = 0; + #$jdata->{$r}->{"BookingType"} = $type; + next; + }elsif ($p =~ /^\s+Unser Zeichen/){ + $cpos = "TransactionIdent"; + my ($trid) = $p =~ m/^\s+Unser Zeichen\s+(.+)$/; + $jdata->{$r}->{$cpos} =$trid; + }elsif ($p =~ /^\s+Mitteilung/){ + $cpos = "Message"; + my ($msg) = $p =~ m/^\s+Mitteilung\s+(.+)$/; + $jdata->{$r}->{$cpos} = $msg; + }elsif ($p =~ /^\s+Auftraggeber/){ + $cpos = "ForeignAccountOwner"; + my ($apl) = $p =~ /^\s+Auftraggeber\s+(.+)$/; + $apl =~ s/\s+/\ /g; + $jdata->{$r}->{$cpos} =$apl; + }elsif ($p =~ /^\s+Bank d. Auftr.gebers/){ + $cpos = ""; + }elsif ($p =~ /^\s+BIC-Code Bank d. Auftraggebers/){ + $cpos = "Bank"; + my ($trfbank) = $p =~ /^\s+BIC-Code\sBank\sd\.\sAuftraggebers\s+(.+)$/; + $jdata->{$r}->{$cpos} =$trfbank; + }elsif ($p =~ /^\s+End-to-End-Identifizierung/){ + $cpos = ""; + }elsif ($p =~ /^\s+Beg.nstigter/){ + $cpos = "ForeignAccountOwner"; + my ($recp) = $p =~ /^\s+Beg.nstigter\s+(.+)$/; + $recp =~ s/\s+/\ /g; + $jdata->{$r}->{$cpos} =$recp; + $cpos=""; + }elsif ($p =~ /^\s+Konto Nr. Beg.nst./){ + $cpos = "TransferAccount"; + + my ($trfacc) = $p =~ /^\s+Konto\sNr\.\sBeg.nst.\s+(.+)$/; + $trfacc =~ s/\///g; + $trfacc =~ s/(....)/$1 /sg; + $trfacc =~ s/\s+$//; + $jdata->{$r}->{$cpos} =$trfacc; + $cpos=""; + }elsif ($p =~ /^\s+bei/){ + $cpos = ""; + }elsif ($p =~ /^\s+Transfergeb.hr/){ + $cpos = "TransferCosts"; + my ($tramount) = $p =~ /^\s+Transfergeb.hr\s+EUR\s+(.+)$/; + $tramount =~ s/\,/\./g; + $jdata->{$r}->{$cpos} =$tramount; + }elsif ($p =~ /^\s+Durch Ihren Bonus abgedeckt/){ + $cpos = "TransferCosts"; + my ($tramount) = $p =~ /^\s+Durch Ihren Bonus abgedeckt\s+EUR\s+(.+)$/; + $tramount =~ s/\,/\./g; + $jdata->{$r}->{$cpos} = $jdata->{$r}->{$cpos} + $tramount; + }elsif ($p =~ /^\s+Zeichen/){ + $cpos = ""; + } elsif ($p =~ /^\s+Neuer Kontostand/){ + $cpos=""; + }elsif ($cpos ne "") { + my ($data) = $p =~ m/\s+(.+)$/; + $jdata->{$r}->{$cpos} .= " ".$data; + } + } + + } +if (-e $pdffile.'.txt'){ + unlink($pdffile.'.txt'); +} +open(FOUT,">".$pdffile.".csv"); +print FOUT '"Account","StatementNumber","BookingDate","Amount","TransactionIdent","Message","ForeignAccountOwner","Bank","TransferAccount","TransferCosts"'."\n"; +foreach my $r (keys(%{$jdata})){ + my @data = (); + push @data, $jdata->{$r}->{"Account"}; + push @data, $jdata->{$r}->{"StatementNumber"}; + push @data, $jdata->{$r}->{"BookingDate"}; + push @data, $jdata->{$r}->{"Amount"}; + push @data, $jdata->{$r}->{"TransactionIdent"}; + $jdata->{$r}->{"Message"} =~ s/\s+/\ /g; + push @data, $jdata->{$r}->{"Message"}; + $jdata->{$r}->{"ForeignAccountOwner"} =~ s/\s+/\ /g; + push @data, $jdata->{$r}->{"ForeignAccountOwner"}; + push @data, $jdata->{$r}->{"Bank"}; + push @data, $jdata->{$r}->{"TransferAccount"}; + push @data, $jdata->{$r}->{"TransferCosts"}; + print FOUT '"'.join('","',@data).'"'."\n"; +} +close(FOUT); \ No newline at end of file