Line # Revision Author
1 8 ahitrov@rambler.ru #!/usr/bin/perl
2
3 use strict;
4
5 use Apache;
6 use Apache::Constants;
7 use Time::HiRes;
8
9 use Contenido::Globals;
10 use Contenido::Apache;
11 use Contenido::Init;
12
13 $Contenido::Globals::PROJECT_NAME = '@PROJECT@';
14 $store_method = lc('@STORE_METHOD@');
15 $DEBUG = lc('@DEBUG@') eq 'yes';
16 $DEBUG_SQL = lc('@DEBUG_SQL@') eq 'yes';
17 $DEBUG_CORE = lc('@DEBUG_CORE@') eq 'yes';
18
19 #базовая инициализация Contenido
20 Contenido::Init->init();
21
22 #импортим все что нужно в пакет в котором работают компоненты
23 package HTML::Mason::Commands;
24
25 use Data::Dumper;
26 use CGI::Cookie;
27 use Convert::Cyrillic;
28 use Image::Size;
29 use Time::HiRes qw(gettimeofday);
30 use POSIX qw(strftime);
31 use Contenido::File;
32 use Contenido::DateTime;
33
34 use Utils;
35 use Contenido::Globals;
36 use Contenido::Init;
37
38 use vars qw(%_comments);
39
40 %_comments = (
41 'text/css' => ['/*', '*/' ],
42 'text/html' => ['<!--', '-->'],
43 );
44
45 require "@CONF@/mason/handler_project.pl";
46
47 1;
48
49 #обьявление package в котором работает основной handler
50 package @PROJECT@::Mason;
51
52 use Contenido::Globals;
53 use HTML::Mason::ApacheHandler;
54 use HTML::Entities;
55 use Utils;
56
57 my %ah_args = (
58 data_dir => '@PROJECT_VAR@/mason',
59 comp_root => [['project'=>'@MASON_COMP@'], ['core'=>'@CORE_COMP@']],
60 );
61
62 if ( '@PLUGINS@' ) {
63 my @plcomps = map { [$_=>'@PLUGIN_COMP@'.'/'.$_.'/comps'] } grep { $_ } split(/\ +/, '@PLUGINS@');
64 if ( @plcomps ) {
65 @{$ah_args{comp_root}} = ($ah_args{comp_root}->[0], @plcomps, $ah_args{comp_root}->[1]);
66 }
67 }
68
69 if (lc('@DEVELOPMENT@') eq 'yes') {
70 $ah_args{error_mode} = 'output';
71
72 if (lc '@COMP_TIMINGS_DISABLE@' ne 'yes') {
73 $ah_args{preamble} = q|
74 use locale;
75 my $_comm = $_comments{$r->content_type};
76 my $s_time_ = [Time::HiRes::gettimeofday];
77 597 ahitrov warn "Start: ".$m->current_comp->path."\n";
78 8 ahitrov@rambler.ru if ($_comm) {
79 $m->out("\n".$$_comm[0]." ".$m->current_comp->path.":\tStart t: ".Time::HiRes::time." ".$$_comm[1]."\n");
80 }|;
81 $ah_args{postamble} = q|
82 597 ahitrov warn "Timing: ".$m->current_comp->path.":\t".sprintf('%.1f ms', Time::HiRes::tv_interval($s_time_) * 1000)."\n";
83 8 ahitrov@rambler.ru if ($_comm) {
84 $m->out("\n".$$_comm[0]." ".$m->current_comp->path.":\tFinish t: ".Time::HiRes::time.", w: ".sprintf('%.4f', Time::HiRes::tv_interval($s_time_))." ".$$_comm[1]."\n");
85 }|;
86 } else {
87 $ah_args{preamble} = q|
88 use locale;
89 |;
90 }
91 } else {
92 597 ahitrov if (lc '@COMP_TIMINGS_DISABLE@' ne 'yes') {
93 $ah_args{preamble} = q|
94 8 ahitrov@rambler.ru use locale;
95 597 ahitrov my $s_time_ = [Time::HiRes::gettimeofday];
96 |;
97 $ah_args{postamble} = q|
98 warn "Timing: ".$m->current_comp->path.":\t".sprintf('%.1f ms', Time::HiRes::tv_interval($s_time_) * 1000)."\n";
99 |;
100 } else {
101 $ah_args{preamble} = q|
102 use locale;
103 |;
104 }
105 8 ahitrov@rambler.ru $ah_args{error_mode} = lc('@ERROR_MODE@') eq 'output' ? 'output':'fatal';
106 $ah_args{preloads} = [qw(@PRELOADS@)];
107 if (lc('@STATIC_SOURCE_ENABLE@') eq 'yes') {
108 $ah_args{static_source} = 1;
109 }
110 }
111
112 if ( lc '@PREAMBLE_HANDLER@' and ref $state->{preamble_handler_obj} ) {
113 $ah_args{preamble} .= q|
114 {
115 my $ret = $state->{preamble_handler_obj}->handle( $m, \@_ );
116 if ( ref $ret eq 'HASH' ) {
117 return if ($ret->{_cached} or $ret->{_return}); # component is self cached or wanna return
118 &http_abort( $ret->{http_abort} ) if $ret->{http_abort};
119 }
120 }
121 |;
122 }
123
124 #Только для нового perl к сожалению :(
125 if (@PERL_LEVEL@ >= 500600) {
126 $ah_args{buffer_preallocate_size} = 256000;
127 $ah_args{enable_autoflush} = 0;
128 }
129
130 # Кеширование Mason (в принципе)
131 if (lc '@MASON_CACHE_ENABLED@' eq 'yes') {
132 # Кеширование Mason посредством Memcached
133 if (lc '@MASON_MEMCACHED_ENABLED@' eq 'yes') {
134 $ah_args{data_cache_defaults} = {
135 cache_class => 'Contenido::Cache::Memcached',
136 mc_backend => '@MASON_MEMCACHED_BACKEND@',
137 mc_servers => [qw(@MASON_MEMCACHED_SERVERS@)],
138 mc_debug => lc '@MASON_MEMCACHED_DEBUG@' eq 'yes',
139 mc_namespace => '@MASON_MEMCACHED_NAMESPACE@',
140 };
141 }
142 } else {
143 $ah_args{data_cache_defaults} = {
144 cache_class => 'Cache::NullCache',
145 };
146 }
147
148 $ah_args{escape_flags} = {
149 h => sub { HTML::Entities::encode_entities(${ $_[0] }, '\'<>&"') },
150 js => sub { Utils::js_escape( ${ $_[0] } ) },
151 strip_crlf => sub { ${$_[0]} =~ s/\r?\n\s*/ /g },
152 };
153
154 $ah_args{default_escape_flags} = '@DEFAULT_ESCAPE_FLAGS@' unless '@DEFAULT_ESCAPE_FLAGS@' eq '';
155
156 # Кеширование скомпиленных компонент
157 if (lc '@COMP_CACHE_ENABLED@' eq 'no') {
158 $ah_args{use_object_files} = 0;
159 $ah_args{code_cache_max_size} = 0;
160 }
161
162 my $ah =new @DEFAULT_HANDLER@(%ah_args);
163
164 sub handler {
165 my $r = shift;
166
167 # Mason НЕ обрабатывает всякое г!!!! /i/ /images/ /binary/
168 return Apache::Constants::DECLINED unless Contenido::Apache::is_valid_request($r);
169
170 my $status;
171
172 # устанавливаем соединение с базой для проекта и всех используемых плагинов,
173 # если их нет или они были потеряны
174 # и пытаемся обработать запрос
175 eval {
176 Contenido::Apache::request_init($r);
177 $status = $ah->handle_request($r)
178 };
179
180 if ($@) {
181 warn '['.scalar(localtime())."] got error $@\n";
182 return Apache::Constants::SERVER_ERROR;
183 } else {
184 return $status;
185 }
186 }
187
188
189 1;
190

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.