Catalog — register catalog with the Interchange server
The directive registers a catalog that will run on the corresponding Interchange installation.
The directive expects three or more arguments.
First expected is the name of the catalog. It will be referred to by the specified name in error, warning, and informational messages. It must contain only alphanumeric characters, hyphens, and underscores. It is highly recommended that it is also all lowercase.
Second argument specifies the filesystem base directory of the catalog.
If the directory does not exist, the required catalog.cfg
is not there, or Interchange
detects any other problem, catalog configuration will be skipped and the
catalog
won't be activated.
Third argument is the so called SCRIPT_NAME
of the
link program. It is a webserver path by which the catalog can be
accessed. It can be followed by different
aliases, all allowing access to
the same catalog. For example, this is useful when calling an SSL
server or a
members-only alias that requires a Basic HTTP authorization using the
username/password pair. All subsequently generated links would be called using
the aliased URL.
The script name must be unique among CGI program paths that run on the
Interchange server, unless the FullUrl
directive is specified. In this case,
hostnames can be added to differentiate otherwise same paths; as usual, see
the section called “EXAMPLES” for clarification.
It is also possible to define catalog-specific configuration directives
from the global interchange.cfg
file. Again, see the section called “EXAMPLES”.
Example: Using FullUrl to differentiate same-named catalogs on different hosts
FullUrl yes Catalog simple1 /home/catalogs/simple1 www.company1.com/cgi-bin/ic/simple Catalog simple2 /home/catalogs/simple2 www.company2.com/cgi-bin/ic/simple
Make sure to read the FullUrl
directive reference page before just
including it in your configuration.
Example: Elaborate Catalog directive definition
Given the nature of the Catalog
directive, a catalog can be registered somewhat
verbosely with:
Catalog simple directory /home/catalogs/simple Catalog simple script /cgi-bin/ic/simple Catalog simple alias /simple
Example: Defining catalog-specific directives in the global config file
Re-using the elaborate example from just above, it is also possible to define
catalog-specific directives in the global interchange.cfg
file.
This is most useful to do with the ErrorFile
and DisplayErrors
directives:
Catalog simple directive ErrorFile /var/log/interchange/simple-error.log
Catalog
is one of the basic Interchange configuration directives.
makecat, the catalog creation helper script,
automatically inserts
the Catalog
line in the interchange.cfg
file as part of the standard procedure.
If the catalog.cfg
file, expected in the catalog base directory, is not found, or is
unreadable by the Interchange server, somewhat misguiding error message will be reported.
Instead of the appropriate permissions-problem message, the mandatory
VendURL
directive will be reported as undefined.
Interchange 5.9.0:
Source: lib/Vend/Config.pm
Line 4147 (context shows lines 4147-4248)
sub parse_catalog { my ($var, $setting) = @_; my $num = ! defined $Global::Catalog ? 0 : $Global::Catalog; return $num unless (defined $setting && $setting); my($name,$base,$dir,$script, @rest); ($name,@rest) = Text::ParseWords::shellwords($setting); my %remap = qw/ base base alias alias aliases alias directory dir dir dir script script directive directive fullurl full_url full full_url /; my ($cat, $key, $value); if ($Global::Catalog{$name}) { # already defined $cat = $Global::Catalog{$name}; $key = shift @rest; $value = shift @rest; } elsif( $var =~ /subcatalog/i and @rest > 2 and file_name_is_absolute($rest[1]) ) { $cat = { name => $name, base => $rest[0], dir => $rest[1], script => $rest[2], }; splice(@rest, 0, 3); $cat->{alias} = [ @rest ] if @rest; } elsif( file_name_is_absolute($rest[0]) ) { $cat = { name => $name, dir => $rest[0], script => $rest[1], }; splice(@rest, 0, 2); $cat->{alias} = [ @rest ] if @rest; } else { $key = shift @rest; $value = shift @rest; $cat = { name => $name }; } $key = $remap{$key} if $key && defined $remap{$key}; if(! $key) { # Nada } elsif($key eq 'alias' or $key eq 'server') { $cat->{$key} = [] if ! $cat->{$key}; push @{$cat->{$key}}, $value; push @{$cat->{$key}}, @rest if @rest; } elsif($key eq 'global') { $cat->{$key} = $Global::AllowGlobal->{$name} = is_yes($value); } elsif($key eq 'directive') { no strict 'refs'; my $p = $value; my $v = join " ", @rest; $cat->{$key} = {} if ! $cat->{$key}; my $ref = set_directive($p, $v, 1); if(ref $ref->[1] =~ /HASH/) { if(! $cat->{$key}{$ref->[0]} ) { $cat->{$key}{$ref->[0]} = { %{"Global::$ref->[0]"} }; } for (keys %{$ref->[1]}) { $cat->{$key}{$ref->[0]}{$_} = $ref->[1]->{$_}; } } else { $cat->{$key}{$ref->[0]} = $ref->[1]; } } else { $cat->{$key} = $value; } #::logDebug ("parsing catalog $name = " . uneval_it($cat)); $Global::Catalog{$name} = $cat; # Define the main script name and array of aliases return ++$num; }