source: A2P/a2p/A2P/Globals.pm @ 3

Last change on this file since 3 was 3, checked in by guillaume, 17 years ago
  • AUTHORS: Ajout des différents contributeurs
  • COPYING: Ajout de la licence GPL v3
  • a2p: Préparation des sources pour leur publication sous GPL
  • Property svn:keywords set to Id
File size: 25.9 KB
Line 
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 guillaume $
21#
22
23package A2P::Globals ;
24
25use strict ;
26use Time::HiRes qw( gettimeofday ) ;
27use A2P::Init ;
28
29BEGIN {
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}
92our @SHARED ;
93our $SYSLOG ;
94our $SERVICE;
95
96# Defaults only used in bash scripts
97our $AFP2PRINT_USER = 'afp2print' ;
98our $PERL           = '/usr/bin/perl' ;
99our $NICE           = 'nice --5' ;
100our $SERVICE_PROG   = '$AFP2PRINT_PATH/a2p.pl' ;
101our $PRINTLIB_PATH  = '$AFP2PRINT_PATH/printlib' ;
102our $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
115sub 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
119our $LOGFILE_VS_SYSLOG    = 0 ;
120our $LOGFILE_PURGE        = 0 ;
121our $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)
125our $NO_SYSLOG_DEBUG      = 0 ;
126
127# SERVICE_DEBUG can be disabled to avoid debugging when service is shutting down
128our $SERVICE_DEBUG        = 1 ;
129
130# SYSLOG_PATH is the standard socket where to send syslog message to system
131our $SYSLOG_PATH          = "/dev/log" ; # Unix dfault
132our $STDOUT_DEBUG         = 0 ; # Send debug to standard console output if set
133our $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
136our $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.
140our $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
144our $JOB_DUMP_ON_ERROR    = 1 ; # By default make a job dump in the error mail
145our $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
149our $MAX_BACKLOG          = 10 ;
150
151# TeX info insertion enabled mostly for PDF Title and Creator
152our $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
156our $ADDPCL_JOBNAME       = 0 ;
157our $ADDPCL_USERNAME      = 0 ;
158
159# TeX debugging for TeX validation only
160our $ADDTEX_DEBUG         = 0 ; # Set alone, it outputs font names in TeX output
161# ADDTEX_DEBUG must be true to use these following
162our $TEX_PAGEDEF_DEBUG    = 0 ; # Show PAGEDEF frame and page off-set used
163our $TEX_OVERLAY_DEBUG    = 0 ; # Show OVERLAY frames and page off-set used
164our $TEX_SEGMENT_DEBUG    = 0 ; # Show SEGMENT frames and page off-set used
165our $TEX_SHOW_SEGMENT     = 1 ; # Remove SEGMENT
166
167# Do we should start a logger thread
168our $START_LOGGER         = 1 ;
169
170# KEEP_STATS actives conversion statistics if set to 1
171our $KEEP_STATS           = 1 ;
172our $STATS_FOLDER         = "/apps/afp2print/stats" ;
173
174# KEEP_JOBSTATUS can be set to 0 to disable keeping job status
175our $KEEP_JOBSTATUS       = 1 ;
176
177# This is the max number of com to manage in one loop
178our $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
181our $COM_LOCKING          = 0 ; # Not useful with new comm scheme
182our $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
187our $NODEBUG_MOD_LIST     = "" ;
188our $NODEBUG_SUB_LIST     = "" ;
189
190# DO_PINGPONG is to be greater than 0 to ping threads periodictly
191our $DO_PING              = 1 ;
192
193# AFPSPOOL is the spool directory where AFPDS file will be expected
194our $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.
198our $SCAN_SPOOL           = 1 ;
199# SPOOL_TIMER is the number of seconds between 2 checks in spool when idle
200our $SPOOL_TIMER          = 5 ;
201# SPOOL_PREFIX is to tune de prefix selection in the spool (NOT case sensitive)
202our $SPOOL_PREFIX         = "TRANS ARCHI" ;
203# WAIT_ON_PREFIX could be set to activate the wait on prefix locking
204our $WAIT_ON_PREFIX       = 0 ;
205
206# USLEEP is the time in microsecond to sleep in thread loops
207our $USLEEP               = 50000 ;
208# DYNAMIC_USLEEP set USLEEP to dynamic mode
209our $DYNAMIC_USLEEP       = 1 ;
210our $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
214our $CLEAN_OPTIMIZATION   = 1 ;
215
216# This is the default project path installation
217our $AFP2PRINT_PATH       = '/apps/afp2print' ;
218
219# SHMDIR default to "/dev/shm" to optimize throughput as be done in memory
220our $SHMDIR               = '/dev/shm' ;
221
222# SERVICE_TMP is the path where to use temporary files
223our $SERVICE_TMP          = '/tmp/.a2p' ;
224
225# ERRORSPOOL is the spool directory where failed conversion files will be moved
226our $ERRORSPOOL           = '/apps/afp2print/spool/error' ;
227
228# DONESPOOL is the spool directory where done conversion files will be moved
229our $DONESPOOL            = '/apps/afp2print/spool/done' ;
230
231# LOGOPATH must point to the segment library
232our $LOGOPATH             = '/apps/afp2print/printlib/seglib' ;
233
234# MAXTASK is set to the number of concurrent conversion to process
235our $MAXTASK              = 1 ;
236
237# MAXJOBS is set to the maximum AFP jobs we can process at a time
238our $MAXJOBS              = 1 ;
239
240# MAXCONNECTIONS is the maximum concurrent connections that we be accepted by
241# any Listener
242our $MAXCONNECTIONS       = 10 ;
243
244# By default Listener won't listen on TCP/IP socket
245our $USE_TCPIP_SOCKET     = 0 ;
246our $USE_TCPIP_PORT       = 6400 ;
247# By default TCP/IP server will listen only on the localhost (127.0.0.1)
248our $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
251our $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
262our $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
274our $BACKEND_FACTOR       = 3 ;
275# Maximum number of retries when command fails
276our $BACKEND_RETRY        = 10 ;
277# Maximum number of seconds when command fails to really set the command failed
278our $BACKEND_RETRYTIMEOUT = 30 ;
279
280# DESTIDFILE is the configuration file for print configuration
281our $DESTIDFILE           = '/etc/afp2print/destid.conf' ;
282
283# DOCSFILE is the configuration file for print correction by document
284our $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
291our $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
295our $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
299our $DONT_PRINT           = 0 ;
300our $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
304our $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
309our $PARALLELE_VALIDATION = 0 ;
310
311# the dvilj variant to run taken from dvihp script
312our $DVILJ                = 'dvipcl5' ;
313
314# the zip option environment for optimizing compression
315our $ZIPOPTIONS           = 'DjJqXm' ;
316our $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)
319our $COMPRESSFILES        = 0 ;
320
321# PURGEFILES is set to 1 when we don't need to keep any file after processing
322our $PURGEFILES           = 0 ;
323
324# MINFOLDERCOUNT is the minimum spool file number under which we will repopulate
325# the spool file cache
326our $MINFOLDERCOUNT       = 10 ;
327# MAXFOLDERCOUNT is the maximum spool files to keep in our known file cache
328our $MAXFOLDERCOUNT       = 100 ;
329# MAXRETRYTIMER is the time in ms to keep a cached available file
330# in memory before retrying to lock it
331our $MAXRETRYTIMER        = 500 ;
332
333# CONV_STATUS_TIMING is the time in second after which a status conversion must
334# be provided to inform clients
335our $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
340our $KEEP_AFPJOB          = 1 ;
341
342# Mailing variables for alerts and errors
343our $MAIL_BIN             = "/usr/lib/sendmail" ;
344# ALERT_MAILS will receive a short mail with only job in ABTERM in the subject
345our $ALERT_MAILS          = "" ;
346# ERROR_MAILS will receive a mail with knowns errors in the body
347our $ERROR_MAILS          = "" ;
348
349# CLient time-out is the max time we can expect for a response from listener
350our $CLIENT_TIMEOUT       = 300 ;
351
352# Some variable used for archivage processing
353our $ARCH_REMHOST_TEST    = '127.0.0.1' ;
354our $ARCH_REMPORT_TEST    = 2222 ;
355our $ARCH_REMHOST_TLOG    = '127.0.0.1' ;
356our $ARCH_REMPORT_TLOG    = 2222 ;
357our $ARCH_REMHOST_PROD    = '127.0.0.1' ;
358our $ARCH_REMPORT_PROD    = 2222 ;
359our $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)
366our $ARCH_ENABLED         = 2 ;
367# ARCH_SCENARIO: 1 = separate binary file, 3 = xml embedded
368our $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
372our $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)
379our $ESERVICE_CONF        = '/etc/afp2print/e-service.conf' ;
380
381# By default client request sockets are closed when processed
382our $CLOSE_CONNECTIONS    = 1 ;
383
384# CONVERT_CONTENT_FILE must be true to convert RC201-RC202 content from EBCDIC
385our $CONVERT_CONTENT_FILE = 1 ;
386
387# DO_CONVERT is set or not to activate AFP conversion with from_to perl API
388our $DO_CONVERT           = 1 ;
389# The following defines which encoding to use with from_to perl API
390our $FROM_CONVERT         = 'cp1047' ;
391our $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
395our $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.
400our $ONLY_DO_PDF          = 0 ;
401
402# DBI variables with default connection on local mysql serveur and db a2p
403our $DBI_DSN              = 'DBI:mysql:database=a2p;host=localhost;port=3306' ;
404our $DBI_USER             = '' ; # Set to Progname (a2p-stat,...) if not set
405our $DBI_PASSWD           = '' ; # Connection should failed if not configured
406
407# Time to force reconnection to DB for a2p-stat and a2p-status services
408our $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
412our $A2PDB_TABLE_PREFIX   = '' ;
413
414# Set maximum amount of values that can be cached in memory during DB usage
415our $MAX_CACHED_DB        = 10000 ;
416# Set maximum lines to read by a2p-stat in each statistics file at each loop
417our $MAX_LINES            = 100 ;
418
419# By default don't do DBA job by ourself
420our $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
424our $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.
431our $STATUS_MAXAGE        = 3600000 ; # Clean after one hour
432# But we are checking Progname later below and set it to 1h on *-status name
433our $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
437our $MAX_CACHED_STATUS    = 1000 ;
438# STATUS_DB_MAXAGE represents the max time to keep a status in jobs_status table
439our $STATUS_DB_MAXAGE     = 24 ; # Time in hours
440
441# A boolean to enable/disable the AFPDS splitting code
442our $ENABLE_SPLITTER      = 1 ;
443# A number of jobs on which use an auto-split
444our $AUTO_SPLIT_MAX       = 100 ;
445
446# A value to force a2p to quit when this number of jobs has been processed
447our $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
451our $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
457our $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
463our $PNGCOMPRESSION       = 9 ;
464
465# PCL_RESOLUTION is the default resolution to use for PCL resource conversion
466our $PCL_RESOLUTION       = 600 ;
467
468# LOCKID is just an identifier to be able to run the service on the same spool
469our $LOCKID               = &get_default_lockid() ;
470
471sub 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
487our $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
491our $USE_PCLCMD           = 1 ;
492
493################################################################################
494##                      Optimized shared constants                            ##
495################################################################################
496# These common constants are arbitrary values
497sub QUIT       () { 0xEFEF }; # Constant passed in request queues
498sub PING       () { 0x0FF0 }; # Constant passed to ping a thread
499sub _INIT      () { 0xF000 }; # Constant passed to update thread env
500sub _UPDATE    () { 0xF001 }; # Constant passed to directly update shared var
501sub TODO       () { 0x8888 }; # Constant passed to ask job to a thread
502sub DONE       () { 0xFFF0 }; # Constant to say job is done
503sub NOMOREFILE () {   99   }; # Constant to say when no file are found in spool
504
505our %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
516our $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
523our $Progname ;
524if (!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
532die "Can't starting process without Progname defined"
533    unless (defined($Progname));
534
535our $maintid = 0 ;
536our $do_file = 0 ;
537our %STATS  = () ;
538our @AbortTime = () ;
539
540sub DOWNSTAT {
541    my $what = shift ;
542    my $down = @_ ? shift : 1 ;
543    unless (defined($STATS{$what})) { $STATS{$what} = 0 }
544    $STATS{$what} -= $down ;
545}
546
547sub UPSTAT {
548    my $what = shift ;
549    my $plus = @_ ? shift : 1 ;
550    unless (defined($STATS{$what})) { $STATS{$what} = 0 }
551    $STATS{$what} += $plus ;
552}
553
554my %chrono = () ;
555sub 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
568sub MAXSTAT {
569    my $max = $_[0] . '-MAX' ;
570    $STATS{(!defined($STATS{$max}) or $_[1] > $STATS{$max}) ? $max : $_[0]}
571        = $_[1] ;
572}
573
574sub 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
584our $LISTENER = $SERVICE_TMP . '/' . $Progname . '-listener' ;
585
586# This authorizes to get thread compilation errors when debugging
587our $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
592our $A2P_SYS_CONF = defined($ENV{'A2P_SYS_CONF'}) ?
593    $ENV{'A2P_SYS_CONF'} : "/etc/afp2print/afpds2tex.conf" ;
594
595if ($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
6441;
Note: See TracBrowser for help on using the repository browser.