From 908c836a2f65d2410800f01518a6039e49028902 Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Sun, 1 Mar 2009 14:29:03 +0000 Subject: xpp-dahdi: freepbx code generation; better procfs compatibility * dahdi_genconf -F will generate chan_dahdi.conf for freepbx (like genzaptelconf -F) * Better procfs compatibility for xpp modules. git-svn-id: http://svn.asterisk.org/svn/dahdi/tools/trunk@6057 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- xpp/dahdi_genconf | 34 +++++++++++-- xpp/perl_modules/Dahdi/Config/Gen/Chandahdi.pm | 5 +- xpp/perl_modules/Dahdi/Xpp/Xbus.pm | 63 +++++++++++++++++++---- xpp/perl_modules/Dahdi/Xpp/Xpd.pm | 70 +++++++++++++++++++------- 4 files changed, 136 insertions(+), 36 deletions(-) (limited to 'xpp') diff --git a/xpp/dahdi_genconf b/xpp/dahdi_genconf index 0c117db..cba1963 100755 --- a/xpp/dahdi_genconf +++ b/xpp/dahdi_genconf @@ -16,6 +16,9 @@ use Dahdi; use Dahdi::Xpp; use Dahdi::Config::GenconfDefaults; +my $version = '1'; # Functionality version (integer) +my $revision = '$Revision$'; + my %opts; my $genconf_defaults; @@ -72,6 +75,7 @@ my $echo_can = 'mg2'; my %global_config = ( 'genconf_file' => 'HARD-CODED-DEFAULT', # GenconfDefaults override 'base_exten' => 4000, + 'freepbx' => 'no', # Better via -F command line 'fxs_immediate' => 'no', 'loadzone' => $lc_country, 'defaultzone' => $lc_country, @@ -80,7 +84,7 @@ my %global_config = ( 'bri_hardhdlc' => 'no', 'bri_sig_style' => 'bri_ptmp', 'r2_idle_bits' => '1101', - 'bri_overlapdial' => 'no', + 'brint_overlap' => 'no', 'pri_connection_type' => 'PRI', # PRI or R2 'dahdi_signalling' => \%default_dahdi_signalling, 'chan_dahdi_signalling' => \%default_chan_dahdi_signalling, @@ -89,6 +93,7 @@ my %global_config = ( my %dahdi_default_vars = ( GENCONF_FILE => \$global_config{'genconf_file'}, base_exten => \$global_config{'base_exten'}, + freepbx => \$global_config{'freepbx'}, fxs_immediate => \$global_config{'fxs_immediate'}, fxs_default_start => \$fxs_default_start, lc_country => [ @@ -106,7 +111,7 @@ my %dahdi_default_vars = ( ], group_lines => \$default_group{FXO}, bri_sig_style => \$global_config{'bri_sig_style'}, - bri_overlapdial => \$global_config{'bri_overlapdial'}, + brint_overlap => \$global_config{'brint_overlap'}, pri_termtype => \$pri_termtype, pri_connection_type => \$global_config{'pri_connection_type'}, r2_idle_bits => \$global_config{'r2_idle_bits'}, @@ -147,7 +152,6 @@ sub set_defaults { if($opts{v}) { print "Default parameters from ", $genconf_defaults->{GENCONF_FILE}, "\n"; } - #$genconf_defaults->dump; map_dahdi_defaults(%$genconf_defaults); foreach my $span (@spans) { if($span->is_pri) { @@ -158,12 +162,12 @@ sub set_defaults { foreach my $val (values %default_dahdi_signalling, values %default_chan_dahdi_signalling) { $val =~ s/{fxs_default_start}/$fxs_default_start/g; } + #$genconf_defaults->dump; } sub parse_args { my @default_generators; - getopts('v', \%opts); if (@ARGV) { for my $gen (@ARGV) { push @default_generators, $gen; @@ -214,10 +218,20 @@ sub generate_files(@) { die "Illegal name '$name'\n" unless $name =~ /^\w+$/; $name =~ s/(.)(.*)/\u$1\L$2/; my %genopts = parse_genopts($optstr); + $genopts{'freepbx'} = 'yes' if $opts{'F'}; run_generator($name, \%genopts); } } +getopts('vVF', \%opts) || die "$0: Bad option\n"; +if($opts{'V'}) { + my $revstr = $revision; + $revstr =~ s/[^$]*\$[^:]+:\s*//; + $revstr =~ s/\s*\$.*//; + print "$0: version=$version revision=$revstr\n"; + exit 0; +} + my @default_generators = parse_args; set_defaults; generate_files @default_generators; @@ -269,8 +283,18 @@ Global options: =over 4 +=item -V + +Version -- print version string and exit. + =item -v -Verbose -- also sets the C<'verbose'> option for all generators. +Verbose -- sets the C<'verbose'> option for all generators. + +=item -F + +Freepbx -- sets the C<'freepbx'> option for all generators. +Currently, chandahdi is affected. + =back diff --git a/xpp/perl_modules/Dahdi/Config/Gen/Chandahdi.pm b/xpp/perl_modules/Dahdi/Config/Gen/Chandahdi.pm index acb74d7..f48455d 100644 --- a/xpp/perl_modules/Dahdi/Config/Gen/Chandahdi.pm +++ b/xpp/perl_modules/Dahdi/Config/Gen/Chandahdi.pm @@ -155,7 +155,7 @@ HEAD $self->gen_digital($span); } else { foreach my $chan ($span->chans()) { - if($genopts->{'freepbx'}) { + if(is_true($genopts->{'freepbx'}) || is_true($gconfig->{'freepbx'})) { # Freepbx has its own idea about channels my $type = $chan->type; if($type eq 'FXS' || $type eq 'OUT' || $type eq 'IN') { @@ -208,3 +208,6 @@ Output ports. This is done because these channel definitions need to be generated and inserted into I database anyway. =back + +The I option may be activated also by adding a C line +to the C file. diff --git a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm index 2cae6f8..b7994f8 100644 --- a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm +++ b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm @@ -46,13 +46,16 @@ sub get_xpd_by_number($$) { return $wanted; } +my %file_warned; # Prevent duplicate warnings about same file. + sub xbus_attr_path($$) { my ($busnum, @attr) = @_; foreach my $attr (@attr) { my $file = sprintf "$Dahdi::Xpp::sysfs_astribanks/xbus-%02d/$attr", $busnum; unless(-f $file) { my $procfile = sprintf "/proc/xpp/XBUS-%02d/$attr", $busnum; - warn "$0: OLD DRIVER: missing '$file'. Fall back to '$procfile'\n"; + warn "$0: warning - OLD DRIVER: missing '$file'. Fall back to '$procfile'\n" + unless $file_warned{$attr}++; $file = $procfile; } next unless -f $file; @@ -92,6 +95,40 @@ sub read_attrs() { } } +sub read_xpdnames_old($) { + my $xbus_num = shift || die; + my $pat = sprintf "/proc/xpp/XBUS-%02d/XPD-[0-9][0-9]", $xbus_num; + my @xpdnames; + + #print STDERR "read_xpdnames_old($xbus_num): $pat\n"; + foreach (glob $pat) { + die "Bad /proc entry: '$_'" unless /^.*XPD-([0-9])([0-9])$/; + my $name = sprintf("%02d:%1d:%1d", $xbus_num, $1, $2); + #print STDERR "\t> $_ ($name)\n"; + push(@xpdnames, $name); + } + return @xpdnames; +} + +sub read_xpdnames($) { + my $xbus_num = shift || die; + my $xbus_dir = "$Dahdi::Xpp::sysfs_astribanks/xbus-$xbus_num"; + my $pat = sprintf "%s/xbus-%02d/[0-9][0-9]:[0-9]:[0-9]", $Dahdi::Xpp::sysfs_astribanks, $xbus_num; + my @xpdnames; + + #print STDERR "read_xpdnames($xbus_num): $pat\n"; + foreach (glob $pat) { + die "Bad /sys entry: '$_'" unless m/^.*\/([0-9][0-9]):([0-9]):([0-9])$/; + my ($busnum, $unit, $subunit) = ($1, $2, $3); + my $name = sprintf("%02d:%1d:%1d", $1, $2, $3); + #print STDERR "\t> $_ ($name)\n"; + push(@xpdnames, $name); + } + return @xpdnames; +} + +my $warned_notransport = 0; + sub new($$) { my $pack = shift or die "Wasn't called as a class method\n"; my $num = shift; @@ -116,18 +153,22 @@ sub new($$) { warn "Bad USB transport='$transport' usbdev='$usbdev'\n"; } } - @{$self->{XPDS}} = (); - opendir(D, $xbus_dir) || die "Failed opendir($xbus_dir): $!"; - while(my $entry = readdir D) { - $entry =~ /^([0-9]+):([0-9]+):([0-9]+)$/ or next; - my ($busnum, $unit, $subunit) = ($1, $2, $3); + my @xpdnames; + my @xpds; + if(-e $transport) { + @xpdnames = read_xpdnames($num); + } else { + @xpdnames = read_xpdnames_old($num); + warn "$0: warning - OLD DRIVER: missing '$transport'. Fall back to /proc\n" + unless $warned_notransport++; + } + foreach my $xpdstr (@xpdnames) { + my ($busnum, $unit, $subunit) = split(/:/, $xpdstr); my $procdir = "/proc/xpp/XBUS-$busnum/XPD-$unit$subunit"; - #print STDERR "busnum=$busnum, unit=$unit, subunit=$subunit procdir=$procdir\n"; - my $xpd = Dahdi::Xpp::Xpd->new($self, $unit, $subunit, $procdir, "$xbus_dir/$entry"); - push(@{$self->{XPDS}}, $xpd); + my $xpd = Dahdi::Xpp::Xpd->new($self, $unit, $subunit, $procdir, "$xbus_dir/$xpdstr"); + push(@xpds, $xpd); } - closedir D; - @{$self->{XPDS}} = sort { $a->id <=> $b->id } @{$self->{XPDS}}; + @{$self->{XPDS}} = sort { $a->id <=> $b->id } @xpds; return $self; } diff --git a/xpp/perl_modules/Dahdi/Xpp/Xpd.pm b/xpp/perl_modules/Dahdi/Xpp/Xpd.pm index 297a1d5..e5aed5d 100644 --- a/xpp/perl_modules/Dahdi/Xpp/Xpd.pm +++ b/xpp/perl_modules/Dahdi/Xpp/Xpd.pm @@ -12,6 +12,8 @@ use Dahdi::Utils; use Dahdi::Xpp; use Dahdi::Xpp::Line; +my %file_warned; # Prevent duplicate warnings about same file. + sub xpd_attr_path($@) { my $self = shift || die; my ($busnum, $unitnum, $subunitnum, @attr) = ( @@ -25,7 +27,8 @@ sub xpd_attr_path($@) { unless(-f $file) { my $procfile = sprintf "/proc/xpp/XBUS-%02d/XPD-%1d%1d/$attr", $busnum, $unitnum, $subunitnum; - warn "$0: OLD DRIVER: missing '$file'. Fall back to /proc\n"; + warn "$0: warning - OLD DRIVER: missing '$file'. Fall back to /proc\n" + unless $file_warned{$attr}++; $file = $procfile; } next unless -f $file; @@ -47,13 +50,56 @@ sub xpd_old_gettype($) { return $head; } +sub xpd_old_getspan($) { + my $xpd = shift || die; + my $dahdi_registration = "/proc/xpp/" . $xpd->fqn . "/dahdi_registration"; + open(F, $dahdi_registration) or die "Failed to open '$dahdi_registration': $!"; + my $head = ; + close F; + chomp $head; + return $head; +} + +sub xpd_old_getoffhook($) { + my $xpd = shift || die; + my $summary = "/proc/xpp/" . $xpd->fqn . "/summary"; + my $channels; + + local $/ = "\n"; + open(F, "$summary") || die "Failed opening $summary: $!\n"; + my $head = ; + chomp $head; # "XPD-00 (BRI_TE ,card present, span 3)" + my $offhook; + while() { + chomp; + if(s/^\s*offhook\s*:\s*//) { + s/\s*$//; + $offhook = $_; + $offhook || die "No channels in '$summary'"; + last; + } + } + close F; + return $offhook; +} + +my %attr_missing_warned; # Prevent duplicate warnings + sub xpd_getattr($$) { my $xpd = shift || die; my $attr = shift || die; $attr = lc($attr); - my $file = xpd_attr_path($xpd, lc($attr)); + my $file = $xpd->xpd_attr_path(lc($attr)); + # Handle special cases for backward compat return xpd_old_gettype($xpd) if $attr eq 'type' and !defined $file; + return xpd_old_getspan($xpd) if $attr eq 'span' and !defined $file; + return xpd_old_getoffhook($xpd) if $attr eq 'offhook' and !defined $file; + if(!defined($file)) { + warn "$0: xpd_getattr($attr) -- Missing attribute.\n" if + $attr_missing_warned{$attr}; + return undef; + } open(F, $file) || return undef; my $val = ; close F; @@ -136,29 +182,15 @@ sub new($$$$$) { my $self = { XBUS => $xbus, ID => "$unit$subunit", + FQN => $xbus->name . "/" . "XPD-$unit$subunit", UNIT => $unit, SUBUNIT => $subunit, DIR => $procdir, SYSFS_DIR => $sysfsdir, }; bless $self, $pack; - local $/ = "\n"; - open(F, "$procdir/summary") || die "Missing summary file in $procdir"; - my $head = ; - chomp $head; # "XPD-00 (BRI_TE ,card present, span 3)" - # The driver does not export the number of channels... - # Let's find it indirectly - while() { - chomp; - if(s/^\s*offhook\s*:\s*//) { - my @offhook = split; - @offhook || die "No channels in '$procdir/summary'"; - $self->{CHANNELS} = @offhook; - last; - } - } - close F; - $self->{FQN} = $xbus->name . "/" . "XPD-$unit$subunit"; + my @offhook = split / /, ($self->xpd_getattr('offhook')); + $self->{CHANNELS} = @offhook; my $type = $self->xpd_getattr('type'); my $span = $self->xpd_getattr('span'); $self->{SPANNO} = $span; -- cgit v1.2.3