#!/usr/bin/perl
# Minimal systemd socket activated service
# Put together based on responses from: https://www.perlmonks.org/?node_id=11157093
use strict;
use warnings;
use English;
$OUTPUT_AUTOFLUSH = 1; # AKA $|
# Important. We need to know the remote IP address.
my $remote_addr = $ENV{REMOTE_ADDR};
printf "Greetings %s what is your command?\n", $remote_addr;
# printf "%s = %s\n", $_, $ENV{$_} foreach sort keys %ENV; # Used to get the rest of the environment.
# Code here to check that $remote_addr is authorised to connect, and which remote commands it may call.
# Need to close the socket & refuse futher commands $remote_addr is not authorised.
while( my $cmd = <> )
{
if( $cmd =~ m/^sleep (\d+)/ )
{
my $snooze_time = $1;
printf "Will sleep for $snooze_time seconds\n";
sleep $snooze_time;
print "... ZZZ ... Yawn ... What next oh master?\n";
}
# NB: In real life there are lots of other commands and many take some time to process.
else
{
print "I did not understand that. What next oh master?\n";
}
}
####
[Unit]
Description=perl forking socket
PartOf=pfs.service
[Socket]
ListenStream=2345
BindIPv6Only=both
Accept=yes
MaxConnections=12
[Install]
WantedBy=sockets.target
##
##
[Unit]
Description=perl forking server
After=network.target nss-user-lookup.target
Requires=pfs.socket
[Service]
ExecStart=/root/path/to/minimal_systemd_socket_activated_service.pl
StandardInput=socket
[Install]
Also=pfs.socket
WantedBy=multi-user.target