Appendix B

Installation instructions

Server software requirements

CallWeb needs the following to be installed on the server:

  • Perl 5 (including the following modules: CGI, CGI::Carp, DB_File, DBI, Fcntl, File::Compare, File::Copy, File::Path, FileHandle, IO::Socket, locale, LWP::Simple, Net::FTP, Net::Telnet, POSIX, Time::HiRes, Time::Local, SOAP::Lite 1.08, Encode)
  • MySQL 4 or better
  • Berkeley DB
  • a Web server (tested with Apache 2 with mod_unique_id enabled)
  • Sendmail
  • (for dialer and robot operations) Asterisk, version 1.2 or better (and the Asterisk::AGI Perl module)

Questionnaire designer client station

The following software has proven very valuable in editing CallWeb .scw files:

  • TextPad is an extraordinary pure-text editor which offers a whealth of functions. In particular, it supports syntax highlighting which makes CallWeb .scw files much more readable. A TextPad syntax highlighting file is available for CallWeb. Alternatively, some like Notepad++ for which CallWeb has a basic syntax highlighting file as well.
  • KeyText is a fabulous keyboard and hot key mapper. For example, one can paste an entire CallWeb question definition by simply pressing a predetermined combination of keys.
  • the free RGBtoHEX provides an easy way to select colours and identify the corresponding hex code.
  • the free Pixie is a colour picker: point to a colour on screen and Pixie tells you the hex, RGB, HTML, CMYK and HSV values of that colour (the hex value can be copied to the paste buffer using a keycoard key combination). ColorZilla, a free Firefox extension implements a similar function, but it is available only within Firefox.
  • there are hundreds of useful Web applications. For example, http://gradcolor.com/ creates a gradient which is very useful to find different intensities of a given coulour (do this by requesting a gradient from that colour to white).

File locations

