diff --git a/cualsea-cli/Makefile.PL b/cualsea-cli/Makefile.PL new file mode 100644 index 0000000..78d8271 --- /dev/null +++ b/cualsea-cli/Makefile.PL @@ -0,0 +1,10 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Cualsea::Cli', + VERSION => '0.1', + INST_SCRIPT => './bin', + INST_BIN => './bin', + test => { TESTS => 't/*.t' }, + test => { TESTS => 't/*/*.t' }, +); diff --git a/cualsea-cli/bin/cualsea b/cualsea-cli/bin/cualsea new file mode 100755 index 0000000..8e40f4e --- /dev/null +++ b/cualsea-cli/bin/cualsea @@ -0,0 +1,22 @@ +#!/usr/bin/env perl + +use v5.30.0; + +use strict; +use warnings; + +use Data::Dumper; +use IO::Socket::UNIX; + +use Cualsea::FileSocket; +use Cualsea::MessageManager; + +my $socket = IO::Socket::UNIX->new( + Type => SOCK_STREAM(), + Peer => $Cualsea::FileSocket::SOCKET_PATH, +) or die "Daemon not started"; +my $message_manager = Cualsea::MessageManager->new(socket => $socket); + +$message_manager->write_message( message => {hola => 'mundo'} ); + +print Data::Dumper::Dumper $message_manager->read_message; diff --git a/cualsea-lib/Makefile.PL b/cualsea-lib/Makefile.PL new file mode 100644 index 0000000..a806953 --- /dev/null +++ b/cualsea-lib/Makefile.PL @@ -0,0 +1,15 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Cualsea', + VERSION => '0.1', + test => { TESTS => 't/*.t' }, + test => { TESTS => 't/*/*.t' }, + PREREQ_PM => { + 'Const::Fast' => 0, + 'Types::Standard' => 0, + 'Params::ValidationCompiler' => 0, + 'JSON' => 0, + } +); + diff --git a/cualsea-lib/lib/Cualsea/FileSocket.pm b/cualsea-lib/lib/Cualsea/FileSocket.pm new file mode 100644 index 0000000..3a27926 --- /dev/null +++ b/cualsea-lib/lib/Cualsea/FileSocket.pm @@ -0,0 +1,11 @@ +package Cualsea::FileSocket; + +use v5.30.0; + +use strict; +use warnings; + +use Const::Fast; + +const our $SOCKET_PATH => '/run/cualsea/cualsea.sock'; +1; diff --git a/cualsea-lib/lib/Cualsea/MessageManager.pm b/cualsea-lib/lib/Cualsea/MessageManager.pm index 96eb224..7d62e07 100644 --- a/cualsea-lib/lib/Cualsea/MessageManager.pm +++ b/cualsea-lib/lib/Cualsea/MessageManager.pm @@ -7,7 +7,7 @@ use warnings; use Encode; -use Types::Standard qw/Object/; +use Types::Standard qw/Object HashRef/; use Params::ValidationCompiler qw/validation_for/; use JSON; @@ -34,6 +34,7 @@ use JSON; } sub _socket { + my $self = shift; return $self->{socket}; } @@ -45,13 +46,12 @@ sub read_message { my $message_json; $socket->recv($len_bytes, 4); $len = unpack ('L', $len_bytes); + say "Received len $len"; $socket->recv($message_json, $len); - eval { - return decode_json($message_json); - }; - if ($@) { - warn "Unable to decode the message."; - } + say "Received message $message_json"; + my $message = decode_json($message_json); + print Data::Dumper::Dumper $message; + return $message; } { @@ -69,11 +69,13 @@ sub read_message { my $socket = $self->_socket; my $message_json = encode_json($message); # We will want the len to be calculated over the raw bytes. - $message_json = Encode::encode("UTF-8"); + $message_json = Encode::encode("UTF-8", $message_json); my $len = length $message_json; my $len_str = pack 'L', $len; $socket->send($len_str); + say "Sended len $len"; $socket->send($message_json); + say "Sended message $message_json"; } } 1 diff --git a/cualsea-server/Makefile.PL b/cualsea-server/Makefile.PL new file mode 100644 index 0000000..c99098d --- /dev/null +++ b/cualsea-server/Makefile.PL @@ -0,0 +1,10 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Cualsea::Server', + VERSION => '0.1', + INST_SCRIPT => './bin', + INST_BIN => './bin', + test => { TESTS => 't/*.t' }, + test => { TESTS => 't/*/*.t' }, +); diff --git a/cualsea-server/lib/Cualsea/Server/Loop.pm b/cualsea-server/lib/Cualsea/Server/Loop.pm index fc94cd1..1bd0ac6 100644 --- a/cualsea-server/lib/Cualsea/Server/Loop.pm +++ b/cualsea-server/lib/Cualsea/Server/Loop.pm @@ -6,12 +6,12 @@ use strict; use warnings; use IO::Socket::UNIX; +use Cualsea::FileSocket; +use Cualsea::Server::MessageController; # The built-in constants are not that good. use Const::Fast; -const $SOCKET_PATH => '/run/cualsea.sock'; - sub new { my $class = shift; @@ -19,26 +19,38 @@ sub new { return bless {}, $class; } -sub socket { +sub _socket { my $self = shift; if ( !defined $self->{socket} ) { - warn 'Overwritting cualsea socket, this may be a bug.' - if -e $SOCKET_PATH; - system 'rm', $SOCKET_PATH; - $self->{socket} = IO::Socket::Unix->new( + if (-e $Cualsea::FileSocket::SOCKET_PATH) { + warn 'Overwritting cualsea socket, this may be a bug.'; + system 'rm', $Cualsea::FileSocket::SOCKET_PATH; + } + $self->{socket} = IO::Socket::UNIX->new( Type => SOCK_STREAM(), - Local => $SOCKET_PATH, + Local => $Cualsea::FileSocket::SOCKET_PATH, Listen => 1, ); + chmod 0777, $Cualsea::FileSocket::SOCKET_PATH; } return $self->{socket}; } +sub _message_controller { + my $self = shift; + if (!defined $self->{message_controller}) { + $self->{message_controller} = Cualsea::Server::MessageController->new; + } + return $self->{message_controller}; +} + sub run { my $self = shift; - my $socket = $self->socket; + my $socket = $self->_socket; my $conn = $socket->accept; + my $message_controller = $self->_message_controller; if ($conn) { + $message_controller->dispatch ( socket => $conn ); } } 1 diff --git a/cualsea-server/lib/Cualsea/Server/MessageController.pm b/cualsea-server/lib/Cualsea/Server/MessageController.pm index 2985b53..fa68741 100644 --- a/cualsea-server/lib/Cualsea/Server/MessageController.pm +++ b/cualsea-server/lib/Cualsea/Server/MessageController.pm @@ -5,11 +5,66 @@ use v5.30.0; use strict; use warnings; +use Data::Dumper; + +use Params::ValidationCompiler qw/validation_for/; +use Types::Standard qw/Object HashRef/; + +use Cualsea::MessageManager; + sub new { my $class = shift; return bless {}, $class; } -sub dispatch { +{ + my $validator = validation_for( + params => { + socket => { type => Object }, + } + ); + + sub dispatch { + my $self = shift; + my %params = $validator->(@_); + my $socket = $params{socket}; + my $message_manager = Cualsea::MessageManager->new( socket => $socket ); + my $message = $message_manager->read_message; + if ( !$self->check_is_command( message => $message ) ) { + $self->write_malformed( + message_manager => $message_manager ); + return; + } + $message_manager->write_message( message => $message ); + } +} +{ + my $validator = validation_for( + params => { + message_manager => { type => Object } + } + ); + + sub write_malformed { + my $self = shift; + my %params = $validator->(@_); + my $message_manager = $params{message_manager}; + $message_manager->write_message( + message => { is_error => 1, status => 400 } ); + } +} +{ + my $validator = validation_for( + params => { + message => { type => HashRef }, + } + ); + + sub check_is_command { + my $self = shift; + my %params = $validator->(@_); + my $message = $params{message}; + return 1 if exists $message->{command}; + } } 1 diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..f3fd45f --- /dev/null +++ b/install.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +if ! getent passwd cualsea &> /dev/null; then + sudo useradd -m cualsea -d /var/lib/cualsea -s /bin/bash && + sudo mkdir /run/cualsea && + sudo chown cualsea:cualsea /run/cualsea/ +fi +current_dir=$(dirname $(realpath $0)); +cd $current_dir/cualsea-lib && +sudo cpan . && +cd $current_dir/cualsea-cli && +sudo cpan . && +cd $current_dir/cualsea-server && +sudo cpan .