--- /dev/null
+#!/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);
+#}
--- /dev/null
+#!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 = <PDFDATA>) {
+ 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