1 | # |
---|
2 | # Copyright (c) 2004-2007 - Consultas, PKG.fr |
---|
3 | # |
---|
4 | # This file is part of A2P. |
---|
5 | # |
---|
6 | # A2P is free software; you can redistribute it and/or modify |
---|
7 | # it under the terms of the GNU General Public License as published by |
---|
8 | # the Free Software Foundation; either version 2 of the License, or |
---|
9 | # (at your option) any later version. |
---|
10 | # |
---|
11 | # A2P is distributed in the hope that it will be useful, |
---|
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
14 | # GNU General Public License for more details. |
---|
15 | # |
---|
16 | # You should have received a copy of the GNU General Public License |
---|
17 | # along with A2P; if not, write to the Free Software |
---|
18 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
---|
19 | # |
---|
20 | # $Id: Globals.pm 3 2007-10-18 16:20:19Z g $ |
---|
21 | # |
---|
22 | |
---|
23 | package A2P::Globals ; |
---|
24 | |
---|
25 | use strict ; |
---|
26 | use Time::HiRes qw( gettimeofday ) ; |
---|
27 | use A2P::Init ; |
---|
28 | |
---|
29 | BEGIN { |
---|
30 | use Exporter (); |
---|
31 | |
---|
32 | our ( $VERSION, $SERVICE, @ISA, @EXPORT, @EXPORT_OK, @SHARED ); |
---|
33 | |
---|
34 | $VERSION = sprintf "%s", q$Rev: 1162 $ =~ /(\d[0-9.]+)\s+/ ; |
---|
35 | $SERVICE = defined($ENV{'LOCKID'}) ? 1 : 0 ; |
---|
36 | |
---|
37 | @ISA = qw(Exporter); |
---|
38 | |
---|
39 | # Export every constants |
---|
40 | @EXPORT = qw( |
---|
41 | %means &QUIT &PING &_INIT &NOMOREFILE $Progname $StdoutFile |
---|
42 | &DONE $MUSTQUIT $LISTENER &TODO $maintid $do_file $A2P_SYS_CONF |
---|
43 | &A2P_RPM_VERSION %STATS &UPSTAT @SHARED &_UPDATE $SYSLOG &TIMESTAT |
---|
44 | &MAXSTAT &MAXMINSTAT @AbortTime $AFPNAME_REGEX &DOWNSTAT |
---|
45 | ); |
---|
46 | |
---|
47 | # List of thread shared and updatable variables to export |
---|
48 | # DEV2 |
---|
49 | @SHARED = qw( |
---|
50 | $NO_SYSLOG_DEBUG $AFPSPOOL $USLEEP $AFP2PRINT_PATH $ARCH_DEBUG |
---|
51 | $SHMDIR $ERRORSPOOL $DONESPOOL $LOGOPATH $ARCH_SCENARIO $PCL_RESOLUTION |
---|
52 | $MAXTASK $DESTIDFILE $COMPRESSFILES $DONTZIPPDF $PURGEFILES $DO_PING |
---|
53 | $PARALLELE_VALIDATION $DVILJ $ZIPOPTIONS $LOCKID $NODEBUG_MOD_LIST |
---|
54 | $MINFOLDERCOUNT $MAXFOLDERCOUNT $ARCH_REMHOST_TEST $ARCH_REMPORT_TEST |
---|
55 | $ARCH_REMHOST_TLOG $ARCH_REMPORT_TLOG $ARCH_REMHOST_PROD $PNGCOMPRESSION |
---|
56 | $MAIL_BIN $ALERT_MAILS $ERROR_MAILS $LOGFILENAME $SPOOL_PREFIX |
---|
57 | $LOGFILE_VS_SYSLOG $ARCH_ENABLED $USE_PCLCMD $LOGFILE_PURGE $KEEP_AFPJOB |
---|
58 | $COM_BURST $SCAN_SPOOL $MAX_BACKLOG $WAIT_ON_PREFIX $MAXRETRYTIMER |
---|
59 | $CLIENT_TIMEOUT $START_LOGGER $NODEBUG_SUB_LIST $CONV_STATUS_TIMING |
---|
60 | $KEEP_STATS $STATS_FOLDER $MAXFILES_BY_ZIPCMD $SYSLOG_PATH |
---|
61 | $KEEP_JOBSTATUS $DONT_PRINT $FORCE_DESTID $SPOOL_TIMER $GIFTOPCL |
---|
62 | $AGREGATE_PRINT $BACKEND_FACTOR $SERVICE_TMP $COM_LOCKING $MAXJOBS |
---|
63 | $SERVICE_DEBUG $STDOUT_DEBUG $MAX_BUFFER_SIZE $DEBUG_IN_FILE |
---|
64 | $ADDTEX_DEBUG $TEX_PAGEDEF_DEBUG $TEX_OVERLAY_DEBUG $TEX_SEGMENT_DEBUG |
---|
65 | $TEX_SHOW_SEGMENT $ADVANCED_DEBUGGING $ARCH_REMPORT_PROD |
---|
66 | $KEEP_DYNAMIC_JOB_LOG $JOB_DUMP_ON_ERROR $JOIN_ZIP_ON_ERROR |
---|
67 | $CLEAN_OPTIMIZATION $DYNAMIC_USLEEP $MAX_DYNAMIC_USLEEP $MAX_CONV_RATE |
---|
68 | $ADDTEX_DOCINFO $ADDPCL_JOBNAME $ADDPCL_USERNAME $ONLY_DO_PDF |
---|
69 | $MAXCONNECTIONS $USE_TCPIP_SOCKET $USE_TCPIP_PORT $USE_ONLY_LOOPBACK |
---|
70 | $AUTHORIZED_HOST $ESERVICE_ENABLED $ESERVICE_CONF $CONVERT_CONTENT_FILE |
---|
71 | $CLOSE_CONNECTIONS $ENABLE_DTD_VALIDATION $DOCSFILE $STATUS_DB_MAXAGE |
---|
72 | $DOCUMENTS_CORRECTION_ENABLED $DBI_DSN $DBI_USER $DBI_PASSWD |
---|
73 | $A2PDB_TABLE_PREFIX $STATSFILE_MAXAGE $STATUS_MAXAGE $DO_CONVERT |
---|
74 | $FROM_CONVERT $TO_CONVERT $STATS_COMMIT_SKIP $MAX_CACHED_DB $MAX_LINES |
---|
75 | $RECONNECT_TIMER $STATUS_CACHE_MAXAGE $MAX_CACHED_STATUS $JOBS_COUNTDOWN |
---|
76 | $ENABLE_SPLITTER $BACKEND_RETRY $BACKEND_RETRYTIMEOUT $AUTO_SPLIT_MAX |
---|
77 | $DO_DB_OPTIMIZATION |
---|
78 | ); |
---|
79 | |
---|
80 | # Add here to @SHARED some parameters only used in init script not to |
---|
81 | # initialize |
---|
82 | push @SHARED , qw( |
---|
83 | $AFP2PRINT_USER $PERL $A2P_SYS_CONF $NICE $SERVICE_PROG $PRINTLIB_PATH |
---|
84 | $TEXSPOOL |
---|
85 | ); |
---|
86 | |
---|
87 | # Add shared to export list |
---|
88 | push @EXPORT , @SHARED ; |
---|
89 | |
---|
90 | @EXPORT_OK = qw( &UpdateSharedEnv &get_default_lockid ); |
---|
91 | } |
---|
92 | our @SHARED ; |
---|
93 | our $SYSLOG ; |
---|
94 | our $SERVICE; |
---|
95 | |
---|
96 | # Defaults only used in bash scripts |
---|
97 | our $AFP2PRINT_USER = 'afp2print' ; |
---|
98 | our $PERL = '/usr/bin/perl' ; |
---|
99 | our $NICE = 'nice --5' ; |
---|
100 | our $SERVICE_PROG = '$AFP2PRINT_PATH/a2p.pl' ; |
---|
101 | our $PRINTLIB_PATH = '$AFP2PRINT_PATH/printlib' ; |
---|
102 | our $TEXSPOOL = '' ; |
---|
103 | |
---|
104 | ################################################################################ |
---|
105 | ## Threads shared variables ## |
---|
106 | ## Each one would be re-initialized by Init function as needed ## |
---|
107 | ################################################################################ |
---|
108 | # DEV: When adding shared variable, dev lines must be added at: |
---|
109 | # DEV1: its 'our' definition with eventually its default value |
---|
110 | # DEV2: and also, it must be inserted in SHARED list (see BEGIN block) |
---|
111 | |
---|
112 | # DEV1 |
---|
113 | |
---|
114 | # This is a constant to be update during rpm packaging |
---|
115 | sub A2P_RPM_VERSION () { '1.024' } |
---|
116 | |
---|
117 | # NO_LOGFILE is to be greater than 0 to output log to a file and to syslog |
---|
118 | # Default to 0 to not have logfile |
---|
119 | our $LOGFILE_VS_SYSLOG = 0 ; |
---|
120 | our $LOGFILE_PURGE = 0 ; |
---|
121 | our $LOGFILENAME = "/var/log/a2p.debug" ; |
---|
122 | |
---|
123 | # NO_SYSLOG_DEBUG is to be greater than 0 to not send any Debug to syslog |
---|
124 | # Default to 0 to always debug service start (not critical) |
---|
125 | our $NO_SYSLOG_DEBUG = 0 ; |
---|
126 | |
---|
127 | # SERVICE_DEBUG can be disabled to avoid debugging when service is shutting down |
---|
128 | our $SERVICE_DEBUG = 1 ; |
---|
129 | |
---|
130 | # SYSLOG_PATH is the standard socket where to send syslog message to system |
---|
131 | our $SYSLOG_PATH = "/dev/log" ; # Unix dfault |
---|
132 | our $STDOUT_DEBUG = 0 ; # Send debug to standard console output if set |
---|
133 | our $DEBUG_IN_FILE = 0 ; # To avoid sending debugging to syslog |
---|
134 | # ADVANCED_DEBUGGING should not be used in configuration but can be dynamically |
---|
135 | # be set by sending signal 12 (USR2) to a thread, see details in A2P::Signal |
---|
136 | our $ADVANCED_DEBUGGING = 0 ; # To activate some online debugging |
---|
137 | |
---|
138 | # KEEP_DYNAMIC_JOB_LOG keeps job info that will be only available in the mail |
---|
139 | # sent to the ERRORS_MAIL list when an AlertError rises. |
---|
140 | our $KEEP_DYNAMIC_JOB_LOG = 1 ; |
---|
141 | # Set it to 0 to desactivate |
---|
142 | # Set it a greater value than 1 to also keep debugging messages |
---|
143 | |
---|
144 | our $JOB_DUMP_ON_ERROR = 1 ; # By default make a job dump in the error mail |
---|
145 | our $JOIN_ZIP_ON_ERROR = 1 ; # By default add zip when exist to dumped job |
---|
146 | |
---|
147 | # By default, we could keep some few last log messages, |
---|
148 | # used for job debugging on error and mailed report |
---|
149 | our $MAX_BACKLOG = 10 ; |
---|
150 | |
---|
151 | # TeX info insertion enabled mostly for PDF Title and Creator |
---|
152 | our $ADDTEX_DOCINFO = 1 ; |
---|
153 | |
---|
154 | # PCL5 info insertion can be forced for all produced PCL otherwise it should be |
---|
155 | # enabled by DESTID in desti configuration file |
---|
156 | our $ADDPCL_JOBNAME = 0 ; |
---|
157 | our $ADDPCL_USERNAME = 0 ; |
---|
158 | |
---|
159 | # TeX debugging for TeX validation only |
---|
160 | our $ADDTEX_DEBUG = 0 ; # Set alone, it outputs font names in TeX output |
---|
161 | # ADDTEX_DEBUG must be true to use these following |
---|
162 | our $TEX_PAGEDEF_DEBUG = 0 ; # Show PAGEDEF frame and page off-set used |
---|
163 | our $TEX_OVERLAY_DEBUG = 0 ; # Show OVERLAY frames and page off-set used |
---|
164 | our $TEX_SEGMENT_DEBUG = 0 ; # Show SEGMENT frames and page off-set used |
---|
165 | our $TEX_SHOW_SEGMENT = 1 ; # Remove SEGMENT |
---|
166 | |
---|
167 | # Do we should start a logger thread |
---|
168 | our $START_LOGGER = 1 ; |
---|
169 | |
---|
170 | # KEEP_STATS actives conversion statistics if set to 1 |
---|
171 | our $KEEP_STATS = 1 ; |
---|
172 | our $STATS_FOLDER = "/apps/afp2print/stats" ; |
---|
173 | |
---|
174 | # KEEP_JOBSTATUS can be set to 0 to disable keeping job status |
---|
175 | our $KEEP_JOBSTATUS = 1 ; |
---|
176 | |
---|
177 | # This is the max number of com to manage in one loop |
---|
178 | our $COM_BURST = 5 ; |
---|
179 | # This set the use of locking feature during communication between processes |
---|
180 | # It can be imply a performance issue but also a stability issue if disabled |
---|
181 | our $COM_LOCKING = 0 ; # Not useful with new comm scheme |
---|
182 | our $MAX_BUFFER_SIZE = 65536 ; |
---|
183 | |
---|
184 | # DEBUG_MOD_LIST is to be populated with module or file name to not debug |
---|
185 | # DEBUG_SUB_LIST is to be populated with subfunction name to not debug |
---|
186 | # This comportement can be inversed by inserting the '!' char at beginning |
---|
187 | our $NODEBUG_MOD_LIST = "" ; |
---|
188 | our $NODEBUG_SUB_LIST = "" ; |
---|
189 | |
---|
190 | # DO_PINGPONG is to be greater than 0 to ping threads periodictly |
---|
191 | our $DO_PING = 1 ; |
---|
192 | |
---|
193 | # AFPSPOOL is the spool directory where AFPDS file will be expected |
---|
194 | our $AFPSPOOL = '/apps/afp2print/afpspool' ; |
---|
195 | |
---|
196 | # SCAN_SPOOL should be disabled for a validation service which don't need |
---|
197 | # to scan the spool. It will also disable SpoolManager launch. |
---|
198 | our $SCAN_SPOOL = 1 ; |
---|
199 | # SPOOL_TIMER is the number of seconds between 2 checks in spool when idle |
---|
200 | our $SPOOL_TIMER = 5 ; |
---|
201 | # SPOOL_PREFIX is to tune de prefix selection in the spool (NOT case sensitive) |
---|
202 | our $SPOOL_PREFIX = "TRANS ARCHI" ; |
---|
203 | # WAIT_ON_PREFIX could be set to activate the wait on prefix locking |
---|
204 | our $WAIT_ON_PREFIX = 0 ; |
---|
205 | |
---|
206 | # USLEEP is the time in microsecond to sleep in thread loops |
---|
207 | our $USLEEP = 50000 ; |
---|
208 | # DYNAMIC_USLEEP set USLEEP to dynamic mode |
---|
209 | our $DYNAMIC_USLEEP = 1 ; |
---|
210 | our $MAX_DYNAMIC_USLEEP = 1_000_000 ; # Max USLEEP in dynamic mode (in ms) |
---|
211 | |
---|
212 | # CLEAN_OPTIMIZATION can be disable to force new job creation only after |
---|
213 | # previous jobs have been cleaned |
---|
214 | our $CLEAN_OPTIMIZATION = 1 ; |
---|
215 | |
---|
216 | # This is the default project path installation |
---|
217 | our $AFP2PRINT_PATH = '/apps/afp2print' ; |
---|
218 | |
---|
219 | # SHMDIR default to "/dev/shm" to optimize throughput as be done in memory |
---|
220 | our $SHMDIR = '/dev/shm' ; |
---|
221 | |
---|
222 | # SERVICE_TMP is the path where to use temporary files |
---|
223 | our $SERVICE_TMP = '/tmp/.a2p' ; |
---|
224 | |
---|
225 | # ERRORSPOOL is the spool directory where failed conversion files will be moved |
---|
226 | our $ERRORSPOOL = '/apps/afp2print/spool/error' ; |
---|
227 | |
---|
228 | # DONESPOOL is the spool directory where done conversion files will be moved |
---|
229 | our $DONESPOOL = '/apps/afp2print/spool/done' ; |
---|
230 | |
---|
231 | # LOGOPATH must point to the segment library |
---|
232 | our $LOGOPATH = '/apps/afp2print/printlib/seglib' ; |
---|
233 | |
---|
234 | # MAXTASK is set to the number of concurrent conversion to process |
---|
235 | our $MAXTASK = 1 ; |
---|
236 | |
---|
237 | # MAXJOBS is set to the maximum AFP jobs we can process at a time |
---|
238 | our $MAXJOBS = 1 ; |
---|
239 | |
---|
240 | # MAXCONNECTIONS is the maximum concurrent connections that we be accepted by |
---|
241 | # any Listener |
---|
242 | our $MAXCONNECTIONS = 10 ; |
---|
243 | |
---|
244 | # By default Listener won't listen on TCP/IP socket |
---|
245 | our $USE_TCPIP_SOCKET = 0 ; |
---|
246 | our $USE_TCPIP_PORT = 6400 ; |
---|
247 | # By default TCP/IP server will listen only on the localhost (127.0.0.1) |
---|
248 | our $USE_ONLY_LOOPBACK = 1 ; |
---|
249 | # Even if listening over internet we only accept connection from just localhost |
---|
250 | # by default. Set it to "0.0.0.0" or "any" to accept from any host |
---|
251 | our $AUTHORIZED_HOST = "127.0.0.1" ; |
---|
252 | |
---|
253 | # MAX_CONV_RATE is used to limit the conversion rate on big job. It is the |
---|
254 | # maximum number of conversion to do during one second, and it is really used |
---|
255 | # only with AFP job with more than this value of sub jobs |
---|
256 | # Default MAX_CONV_RATE=20 means AFP jobs with more than 20 sub-jobs will have |
---|
257 | # their TeX conversion limited to not exceed 20 sub-jobs created for each second |
---|
258 | # This should be used to avoid processes communication saturation |
---|
259 | # Remark: - if set to 0, conversion will slow down to reach one conversion by |
---|
260 | # USLEEP interval |
---|
261 | # - it is disabled with negative value |
---|
262 | our $MAX_CONV_RATE = -1 ; |
---|
263 | |
---|
264 | # BACKEND_FACTOR must be greater than 0 and define the numbre of processes |
---|
265 | # (multiplied by MAXTASK) that will be used to call command on the system and |
---|
266 | # this defined also the number of ARchiver processes |
---|
267 | # Exemple: |
---|
268 | # - If MAXTASK = 1 and BACKEND_FACTOR = 3 (this is the default) |
---|
269 | # 3 BackEnd processes will be managed |
---|
270 | # 3 Archiver will be also managed if ARCH_ENABLED is set |
---|
271 | # - If MAXTASK = 2 and BACKEND_FACTOR = 5 |
---|
272 | # 10 BackEnd processes will be managed |
---|
273 | # 10 Archiver will be also managed if ARCH_ENABLED is set |
---|
274 | our $BACKEND_FACTOR = 3 ; |
---|
275 | # Maximum number of retries when command fails |
---|
276 | our $BACKEND_RETRY = 10 ; |
---|
277 | # Maximum number of seconds when command fails to really set the command failed |
---|
278 | our $BACKEND_RETRYTIMEOUT = 30 ; |
---|
279 | |
---|
280 | # DESTIDFILE is the configuration file for print configuration |
---|
281 | our $DESTIDFILE = '/etc/afp2print/destid.conf' ; |
---|
282 | |
---|
283 | # DOCSFILE is the configuration file for print correction by document |
---|
284 | our $DOCSFILE = '/etc/afp2print/documents.conf' ; |
---|
285 | |
---|
286 | # DOCUMENTS_CORRECTION_ENABLED can be set to 1 to enable automatic by Documents |
---|
287 | # scaling and off-set correction. A flag by DestId can be used to enable/disable |
---|
288 | # the correction for a specific DestId. |
---|
289 | # When set greater than 1, the flag by DestId is ignored and correction is |
---|
290 | # forced and only if correction exists for a Document |
---|
291 | our $DOCUMENTS_CORRECTION_ENABLED = 0 ; |
---|
292 | |
---|
293 | # DONTZIPPDF must be set to '1' to keep PDF files not compressed in zip file |
---|
294 | # Only used if COMPRESSFILES is set to 1 |
---|
295 | our $DONTZIPPDF = 0 ; |
---|
296 | |
---|
297 | # DONT_PRINT is set to 1 to skip lpr command |
---|
298 | # FORCE_DESTID can be used as in validation, exemple set it to "LINDEC" in conf |
---|
299 | our $DONT_PRINT = 0 ; |
---|
300 | our $FORCE_DESTID = "" ; |
---|
301 | |
---|
302 | # AGREGATE_PRINT is set to 0 to force print immediatly and not agregate PCL5 to |
---|
303 | # only do one PCL5 by DESTID |
---|
304 | our $AGREGATE_PRINT = 1 ; |
---|
305 | |
---|
306 | # PARALLELE_VALIDATION: Set it to: |
---|
307 | # - 1 to duplicate AFP incoming flux to validation mode and destinations |
---|
308 | # - 2 to only use validation mode and destination printers |
---|
309 | our $PARALLELE_VALIDATION = 0 ; |
---|
310 | |
---|
311 | # the dvilj variant to run taken from dvihp script |
---|
312 | our $DVILJ = 'dvipcl5' ; |
---|
313 | |
---|
314 | # the zip option environment for optimizing compression |
---|
315 | our $ZIPOPTIONS = 'DjJqXm' ; |
---|
316 | our $MAXFILES_BY_ZIPCMD = 1 ; |
---|
317 | # COMPRESSFILES must be set to compression level desired for backup files in |
---|
318 | # DONESPOOL and ERRORSPOOL, value can be 0 to 9 (see 'zip' command man) |
---|
319 | our $COMPRESSFILES = 0 ; |
---|
320 | |
---|
321 | # PURGEFILES is set to 1 when we don't need to keep any file after processing |
---|
322 | our $PURGEFILES = 0 ; |
---|
323 | |
---|
324 | # MINFOLDERCOUNT is the minimum spool file number under which we will repopulate |
---|
325 | # the spool file cache |
---|
326 | our $MINFOLDERCOUNT = 10 ; |
---|
327 | # MAXFOLDERCOUNT is the maximum spool files to keep in our known file cache |
---|
328 | our $MAXFOLDERCOUNT = 100 ; |
---|
329 | # MAXRETRYTIMER is the time in ms to keep a cached available file |
---|
330 | # in memory before retrying to lock it |
---|
331 | our $MAXRETRYTIMER = 500 ; |
---|
332 | |
---|
333 | # CONV_STATUS_TIMING is the time in second after which a status conversion must |
---|
334 | # be provided to inform clients |
---|
335 | our $CONV_STATUS_TIMING = 30 ; |
---|
336 | |
---|
337 | # KEEP_AFPJOB is set to 1 when PARALLELE_VALIDATION is 0 if we want to keep AFP |
---|
338 | # version of each job. In that case, an AFPDS file is splitted in as many job |
---|
339 | # that it contains. This is the default if PARALLELE_VALIDATION is set to 1 or 2 |
---|
340 | our $KEEP_AFPJOB = 1 ; |
---|
341 | |
---|
342 | # Mailing variables for alerts and errors |
---|
343 | our $MAIL_BIN = "/usr/lib/sendmail" ; |
---|
344 | # ALERT_MAILS will receive a short mail with only job in ABTERM in the subject |
---|
345 | our $ALERT_MAILS = "" ; |
---|
346 | # ERROR_MAILS will receive a mail with knowns errors in the body |
---|
347 | our $ERROR_MAILS = "" ; |
---|
348 | |
---|
349 | # CLient time-out is the max time we can expect for a response from listener |
---|
350 | our $CLIENT_TIMEOUT = 300 ; |
---|
351 | |
---|
352 | # Some variable used for archivage processing |
---|
353 | our $ARCH_REMHOST_TEST = '127.0.0.1' ; |
---|
354 | our $ARCH_REMPORT_TEST = 2222 ; |
---|
355 | our $ARCH_REMHOST_TLOG = '127.0.0.1' ; |
---|
356 | our $ARCH_REMPORT_TLOG = 2222 ; |
---|
357 | our $ARCH_REMHOST_PROD = '127.0.0.1' ; |
---|
358 | our $ARCH_REMPORT_PROD = 2222 ; |
---|
359 | our $ARCH_DEBUG = 0 ; |
---|
360 | # ARCH_ENABLED: Can be set to from 0 to 99 |
---|
361 | # to get ARCH_ENABLED * BACKEND_FACTOR Archiver processes |
---|
362 | # ARCH_ENABLED: Set to greater than 99 to activate an archivage simulation: |
---|
363 | # - if = 100 than archivage call returns true each time |
---|
364 | # - else greater, it returns randomly false when random(value) > 99 |
---|
365 | # (so greater value produces more false case) |
---|
366 | our $ARCH_ENABLED = 2 ; |
---|
367 | # ARCH_SCENARIO: 1 = separate binary file, 3 = xml embedded |
---|
368 | our $ARCH_SCENARIO = 1 ; |
---|
369 | |
---|
370 | # ESERVICE designs Electronic Service it can only be activated with AFP flux |
---|
371 | # telling about RC 200,201,202 and replaces the ARCH step when enabled |
---|
372 | our $ESERVICE_ENABLED = 0 ; |
---|
373 | # ESERVICE_ENABLED: Can be set to from 0 to 99 |
---|
374 | # to get ESERVICE_ENABLED * BACKEND_FACTOR EService processes |
---|
375 | # ESERVICE_ENABLED: Set to greater than 99 to activate an e-service simulation: |
---|
376 | # - if = 100 than e-service call returns true each time |
---|
377 | # - else greater, it returns randomly false when random(value) > 99 |
---|
378 | # (so greater value produces more false case) |
---|
379 | our $ESERVICE_CONF = '/etc/afp2print/e-service.conf' ; |
---|
380 | |
---|
381 | # By default client request sockets are closed when processed |
---|
382 | our $CLOSE_CONNECTIONS = 1 ; |
---|
383 | |
---|
384 | # CONVERT_CONTENT_FILE must be true to convert RC201-RC202 content from EBCDIC |
---|
385 | our $CONVERT_CONTENT_FILE = 1 ; |
---|
386 | |
---|
387 | # DO_CONVERT is set or not to activate AFP conversion with from_to perl API |
---|
388 | our $DO_CONVERT = 1 ; |
---|
389 | # The following defines which encoding to use with from_to perl API |
---|
390 | our $FROM_CONVERT = 'cp1047' ; |
---|
391 | our $TO_CONVERT = 'latin1' ; |
---|
392 | |
---|
393 | # ENABLE_DTD_VALIDATION can be set to 0 or 1 to disable |
---|
394 | # or activate DTD validation on XML requests |
---|
395 | our $ENABLE_DTD_VALIDATION= 0 ; |
---|
396 | |
---|
397 | # ONLY_DO_PDF can be set to avoid the steps 4 to 10 only used with printing and |
---|
398 | # online archivage. This is used essentialy to only handle PDF generation and |
---|
399 | # get better performance in this case. |
---|
400 | our $ONLY_DO_PDF = 0 ; |
---|
401 | |
---|
402 | # DBI variables with default connection on local mysql serveur and db a2p |
---|
403 | our $DBI_DSN = 'DBI:mysql:database=a2p;host=localhost;port=3306' ; |
---|
404 | our $DBI_USER = '' ; # Set to Progname (a2p-stat,...) if not set |
---|
405 | our $DBI_PASSWD = '' ; # Connection should failed if not configured |
---|
406 | |
---|
407 | # Time to force reconnection to DB for a2p-stat and a2p-status services |
---|
408 | our $RECONNECT_TIMER = 3600 ; |
---|
409 | |
---|
410 | # A2PDB_PREFIX can be set if you need to install stats or/and status tables in |
---|
411 | # a database with conflicting table names |
---|
412 | our $A2PDB_TABLE_PREFIX = '' ; |
---|
413 | |
---|
414 | # Set maximum amount of values that can be cached in memory during DB usage |
---|
415 | our $MAX_CACHED_DB = 10000 ; |
---|
416 | # Set maximum lines to read by a2p-stat in each statistics file at each loop |
---|
417 | our $MAX_LINES = 100 ; |
---|
418 | |
---|
419 | # By default don't do DBA job by ourself |
---|
420 | our $DO_DB_OPTIMIZATION = 0 ; |
---|
421 | |
---|
422 | # STATSFILE_MAXAGE is only used by statistics service to delete statistics file |
---|
423 | # for which the age in DAYs is greater than this value |
---|
424 | our $STATSFILE_MAXAGE = 70 ; |
---|
425 | # Default value keeps at least 2 months of statistics files |
---|
426 | |
---|
427 | # STATUS_MAXAGE is used as peremption timer for status information in DBM files |
---|
428 | # By default it should be disabled, and only activated in a2p-status service |
---|
429 | # Only DONE status can be deleted automatically as it is redondant |
---|
430 | # with statistics informations. Unit is milli-second. |
---|
431 | our $STATUS_MAXAGE = 3600000 ; # Clean after one hour |
---|
432 | # But we are checking Progname later below and set it to 1h on *-status name |
---|
433 | our $STATUS_CACHE_MAXAGE = 60000 ; # 1 minute |
---|
434 | # Default value keeps 1 hour of status |
---|
435 | # MAX_CACHED_STATUS set the max number of status we can keep in cache. If this |
---|
436 | # maximum is reached, the older DONE status will be released |
---|
437 | our $MAX_CACHED_STATUS = 1000 ; |
---|
438 | # STATUS_DB_MAXAGE represents the max time to keep a status in jobs_status table |
---|
439 | our $STATUS_DB_MAXAGE = 24 ; # Time in hours |
---|
440 | |
---|
441 | # A boolean to enable/disable the AFPDS splitting code |
---|
442 | our $ENABLE_SPLITTER = 1 ; |
---|
443 | # A number of jobs on which use an auto-split |
---|
444 | our $AUTO_SPLIT_MAX = 100 ; |
---|
445 | |
---|
446 | # A value to force a2p to quit when this number of jobs has been processed |
---|
447 | our $JOBS_COUNTDOWN = 0 ; |
---|
448 | |
---|
449 | # STATS_COMMIT_SKIP is only used by statistics to skip some commit, when loading |
---|
450 | # statistics files to get better performance |
---|
451 | our $STATS_COMMIT_SKIP = 100 ; |
---|
452 | # But commit will be forced if none has been done since 10 seconds |
---|
453 | |
---|
454 | # GIFTOPCL is the command chain to use for GIF to PCL conversion |
---|
455 | # The first %d will be replaced by the width of the image to scale to |
---|
456 | # The second %d will be replaced by the resolution to be used for PCL format |
---|
457 | our $GIFTOPCL = 'giftopnm | pnmscalefixed -width=%d | ppmtopgm ' . |
---|
458 | '| pgmtopbm -d8 | pbmtolj -resolution %d -packbits -float -noreset' ; |
---|
459 | # Dont't use delta compression with pbmtolj as the result is wrong with texts |
---|
460 | |
---|
461 | # PNGCOMPRESSION could be from 0 for no compression to 9 for maximum compression |
---|
462 | # of included PNG resources in PDF generated files |
---|
463 | our $PNGCOMPRESSION = 9 ; |
---|
464 | |
---|
465 | # PCL_RESOLUTION is the default resolution to use for PCL resource conversion |
---|
466 | our $PCL_RESOLUTION = 600 ; |
---|
467 | |
---|
468 | # LOCKID is just an identifier to be able to run the service on the same spool |
---|
469 | our $LOCKID = &get_default_lockid() ; |
---|
470 | |
---|
471 | sub get_default_lockid { |
---|
472 | my $lockid = "a2p-service" ; |
---|
473 | if ( -e '/proc/sys/kernel/hostname' and ! $SERVICE ) { |
---|
474 | open *HOSTNAME , '<', "/proc/sys/kernel/hostname" |
---|
475 | or die "Can't read hostname from kernel: $!"; |
---|
476 | $lockid = <HOSTNAME> ; |
---|
477 | close HOSTNAME ; |
---|
478 | } else { |
---|
479 | $lockid = $SERVICE ? $ENV{'LOCKID'} : qx/hostname -s/ ; |
---|
480 | } |
---|
481 | chomp $lockid ; |
---|
482 | $lockid = $1 if ( $lockid =~ /^([^.]+)/ ); |
---|
483 | $lockid = uc( $lockid ); |
---|
484 | return $lockid ; |
---|
485 | } |
---|
486 | |
---|
487 | our $MUSTQUIT = 0 ; # Shared flagged to stop immediatly |
---|
488 | |
---|
489 | # Should we use \special command specific to dvipcl5 instead of |
---|
490 | # Integrating files containing PCL5 commands |
---|
491 | our $USE_PCLCMD = 1 ; |
---|
492 | |
---|
493 | ################################################################################ |
---|
494 | ## Optimized shared constants ## |
---|
495 | ################################################################################ |
---|
496 | # These common constants are arbitrary values |
---|
497 | sub QUIT () { 0xEFEF }; # Constant passed in request queues |
---|
498 | sub PING () { 0x0FF0 }; # Constant passed to ping a thread |
---|
499 | sub _INIT () { 0xF000 }; # Constant passed to update thread env |
---|
500 | sub _UPDATE () { 0xF001 }; # Constant passed to directly update shared var |
---|
501 | sub TODO () { 0x8888 }; # Constant passed to ask job to a thread |
---|
502 | sub DONE () { 0xFFF0 }; # Constant to say job is done |
---|
503 | sub NOMOREFILE () { 99 }; # Constant to say when no file are found in spool |
---|
504 | |
---|
505 | our %means = ( |
---|
506 | QUIT , "QUIT", |
---|
507 | PING , "PING", |
---|
508 | _INIT , "INIT", |
---|
509 | _UPDATE , "Direct UPDATE", |
---|
510 | TODO , "TODO", |
---|
511 | DONE , "DONE", |
---|
512 | NOMOREFILE , "NO MORE FILE" |
---|
513 | ); |
---|
514 | |
---|
515 | # Regex used in SpoolManager and Converter to compute AFPNAME |
---|
516 | our $AFPNAME_REGEX = |
---|
517 | qr/(?i:LINUX\.|TEMP\.)*([-0-9a-zA-Z_.]+)(?i:\.afp|\.afpds)?$/ ; |
---|
518 | |
---|
519 | ################################################################################ |
---|
520 | ## System shared values ## |
---|
521 | ################################################################################ |
---|
522 | # Prepare process short name, extracting basename without extension |
---|
523 | our $Progname ; |
---|
524 | if (!defined($Progname)) { |
---|
525 | ( $Progname ) = $ARGV[0] =~ m|.*/([^/.]+)(\.[^/.]+)?$| |
---|
526 | if (defined($ARGV[0])); |
---|
527 | ( $Progname ) = $0 =~ m|.*/([^/.]+)(\.[^/.]+)?$| |
---|
528 | unless (defined($Progname)); |
---|
529 | $Progname = "a2p" unless (defined($Progname)); |
---|
530 | } |
---|
531 | |
---|
532 | die "Can't starting process without Progname defined" |
---|
533 | unless (defined($Progname)); |
---|
534 | |
---|
535 | our $maintid = 0 ; |
---|
536 | our $do_file = 0 ; |
---|
537 | our %STATS = () ; |
---|
538 | our @AbortTime = () ; |
---|
539 | |
---|
540 | sub DOWNSTAT { |
---|
541 | my $what = shift ; |
---|
542 | my $down = @_ ? shift : 1 ; |
---|
543 | unless (defined($STATS{$what})) { $STATS{$what} = 0 } |
---|
544 | $STATS{$what} -= $down ; |
---|
545 | } |
---|
546 | |
---|
547 | sub UPSTAT { |
---|
548 | my $what = shift ; |
---|
549 | my $plus = @_ ? shift : 1 ; |
---|
550 | unless (defined($STATS{$what})) { $STATS{$what} = 0 } |
---|
551 | $STATS{$what} += $plus ; |
---|
552 | } |
---|
553 | |
---|
554 | my %chrono = () ; |
---|
555 | sub TIMESTAT { |
---|
556 | my @timing = &gettimeofday() ; |
---|
557 | my $what = 'TIMING-' . $_[0] ; |
---|
558 | if (defined($chrono{$what}) and @{$chrono{$what}}) { |
---|
559 | &MAXSTAT($what,( $timing[0] - ${$chrono{$what}}[0] ) * 1_000_000 |
---|
560 | + ( $timing[1] - ${$chrono{$what}}[1] )); |
---|
561 | $chrono{$what} = [] ; |
---|
562 | |
---|
563 | } else { |
---|
564 | $chrono{$what} = [ @timing ] ; |
---|
565 | } |
---|
566 | } |
---|
567 | |
---|
568 | sub MAXSTAT { |
---|
569 | my $max = $_[0] . '-MAX' ; |
---|
570 | $STATS{(!defined($STATS{$max}) or $_[1] > $STATS{$max}) ? $max : $_[0]} |
---|
571 | = $_[1] ; |
---|
572 | } |
---|
573 | |
---|
574 | sub MAXMINSTAT { |
---|
575 | my $min = $_[0] . '-MIN' ; |
---|
576 | $STATS{(!defined($STATS{$min}) or ! $STATS{$min} |
---|
577 | or ( $_[1] and $_[1] < $STATS{$min})) ? $min : $_[0]} = $_[1] |
---|
578 | if (&MAXSTAT(@_) == $_[1]); |
---|
579 | } |
---|
580 | |
---|
581 | # Update LOGFILENAME default |
---|
582 | $LOGFILENAME = $SHMDIR . '/' . $Progname . '.log' unless $LOGFILENAME ; |
---|
583 | |
---|
584 | our $LISTENER = $SERVICE_TMP . '/' . $Progname . '-listener' ; |
---|
585 | |
---|
586 | # This authorizes to get thread compilation errors when debugging |
---|
587 | our $StdoutFile = "/var/run/$Progname.debug" ; |
---|
588 | # But it should be really set to /dev/null for a service |
---|
589 | $StdoutFile = "/dev/null" if ( ! -e $StdoutFile ); |
---|
590 | |
---|
591 | # A2P_SYS_CONF has its defaults should come from a2p.sh script |
---|
592 | our $A2P_SYS_CONF = defined($ENV{'A2P_SYS_CONF'}) ? |
---|
593 | $ENV{'A2P_SYS_CONF'} : "/etc/afp2print/afpds2tex.conf" ; |
---|
594 | |
---|
595 | if ($SERVICE) { |
---|
596 | # Initialize Init module |
---|
597 | &Init( "$A2P_SYS_CONF" , "/etc/afp2print/" . $Progname . ".conf" ); |
---|
598 | |
---|
599 | my @FIRSTENV = &Init( map { $_ => eval $_ } @SHARED ); |
---|
600 | |
---|
601 | # Now we can evaluate our %ENV |
---|
602 | map { eval $_ } @FIRSTENV ; |
---|
603 | |
---|
604 | my $debugenv = 0 ; # Set to one to got ENV debugging while updating conf |
---|
605 | sub UpdateSharedEnv { |
---|
606 | # Compute shared variable |
---|
607 | map { |
---|
608 | my ( $key ) = $_ =~ /^[\$](.*)$/ ; |
---|
609 | if ($key and defined($ENV{$key})) { |
---|
610 | my $quote = $ENV{$key} =~ /^\d+$/ ? "\"\"" : "\"'\"" ; |
---|
611 | eval "$_ = \$ENV{$key}" ; |
---|
612 | } |
---|
613 | } @SHARED ; |
---|
614 | |
---|
615 | # Update some other ENV |
---|
616 | $ENV{TEXMFOUTPUT} = $SHMDIR if ( defined($SHMDIR) and -d $SHMDIR ); |
---|
617 | |
---|
618 | # Debug env if needed |
---|
619 | if ($debugenv) { |
---|
620 | my %HASH = %ENV ; |
---|
621 | $debugenv ++ while ( -e "/tmp/$Progname-ENV-$debugenv" ); |
---|
622 | open( *LOG, '>', "/tmp/$Progname-ENV-$debugenv" ) |
---|
623 | or return ; |
---|
624 | map { |
---|
625 | my ( $key ) = $_ =~ /^[\$](.*)$/ ; |
---|
626 | print LOG scalar(localtime), ", $0: $_ => ", |
---|
627 | defined($ENV{$key}) ? "ENV='$ENV{$key}'" : "ENV=undef", |
---|
628 | " vs '", eval $_ , "'\n" ; |
---|
629 | delete $HASH{$key}; |
---|
630 | } @SHARED ; |
---|
631 | map { |
---|
632 | print LOG scalar(localtime), ", $0: ENV $_ = $ENV{$_}\n" |
---|
633 | } keys( %HASH ); |
---|
634 | map { |
---|
635 | print LOG scalar(localtime), ", $0: FIRSTENV => $_ \n" |
---|
636 | } @FIRSTENV ; |
---|
637 | close(LOG); |
---|
638 | } |
---|
639 | } |
---|
640 | |
---|
641 | &UpdateSharedEnv ; |
---|
642 | } |
---|
643 | |
---|
644 | 1; |
---|