summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2018-02-25 12:42:58 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2018-02-25 12:42:58 +0100
commitbbbc36a1e63b39db9fb985e9b5c5a4a24ea2f4a2 (patch)
treec7f5daa732d74a0685ca62663bc6c2af1ac39b7b
parent361d6426604505615ae94944a78a0126712b28cd (diff)
downloadvdr-bbbc36a1e63b39db9fb985e9b5c5a4a24ea2f4a2.tar.gz
vdr-bbbc36a1e63b39db9fb985e9b5c5a4a24ea2f4a2.tar.bz2
Adapted to the new CONN command
-rwxr-xr-xpeerdemo88
1 files changed, 54 insertions, 34 deletions
diff --git a/peerdemo b/peerdemo
index 4dff0d61..a80a59b9 100755
--- a/peerdemo
+++ b/peerdemo
@@ -2,7 +2,12 @@
# VDR SVDRP Peer Demo
#
-# (C) 2017 by Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
+# This script broadcasts an SVDRP discover datagram on the SVDRP UDP port and
+# then listens for replies from peer VDRs on both the UDP and TCP port.
+# It reacts properly to the SVDRP commands CONN, LSTT, POLL, PING and QUIT,
+# and thus seems like a regular VDR to other VDRs.
+#
+# (C) 2018 by Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
use Getopt::Std;
use IO::Socket;
@@ -11,14 +16,12 @@ use IO::Select;
$Usage = qq{
Usage: $0 options
-Options: -c communicate with peer VDR
- -v be verbose
+Options: -v be verbose
};
die $Usage if (!getopts("cv"));
-$Communicate = $opt_c || 0;
-$Verbose = $opt_v || 0;
+$Verbose = $opt_v || 0;
$SvdrpPort = 6419;
$MyName = "peerdemo";
@@ -42,16 +45,9 @@ $BcastSocket->close();
while (1) {
if ($UdpSocket->recv($Request, 1024)) {
- if ($SkippedFirstUdpPacket++) { # the first one is the one we sent, so skip it
+ if (Extract($Request, "name") ne $MyName) {
Log('<', $UdpSocket, $Request);
- $Request .= " "; # for easier parsing
- my $Name = Extract($Request, "name");
- my $Port = Extract($Request, "port");
- my $VdrVersion = Extract($Request, "vdrversion");
- my $ApiVersion = Extract($Request, "apiversion");
- my $Timeout = Extract($Request, "timeout");
- my $PeerHost = $UdpSocket->peerhost();
- print("found VDR '$Name' at $PeerHost with SVDRP port '$Port'\n");
+ ReportVDR($Request, $UdpSocket->peerhost());
}
}
if (my @Ready = $SvdrpSelect->can_read(0.01)) {
@@ -63,30 +59,34 @@ while (1) {
# send mandatory response to simulate an SVDRP host:
my $Prompt = "220 $MyName SVDRP VideoDiskRecorder 2.3.9; Wed Nov 29 17:00:29 2017; ISO-8859-1";
Log('>', $new, $Prompt);
- print($new $Prompt);
- if ($Communicate) {
- # add incoming connection to select:
- $SvdrpSelect->add($new);
- }
- else {
- # close connection:
- $new->close;
- }
+ print($new "$Prompt\n");
+ # add incoming connection to select:
+ $SvdrpSelect->add($new);
}
else {
# process connection:
- my $Request;
- if ($fh->recv($Request, 1024)) {
- Log('<', $fh, $Request);
- if ($Request =~ /^LSTT/) {
- my $Response = "550 No timers defined";
- Log('>', $fh, $Response);
- print($fh "$Response\n");
- }
+ my $Request = "";
+ $fh->recv($Request, 1024);
+ chomp($Request);
+ Log('<', $fh, $Request);
+ if ($Request =~ /^CONN/) {
+ Reply($fh, "250 OK");
+ ReportVDR($Request, $fh->peerhost());
+ }
+ elsif ($Request =~ /^LSTT/) {
+ Reply($fh, "550 No timers defined");
+ }
+ elsif ($Request =~ /^POLL/) {
+ Reply($fh, "250 OK");
+ }
+ elsif ($Request =~ /^PING/) {
+ Reply($fh, "250 $MyName is alive");
+ }
+ elsif ($Request =~ /^QUIT/) {
+ # close connection:
+ $SvdrpSelect->remove($fh);
+ $fh->close;
}
- # close connection:
- $SvdrpSelect->remove($fh);
- $fh->close;
}
}
}
@@ -94,6 +94,26 @@ while (1) {
# Tools:
+sub Reply
+{
+ my ($fh, $s) = @_;
+ Log('>', $fh, $s);
+ print($fh "$s\n");
+}
+
+sub ReportVDR
+{
+ my $s = shift;
+ my $PeerHost = shift;
+ $s .= " "; # for easier parsing
+ my $Name = Extract($s, "name");
+ my $Port = Extract($s, "port");
+ my $VdrVersion = Extract($s, "vdrversion");
+ my $ApiVersion = Extract($s, "apiversion");
+ my $Timeout = Extract($s, "timeout");
+ print("found VDR '$Name' at $PeerHost with SVDRP port '$Port'\n");
+}
+
sub Extract
{
my ($s, $n) = @_;