dahdi-tools/xpp/perl_modules/Dahdi/Config/Gen/Users.pm

228 lines
4.8 KiB
Perl

package Dahdi::Config::Gen::Users;
use strict;
use File::Basename;
use Dahdi::Config::Gen qw(is_true);
# Generate a complete users.conf for the asterisk-gui
# As the asterisk-gui provides no command-line interface of its own and
# no decent support of #include, we have no choice but to nuke users.conf
# if we're to provide a working system
sub new($$$) {
my $pack = shift || die;
my $gconfig = shift || die;
my $genopts = shift || die;
my $file = $ENV{USERS_FILE} || "/etc/asterisk/users.conf";
my $self = {
FILE => $file,
GCONFIG => $gconfig,
GENOPTS => $genopts,
};
bless $self, $pack;
return $self;
}
# A single analog trunk for all the FXO channels
sub gen_analog_trunk {
my @fxo_ports = @_;
return unless (@fxo_ports); # no ports
my $ports = join(',', @fxo_ports);
print << "EOF"
[trunk_1]
trunkname = analog
hasexten = no
hasiax = no
hassip = no
hasregisteriax = no
hasregistersip = no
trunkstyle = analog
dahdichan = $ports
EOF
}
# A digital trunk for a single span.
# FIXME: how do I create the DID context?
sub gen_digital_trunk($) {
my $span = shift;
my $num = $span->num;
my $sig = $span->signalling;
my $type = $span->type;
my $bchan_range = Dahdi::Config::Gen::bchan_range($span);
print << "EOF";
[span_$num]
group = $num
hasexten = no
signalling = $sig
trunkname = Span $num $type
trunkstyle = digital ; GUI metadata
hassip = no
hasiax = no
context = DID_span_$num
dahdichan = $bchan_range
EOF
}
my $ExtenNum;
# A single user for a FXS channel
sub gen_channel($$) {
my $self = shift || die;
my $chan = shift || die;
my $gconfig = $self->{GCONFIG};
my $type = $chan->type;
my $num = $chan->num;
die "channel $num type $type is not an analog channel\n" if $chan->span->is_digital();
my $exten = $ExtenNum++;
my $sig = $gconfig->{'chan_dahdi_signalling'}{$type};
my $full_name = "$type $num";
die "missing default_chan_dahdi_signalling for chan #$num type $type" unless $sig;
print << "EOF";
[$exten]
context = DLPN_DialPlan1
callwaiting = yes
fullname = $full_name
cid_number = $exten
hasagent = no
hasdirectory = no
hasiax = no
hasmanager = no
hassip = no
hasvoicemail = yes
mailbox = $exten
threewaycalling = yes
vmsecret = $exten
signalling = $sig
dahdichan = $num
registeriax = no
registersip = no
canreinvite = no
EOF
}
sub generate($) {
my $self = shift || die;
my $file = $self->{FILE};
my $gconfig = $self->{GCONFIG};
my $genopts = $self->{GENOPTS};
#$gconfig->dump;
my @spans = @_;
warn "Empty configuration -- no spans\n" unless @spans;
rename "$file", "$file.bak"
or $! == 2 # ENOENT (No dependency on Errno.pm)
or die "Failed to backup old config: $!\n";
print "Generating $file\n" if $genopts->{verbose};
open(F, ">$file") || die "$0: Failed to open $file: $!\n";
my $old = select F;
print <<"HEAD";
;!
;! Automatically generated configuration file
;! Filename: @{[basename($file)]} ($file)
;! Generator: $0
;! Creation Date: @{[scalar(localtime)]}
;! If you edit this file and execute $0 again,
;! your manual changes will be LOST.
;!
[general]
;
; Starting point of allocation of extensions
;
userbase = @{[$gconfig->{'base_exten'}+1]}
;
; Create voicemail mailbox and use use macro-stdexten
;
hasvoicemail = yes
;
; Set voicemail mailbox @{[$gconfig->{'base_exten'}+1]} password to 1234
;
vmsecret = 1234
;
; Create SIP Peer
;
hassip = no
;
; Create IAX friend
;
hasiax = no
;
; Create Agent friend
;
hasagent = no
;
; Create H.323 friend
;
;hash323 = yes
;
; Create manager entry
;
hasmanager = no
;
; Remaining options are not specific to users.conf entries but are general.
;
callwaiting = yes
threewaycalling = yes
callwaitingcallerid = yes
transfer = yes
canpark = yes
cancallforward = yes
callreturn = yes
callgroup = 1
pickupgroup = 1
localextenlength = @{[length($gconfig->{'base_exten'})]}
HEAD
my @fxo_ports = ();
$ExtenNum = $self->{GCONFIG}->{'base_exten'};
foreach my $span (@spans) {
printf "; Span %d: %s %s\n", $span->num, $span->name, $span->description;
if ($span->type =~ /^(BRI_(NT|TE)|E1|T1)$/) {
gen_digital_trunk($span);
next;
}
foreach my $chan ($span->chans()) {
if (grep { $_ eq $span->type} ( 'FXS', 'IN', 'OUT' )) {
$self->gen_channel($chan);
} elsif ($chan->type eq 'FXO') {
# TODO: "$first_chan-$last_chan"
push @fxo_ports,($chan->num);
}
}
print "\n";
}
gen_analog_trunk(@fxo_ports);
close F;
select $old;
}
1;
__END__
=head1 NAME
users - Generate configuration for users.conf.
=head1 SYNOPSIS
use Dahdi::Config::Gen::Users;
my $cfg = new Dahdi::Config::Gen::Users(\%global_config, \%genopts);
$cfg->generate(@span_list);
=head1 DESCRIPTION
Generate the F</etc/asterisk/users.conf> which is used by asterisk(1)
and AsteriskGUI. This will replace your entire configuration including
any SIP/IAX users and trunks you may have set. Thus it's probably only
appropriate for an initial setup.
Its location may be overriden via the environment variable F<USERS_FILE>.