#!/usr/bin/perl 

#
#  This is a very simple example Penguin daemon which uses
#  the 'Trivial::Server' class.  Obviously, to do anything
#  real with it, you'd probably want to subclass from
#  Penguin::Trivial::Server and install your own hooks
#  (including sharing compartments, etc.) into the mix.
#

print("Type your PGP Password (echo disabled with 'stty -echo'):\n");
system("stty -echo");
chop($password = <STDIN>);
system("stty echo");
print("thanks (echo back on)\n");

use Penguin::Trivial::Server;

print("listening for clients...\n");

$shareref = [ 'notify', 'alert', 'message' ];

my $penguinserver = new Penguin::Trivial::Server Port => 8118,
                                                 Password => $password,
                                                 Share => $shareref;

$penguinserver->serve();

sub notify {
    print "hello, world!  Notification is happening!\n";
}

sub alert {
    print "Warning, alert!  Alert!  Danger will robinson!\n";
}

sub message { # note that this uses backticks, which are normally
              # executed with extreme prejudice by Safe.  However,
              # since we explicitly shared this, it executes.
    print "the time is " . `date` . "\n";
}

# NOTE: guestbook is not shared by default, because it's
# not 100% safe (it's vulnerable to denial-of-service
# attacks against your filesystem).

sub guestbook { # this one demonstrates a semisafe guestbook.
    my $text = shift;

    if (! open(GUESTBOOK, ">>guestbook")) {
        warn "whups, can't open the guestbook for appending";
        return "sorry, the guestbook is unavailable right now";
    }
    print GUESTBOOK $text if length($text) < 100; # no spam please
    close GUESTBOOK;
}


syntax highlighted by Code2HTML, v. 0.9.1