Как запустить режим запуска CGI :: Application из командной строки? - PullRequest
5 голосов
/ 17 июля 2009

У меня есть режим запуска в моем CGI :: Application веб-приложении, которое я хотел бы запускать из командной строки, чтобы я мог автоматизировать его. С точки зрения веб-приложения оно выполняет некоторую обработку, а затем отправляет результаты по электронной почте.

При вызове из веб-интерфейса он передает набор параметров (адрес электронной почты, запрос для запуска, дату и т. Д.), Поэтому их необходимо передать.

Как мне создать вызов для приложения CGI :: Application, который будет таким же, как если бы я запускал его из Интернета?

Ответы [ 6 ]

6 голосов
/ 17 июля 2009

Оригинальная CGI-спецификация позволяет легко запускать вещи из командной строки и была полностью задумана не как специальный интерфейс только для HTTP, а как нечто, способное обрабатывать FTP и gopher, а также новый верхний уровень. Схемы URL. Я знаю, что я хотел, когда помог мне это указать.

Спецификация, на которую я ссылался, должна дать вам все, что вам нужно, но по большей части это просто набор переменных среды. Если вы видите запрос на:

http://some.server.com/some/path?a=b&c=d

Переменные среды выглядят так:

SERVER_PROTOCOL=http
REQUEST_METHOD=GET
HTTP_HOST=some.server.com
SERVER_PORT=80
PATH_INFO=/some/path
QUERY_INFO=a=b&c=d

Чтобы изменить полярность в Perl, нужно что-то вроде этого:

$ENV{'SERVER_PROTOCOL'} = 'http';
$ENV{'REQUEST_METHOD'} = 'GET';
$ENV{'SERVER_PORT'} = 80;
$ENV{'PATH_INFO'} = '/some/path';
$ENV{'QUERY_INFO'} = 'a=b&c=d';
system("perl your-CGI-script.pl");

Вещи становятся немного более сложными в обработке запросов POST, и есть больше возможных переменных среды, которые могут потребоваться. В худшем случае вы можете перечислить их все с помощью быстрого CGI-скрипта, например:

print "Content-Type: text/plain\r\n\r\n";
foreach (keys(%ENV))
{
    print "$_=$ENV{$_}\r\n";
}

Теперь поместите это на веб-сервер вместо вашего CGI-скрипта, и вы увидите всю среду, в которую он передается (и исходную среду, поэтому вам нужно будет сделать несколько оценочных вызовов).

3 голосов
/ 04 мая 2011

Я поддерживаю CGI :: Application, и я делаю это все время - у меня есть дюжина скриптов cron, созданных с помощью CGI :: Application, потому что удобно делить инфраструктуру с приложением.

Самый простой подход такой:

# There is no browser to return results to.
$ENV{CGI_APP_RETURN_ONLY} = 1;

my $app = WebApp->new;
$app->direct_run_mode_method;

В этом примере вы обходите нормальный поток и вызываете метод напрямую. Убедитесь, что в этом случае вам не нужны какие-либо действия «установки» или «разрыва».

Если у вас есть только один режим запуска, который вы вызываете, вы также можете просто установить "start_mode" и вызвать run (), так что режим запуска по умолчанию вызывается по умолчанию.

Еще одна идея: вы можете использовать такой модуль, как Getopt :: Long, и передавать значения через хеш PARAM функции new () или полностью заменить процесс выбора режима выполнения. Вот пример, где для определения режима запуска используются флаги командной строки:

sub setup {
    my $self = shift;

    $self->start_mode('send_error_digests');
    $self->run_modes([qw/
        send_error_digests
        help
    /]);

    my ($dry_run, $help);
    GetOptions(
        'dry-run' => \$dry_run,
        'help'    => \$help
    );

    $self->param('dry_run' => $dry_run);

    $self->mode_param(sub {
        return 'help' if $help;
        return $self->start_mode();
    });
}
3 голосов
/ 17 июля 2009

После дальнейшего изучения документации CGI :: App и CGI все оказалось более простым, чем я думал. Простейший случай (без реальной обработки аргументов или работы с выводом из вызова run Webapp):

#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use WebApp;

my $cgi = new CGI( \%{@ARGV} );

my $webapp = WebApp->new( QUERY => $cgi );
$webapp->run();

Для создания CGI требуется всего лишь пара пар значений разделенных пробелами. Вам нужно передать в режиме запуска и все аргументы.

0 голосов
/ 20 июля 2009

Вы можете автоматизировать вызов веб-приложения с помощью curl, wget или LWP GET-скрипта с соответствующими параметрами. Я использовал аналогичную систему для задач, управляемых cron, с приложением Catalyst.

Это касается всех переменных среды для вас ..

0 голосов
/ 17 июля 2009

Вместо того, чтобы проходить через CGI :: Application каждый раз, когда вы хотите что-то сделать, установите правильное разделение интересов , возможно, используя установку MVC . Вся функциональность должна существовать за пределами CGI :: Application, поскольку она должна работать только как контроллер. Как только вы выделите эти биты, вы можете легко написать другие контроллеры для других методов ввода.

Не пишите веб-приложение; написать приложение, которое имеет веб-интерфейс. Когда у вас это есть, вы можете легко предоставить вашему приложению другие виды интерфейсов.

0 голосов
/ 17 июля 2009

Thusly:

$ perl yourscript.pl  field1=value1 field2=value2

Библиотека Perl CGI позаботится о вашем волшебстве, и похоже, что CGI :: Application опирается на CGI (судя по их примеру кода).

...