#!/usr/bin/env starman #pacakge bin::tpsgi; #ABSTRACT: PSGI application which simplifies migrating legacy/cgi applications to PSGI use strict; use warnings; use FindBin::libs; use TPSGI; use Getopt::Long qw{GetOptionsFromArray}; use Config::Simple; my %options = main(@ARGV); =head1 USAGE tpsgi ... starman options tpsgi obeys a config file, ~/.tpsgi.ini which is in Config::Simple (key=value) format, with the keys being: verbose # Whether to print all log messages or not custom_log # Custom location for default (rotated) log routers # Router module(s), separate with comma indices # Dirindex files. In addition to index.html, index.htm, index.cgi loggers # Logger module(s), separate with comma auth # Authentication module The idea is that this application is going to be run in a chroot with the user's homedir being the application dir. =cut sub main { my (@args) = @_; my %options = _get_from_config(); return %options; } sub _get_from_config { my %options = ( verbose => 0, custom_log => undef, routers => [], loggers => [], auth => undef, ); my $config_file = "$ENV{HOME}/.tpsgi.ini"; if (-f $config_file) { my $conf = Config::Simple->new($config_file); my %config; %config = %{$conf->param(-block => 'default')} if $conf; # Merge the configuration with the options foreach my $opt (keys(%options)) { if ( ref $options{$opt} eq 'ARRAY' ) { next unless exists $config{$opt}; my @arrayed = ref $config{$opt} eq 'ARRAY' ? @{$config{$opt}} : ($config{$opt}); push(@{$options{$opt}}, @arrayed); next; } $options{$opt} = $config{$opt} if exists $config{$opt}; } } return %options; } our $app = sub { $options{verbose} = 1; my $self = TPSGI->new(%options); return eval { $self->app(@_) } || do { my $env = shift; $env->{'psgi.errors'}->print($@); # Redact the stack trace past line 1, it usually has things which should not be shown $self->{cur_query}->{message} = $@; $self->{cur_query}->{message} =~ s/\n.*//g if $self->{cur_query}->{message}; return $self->error($self->{cur_query}); }; };