dahdi-tools/xpp/perl_modules/Dahdi/Config/Params.pm

157 lines
3.6 KiB
Perl

package Dahdi::Config::Params;
#
# Written by Oron Peled <oron@actcom.co.il>
# Copyright (C) 2009, Xorcom
# This program is free software; you can redistribute and/or
# modify it under the same terms as Perl itself.
#
# $Id$
#
use strict;
=head1 NAME
Dahdi::Config::Params -- Object oriented representation of F<genconf_parameters> file.
=head1 SYNOPSIS
use Dahdi::Config::Params;
my $params = Dahdi::Config::Params->new('the-config-file');
print $params->item{'some-key'};
print $params->item{'some-key', NODEFAULTS => 1};
$params->dump; # For debugging
=head1 DESCRIPTION
The constructor must be given a configuration file name:
=over 4
=item * Missing file is B<not> an error.
=item * Other opening errors cause a C<die> to be thrown.
=item * The file name is saved as the value of C<GENCONF_FILE> key.
=back
The access to config keys should only be done via the C<item()> method:
=over 4
=item * It contains all hard-coded defaults.
=item * All these values are overriden by directives in the config file.
=item * Calling it with C<NODEFAULTS =E<gt> 1> option, returns C<undef> for keys that
do not appear in the configuration file.
=back
=cut
sub new($$) {
my $pack = shift || die;
my $cfg_file = shift || die;
my $self = {
GENCONF_FILE => $cfg_file,
};
bless $self, $pack;
if(!open(F, $cfg_file)) {
if(defined($!{ENOENT})) {
#print STDERR "No $cfg_file. Assume empty config\n";
return $self; # Empty configuration
}
die "$pack: Failed to open '$cfg_file': $!\n";
}
#print STDERR "$pack: $cfg_file\n";
my $array_key;
while(<F>) {
my ($key, $val);
chomp;
s/#.*$//;
s/\s+$//; # trim tail whitespace
next unless /\S/;
if(defined $array_key && /^\s+/) {
s/^\s+//; # trim beginning whitespace
push(@{$self->{$array_key}}, $_);
next;
}
undef $array_key;
($key, $val) = split(/\s+/, $_, 2);
$key = lc($key);
if(! defined $val) {
$array_key = $key;
next;
}
die "$cfg_file:$.: Duplicate key '$key'\n", if exists $self->{$key};
$self->{$key} = $val;
}
close F;
return $self;
}
sub item($$@) {
my $self = shift || die;
my $key = shift || die;
my %options = @_;
my %defaults = (
base_exten => '4000',
freepbx => 'no', # Better via -F command line
fxs_immediate => 'no',
fxs_default_start => 'ks',
fxo_default_start => 'ks',
em_signalling => 'none',
lc_country => 'us',
context_lines => 'from-pstn',
context_phones => 'from-internal',
context_input => 'astbank-input',
context_output => 'astbank-output',
group_phones => '5',
group_lines => '0',
brint_overlap => 'no',
bri_sig_style => 'bri_ptmp',
echo_can => 'mg2',
bri_hardhdlc => 'auto',
pri_connection_type => 'PRI',
r2_idle_bits => '1101',
tdm_framing => 'esf',
'pri_termtype' => [ 'SPAN/* TE' ],
);
return $self->{$key} if exists($self->{$key}) or $options{NODEFAULTS};
return $defaults{$key};
}
sub dump($) {
my $self = shift || die;
printf STDERR "%s dump:\n", ref $self;
my $width = 30;
foreach my $k (sort keys %$self) {
my $val = $self->{$k};
my $ref = ref $val;
#print STDERR "DEBUG: '$k', '$ref', '$val'\n";
if($ref eq '') {
printf STDERR "%-${width}s %s\n", $k, $val;
} elsif($ref eq 'SCALAR') {
printf STDERR "%-${width}s %s\n", $k, ${$val};
} elsif($ref eq 'ARRAY') {
#printf STDERR "%s:\n", $k;
my $i = 0;
foreach my $v (@{$val}) {
printf STDERR "%-${width}s %s\n", "$k\->[$i]", $v;
$i++;
}
} elsif($ref eq 'HASH') {
#printf STDERR "%s:\n", $k;
foreach my $k1 (keys %{$val}) {
printf STDERR "%-${width}s %s\n", "$k\->\{$k1\}", ${$val}{$k1};
}
} else {
printf STDERR "%-${width}s (-> %s)\n", $k, $ref;
}
}
}
1;