Line # Revision Author
1 8 ahitrov@rambler.ru package Contenido::State;
2
3 # ----------------------------------------------------------------------------
4 # Contenido::State - класс, описывающий текущее состояние проекта.
5 # Объект этого класса создается при старте Apache-сервера и заполняется
6 # данными из handler.pl или startup.pl. Конкретные данные (порт, URL,
7 # стадию и т.д.) изменяются в startup.pl с помощью стандартного механизма
8 # sandbox (@@PORT@@).
9 # ----------------------------------------------------------------------------
10
11 use strict;
12 use vars qw($VERSION $AUTOLOAD);
13 $VERSION = '4.2';
14
15 use Utils;
16 use Contenido::Globals;
17
18 use @MEMCACHED_BACKEND@;
19
20 sub new
21 {
22 my ($proto) = shift;
23 my $class = ref($proto) || $proto;
24 my $self = {};
25 bless($self, $class);
26
27 $self->{project} = '@PROJECT@';
28 $self->{project_version} = '@PROJECT_VERSION@';
29 $self->{core_version} = '@CORE_VERSION@';
30
31 $self->{db_type} = lc('@DB_TYPE@') || 'single';
32 $self->{db_keepalive} = (lc('@PERSISTENT_CONN@') eq 'no') ? 0:1;
33 $self->{db_host} = (($self->{db_type} eq 'remote') and '@BASE_HOST@') ? lc('@BASE_HOST@') : 'localhost';
34 $self->{db_name} = '@PGSQL_BASE@';
35 $self->{db_user} = '@BASE_USER@';
36 $self->{db_password} = '@BASE_PASSWD@';
37 $self->{db_port} = '@PGSQL_PORT@';
38 $self->{db_prepare} = lc('@PGSQL_REAL_PREPARE@') eq 'yes' ? 1 : 0;
39 567 ahitrov $self->{db_enable_utf8} = lc('@PGSQL_ENABLE_UTF@') eq 'yes' ? -1 : 0;
40 8 ahitrov@rambler.ru $self->{db_client_encoding} = '@PGSQL_CLIENT_ENCODING@';
41
42 $self->{db_encode_data} = '@PGSQL_ENCODE_DATA@';
43 $self->{db_decode_data} = '@PGSQL_DECODE_DATA@' || 'utf-8';
44
45 217 ahitrov $self->{serialize_with} = lc('@SERIALIZE_WITH@') || 'dumper';
46
47 8 ahitrov@rambler.ru $self->{master_db_host} = (($self->{db_type} eq 'remote') and '@MASTER_BASE_HOST@') ? lc('@MASTER_BASE_HOST@') : 'localhost';
48 $self->{master_db_name} = '@MASTER_BASE_NAME@';
49 $self->{master_db_user} = '@MASTER_BASE_USER@';
50 $self->{master_db_password} = '@MASTER_BASE_PASSWD@';
51 $self->{master_db_port} = '@MASTER_BASE_PORT@';
52
53 $self->{session_dir} = '@SESSIONS@';
54 $self->{session_directory} = '@SESSIONS@';
55
56 $self->{crosslinks_dir} = '@CROSSLINKS@';
57 $self->{crosslinks_directory} = '@CROSSLINKS@';
58
59 $self->{httpd_port} = '@HTTPD_PORT@';
60 $self->{httpd_server} = '@HTTPD_SERVER@';
61 $self->{httpd_root} = 'http://'.$self->{httpd_server}.'/';
62
63 $self->{plugins} = '@PLUGINS@';
64
65 $self->{prefix} = '@PREFIX@';
66
67 $self->{images_directory} = '@IMAGES@';
68 $self->{images_dir} = '@IMAGES@';
69
70 $self->{proxy_image_location} = '@PROXY_IMAGE_LOCATION@';
71 $self->{proxy_image_secret} = '@PROXY_IMAGE_SECRET@';
72
73
74 $self->{binary_directory} = '@BINARY@';
75 $self->{binary_dir} = '@BINARY@';
76
77 {
78 my $files_dir = '@FILES@';
79 $self->{files_dir} = [split /\s+/ms, $files_dir];
80 }
81
82 365 ahitrov $self->{composite_binary} = '@COMPOSITE@';
83 8 ahitrov@rambler.ru $self->{convert_binary} = '@CONVERT@';
84 203 ahitrov $self->{file_web_storage} = lc('@FILE_WEB_STORAGE@');
85 8 ahitrov@rambler.ru
86 $self->{core_src} = '@CORE_SRC@';
87 $self->{plug_src} = '@PLUG_SRC@';
88 $self->{proj_src} = '@PROJ_SRC@';
89
90 $self->{log_dir} = '@PROJECT_LOG@';
91 $self->{run_dir} = '@PROJECT_RUN@';
92 $self->{tmp_dir} = '@PROJECT_TMP@';
93 $self->{usr_dir} = '@PROJECT_USR@';
94
95 $self->{var_dir} = '@PROJECT_VAR@';
96 $self->{data_dir} = $self->{var_dir};
97 $self->{data_directory} = $self->{var_dir};
98
99 $self->{preview} = '@PREVIEW@';
100 $self->{mason_comp} = '@MASON_COMP@';
101
102 $self->{auth_cookie} = '@AUTH_COOKIE@';
103
104 $self->{is_dev_server} = lc('@DEVELOPMENT@') eq 'yes';
105 $self->{development} = lc('@DEVELOPMENT@') eq 'yes';
106
107 $self->{contenido_version} = '@CONTENIDO_VERSION@' + 0;
108 $self->{version} = $self->{contenido_version};
109
110 $self->{__debug__} = (lc('@DEBUG@') eq 'yes');
111 $self->{__debug_format__} = '@DEBUG_FORMAT@';
112 $self->{__debug_stack_trace__} = lc('@DEBUG_STACK_TRACE@') eq 'yes';
113 $self->{__debug_min_level__} = '@DEBUG_MIN_LEVEL@';
114 $self->{__debug_max_level__} = '@DEBUG_MAX_LEVEL@';
115 $self->{__sql_debug__} = lc('@DEBUG_SQL@') eq 'yes';
116
117 $self->{project_name} = '@PROJECT_NAME@';
118 $self->{multidomain} = lc('@MULTIDOMAIN@') eq 'yes';
119 $self->{stage} = 'REAL';
120
121 $state->{readonly} = (lc('@READONLY@') eq 'yes');
122
123 $self->{store_method} = lc('@STORE_METHOD@');
124 $Contenido::Globals::store_method = $self->{store_method};
125
126 $self->{cascade} = (lc('@CASCADE@') eq 'yes');
127
128 $self->{locale} = '@LOCALE@';
129
130 # Конфигурационные параметры memcached
131 $self->{memcached_backend} = '@MEMCACHED_BACKEND@';
132 $self->{memcached_enable} = lc( '@MEMCACHED_ENABLE@' ) eq 'yes' ? 1 : 0;
133 $self->{memcached_select_timeout} = '@MEMCACHED_SELECT_TIMEOUT@' || 0.2;
134 $self->{memcached_servers} = [ split(/\s+/, '@MEMCACHED_SERVERS@') ];
135 $self->{memcached_enable_compress} = lc( '@MEMCACHED_ENABLE_COMPRESS@' ) eq 'yes' ? 1 : 0;
136 $self->{memcached_delayed} = lc('@MEMCACHED_DELAYED@') eq 'yes' ? 1 : 0;
137 $self->{memcached_set_mode} = lc('@MEMCACHED_SET_MODE@') eq 'add' ? 'add' : 'set';
138 $self->{memcached_namespace} = lc( $self->{'project'} ).'|';
139
140 $self->{memcached_object_expire} = undef;
141
142 $self->{options_expire} = '@OPTIONS_EXPIRE@';
143
144 $self->{preamble_handler} = '@PREAMBLE_HANDLER@';
145 $self->{preamble_handler_path} = '@PREAMBLE_HANDLER_PATH@';
146
147 740 ahitrov $self->{email_enable} = lc('@EMAIL_ENABLE@') eq 'yes' ? 1 : 0;
148 if ( $self->{email_enable} ) {
149 $self->{email_mailer} = lc ('@EMAIL_MAILER@') eq 'smtp' ? 'smtp' : 'sendmail';
150 $self->{email_from} = '@EMAIL_FROM@';
151 $self->{email_auth_login} = '@EMAIL_LOGIN@';
152 $self->{email_auth_password} = '@EMAIL_PASSWORD@';
153 if ( $self->{email_mailer} eq 'smtp' ) {
154 $self->{email_smtp_server} = '@EMAIL_SMTP_SERVER@';
155 $self->{email_smtp_hello} = '@EMAIL_SMTP_HELLO@';
156 $self->{email_smtp_timeout} = int(@EMAIL_SMTP_TIMEOUT@) || 10;
157 $self->{email_smtp_ssl} = lc ('@EMAIL_SMTP_SSL@') eq 'yes' ? 1 : 0;
158 $self->{email_smtp_port} = int(@EMAIL_SMTP_PORT@) || ($self->{email_smtp_ssl} ? 465 : 25);
159 }
160 }
161
162 8 ahitrov@rambler.ru $self->_refresh_();
163 $self->_init_();
164
165 my @plugins = split(/\s+/, $self->plugins());
166 for my $plugin ($self->{project}, @plugins) {
167 $self->{lc($plugin)} = {};
168 $self->{attributes}->{lc($plugin)} = 'SCALAR';
169
170 my $class = $plugin.'::State';
171 eval ("use $class");
172
173 if ( $@ ) {
174 warn "Contenido Error: Не могу определить состояние плагина $plugin ($class) по причине '$@'.\n";
175 } else {
176 warn "Contenido Init: Загружен класс $class для плагина $plugin.\n" if ($self->debug());
177 eval {
178 $self->{lc($plugin)} = $class->new();
179 };
180 if ( $@ ) {
181 warn "Contenido Error: Не могу выполнить инициализацию состояния плагина $plugin ($class) по причине '$@'.\n";
182 }
183 }
184 }
185
186
187
188
189 return $self;
190 }
191
192
193
194 sub _refresh_
195 {
196 my $self = shift;
197 $self->{debug} = $self->{__debug__};
198 #выставляем $DEBUG и $DEBUG_SQL в правильные значения!!!
199 $DEBUG_SQL = $self->{__sql_debug__};
200 $DEBUG = $self->{__debug__};
201 }
202
203
204 # ----------------------------------------------------------------------------
205 # Вывод информации об объекте...
206 # ----------------------------------------------------------------------------
207 sub info
208 {
209 my $self = shift;
210 return undef unless ref($self);
211
212 $log->info("Объект Contenido::State заполнен следующими параметрами:");
213 foreach my $attribute (sort (keys( %{ $self->{attributes} } )))
214 {
215 my $la = length($attribute);
216 warn "\t".$attribute.("\t" x (2-int($la/8))).": ".$self->{$attribute}."\n";
217 }
218
219 my @plugins = split(/\s+/, $self->plugins());
220 for my $plugin ($self->{project}, @plugins) {
221 if (ref($self->{lc($plugin)})) {
222 eval {
223 $self->{lc($plugin)}->info();
224 };
225 }
226 }
227 }
228
229
230
231 # ----------------------------------------------------------------------------
232 # Инициализация.
233 # - Создает внутри объекта хэш с типами полей - это нужно для быстрой
234 # работы метода AUTOLOAD...
235 # ----------------------------------------------------------------------------
236 sub _init_
237 {
238 my $self = shift;
239
240 foreach my $attribute ( qw(
241 project project_version
242
243 httpd_port httpd_server httpd_root
244 data_directory data_dir
245 images_directory images_dir
246 session_directory session_dir
247 binary_directory binary_dir
248 crosslinks_directory crosslinks_dir
249
250 stage
251 db_keepalive db_host db_name db_user db_password db_port db_type db_client_encoding db_enable_utf8
252 db_encode_data db_decode_data
253
254 mason_comp
255 multidomain
256 project_name
257 preview
258
259 proxy_image_location
260 proxy_image_secret
261
262 debug
263 auth_cookie
264
265 plugins
266
267 development
268 is_dev_server
269
270 contenido_version version
271
272 store_method cascade
273
274 readonly
275
276 locale
277
278 memcached_enable memcached_servers
279 memcached_select_timeout
280 memcached_backend memcached_enable_compress
281 memcached_set_mode
282 memcached_object_expire
283 memcached_namespace
284 convert_binary
285 740 ahitrov
286 email_enable email_mailer
287 email_from email_auth_login email_auth_password
288 email_smtp_server email_smtp_hello email_smtp_timeout email_smtp_ssl email_smtp_port
289 8 ahitrov@rambler.ru ) )
290 {
291 $self->{attributes}->{ $attribute } = 'SCALAR';
292 }
293 }
294
295
296
297 # ----------------------------------------------------------------------------
298 # Это умный AUTOLOAD. Ловит методов для установки/чтения полей...
299 # Версия 0.2
300 # ----------------------------------------------------------------------------
301
302 sub AUTOLOAD
303 {
304 my $self = shift;
305 my $attribute = $AUTOLOAD;
306
307 $attribute =~ s/.*:://;
308 return undef unless $attribute =~ /[^A-Z]/; # Отключаем методы типа DESTROY
309
310 if (! exists($self->{attributes}->{$attribute}))
311 {
312 $log->error("Вызов метода, для которого не существует обрабатываемого свойства: ->$attribute()");
313 return undef;
314 }
315
316 $self->{ $attribute } = shift @_ if (scalar(@_) > 0);
317 return $self->{ $attribute };
318 }
319
320
321 1;