DirectoryContentNotesPermission
{master}Main access directorymandatory: callweb.cgi, cwroutine.pl
optional: cwx.cgi cwjscripts.js, cwAST.pl
read, execute (world)
{master}/grSystem graphic filesmandatory: collection of .gif files
optional: style.css (when no style.css exists in the project directory)
read, execute (world)
{master}/cw... (i.e., name starting with "cw" or "cw" only)Everything project-relatedmandatory: *.scw, *.qcw
optional: style.css (for all projects located in the same directory; the # Stylesheet instruction can specify a stylesheet for a particular project), navigation images, all files referenced by questionnaires in that directory (linked by cw.../file.xxx in the .scw file), project configuration file (named projectSOMETHING.conf)
 
Notes
(1) all directories named cw* are considered project directories
(2) .scw (raw questionnaire) files must be located in their respective cw directory for compilation purposes; once compiled, they may be deleted or moved
(3) several projects may cohabitate in the same cw* directory; they then share the style.css file
(4) prepopulation files (e.g., pop.tab) must be located in the directory of the project to which they contribute
read, write, execute (world)
{master}/{any name}CallWeb utilitiesoptional according to circumstances: cw.cgi, cwappels.pl, cwarchive.cgi, cwarchive.pl, cwautoemail.pl, cwbounces.pl, cwcheck.cgi, cwcompare.cgi, cwcompile.cgi, cwdestruction.cgi, cwdossier.cgi, cwedit.cgi, cwemail.cgi, cwextr.cgi, cwfreq.cgi, cwgen.cgi, cwnav.cgi, cwpermissions.pl, cwprepop.cgi, cwquestionnaire.cgi, cwstats.cgi, cwstats.pl, cwtelkeys.cgi, cwtrack.pl, cwupdate.cgi, cwupdate.pl
for CATI installations: cwcodescati.cgi, cwgroupes.cgi, cwoutcomes.cgi, cwphone.cgi, cwphone.pl, cwprod.cgi, cwsuper.cgi, cwsuperimp.cgi, cwsuperpro.cgi, cwsuperpro.pl, cwdial.pl
for robot installations: cwrobot.pl (see complete robot installation instructions)
optional: style.css (controls the appearance of utilities, unless a project-related style.css (or other file) exists)
read, execute (world)
{master}/{any name}CallWeb CATI interviewer utilitiesmandatory for CATI installations: int1acces.cgi, int2select.cgi, int3travail.cgiread, execute (world)
{master}/etcSystem configuration filemandatory: the name must start with "usager" and end with ".conf" as in usager__531vh.confowner: apache
read, write (owner)
{master}/calCalendar filesoptional but mandatory to get pop-up calendarsread, execute (world)
/opt/callwebCallWeb daemon programmandatory for the daemon mode: callwebd.plread, execute (root)
/etcCallWeb daemon program configuration filemandatory for the daemon mode: callweb.confread, write (root)
/var/spool/callwebCallWeb daemon program spool directorymandatory for the daemon mode: directory where the CallWeb daemon reads and writes request and response filesread, write (world)
/etc/rc.d/init.dCallWeb daemon control programmandatory for the daemon mode: callwebdread, write (world)

System configuration file

The system configuration file and the project configuration files may contain several parameters controlling the in-depth behaviour of CallWeb and its default appearance. Some parameters must be supplied in one file or the other. Mandatory parameters are (parameters are case-sensitive):

client=(prefix used in naming MySQL data bases for this installation; do not include periods)
hote=(MySQL host, typically "localhost" but it could be the IP address of a distant MySQL server)
usager=(MySQL user name)
usager_defaced=(MySQL user name encrypted using cwperm.cgi; takes precedence over the usager parameter)
motdepasse=(MySQL user password)
motdepasse_defaced=(MySQL user password encrypted using cwperm.cgi; takes precedence over the motdepasse parameter)
driver=(Perl data base engine driver, typically "mysql")

The following are mandatory in CATI mode:

local_area_codes=(in CATI mode only, comma-delimited list of area codes not requiring a long distance call)
long_distance_exchanges_in_local_area_codes=(in CATI mode only, comma-delimited list of area+exchange codes requiring a long distance call within an otherwise local zone)
server_gmtoffset=offset hours to GMT (negative west of Greenwich)
gmtnnn=GMT offset hours for the area code nnn; negative west of Greenwich; there is one such line for each area code
gmtnnnxxx=GMT offset hours for exchange xxx in area code nnn; negative west of Greenwich; these are exceptions to the area code rules

The following are mandatory to connect an Asterisk server to CallWeb:

asterisk_ip=local network IP address of the Asterisk server
asterisk_ip_ecoute=local network IP address of the Asterisk server for supervising stations (asterisk_ip is used if asterisk_ip_ecoute does not exist)
asterisk_external_ip=external IP address of the Asterisk server (could be the same as asterisk_ip if the CATI server is on the same local network as the Asterisk server)
asterisk_telnetport=Telnet port on the Asterisk server (usually 5038)
asterisk_telnetuser=Telnet user on the Asterisk server (to communicate with Asterisk)
asterisk_telnetpw=Telnet user password on the Asterisk server (to communicate with Asterisk)
asterisk_cati_callerid=telephone number used for call display in CATI context
asterisk_cati_callerid_text=name used for call display in CATI context
asterisk_mysqlcdr=name of the MySQL data base where Asterisk stores the cdr table (usually asteriskcdrdb)
asterisk_mysqluser=mysql user on the Asterisk server (must be accessible from the CallWeb server)
asterisk_mysqlpw=mysql user password on the Asterisk server (must be accessible from the CallWeb server)
asterisk_sqlengine=SQL engine used on the Asterisk server (usually mysql)
longdistance_cost_per_minute=cost per minute of long distance calling
longdistance_minimum_seconds=minimum chargeable length (seconds) of a long distance call
longdistance_increment_seconds=increment (seconds) used to calculate long distance charges

The following are mandatory in robot mode:

pris_locaux=comma-delimited list of PRI lines which can dial local and long distance numbers (e.g., "pris_locaux = 1, 2" defines dialling lines 1 to 23 and 24 to 45)
pris_interurbains=comma-delimited list of PRI lines which can dial only long distance numbers (e.g., "pris_interurbains = 3" defines dialling lines 46 to 71)
asterisk_ivr_callerid=telephone number used for call display in robot context
asterisk_ivr_callerid_text=text used for call display in robot context
asterisk_mysqluser=mysql user on the Asterisk server (must be accessible from the robot server)
asterisk_mysqlpw=mysql user password on the Asterisk server (must be accessible from the robot server)
asterisk_sqlengine=SQL engine used on the Asterisk server (usually mysql)
cati_ip_for_robot=external IP address of the robot server (the Asterisk server needs to verify the number of interviewers logged in)
cati_user_for_robot=MySQL user for CallWeb on the robot server
cati_pw_for_robot=MySQL user password for CallWeb on the robot server
cati_clientdb_for_robot="client" parameter used by the robot on the robot server (see the client parameter above)
external_transfer_string=string used by Asterisk to send robot calls on a SIP trunk
siptrunk_prefix=string used by Asterisk to identify robot calls to be sent to a SIP trunk
number_of_SIP_channels=integer indicating how many SIP trunk channels the robot has access to

The following are mandatory in connecting CallWeb to a predictive dialer:

dialer_dbhote=IP address of the dialer data base host
dialer_dbusager=user name on the dialer data base
dialer_dbmotdepasse=password on the dialer data base
dialer_dbdriver=data base engine used by the dialer data base (e.g., mysql)
dialer_dbname=name of the dialer data base on the data base host
dialer_result_table=name of the table where call results are stored in the dialer data base
dialer_softphone_port=interviewer softphone port (the softphone is used to communicate some information to the dialer
dialer_server=IP address of the dialer host
dialer_server_port=port used by the dialer host
dialer_wait_for_human=number of seconds that CallWeb will wait for the dialer to supply a human call before giving up (default = 60)

In a project-specific configuration file, if the MySQL host is redefined, the following entry is mandatory:

projet=(name of the CallWeb project to which the configuration file belongs)

Any pound instruction can be inserted in the system configuration file. All such pound instructions found in the system configuration file are inserted at the beginning of all questionnaires upon compilation. This means two things:

  • that system-wide defaults can be defined for any of the pound instructions, such as defining a default read access password for all projects with "# cwNav read password = some_password";
  • that such system default values can be overwritten inside any questionnaire by adding the same instruction (with other parameters) in the .scw file.

In addition, optional configuration parameters include (parameters are case-sensitive):

administrator_email=(e-mail address of the CallWeb system administrator)
notify_after=(number of days of data base inactivity that triggers an e-mail reminder; the default is 14)
notify_every=(number of days between notifications of inactive projects as defined by notify_after; the default is 1)
maximum_undo_versions=(number of update versions to keep available for undo; the default is 5)
serveurftp=(name/address of the FTP server offering system updates and upgrades)
proxyftp=(name/address of the proxy server through which FTP has to connect; add ":port" if the proxy does not use the default FTP port)
usagerftp =(user name on serveurftp)
motdepasseftp =(password for usagerftp)
engine=(MyISAM or InnoDB)
use_telkey_table=(yes or no; determines whether a table of reserved _telkeys is used for open projects (preferable); requires mod_unique_id in Apache; default "no")
nom_de_ce_serveur=(name of the server; used in # Only for server and # Master compilation server instructions)
repertoire_utilitaire_maitre=(name of the master utility directory)
repertoire_cati_maitre=(name of the master directory for CATI scripts)
nom_installation=(name of the installation reflected in the utility banner)
langue=(2-letter code for the default language)
update_daemon=(0 or 1 according to whether the daemon files must be updated with cwupdate. Place in only one CallWeb instance on a given server.)
cwextr_types=(default extraction file types presented as a comma-delimited list among the following: csv, dat, tcw, opn, sps, sas, rcode, asc, sss, scw)
cwextr_email=(e-mail address to select as the default extraction destination)
csv_delimiter=(single character used as a delimiter in extracted csv files)

champs_par_csv
=(default number of fields in an extracted csv file)
test_email_address_hostname=(domain name used by the test_email_address function to build the FROM parameter (should be a subdomain like mail.callweb.ca). Uses $ENV{HTTP_HOST} or $ENV{HOSTNAME} otherwise.)
url_principal=(URL used by cwautoemail.pl to call cwemail.cgi; must be a fully qualified URL ending with a slash such as http://domain.com/utilities/)
max_var_label_length=(default maximum length of variable labels extracted to other software code; default = 60)
max_value_label_length=(default maximum length of category labels extracted to other software code; default = 40)
max_spss_alpha_field=(maximum number of characters read off alphanumaric fields in SPSS; default = 254)
default_cwtelkeys_pattern=_telkey pattern proposed by default by cwtelkeys
_M_COULEURCELLULES=(# colour code; base cell colour for tables)
_M_COULEURCELLULES2=(# colour code; second cell colour for tables)
_M_COULEURTITRESCOLONNES=(# colour code; column header cell colour for tables)
_M_COULEURTITRESLIGNES=(# colour code; base line header cell colour for tables)
_M_COULEURTITRESLIGNES2=(# colour code; second line header cell colour for tables)
_M_COULEURBORDURES=(# colour code; border colour for tables)
_M_BORDURES=(number of pixels for table borders)
_M_ESPACEMENTINTERIEUR=(number of pixels for internal spacing of table cells)
_M_ALIGNEMENTTITRESCOLONNES=(T|B; vertical alignment of column header cells)
cati=(oui|non|ivr, whether the installation is CATI- or IVR-type by default)
couleur_commentaire_o=(# colour code; colour of the CATI result codes where interviewer comments are mandatory)
couleur_commentaire_f=(# colour code; colour of the CATI result codes where interviewer comments are optional)
couleur_commentaire_a=(# colour code; colour of the CATI result codes where interviewer comments are disallowed)
between_cati_buttons=(number of pixels to insert between CATI buttons presented to interviewers)
lignes_commentaires=(number of lines of the comment entry box for interviewers)
colonnes_commentaires=(number of columns of the comment entry box for interviewers)
size_of_stratum_selection_box_in_cwsuperpro=(number of lines for the multiple select drop-down list of strata in cwsuperpro; default 5)
default_for_cati_comment_carry_over=(yes|no whether the interviewer comment is carried over from call to call by default
delai_min_entre_appels=minimum number of seconds between two call results by a particular interviewer for a given case
allow_password_change_by_interviewers=yes | no (if yes, interviewers are given a chance to change their password upon login)
allow_sip_change_by_interviewers=yes | no (if yes, interviewers are given a chance to change their SIP extension upon login)
constrain_to_groups=yes | no (if yes, the free case selection option is not displayed to interviewers if groups exists in CATI mode)
allow_viewing_time=yes | no (if no, interviewers are not offered the option to view thier cumulated time in CATI mode)
interviewer_clock=12|24 (displays the apppointment clock as a 12- or 24-hour clock; 24 is the default)
allow_cross_project_search=yes | no (if no, interviewers are not offered the list of projects from which to search for a case in CATI mode)
interviewer_timer=yes | no (whether or not interviewers are shown a timer on the call management screen; the default is yes)
mpBASEtemps=password used in BASEtemps (mpBASEtemps is used in cwsuper to give supervisors access to interviewer time slips.)
productivity_index=MySQL expression returning an index of interviewer productivity. Used in cwprod.cgi. The default is ROUND((completes_first + 2*completes_norefusal + 5*completes_withrefusal - 3*refusals_first ) / duration,1).
repertoire_wav=absolute path to the server directory containing the project directories where .wav files of the interviews are stored
repertoire_html_wav=directory alias defined in the Apache configuration to permit building URLs to the .wav files even if they are outside the Web server directory structure
seconds_before_dialling=seconds (in CATI mode with an Asterisk dialler, length of the pause between the display of the call management screen and the automated dialling of the telephone number)
storeinBASEappels=yes | no (in CATI mode, if no, call results are not stored in real time in BASEappels and interviewers do not get a dynamic count of their results)
week_start=between 0 and 6: determines when the week starts in the calculation of the _week system variable; 0 for Sunday, 1 for Monday, etc.
comparative_results=yes|no (in CATI mode, controls the display of a summary of interviewer productivity to each interviewer)
command_prefix_for_record_wav=(some text) (prefix command used by the Apache user to start and stop recordings in face-to-face settings)
url_to_cwagent=(url) (full URL to the cwagent.cgi script to bridge agents from int2select.cgi to cwagent.cgi; should be in the usagerXXX.conf file of the CallWeb instance agents use to log in) (e.g., http://192.168.0.1/prod/interviewers/cwagent.cgi)
url_from_cwagent=(url) (full URL to the int2select.cgi script to bridge agents from cwagent.cgi back into int2select.cgi; should be in the usagerXXX.conf file of the CallWeb instance where cwagent.cgi runs, i.e. in the robot instance) (e.g., http://192.168.0.2/prod2/interviewers/int2select.cgi)
agent_languages=comma-delimited list of ISO language codes offered to the agents logging into cwagent.cgi
parms_to_copy_dump_file (OBSOLETE)=apache@server (where "server" is a distant MySQL server where the backup dump files will be written. This parameter serves to copy the dump file over to the administrative server and to delete it from the MySQL server. For this to work, ssh keys must have been exchanged for the Apache user [for compilation backups] and the root user [for automated backups])
control_by_other_server_possible=yes | no, set this to yes if it is possible that there will be CATI projects that are controlled by another server based on the # Master compilation server pound instruction
default_cwpermissions_directory_permissions=permission level assigned to project directories by cwpermission; it must be in octal representation; the default is 0777.
default_cwpermissions_file_permissions=permission level assigned to project files by cwpermission; it must be in octal representation; the default is 0666.
cwpermissions_deletes_from_cwdir=(case insensitive regular expression, minutes); the two options are separated by a comma; cwpermissions.pl deletes files that correspond to the regular expression pattern when they are older than the number of minutes stated in the second option; the regular expression is not tested — it is entirely the responsibility of the CallWeb manager.
exclude_from_cwcompile_backup=(case insensitive regular expression); defines a regular expression identifying files to NOT save in cwcompile zip backups.
hide_user_from_cwdocs_link=yes; if defined, this option hides the user code from the cwdocs link in cw.cgi.
check_login=yes | no, set to no, it deactivates the authentification system.
dialer_timeout_milliseconds=number of milliseconds after which the dialer considers a call ring-no-answer.
musiconhold=0|1, whether or not to use music-on-hold when transfering a batch-dialed extra call to an agent.
external_transfer_string=string used by Asterisk to compose SIP channel information for external audio monitoring; this is lifted from the relevant Asterisk context.
systemlog=level of logging to be performed in the instance. Valid values are: 0: Emergency (emerg); 1: Alerts (alert); 2: Critical (crit); 3: Errors (err); 4: Warnings (warn); 5: Notification (notice); 6: Information (info); 7: Debug (debug).
max_log_size=maximum size of the log file before rotation, expressed in megs.
service_command_path=path of the service command used in cwupdate.pl. Normally, this option is not necessary.
login_pw_valid_days=number of days after which a user must change their password to access CallWeb utility modules (none by default).
login_pw_allow_same=(yes|no) whether or not users are allowed to supply the same password when requested to change it.
login_pw_rules=tab-delimited list of regular expressions that must be adhered to in creating a new password.
login_pw_rules_message=text displayed to explain the password composition rules. Different linguistic versions may be defined by inserting [xx] codes using ISO language codes; see # URL for an example.
out_of_service=(yes|no) blocks all access to the instance questionnaire and displays a general out-of-service message.
no_lastlogin_storage=(yes) avoids storing the time of last utility program login in the permission file.
user_cookie_expiry_minutes=(number of minutes after which a user cookie expires; the default is 120)
use_user_cookie=yes | no, determines if user cookies are used instead of the _user parameter
cwarchive_extensions=(extensions), provides a comma-space delimited list of file extensions to add to the automated archives
cookie_same_site_security=(none|lax|strict), default = lax, SameSite security level of the administrative user cookie
charset=(character set), default = ISO-8859-15, character set declared upon the creation of the HTML pages; change this only if use of a UTF-8 font is necessary

Automated tasks

A number of tasks are performed automatically by various programs once they are scheduled in the cron feature of a Linux server. They are as follows.

ScriptType of installationDescriptionTypical location
cwupdate.plAllScans the CallWeb instance and updates programs to the most recent version.cron.minute
cwpermissions.plAllAdjusts the permissions of CallWeb directories and files which require open access by the Web server, throughout the CallWeb instance.cron.minute
cwsuperpro.plCATIScans projects to perform updates of the CATI files containing the cases available to telephone interviewers.cron.minute
cwphone.cgiCATI with AsteriskFor CATI installations equipped with an Asterisk PBX server, updates the list of last times when there was activity on an IP address. Add the CallWeb "client" name as an argument, e.g., "perl cwphone.cgi PROD".cron.minute
cwdial.plCATI with Asterisk and dialerFor CATI installations equipped with an Asterisk PBX server and the CallWeb dailer, absorbs automated call results into the CallWeb call history. Add the CallWeb "client" name as an argument and an ampersand to release the process, e.g., "perl cwdial.pl PROD &".cron.minute
cwrobot.plIVRFor robot servers: handles placing calls on the Asterisk server as well as collecting call results from the Asterisk server (see complete robot installation instructions). The call must be accompanied by the "client" name from the installation file of the CallWeb instance.cron.minute
cwarchive.plAllPerforms the back-ups throughout the instance of CallWeb as determined in cwarchive.cron.hourly*
cwautoemail.plAllSends the e-mail messages requested in "# Auto email" instructions throughout the instance of CallWeb. Add the CallWeb "client" name as an argument, e.g., "perl cwautoemail.cgi PROD &".cron.hourly*
cwstats.plAllComputes various usage statistics based on CallWeb data bases throughout the instance of CallWeb. The results are displayed by cwstats.cron.hourly
cwupdate.cgiAllE-mails the system administrator in case of available system updates.cron.daily
cwappels.plCATI(CATI only) Re-creates the BASEappels data base which contains one entry for each call made in each project available in the CallWeb instance.cron.daily
* Considering the functionality of the script, this must be its location.
Note that each of these scripts needs to be called individually for each instance of CallWeb installed on the server. To simplify this process, put an executable text file containing a series of "cd" commands (to change to the utilities directory) followed by "perl script" commands in the pertinent cron directory, as in:
cd /var/www/html/scripts
perl cwstats.pl
cd /home/someuser/scripts
perl cwstats.pl

One last script cwbounces.pl is a special case. Its purpose is to intercept bounced messages and to update the CallWeb data base with an indication of this bounce. It is not located in the cron system but rather, it is called by Sendmail upon receiving bounced messages for the "bounces" address. A single instance of this program services an entire server and all instances of CallWeb installed on it. Here are detailed installation instructions:

  • put the cwbounces.pl script in the main utilities directory;
  • make cwbounces.pl executable (0755);
  • create a symbolic link cwbounces.pl in /etc/smrsh, pointing to the cwbounces.pl script in the utilities directory;
  • create a virtual user called "bounces.+*@domain.xxx" (adjust the domain name but leave the left side of this expression intact) and send its mail to the "bounces" alias;
  • create a mail alias "bounces" piped to the cwbounces.pl script (|cwbounces.pl).

Note that, for cwbounces.pl to work with a given instance of CallWeb on a server, the following directories and files must be readable by the user or the group "mail" (under which Sendmail runs):

  • the cwroutines.pl file ;
  • the etc directory;
  • the file usager???.conf file within the etc directory (the exact name of this file varies with each instance of CallWeb).

Daemon mode installation

The CallWeb daemon mode is three times as fast as the base mode. In daemon mode, CallWeb runs constantly in the server background, waiting for questionnaire page request files to be placed by cwx.cgi (which replaces callweb.cgi in daemon mode) in the spool directory. The CallWeb daemon processes these request files and places the HTML code of the next questionnaire page in the spool directory for cwx.cgi to display to the respondent.

To use the CallWeb daemon mode, follow the installation instructions and then call the questionnaires with the cwx.cgi module instead of the callweb.cgi module.

CallWeb daemon mode installation instructions:

  • the daemon mode requires that Apache loads the mod_unique_id module. Make sure that the following line is part of the Apache configuration:
    LoadModule unique_id_module modules/mod_unique_id.so
  • create the directory /var/spool/callweb and allow the Web server user to read from it and to write to it, for example:
    mkdir /var/spool/callweb
    chmod 0777 /var/spool/callweb
  • place cwx.cgi in the CallWeb installation master directory and allow the Web server user to execute it, for example:
    chmod 0755 cwx.cgi
  • create the /opt/callweb directory and place callwebd.pl as well as cwroutines.pl in it, for example:
    mkdir /opt/callweb
    cp callwebd.pl /opt/callweb
    cp cwroutines.pl /opt/callweb
    chmod 0700 /opt/callweb/callwebd.pl
  • create the /var/log/callweb directory and make it writable by the Apache user, for example:
    mkdir /var/log/callweb
    chown apache:apache /var/log/callweb
    chmod 0755 /var/log/callweb
  • place callwebd in /etc/rc.d/init.d and give it execution permission by root, for example:chmod 0700 /etc/rc.d/init.d/callwebd
  • request that the CallWeb daemon be started automatically upon server boot: chkconfig --add callwebd (see update-rc.d for Ubuntu)
  • to allow for daemon system updates, add the following line to the usagerXXX.conf file of one instance on the server (probably the most active production instance): update_daemon = 1. That CallWeb instance will control updates to the daemon system.
  • if the system is connected to a Munin server:
    • activate loglevels 1 (for problems) and 4 (for page creation) in /etc/callweb.conf (see below);
    • place the callwebd_pages script in the /etc/munin/plugins directory
    • make callwebd_pages executable
    • restart Munin with service munin-node restart

The CallWeb daemon is started, stopped and restarted with the command service callwebd start|stop|restart. The daemon status can also be probed with service callwebd status. When the "restart" or the "stop" command is issued, the CallWeb daemon waits until the request queue is empty before proceeding with stopping the daemon.

The CallWeb daemon configuration file is /etc/callweb.conf. The CallWeb daemon must be restarted for changes to the configuration file to take effect. Its content is as follows.

SectionContentNotes
AnywhereLines starting with a pound sign are commented out.
[General]loglevel=n"n" is the sum of the numerical values associated with each element of information that may be logged. For example, a loglevel of 5 activates the logging of information numbered 1 and 4. The elements of information are numbered as follows:
1: system start and stop, problems encountered
2: state of the server, noted every minute
4: name of each file processed and project concerned
8: opening of request files and closing of response files
A loglevel of 0 indicates that no information is to be logged.

Multi-server configuration (CallWeb cluster)

Using the configuration files, it is possible to develop various server implementations of CallWeb. First, CallWeb can run on the same computer as the data base server if the "hote" parameter of the main CallWeb configuration file points locally:

hote = localhost

Another CallWeb server could use the same MySQL server by specifying a distant address for the "hote" in its main configuration file:

hote = 99.99.99.99

If the two CallWeb servers use the same "client" parameters in their main configuration file, both servers will "see" projects from both origins; that would be the typical setup of a multi-site CATI system. If they use different "client" parameters, each CallWeb server will only see its own projects.

Each project used in a multi-server configuration (also called "CallWeb cluster") should possess a # Master compilation server pound instruction to protect the integrity of the questionnaire files. Parallelism of the questionnaire files across servers is ensured by the # Copy questionnaire into instruction which dispatches a copy of the questionnaire (and an empty .scw file) to distant servers (there should be one such instruction for each of the distant servers in the CallWeb cluster which will use the questionnaire). This dispatching of questionnaires requires that a direct SSH connection (with exchange of public keys) exists between the servers; see below for the procedure.

In a multi-server configuration, re-compilation of the .scw script involving changes in data structure should be performed on the computer running the MySQL server. Otherwise, while the compilation will be performed and the data base adjusted if required, no backup of the data will be kept before modifying the data structure.

Note that, for bi-mode projects, the CATI CallWeb server must be the Master for compilation so that the .ccw file is correctly processed.

Exchange of public keys between servers

This procedure must be carried out only once per server connection. In brief, here is the procedure for the exchange of public keys between Linux servers:

  • in this procedure, "computer2" (the server, or the CallWeb computer which will receive the compiled CallWeb questionnaires) is the machine granting access to "computer1" (the client, or the computer which will send the compiled CallWeb questionnaires);
  • on computer1,
    • in a root shell, issue the following commands:
      • passwd apache [when prompted, enter a password for user apache]
      • usermod -s /bin/bash apache
      • chown apache:apache /var/www
    • enter a shell with the apache user ("su apache");
    • as the apache user, issue the following commands in a computer1 terminal window:
      • cd /var/www/
      • [if the .ssh directory does not exist] mkdir .ssh
      • cd .ssh
      • ssh-keygen -t rsa [accept the default options and do not specify a passphrase; this generates two files: id_rsa and id_rsa.pub]
    • in a root shell, issue the following commands:
      • chown root:root /var/www
  • copy id_rsa.pub from computer1 to computer2, in directory /var/www/.ssh (for example, via SFTP);
  • on computer2, in a root shell, issue the following commands:
    • usermod -s /bin/bash apache
    • cd /var/www/.ssh
    • cat id_rsa.pub >> authorized_keys
  • in a shell as the apache user on computer1, initiate an SSH connection and type "yes" when prompted; this needs be done once to accept the exchange of keys.

Appendix B

Installation instructions

Server software requirements

CallWeb needs the following to be installed on the server:

  • Perl 5 (including the following modules: CGI, CGI::Carp, DB_File, DBI, Fcntl, File::Compare, File::Copy, File::Path, FileHandle, IO::Socket, locale, LWP::Simple, Net::FTP, Net::Telnet, POSIX, Time::HiRes, Time::Local, SOAP::Lite 1.08, Encode)
  • MySQL 4 or better
  • Berkeley DB
  • a Web server (tested with Apache 2 with mod_unique_id enabled)
  • Sendmail
  • (for dialer and robot operations) Asterisk, version 1.2 or better (and the Asterisk::AGI Perl module)

Questionnaire designer client station

The following software has proven very valuable in editing CallWeb .scw files:

  • TextPad is an extraordinary pure-text editor which offers a whealth of functions. In particular, it supports syntax highlighting which makes CallWeb .scw files much more readable. A TextPad syntax highlighting file is available for CallWeb. Alternatively, some like Notepad++ for which CallWeb has a basic syntax highlighting file as well.
  • KeyText is a fabulous keyboard and hot key mapper. For example, one can paste an entire CallWeb question definition by simply pressing a predetermined combination of keys.
  • the free RGBtoHEX provides an easy way to select colours and identify the corresponding hex code.
  • the free Pixie is a colour picker: point to a colour on screen and Pixie tells you the hex, RGB, HTML, CMYK and HSV values of that colour (the hex value can be copied to the paste buffer using a keycoard key combination). ColorZilla, a free Firefox extension implements a similar function, but it is available only within Firefox.
  • there are hundreds of useful Web applications. For example, http://gradcolor.com/ creates a gradient which is very useful to find different intensities of a given coulour (do this by requesting a gradient from that colour to white).

File locations

DirectoryContentNotesPermission
{master}Main access directorymandatory: callweb.cgi, cwroutine.pl
optional: cwx.cgi cwjscripts.js, cwAST.pl
read, execute (world)
{master}/grSystem graphic filesmandatory: collection of .gif files
optional: style.css (when no style.css exists in the project directory)
read, execute (world)
{master}/cw... (i.e., name starting with "cw" or "cw" only)Everything project-relatedmandatory: *.scw, *.qcw
optional: style.css (for all projects located in the same directory; the # Stylesheet instruction can specify a stylesheet for a particular project), navigation images, all files referenced by questionnaires in that directory (linked by cw.../file.xxx in the .scw file), project configuration file (named projectSOMETHING.conf)
 
Notes
(1) all directories named cw* are considered project directories
(2) .scw (raw questionnaire) files must be located in their respective cw directory for compilation purposes; once compiled, they may be deleted or moved
(3) several projects may cohabitate in the same cw* directory; they then share the style.css file
(4) prepopulation files (e.g., pop.tab) must be located in the directory of the project to which they contribute
read, write, execute (world)
{master}/{any name}CallWeb utilitiesoptional according to circumstances: cw.cgi, cwappels.pl, cwarchive.cgi, cwarchive.pl, cwautoemail.pl, cwbounces.pl, cwcheck.cgi, cwcompare.cgi, cwcompile.cgi, cwdestruction.cgi, cwdossier.cgi, cwedit.cgi, cwemail.cgi, cwextr.cgi, cwfreq.cgi, cwgen.cgi, cwnav.cgi, cwpermissions.pl, cwprepop.cgi, cwquestionnaire.cgi, cwstats.cgi, cwstats.pl, cwtelkeys.cgi, cwtrack.pl, cwupdate.cgi, cwupdate.pl
for CATI installations: cwcodescati.cgi, cwgroupes.cgi, cwoutcomes.cgi, cwphone.cgi, cwphone.pl, cwprod.cgi, cwsuper.cgi, cwsuperimp.cgi, cwsuperpro.cgi, cwsuperpro.pl, cwdial.pl
for robot installations: cwrobot.pl (see complete robot installation instructions)
optional: style.css (controls the appearance of utilities, unless a project-related style.css (or other file) exists)
read, execute (world)
{master}/{any name}CallWeb CATI interviewer utilitiesmandatory for CATI installations: int1acces.cgi, int2select.cgi, int3travail.cgiread, execute (world)
{master}/etcSystem configuration filemandatory: the name must start with "usager" and end with ".conf" as in usager__531vh.confowner: apache
read, write (owner)
{master}/calCalendar filesoptional but mandatory to get pop-up calendarsread, execute (world)
/opt/callwebCallWeb daemon programmandatory for the daemon mode: callwebd.plread, execute (root)
/etcCallWeb daemon program configuration filemandatory for the daemon mode: callweb.confread, write (root)
/var/spool/callwebCallWeb daemon program spool directorymandatory for the daemon mode: directory where the CallWeb daemon reads and writes request and response filesread, write (world)
/etc/rc.d/init.dCallWeb daemon control programmandatory for the daemon mode: callwebdread, write (world)

System configuration file

The system configuration file and the project configuration files may contain several parameters controlling the in-depth behaviour of CallWeb and its default appearance. Some parameters must be supplied in one file or the other. Mandatory parameters are (parameters are case-sensitive):

client=(prefix used in naming MySQL data bases for this installation; do not include periods)
hote=(MySQL host, typically "localhost" but it could be the IP address of a distant MySQL server)
usager=(MySQL user name)
usager_defaced=(MySQL user name encrypted using cwperm.cgi; takes precedence over the usager parameter)
motdepasse=(MySQL user password)
motdepasse_defaced=(MySQL user password encrypted using cwperm.cgi; takes precedence over the motdepasse parameter)
driver=(Perl data base engine driver, typically "mysql")

The following are mandatory in CATI mode:

local_area_codes=(in CATI mode only, comma-delimited list of area codes not requiring a long distance call)
long_distance_exchanges_in_local_area_codes=(in CATI mode only, comma-delimited list of area+exchange codes requiring a long distance call within an otherwise local zone)
server_gmtoffset=offset hours to GMT (negative west of Greenwich)
gmtnnn=GMT offset hours for the area code nnn; negative west of Greenwich; there is one such line for each area code
gmtnnnxxx=GMT offset hours for exchange xxx in area code nnn; negative west of Greenwich; these are exceptions to the area code rules

The following are mandatory to connect an Asterisk server to CallWeb:

asterisk_ip=local network IP address of the Asterisk server
asterisk_ip_ecoute=local network IP address of the Asterisk server for supervising stations (asterisk_ip is used if asterisk_ip_ecoute does not exist)
asterisk_external_ip=external IP address of the Asterisk server (could be the same as asterisk_ip if the CATI server is on the same local network as the Asterisk server)
asterisk_telnetport=Telnet port on the Asterisk server (usually 5038)
asterisk_telnetuser=Telnet user on the Asterisk server (to communicate with Asterisk)
asterisk_telnetpw=Telnet user password on the Asterisk server (to communicate with Asterisk)
asterisk_cati_callerid=telephone number used for call display in CATI context
asterisk_cati_callerid_text=name used for call display in CATI context
asterisk_mysqlcdr=name of the MySQL data base where Asterisk stores the cdr table (usually asteriskcdrdb)
asterisk_mysqluser=mysql user on the Asterisk server (must be accessible from the CallWeb server)
asterisk_mysqlpw=mysql user password on the Asterisk server (must be accessible from the CallWeb server)
asterisk_sqlengine=SQL engine used on the Asterisk server (usually mysql)
longdistance_cost_per_minute=cost per minute of long distance calling
longdistance_minimum_seconds=minimum chargeable length (seconds) of a long distance call
longdistance_increment_seconds=increment (seconds) used to calculate long distance charges

The following are mandatory in robot mode:

pris_locaux=comma-delimited list of PRI lines which can dial local and long distance numbers (e.g., "pris_locaux = 1, 2" defines dialling lines 1 to 23 and 24 to 45)
pris_interurbains=comma-delimited list of PRI lines which can dial only long distance numbers (e.g., "pris_interurbains = 3" defines dialling lines 46 to 71)
asterisk_ivr_callerid=telephone number used for call display in robot context
asterisk_ivr_callerid_text=text used for call display in robot context
asterisk_mysqluser=mysql user on the Asterisk server (must be accessible from the robot server)
asterisk_mysqlpw=mysql user password on the Asterisk server (must be accessible from the robot server)
asterisk_sqlengine=SQL engine used on the Asterisk server (usually mysql)
cati_ip_for_robot=external IP address of the robot server (the Asterisk server needs to verify the number of interviewers logged in)
cati_user_for_robot=MySQL user for CallWeb on the robot server
cati_pw_for_robot=MySQL user password for CallWeb on the robot server
cati_clientdb_for_robot="client" parameter used by the robot on the robot server (see the client parameter above)
external_transfer_string=string used by Asterisk to send robot calls on a SIP trunk
siptrunk_prefix=string used by Asterisk to identify robot calls to be sent to a SIP trunk
number_of_SIP_channels=integer indicating how many SIP trunk channels the robot has access to

The following are mandatory in connecting CallWeb to a predictive dialer:

dialer_dbhote=IP address of the dialer data base host
dialer_dbusager=user name on the dialer data base
dialer_dbmotdepasse=password on the dialer data base
dialer_dbdriver=data base engine used by the dialer data base (e.g., mysql)
dialer_dbname=name of the dialer data base on the data base host
dialer_result_table=name of the table where call results are stored in the dialer data base
dialer_softphone_port=interviewer softphone port (the softphone is used to communicate some information to the dialer
dialer_server=IP address of the dialer host
dialer_server_port=port used by the dialer host
dialer_wait_for_human=number of seconds that CallWeb will wait for the dialer to supply a human call before giving up (default = 60)

In a project-specific configuration file, if the MySQL host is redefined, the following entry is mandatory:

projet=(name of the CallWeb project to which the configuration file belongs)

Any pound instruction can be inserted in the system configuration file. All such pound instructions found in the system configuration file are inserted at the beginning of all questionnaires upon compilation. This means two things:

  • that system-wide defaults can be defined for any of the pound instructions, such as defining a default read access password for all projects with "# cwNav read password = some_password";
  • that such system default values can be overwritten inside any questionnaire by adding the same instruction (with other parameters) in the .scw file.

In addition, optional configuration parameters include (parameters are case-sensitive):

administrator_email=(e-mail address of the CallWeb system administrator)
notify_after=(number of days of data base inactivity that triggers an e-mail reminder; the default is 14)
notify_every=(number of days between notifications of inactive projects as defined by notify_after; the default is 1)
maximum_undo_versions=(number of update versions to keep available for undo; the default is 5)
serveurftp=(name/address of the FTP server offering system updates and upgrades)
proxyftp=(name/address of the proxy server through which FTP has to connect; add ":port" if the proxy does not use the default FTP port)
usagerftp =(user name on serveurftp)
motdepasseftp =(password for usagerftp)
engine=(MyISAM or InnoDB)
use_telkey_table=(yes or no; determines whether a table of reserved _telkeys is used for open projects (preferable); requires mod_unique_id in Apache; default "no")
nom_de_ce_serveur=(name of the server; used in # Only for server and # Master compilation server instructions)
repertoire_utilitaire_maitre=(name of the master utility directory)
repertoire_cati_maitre=(name of the master directory for CATI scripts)
nom_installation=(name of the installation reflected in the utility banner)
langue=(2-letter code for the default language)
update_daemon=(0 or 1 according to whether the daemon files must be updated with cwupdate. Place in only one CallWeb instance on a given server.)
cwextr_types=(default extraction file types presented as a comma-delimited list among the following: csv, dat, tcw, opn, sps, sas, rcode, asc, sss, scw)
cwextr_email=(e-mail address to select as the default extraction destination)
csv_delimiter=(single character used as a delimiter in extracted csv files)

champs_par_csv
=(default number of fields in an extracted csv file)
test_email_address_hostname=(domain name used by the test_email_address function to build the FROM parameter (should be a subdomain like mail.callweb.ca). Uses $ENV{HTTP_HOST} or $ENV{HOSTNAME} otherwise.)
url_principal=(URL used by cwautoemail.pl to call cwemail.cgi; must be a fully qualified URL ending with a slash such as http://domain.com/utilities/)
max_var_label_length=(default maximum length of variable labels extracted to other software code; default = 60)
max_value_label_length=(default maximum length of category labels extracted to other software code; default = 40)
max_spss_alpha_field=(maximum number of characters read off alphanumaric fields in SPSS; default = 254)
default_cwtelkeys_pattern=_telkey pattern proposed by default by cwtelkeys
_M_COULEURCELLULES=(# colour code; base cell colour for tables)
_M_COULEURCELLULES2=(# colour code; second cell colour for tables)
_M_COULEURTITRESCOLONNES=(# colour code; column header cell colour for tables)
_M_COULEURTITRESLIGNES=(# colour code; base line header cell colour for tables)
_M_COULEURTITRESLIGNES2=(# colour code; second line header cell colour for tables)
_M_COULEURBORDURES=(# colour code; border colour for tables)
_M_BORDURES=(number of pixels for table borders)
_M_ESPACEMENTINTERIEUR=(number of pixels for internal spacing of table cells)
_M_ALIGNEMENTTITRESCOLONNES=(T|B; vertical alignment of column header cells)
cati=(oui|non|ivr, whether the installation is CATI- or IVR-type by default)
couleur_commentaire_o=(# colour code; colour of the CATI result codes where interviewer comments are mandatory)
couleur_commentaire_f=(# colour code; colour of the CATI result codes where interviewer comments are optional)
couleur_commentaire_a=(# colour code; colour of the CATI result codes where interviewer comments are disallowed)
between_cati_buttons=(number of pixels to insert between CATI buttons presented to interviewers)
lignes_commentaires=(number of lines of the comment entry box for interviewers)
colonnes_commentaires=(number of columns of the comment entry box for interviewers)
size_of_stratum_selection_box_in_cwsuperpro=(number of lines for the multiple select drop-down list of strata in cwsuperpro; default 5)
default_for_cati_comment_carry_over=(yes|no whether the interviewer comment is carried over from call to call by default
delai_min_entre_appels=minimum number of seconds between two call results by a particular interviewer for a given case
allow_password_change_by_interviewers=yes | no (if yes, interviewers are given a chance to change their password upon login)
allow_sip_change_by_interviewers=yes | no (if yes, interviewers are given a chance to change their SIP extension upon login)
constrain_to_groups=yes | no (if yes, the free case selection option is not displayed to interviewers if groups exists in CATI mode)
allow_viewing_time=yes | no (if no, interviewers are not offered the option to view thier cumulated time in CATI mode)
interviewer_clock=12|24 (displays the apppointment clock as a 12- or 24-hour clock; 24 is the default)
allow_cross_project_search=yes | no (if no, interviewers are not offered the list of projects from which to search for a case in CATI mode)
interviewer_timer=yes | no (whether or not interviewers are shown a timer on the call management screen; the default is yes)
mpBASEtemps=password used in BASEtemps (mpBASEtemps is used in cwsuper to give supervisors access to interviewer time slips.)
productivity_index=MySQL expression returning an index of interviewer productivity. Used in cwprod.cgi. The default is ROUND((completes_first + 2*completes_norefusal + 5*completes_withrefusal - 3*refusals_first ) / duration,1).
repertoire_wav=absolute path to the server directory containing the project directories where .wav files of the interviews are stored
repertoire_html_wav=directory alias defined in the Apache configuration to permit building URLs to the .wav files even if they are outside the Web server directory structure
seconds_before_dialling=seconds (in CATI mode with an Asterisk dialler, length of the pause between the display of the call management screen and the automated dialling of the telephone number)
storeinBASEappels=yes | no (in CATI mode, if no, call results are not stored in real time in BASEappels and interviewers do not get a dynamic count of their results)
week_start=between 0 and 6: determines when the week starts in the calculation of the _week system variable; 0 for Sunday, 1 for Monday, etc.
comparative_results=yes|no (in CATI mode, controls the display of a summary of interviewer productivity to each interviewer)
command_prefix_for_record_wav=(some text) (prefix command used by the Apache user to start and stop recordings in face-to-face settings)
url_to_cwagent=(url) (full URL to the cwagent.cgi script to bridge agents from int2select.cgi to cwagent.cgi; should be in the usagerXXX.conf file of the CallWeb instance agents use to log in) (e.g., http://192.168.0.1/prod/interviewers/cwagent.cgi)
url_from_cwagent=(url) (full URL to the int2select.cgi script to bridge agents from cwagent.cgi back into int2select.cgi; should be in the usagerXXX.conf file of the CallWeb instance where cwagent.cgi runs, i.e. in the robot instance) (e.g., http://192.168.0.2/prod2/interviewers/int2select.cgi)
agent_languages=comma-delimited list of ISO language codes offered to the agents logging into cwagent.cgi
parms_to_copy_dump_file (OBSOLETE)=apache@server (where "server" is a distant MySQL server where the backup dump files will be written. This parameter serves to copy the dump file over to the administrative server and to delete it from the MySQL server. For this to work, ssh keys must have been exchanged for the Apache user [for compilation backups] and the root user [for automated backups])
control_by_other_server_possible=yes | no, set this to yes if it is possible that there will be CATI projects that are controlled by another server based on the # Master compilation server pound instruction
default_cwpermissions_directory_permissions=permission level assigned to project directories by cwpermission; it must be in octal representation; the default is 0777.
default_cwpermissions_file_permissions=permission level assigned to project files by cwpermission; it must be in octal representation; the default is 0666.
cwpermissions_deletes_from_cwdir=(case insensitive regular expression, minutes); the two options are separated by a comma; cwpermissions.pl deletes files that correspond to the regular expression pattern when they are older than the number of minutes stated in the second option; the regular expression is not tested — it is entirely the responsibility of the CallWeb manager.
exclude_from_cwcompile_backup=(case insensitive regular expression); defines a regular expression identifying files to NOT save in cwcompile zip backups.
hide_user_from_cwdocs_link=yes; if defined, this option hides the user code from the cwdocs link in cw.cgi.
check_login=yes | no, set to no, it deactivates the authentification system.
dialer_timeout_milliseconds=number of milliseconds after which the dialer considers a call ring-no-answer.
musiconhold=0|1, whether or not to use music-on-hold when transfering a batch-dialed extra call to an agent.
external_transfer_string=string used by Asterisk to compose SIP channel information for external audio monitoring; this is lifted from the relevant Asterisk context.
systemlog=level of logging to be performed in the instance. Valid values are: 0: Emergency (emerg); 1: Alerts (alert); 2: Critical (crit); 3: Errors (err); 4: Warnings (warn); 5: Notification (notice); 6: Information (info); 7: Debug (debug).
max_log_size=maximum size of the log file before rotation, expressed in megs.
service_command_path=path of the service command used in cwupdate.pl. Normally, this option is not necessary.
login_pw_valid_days=number of days after which a user must change their password to access CallWeb utility modules (none by default).
login_pw_allow_same=(yes|no) whether or not users are allowed to supply the same password when requested to change it.
login_pw_rules=tab-delimited list of regular expressions that must be adhered to in creating a new password.
login_pw_rules_message=text displayed to explain the password composition rules. Different linguistic versions may be defined by inserting [xx] codes using ISO language codes; see # URL for an example.
out_of_service=(yes|no) blocks all access to the instance questionnaire and displays a general out-of-service message.
no_lastlogin_storage=(yes) avoids storing the time of last utility program login in the permission file.
user_cookie_expiry_minutes=(number of minutes after which a user cookie expires; the default is 120)
use_user_cookie=yes | no, determines if user cookies are used instead of the _user parameter
cwarchive_extensions=(extensions), provides a comma-space delimited list of file extensions to add to the automated archives
cookie_same_site_security=(none|lax|strict), default = lax, SameSite security level of the administrative user cookie
charset=(character set), default = ISO-8859-15, character set declared upon the creation of the HTML pages; change this only if use of a UTF-8 font is necessary

Automated tasks

A number of tasks are performed automatically by various programs once they are scheduled in the cron feature of a Linux server. They are as follows.

ScriptType of installationDescriptionTypical location
cwupdate.plAllScans the CallWeb instance and updates programs to the most recent version.cron.minute
cwpermissions.plAllAdjusts the permissions of CallWeb directories and files which require open access by the Web server, throughout the CallWeb instance.cron.minute
cwsuperpro.plCATIScans projects to perform updates of the CATI files containing the cases available to telephone interviewers.cron.minute
cwphone.cgiCATI with AsteriskFor CATI installations equipped with an Asterisk PBX server, updates the list of last times when there was activity on an IP address. Add the CallWeb "client" name as an argument, e.g., "perl cwphone.cgi PROD".cron.minute
cwdial.plCATI with Asterisk and dialerFor CATI installations equipped with an Asterisk PBX server and the CallWeb dailer, absorbs automated call results into the CallWeb call history. Add the CallWeb "client" name as an argument and an ampersand to release the process, e.g., "perl cwdial.pl PROD &".cron.minute
cwrobot.plIVRFor robot servers: handles placing calls on the Asterisk server as well as collecting call results from the Asterisk server (see complete robot installation instructions). The call must be accompanied by the "client" name from the installation file of the CallWeb instance.cron.minute
cwarchive.plAllPerforms the back-ups throughout the instance of CallWeb as determined in cwarchive.cron.hourly*
cwautoemail.plAllSends the e-mail messages requested in "# Auto email" instructions throughout the instance of CallWeb. Add the CallWeb "client" name as an argument, e.g., "perl cwautoemail.cgi PROD &".cron.hourly*
cwstats.plAllComputes various usage statistics based on CallWeb data bases throughout the instance of CallWeb. The results are displayed by cwstats.cron.hourly
cwupdate.cgiAllE-mails the system administrator in case of available system updates.cron.daily
cwappels.plCATI(CATI only) Re-creates the BASEappels data base which contains one entry for each call made in each project available in the CallWeb instance.cron.daily
* Considering the functionality of the script, this must be its location.
Note that each of these scripts needs to be called individually for each instance of CallWeb installed on the server. To simplify this process, put an executable text file containing a series of "cd" commands (to change to the utilities directory) followed by "perl script" commands in the pertinent cron directory, as in:
cd /var/www/html/scripts
perl cwstats.pl
cd /home/someuser/scripts
perl cwstats.pl

One last script cwbounces.pl is a special case. Its purpose is to intercept bounced messages and to update the CallWeb data base with an indication of this bounce. It is not located in the cron system but rather, it is called by Sendmail upon receiving bounced messages for the "bounces" address. A single instance of this program services an entire server and all instances of CallWeb installed on it. Here are detailed installation instructions:

  • put the cwbounces.pl script in the main utilities directory;
  • make cwbounces.pl executable (0755);
  • create a symbolic link cwbounces.pl in /etc/smrsh, pointing to the cwbounces.pl script in the utilities directory;
  • create a virtual user called "bounces.+*@domain.xxx" (adjust the domain name but leave the left side of this expression intact) and send its mail to the "bounces" alias;
  • create a mail alias "bounces" piped to the cwbounces.pl script (|cwbounces.pl).

Note that, for cwbounces.pl to work with a given instance of CallWeb on a server, the following directories and files must be readable by the user or the group "mail" (under which Sendmail runs):

  • the cwroutines.pl file ;
  • the etc directory;
  • the file usager???.conf file within the etc directory (the exact name of this file varies with each instance of CallWeb).

Daemon mode installation

The CallWeb daemon mode is three times as fast as the base mode. In daemon mode, CallWeb runs constantly in the server background, waiting for questionnaire page request files to be placed by cwx.cgi (which replaces callweb.cgi in daemon mode) in the spool directory. The CallWeb daemon processes these request files and places the HTML code of the next questionnaire page in the spool directory for cwx.cgi to display to the respondent.

To use the CallWeb daemon mode, follow the installation instructions and then call the questionnaires with the cwx.cgi module instead of the callweb.cgi module.

CallWeb daemon mode installation instructions:

  • the daemon mode requires that Apache loads the mod_unique_id module. Make sure that the following line is part of the Apache configuration:
    LoadModule unique_id_module modules/mod_unique_id.so
  • create the directory /var/spool/callweb and allow the Web server user to read from it and to write to it, for example:
    mkdir /var/spool/callweb
    chmod 0777 /var/spool/callweb
  • place cwx.cgi in the CallWeb installation master directory and allow the Web server user to execute it, for example:
    chmod 0755 cwx.cgi
  • create the /opt/callweb directory and place callwebd.pl as well as cwroutines.pl in it, for example:
    mkdir /opt/callweb
    cp callwebd.pl /opt/callweb
    cp cwroutines.pl /opt/callweb
    chmod 0700 /opt/callweb/callwebd.pl
  • create the /var/log/callweb directory and make it writable by the Apache user, for example:
    mkdir /var/log/callweb
    chown apache:apache /var/log/callweb
    chmod 0755 /var/log/callweb
  • place callwebd in /etc/rc.d/init.d and give it execution permission by root, for example:chmod 0700 /etc/rc.d/init.d/callwebd
  • request that the CallWeb daemon be started automatically upon server boot: chkconfig --add callwebd (see update-rc.d for Ubuntu)
  • to allow for daemon system updates, add the following line to the usagerXXX.conf file of one instance on the server (probably the most active production instance): update_daemon = 1. That CallWeb instance will control updates to the daemon system.
  • if the system is connected to a Munin server:
    • activate loglevels 1 (for problems) and 4 (for page creation) in /etc/callweb.conf (see below);
    • place the callwebd_pages script in the /etc/munin/plugins directory
    • make callwebd_pages executable
    • restart Munin with service munin-node restart

The CallWeb daemon is started, stopped and restarted with the command service callwebd start|stop|restart. The daemon status can also be probed with service callwebd status. When the "restart" or the "stop" command is issued, the CallWeb daemon waits until the request queue is empty before proceeding with stopping the daemon.

The CallWeb daemon configuration file is /etc/callweb.conf. The CallWeb daemon must be restarted for changes to the configuration file to take effect. Its content is as follows.

SectionContentNotes
AnywhereLines starting with a pound sign are commented out.
[General]loglevel=n"n" is the sum of the numerical values associated with each element of information that may be logged. For example, a loglevel of 5 activates the logging of information numbered 1 and 4. The elements of information are numbered as follows:
1: system start and stop, problems encountered
2: state of the server, noted every minute
4: name of each file processed and project concerned
8: opening of request files and closing of response files
A loglevel of 0 indicates that no information is to be logged.

Multi-server configuration (CallWeb cluster)

Using the configuration files, it is possible to develop various server implementations of CallWeb. First, CallWeb can run on the same computer as the data base server if the "hote" parameter of the main CallWeb configuration file points locally:

hote = localhost

Another CallWeb server could use the same MySQL server by specifying a distant address for the "hote" in its main configuration file:

hote = 99.99.99.99

If the two CallWeb servers use the same "client" parameters in their main configuration file, both servers will "see" projects from both origins; that would be the typical setup of a multi-site CATI system. If they use different "client" parameters, each CallWeb server will only see its own projects.

Each project used in a multi-server configuration (also called "CallWeb cluster") should possess a # Master compilation server pound instruction to protect the integrity of the questionnaire files. Parallelism of the questionnaire files across servers is ensured by the # Copy questionnaire into instruction which dispatches a copy of the questionnaire (and an empty .scw file) to distant servers (there should be one such instruction for each of the distant servers in the CallWeb cluster which will use the questionnaire). This dispatching of questionnaires requires that a direct SSH connection (with exchange of public keys) exists between the servers; see below for the procedure.

In a multi-server configuration, re-compilation of the .scw script involving changes in data structure should be performed on the computer running the MySQL server. Otherwise, while the compilation will be performed and the data base adjusted if required, no backup of the data will be kept before modifying the data structure.

Note that, for bi-mode projects, the CATI CallWeb server must be the Master for compilation so that the .ccw file is correctly processed.

Exchange of public keys between servers

This procedure must be carried out only once per server connection. In brief, here is the procedure for the exchange of public keys between Linux servers:

  • in this procedure, "computer2" (the server, or the CallWeb computer which will receive the compiled CallWeb questionnaires) is the machine granting access to "computer1" (the client, or the computer which will send the compiled CallWeb questionnaires);
  • on computer1,
    • in a root shell, issue the following commands:
      • passwd apache [when prompted, enter a password for user apache]
      • usermod -s /bin/bash apache
      • chown apache:apache /var/www
    • enter a shell with the apache user ("su apache");
    • as the apache user, issue the following commands in a computer1 terminal window:
      • cd /var/www/
      • [if the .ssh directory does not exist] mkdir .ssh
      • cd .ssh
      • ssh-keygen -t rsa [accept the default options and do not specify a passphrase; this generates two files: id_rsa and id_rsa.pub]
    • in a root shell, issue the following commands:
      • chown root:root /var/www
  • copy id_rsa.pub from computer1 to computer2, in directory /var/www/.ssh (for example, via SFTP);
  • on computer2, in a root shell, issue the following commands:
    • usermod -s /bin/bash apache
    • cd /var/www/.ssh
    • cat id_rsa.pub >> authorized_keys
  • in a shell as the apache user on computer1, initiate an SSH connection and type "yes" when prompted; this needs be done once to accept the exchange of keys.