Hello,
This is a preannounce of Apache::ConfigParser. I wrote this to
allow programs separate from Apache to completely understand,
parse and manipulate Apache configuration files.
The interface is not simple, but it allows for more complicated
understanding of log files, such as finding the associated ServerName
for log files.
There are two separate modules described here. The first manages
a single directive and the second assembles these into an object
that represents a complete configuration file.
Comments welcome, including the name of the module.
It's available now at
http://www.orcaware.com/perl/Apache-ConfigParser-0.01.tar.gz
and will be up on CPAN if there are no serious comments.
Regards,
Blair
NAME
Apache::ConfigParser::Directive - An Apache directive or start
context
SYNOPSIS
use Apache::ConfigParser::Directive;
# Create a new emtpy directive.
my $d = Apache::ConfigParser::Directive-new;
# Make it a ServerRoot directive.
# ServerRoot /etc/httpd
$d-name('ServerRoot');
$d-value('/etc/httpd');
# A more complicated directive. Value automatically splits the
# argument into separate elements. It treats elements in 's
as a
# single ement.
# LogFormat %h %l %u %t \%r\ %s %b common
$d-name('LogFormat');
$d-value('%h %l %u %t \%r\ %s %b common');
# Get a string form of the name.
# Prints `logformat'.
print $d-name, \n;
# Get a string form of the value.
# Prints `%h %l %u %t \%r\ %s %b common'.
print $d-value, \n;
# Get the values separated into individual elements.
Whitespace
# separated elements that are enclosed in 's are treated as a
# single element. Protected quotes, \, are honored to not
begin or
# end a value element. In this form protected 's, \, are no
# longer protected.
my @value = $d-get_value_array;
scalar @value == 2; # There are two elements in this
array.
$value[0] eq '%h %l %u %t \%r\ %s %b';
$value[1] eq 'common';
# The array form can also be set. Change style of LogFormat
from a
# common to a referer style log.
$d-set_value_array('%{Referer}i - %U', 'referer');
# This is equivalent.
$d-value('%{Referer}i - %U referer');
# There are also an equivalent pair of values that are called
# `original' that can be accessed via orig_value,
# get_orig_value_array and set_orig_value_array.
$d-orig_value('%{User-agent}i agent');
$d-set_orig_value_array('%{User-agent}i', 'agent');
@value = $d-get_orig_value_array;
scalar @value == 2; # There are two elements in this
array.
$value[0] eq '%{User-agent}i';
$value[1] eq 'agent';
# You can set undef values for the strings.
$d-value(undef);
DESCRIPTION
The Apache::ConfigParser::Directive module is a subclass
of Tree::DAG_Node, which provides methods to represents
nodes in a tree. Each node is a single Apache configura
tion directive or root node for a context, such as Direc
tory or VirtualHost. All of the methods in that module
are available here. This module adds some additional
methods that make it easier to represent Apache directives
and contexts.
This module holds a directive or context:
name
value in string form
value in array form
a separate value termed `original' in string form
a separate value termed `original' in array form
the filename where the directive was set
the line number in the filename where the directive was set
The `original' value is separate from the non-`original'
value and the methods to operate on the two sets of values
have distinct names. The `original' value can be used to
store the original value of a directive while the
non-`directive' value can be a modified form, such as
changing the CustomLog filename to make it absolute. The
actual use of these two distinct values is up to the
caller as this module does not link the two in any way.
METHODS
The following methods are available:
$d = Apache::ConfigParser::Directive-new;
This creates a brand new Apache::ConfigParser::Direc
tive object.
It is not recommended to pass any arguments to new
to set the internal state and instead use the follow
ing methods.
There actually is no new method in the Apache::Con
figParser::Directive module. Instead, due to
Apache::ConfigParser::Directive being a subclass of
Tree::DAG_Node, Tree::DAG_Node::new will be used.
$d-name
$d-name($name)
In the first form get