#!/usr/bin/env perl use Getopt::Std; sub help { my $error = shift; print "Error: $error\n\n" if($error); print < -f Don't fork and stay in foreground -h This help message -P TCP port to listen on. Always listens on all available IPv4 interfaces. Defaults to tcp/8080 HELP exit(1) if($error); }; our($opt_f, $opt_h, $opt_P); $opt_P = 8080; getopts('fhP:') or (help() and exit(1)); if($opt_h) { help(); exit(0); }; help('Port must be numeric') unless($opt_P =~ m/^\d+$/); my $OSASCRIPT = '/usr/bin/osascript'; { package TaskerWebServer; use HTTP::Server::Simple::CGI; use base qw(HTTP::Server::Simple::CGI); use strict; use warnings; my %dispatch = ( '/' => \&mainPage, '/cmd1' => \&cmd1, '/cmd2' => \&cmd2, ); sub handle_request { my $self = shift; my $cgi = shift; my $path = $cgi->path_info(); my $handler = $dispatch{$path}; if (ref($handler) eq "CODE") { print "HTTP/1.0 200 OK\r\n"; $handler->($cgi); } else { print "HTTP/1.0 404 Not found\r\n"; print $cgi->header, $cgi->start_html('Not found'), $cgi->h1('Not found'), $cgi->end_html; }; }; sub helper { my $cgi = shift; my $message = shift; my $html = $cgi->header . $cgi->start_html('Tasker interface'); $html .= $cgi->h1($message) if($message); $html .= $cgi->end_html; return $html; }; sub mainPage { my $cgi = shift; print helper($cgi, 'Tasker interface'); }; sub cmd1 { my $cgi = shift; system("$OSASCRIPT ~/my.first.applescript"); print helper($cgi, 'Ran cmd1'); }; sub cmd2 { my $cgi = shift; system("$OSASCRIPT ~/my.second.applescript"); print helper($cgi, 'Ran cmd1'); }; }; if($opt_f) { TaskerWebServer->new($opt_P)->run(); } else { my $pid = TaskerWebServer->new($opt_P)->background(); print "Started tasker web service with PID $pid\n"; };