This commit is contained in:
2024-10-14 00:08:40 +02:00
parent dbfba56f66
commit 1462d52e13
4572 changed files with 2658864 additions and 0 deletions

View File

@@ -0,0 +1,203 @@
#!/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";
#<STDIN>;
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";
#<STDIN>;
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";
#<STDIN>;
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";
#<STDIN>;
#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 [<IP> <PORT>]\n\nOhne Angabe von IP und Port wird auf 0.0.0.0 11211 verbunden\n\n";
exit;
}