From c09a3f8cd540924be76de055adbb2a5d46e9ba0f Mon Sep 17 00:00:00 2001 From: Andreas Steffen Date: Fri, 20 Nov 2015 14:40:18 +0100 Subject: [PATCH] Implemented subscription to events --- .../perl/Vici-Session/lib/Vici/Message.pm | 8 +-- .../vici/perl/Vici-Session/lib/Vici/Packet.pm | 51 +++++++++++++------ .../perl/Vici-Session/lib/Vici/Session.pm | 38 +++++++++++++- 3 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Message.pm b/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Message.pm index 228431c903..102ee8ba75 100644 --- a/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Message.pm +++ b/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Message.pm @@ -78,10 +78,10 @@ sub parse { { (my $type, $data) = unpack('Ca*', $data); - if ($type == SECTION_END) - { - return $data; - } + if ($type == SECTION_END) + { + return $data; + } (my $key, $data) = unpack('C/a*a*', $data); diff --git a/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Packet.pm b/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Packet.pm index 62dac0a377..1884da146f 100644 --- a/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Packet.pm +++ b/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Packet.pm @@ -5,7 +5,7 @@ use AutoLoader qw(AUTOLOAD); our @ISA = qw(Exporter); our @EXPORT = qw( - new, request, register, unregister, streamed_request + new, request, register, unregister, event, streamed_request ); our $VERSION = '0.9'; @@ -42,24 +42,27 @@ sub request { my $request = pack('CC/a*a*', CMD_REQUEST, $command, $out); $self->{'Transport'}->send($request); - my $response = $self->{'Transport'}->receive(); - my ($type, $data) = unpack('Ca*', $response); - - switch ($type) + while (1) { - case CMD_RESPONSE - { - return Vici::Message->from_data($data); - } - case CMD_UNKNOWN - { - die "unknown command '", $command, "'\n" - } - else + my $response = $self->{'Transport'}->receive(); + my ($type, $data) = unpack('Ca*', $response); + + switch ($type) { - die "invalid response type\n" + case CMD_RESPONSE + { + return Vici::Message->from_data($data); + } + case CMD_UNKNOWN + { + die "unknown command '", $command, "'\n" + } + else + { + #ignore, message might be for another thread + } } - }; + } } sub register { @@ -112,6 +115,22 @@ sub unregister { }; } +sub event { + my $self = shift; + + while (1) + { + my $response = $self->{'Transport'}->receive(); + my ($type, $data) = unpack('Ca*', $response); + if ($type == EVENT) + { + (my $event_name, $data) = unpack('C/a*a*', $data); + my $msg = Vici::Message->from_data($data); + return ($event_name, $msg); + } + } +} + sub streamed_request { my ($self, $command, $event, $vars) = @_; my $out = defined $vars ? $vars->encode() : ''; diff --git a/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Session.pm b/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Session.pm index 256509b190..cd18cbc380 100644 --- a/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Session.pm +++ b/src/libcharon/plugins/vici/perl/Vici-Session/lib/Vici/Session.pm @@ -9,7 +9,8 @@ our @EXPORT = qw( uninstall, list_sas, list_policies, list_conns, get_conns, list_certs, list_authorities, get_authorities, load_conn, unload_conn, load_cert, load_key, load_shared, clear_creds, load_authority, unload_authority, - load_pool, unload_pool, get_pools + load_pool, unload_pool, get_pools, register_events, unregister_events, + listen_events ); our $VERSION = '0.9'; @@ -128,6 +129,41 @@ sub get_pools { return request('get-pools', @_); } +sub register_events { + my ($self, $events) = @_; + if (ref($events) eq 'ARRAY') + { + foreach my $event (@$events) + { + $self->{'Packet'}->register($event); + } + } + else + { + $self->{'Packet'}->register($events); + } +} + +sub unregister_events { + my ($self, $events) = @_; + if (ref($events) eq 'ARRAY') + { + foreach my $event (@$events) + { + $self->{'Packet'}->register($event); + } + } + else + { + $self->{'Packet'}->register($events); + } +} + +sub listen_events { + my ($self, $events) = @_; + return $self->{'Packet'}->event(); +} + # Private functions sub request { -- 2.47.2