| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #!/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});
- };
- };
|