#!/usr/bin/perl -X use warnings; use Thread; use IO::Socket::Multicast; use Win32::Console::ANSI qw /Cursor Title/; use IO::Socket; use JSON::XS; use strict; my %jdata :shared; my %data; my @sortedindex; my $gotdata :shared; my $rrthr :shared; $rrthr = 0; $gotdata=0; #my $peerhost = "10.61.1.10"; my $peerhost; my $peerport; if ($ARGV[0] eq "") { $peerhost="0.0.0.0"; $peerport="11211"; } else { if ($ARGV[1] eq "") { wrong_start("Kein Port"); } my $e=$ARGV[1]; if ($e<1024 or $e>65535) {wrong_start("Ungültiger Port");} $peerport = $e; my ($a,$b,$c,$d) = split/\./,$ARGV[0]; if ($ARGV[0] eq "0.0.0.0") { $peerhost=0.0.0.0; } else { if ($a<1 or $a>255 or $b<0 or $b>255 or $c<0 or $c>255 or $d<1 or $d>255) { wrong_start("Ungültige IP"); } $peerhost = $a . "." . $b . "." . $c . "." . "$d"; } } while (1) { if ($rrthr==0) { print "Receive JSON neu starten\n"; #; my $thr = new Thread(\&ReceiveJSON); $thr->detach; #sleep 1; } if ($gotdata and $rrthr==1) { TransformJSON(); @sortedindex=Sorted(); print "\e[2J"; my $status = $data{0}[0]; my $res1 = $data{0}[1]; my $res2 = $data{0}[2]; my $res3 = $data{0}[3]; my $timest = $data{0}[4]; my $spalten = $data{0}[5]; my $zeilen = $data{0}[6]; my $label = $data{0}[7]; my $showl = 0; # beschriftung wird angezeigt $showl = 1 if ($label eq ""); # beschriftung wird nicht angezeigt my $gesamtzeilen = @sortedindex; my $startshow = 7 + $showl; my $endshow; if ($spalten eq "") { $endshow=@{$data{0}} -1; } else { $endshow = $startshow -1 + $spalten; } $zeilen=$gesamtzeilen if ($zeilen eq ""); #spaltenbreite ermitteln my @sb; for my $id (0 .. $zeilen -1) { #zeilen durchlaufen my $i=$sortedindex[$id]; for my $c ($startshow .. $endshow) { #spalten durchlaufen # spaltenbreite ist länge der aktuellen spalte wenn die aktuelle länger als die bisher ermittelte länge ist $sb[$c]=0 unless ($sb[$c]); $sb[$c] = length ($data{$i}[$c]) if (length ($data{$i}[$c]) > $sb[$c]); } } for my $id (0 .. $zeilen -1) { my $i=$sortedindex[$id]; for my $c ($startshow .. $endshow) { # soviele leerzeichen schreiben bis die anzahl der geschriebenen leerzeichen + des inhalts die maximale länge der spalte erreicht hat my $lenv; if ($data{$i}[$c] eq "") { $lenv=0; } else { $lenv = length($data{$i}[$c]); } for (my $j=0;$j<$sb[$c]-$lenv;$j++) { print " "; } # ein leerzeichen muß hinten angehängt werden damit eine lücke zwischen den spalten entsteht printf "%s ", $data{$i}[$c]; } print "\n" if ($id==0); # nach der überschrift eine leerzeile einfügen print "\n"; # zeilenumbruch einfügen } } sleep 1; } sub Sorted { my @sorted; my $type=0; # type 0 numerisch, 1 alphanumerisch foreach (keys %data) { if ($_ =~ /[a-z]/i) { $type=1; } } if ($type == 0) { foreach my $id (sort { $a <=> $b } keys %data) { push @sorted, $id; } } else { foreach my $id (sort keys %data) { push @sorted, $id; } } return @sorted; } sub ReceiveJSON { my $JSONObject = JSON::XS->new->ascii->pretty->relaxed->allow_nonref(); $rrthr=1; my $socket = new IO::Socket::INET (PeerAddr => $peerhost, PeerPort => $peerport, Proto => 'tcp', ) or $rrthr=0; if ($rrthr==0) { print "Keinen Server gefunden unter $peerhost:$peerport\n"; #; return; } #$socket->send("\n"); #printf "[Connected to %s]\n", $socket->peerport; while ( 1 ) { my $recv_data; if ($socket->peerport eq "") { $rrthr=0; #die "Verbindung zum Server verloren!\n"; #return; print "Verbindung verloren\n"; #; threads->exit(); } $socket->send("GETDATA\n"); $socket->recv($recv_data,4096); local $@; my $failed=not eval { %jdata = %{$JSONObject->decode($recv_data)}; return 1; }; if ($failed) { $gotdata=0; #$rrthr=0; #die "Malformed JSON\n"; #return; print "Malformed JSON\n"; #; #threads->exit(); } $gotdata=1; sleep 1; } } sub TransformJSON { foreach my $id (keys %jdata) { my @fields = split /\|/,$jdata{$id}; #@arr=($a,$b,$c,$d); #push @{$hash2{$_}}=@arr; #$hash2{$_} = [$a, $b, $c ,$d]; $data{$id} = [@fields]; } } sub wrong_start { print "\n\n\t$_[0]\n\nAufruf:\n\nmcastrcv3 [ ]\n\nOhne Angabe von IP und Port wird auf 0.0.0.0 11211 verbunden\n\n"; exit; }