The other day I shared my script on how to parse Dial Code Tables (DCT) if took the time to convert them to CSV. Well after thinking about it this morning I made a quick change to my code to read in the net.db file (ascii copy of the database) and process routing that way.
Update: I found some coding errors, removed the utilization of external shell commands, and added strict usage.
Redcom version 4.0 R1P1
The Code:
#!/usr/bin/perl # Author: Lance Vermilion # Purpose: Walk through Redcom Dial Code Tables and determine # what entry the digits would hit if it was ran # through a Redcom. # Script: dct.pl # Date: 10/4/2011 # Rev: 0.4 # Syntax: dct.pl # Example: dct.pl dct0 4352348763 ################################################################# ################################################################# # Instructions: # Downlaod the binary configuration to a ascii format on the # Redcom. # rsh /tmp> xld downl;over=yes;downl;exit;log # Cat the net.db and copy/paste this in a local net.db file in the # same folder as dct.pl # cat /sys/net.db # dct.pl will parse net.db and preform all the work needed just # as if it was being processed through the Redcom. ################################################################# ################################################################# # Not supported yet # TYPE (other than dct, rte, int, stn, sup) # SC # PRE (does support any variation of ac- ac+) # POS (does support any variation of ac- ac+) # MARK (does support any variation of ac- ac+) # Next (Only jumps to that dct) # SB # SST # TID # # Pattern that uses a # in the pattern ################################################################# use strict; use Carp; use Data::Dumper; my $dctnumber = "$ARGV[0]"; my $dialeddigits = "$ARGV[1]"; my $file = "net.db"; # DCT to be used that is passed by commandline my $hash_ref = {}; print "Reading \"$file\" file: "; if ( -f "$file" ) { print "[OK]\n"; } else { print "[FAILED]\n"; croak "File: \"$file\" does not exist. :: $!\n"; } # File net.db exists slurp it to an array open(FH, "$file" ) or die "Could not open $file\n"; my @netdbarr = ; sub help() { print "Syntax: dct.pl \n"; print "Example: dct.pl dct0 4352348763\n"; exit; } if ( scalar(@ARGV) ne 2 ) { print "You didn't provide enough variables\n" &help(); } &buildDCThash(); &processDCThash($dctnumber,$dialeddigits,0,0,0); # Sub-routine to print DCT sub printdct ($$$$$$$$) { my $printent = shift; my $printpatt = shift; my $printsc = shift; my $printtype = shift; my $printval = shift; my $printpre = shift; my $printpos = shift; my $printmark = shift; my $printnext = shift; my $printsb = shift; my $printsst = shift; my $printtid = shift; print "ENTRY PATTERN SC TYPE VAL PRE POS MARK NEXT SB/SNU SST/NST TID \n"; format DCTREPORT = @<<<< @<<<<<<<<<<<<<< @< @<<< @<< @<< @<< @<<< @<<< @<<<<< @<<<<<< @<< $printent $printpatt $printsc $printtype $printval $printpre $printpos $printmark $printnext $printsb $printsst $printtid . $~ = 'DCTREPORT'; write; } # Sub-routine to build our hash sub buildDCThash() { my $curdct = ''; my $curgrp = ''; my $currte = ''; for my $netdbline (@netdbarr) { if ( $netdbline =~ /^_dcta\[ (\d+) \] = (.*)/ ) { $curdct = "dct$1"; my ($dctname, $dctqty, undef, undef, undef, undef, $dcttoneable, undef, $dctdialtimer) = split(/,/, $2); $hash_ref->{'dct'}->{$curdct}->{'name'} = $dctname; $hash_ref->{'dct'}->{$curdct}->{'qty'} = $dctqty; $hash_ref->{'dct'}->{$curdct}->{'tonable'} = $dcttoneable; $hash_ref->{'dct'}->{$curdct}->{'dtimer'} = $dctdialtimer; } $netdbline =~ s/,252,/,,/g if $netdbline =~ /^_dctm/; #252 equals blank $netdbline =~ s/220/ac/g if $netdbline =~ /^_dctm/; #220 equals ac if ( $netdbline =~ /^_dctm\[ (\d+) \] = (.*)/ ) { my $ent=$1; my ($patt, $type, $val, $next, $sc, $pre, $pos, $mark, $sb, undef, $sst, undef, $tid) = split(/,/, $2); $patt = '-default-' if $ent eq 0; # net.db stored a blank entry for entry 0 aka -default- so we hard set the value. $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'origpatt'} = $patt; $patt = 'NULL_PATTERN' if $patt eq ''; $patt =~ s/n/[2-9]/g; $patt =~ s/x/[0-9]/g; $patt =~ s/q/[0-4]/g; $patt =~ s/Q/[5-9]/g; $patt =~ s/X/[2-8]/g; $patt =~ s/\~/\\d+/g; $patt =~ s/\*/\\*/g; $patt =~ s/\#/\\#/g; $patt =~ s/\?/[0-9]/g; $patt =~ s/w//g; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'patt'} = $patt; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'sc'} = $sc; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'type'} = $type; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'val'} = $val; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'pre'} = $pre; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'pos'} = $pos; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'mark'} = $mark; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'next'} = $next; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'sb'} = $sb; $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'sst'} = $sst; $tid =~ s/65535//; # similar to VAL, except that the final value 65535 would be reserved for the "blank" case) $hash_ref->{'dct'}->{$curdct}->{'entries'}->{$ent}->{'tid'} = $tid; } # # INCLUDE ROUTE AND GROUP INFORMATION # if ( $netdbline =~ /^_grpatt\[ (\d+), 1 \] = (.*)/ ) { $curgrp = $1; my ( $type1,undef,undef,$grpname,undef,undef,undef ) = split(/,/, $2); #print "$group $type1 $grpname\n"; $hash_ref->{'grp'}->{$curgrp}->{'group'} = $curgrp; $hash_ref->{'grp'}->{$curgrp}->{'type1'} = $type1; $hash_ref->{'grp'}->{$curgrp}->{'grpname'} = $grpname; } if ( $netdbline =~ /^_grpatt\[ (\d+), 3 \] = (.*)/ ) { if ( $curgrp eq $1 ) { my ( $type3,$grptype,undef,undef,undef,undef,undef,undef,undef) = split(/,/, $2); #print "$group,$type3,$grptype\n"; $hash_ref->{'grp'}->{$curgrp}->{'type3'} = $type3; $hash_ref->{'grp'}->{$curgrp}->{'grptype'} = $grptype; } } my $currte = ''; if ( $netdbline =~ /^route\[ (\d+), 1 \] = (.*)/ ) { $currte = "rte$1"; my ( $prefix_digits,undef,undef,undef,$rtename,$alt1,$alt2,$alt3,undef,undef,undef,undef,$catid,undef,undef,undef,undef,undef,undef,undef,$comp,undef,undef,undef,undef,$groupnum,undef,undef,undef,undef,undef,undef,undef ) = split(/,/, $2); $comp =~ s/0x0/off/g; $comp =~ s/0x40/on/g; #print "$route,$prefix_digits,$rtename,$alt1,$alt2,$alt3,$comp,$groupnum\n"; $hash_ref->{'rte'}->{$currte}->{'prefix_digits'} = $prefix_digits; $hash_ref->{'rte'}->{$currte}->{'rtename'} = $rtename; $hash_ref->{'rte'}->{$currte}->{'alt1'} = $alt1; $hash_ref->{'rte'}->{$currte}->{'alt2'} = $alt2; $hash_ref->{'rte'}->{$currte}->{'alt3'} = $alt3; $hash_ref->{'rte'}->{$currte}->{'comp'} = $comp; $hash_ref->{'rte'}->{$currte}->{'groupnum'} = $groupnum; } } } # Sub-routine to process the hash sub processDCThash($$$$$) { # TYPE (DCT type and val (ie. dct6) # Digits (digits to be processed) # Pre (digits to delete from begining of the digit string) # Pos (digits to delete from end of the digit string) # Mark (pass all digits, but read from n place in the digit string) # TYPE from DCT my $TYPE = shift; # Since we wrap back on our self to walk DCTs we need to make sure we exit on types of int,etc if ( $TYPE =~ /^(int|int\d+)/ ) { print "User will be sent to an intercept message\n"; print "#" x 73 . "\n"; exit; } elsif ( $TYPE =~ /^(rte|rte\d+)/ ) { my $tempTYPE = $TYPE; $tempTYPE =~ s/rte//g; print "Digits will be sent to:\n"; print " Primary Route: Route $tempTYPE $hash_ref->{'rte'}->{$TYPE}->{'rtename'}\n"; print " Group $hash_ref->{'rte'}->{$TYPE}->{'groupnum'} $hash_ref->{'grp'}->{$hash_ref->{'rte'}->{$TYPE}->{'groupnum'}}->{'grpname'} Type: $hash_ref->{'grp'}->{$hash_ref->{'rte'}->{$TYPE}->{'groupnum'}}->{'type1'},$hash_ref->{'grp'}->{$hash_ref->{'rte'}->{$TYPE}->{'groupnum'}}->{'type3'}\n"; print " Inserted Prefix Digits: $hash_ref->{'rte'}->{$TYPE}->{'prefix_digits'}\n" if $hash_ref->{'rte'}->{$TYPE}->{'prefix_digits'} ne ''; if ( $hash_ref->{'rte'}->{$TYPE}->{'alt1'} ne 0 ) { my $tmpalt1rte = "rte" . $hash_ref->{'rte'}->{$TYPE}->{'alt1'}; my $tmpalt1grp = $hash_ref->{'rte'}->{$tmpalt1rte}->{'groupnum'}; print " Alternate Route #1: Route $hash_ref->{'rte'}->{$TYPE}->{'alt1'} $hash_ref->{'rte'}->{$tmpalt1rte}->{'rtename'}\n"; print " Group $tmpalt1grp $hash_ref->{'grp'}->{$tmpalt1grp}->{'grpname'} Type: $hash_ref->{'grp'}->{$tmpalt1grp}->{'type1'},$hash_ref->{'grp'}->{$tmpalt1grp}->{'type3'}\n"; print " Inserted Prefix Digits: $hash_ref->{'rte'}->{$tmpalt1rte}->{'prefix_digits'}\n" if $hash_ref->{'rte'}->{$tmpalt1rte}->{'prefix_digits'} ne ''; } if ( $hash_ref->{'rte'}->{$TYPE}->{'alt2'} ne 0 ) { my $tmpalt2rte = "rte" . $hash_ref->{'rte'}->{$TYPE}->{'alt2'}; my $tmpalt2grp = $hash_ref->{'rte'}->{$tmpalt2rte}->{'groupnum'}; print " Alternate Route #2: Route $hash_ref->{'rte'}->{$TYPE}->{'alt2'} $hash_ref->{'rte'}->{$tmpalt2rte}->{'rtename'}\n"; print " Group $tmpalt2grp $hash_ref->{'grp'}->{$tmpalt2grp}->{'grpname'} Type: $hash_ref->{'grp'}->{$tmpalt2grp}->{'type1'},$hash_ref->{'grp'}->{$tmpalt2grp}->{'type3'}\n"; print " Inserted Prefix Digits: $hash_ref->{'rte'}->{$tmpalt2rte}->{'prefix_digits'}\n" if $hash_ref->{'rte'}->{$tmpalt2rte}->{'prefix_digits'} ne ''; } if ( $hash_ref->{'rte'}->{$TYPE}->{'alt3'} ne 0 ) { my $tmpalt3rte = "rte" . $hash_ref->{'rte'}->{$TYPE}->{'alt3'}; my $tmpalt3grp = $hash_ref->{'rte'}->{$tmpalt3rte}->{'groupnum'}; print " Alternate Route #3: Route $hash_ref->{'rte'}->{$TYPE}->{'alt3'} $hash_ref->{'rte'}->{$tmpalt3rte}->{'rtename'}\n"; print " Group $tmpalt3grp $hash_ref->{'grp'}->{$tmpalt3grp}->{'grpname'} Type: $hash_ref->{'grp'}->{$tmpalt3grp}->{'type1'},$hash_ref->{'grp'}->{$tmpalt3grp}->{'type3'}\n"; print " Inserted Prefix Digits: $hash_ref->{'rte'}->{$tmpalt3rte}->{'prefix_digits'}\n" if $hash_ref->{'rte'}->{$tmpalt3rte}->{'prefix_digits'} ne ''; } print "#" x 73 . "\n"; exit; } elsif ( $TYPE =~ /^(stn|stn\d+)/ ) { print "Digits will be sent to a local station.\n"; print "#" x 73 . "\n"; exit; } # Account for the fact the user may not provide dct6 and may provide something else. if ( $TYPE !~ /^dct\d+$/ ) { print "Error: The Dial Code Table (DCT) you want to start at must be in this format.\n"; print " dct\n"; print " Example: dct0\n"; my $loop = 0; until ( $TYPE =~ /^dct\d+$/ ) { print "Re-Enter your DCT: "; chomp($TYPE = ); $loop++; if ($loop >= 3) { print "Exiting!!! You failed to enter the DCT correctly 3 times.\n"; exit; } } } # numbers dialed my $digits = shift; chomp($digits); # Adjust digits based on pre, pos, and mark my $pre = shift; my $pos = shift; my $mark = shift; $digits = substr($digits, $pre) if ( $pre > 0 ); $digits = substr($digits, -$pos) if ( $pos > 0 ); $digits = substr($digits, $mark) if ( $mark > 0 ); my $curdct = ''; # Create a pattern hash keyed by pattern with entry and value my $patt_ref = {}; for my $key ( sort keys %{$hash_ref->{'dct'}->{$TYPE}->{'entries'}} ) { $patt_ref->{$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$key}->{'origpatt'}} = $key; } print "\n" . "#" x 73 . "\n"; print "Processing " . length($digits) . " Digit Dialed Number \"$digits\"\n"; my $charcnt = 0; # Print DCT in really short form my $tmpTYPE = $TYPE; $tmpTYPE =~ s/dct//g; print "DCT Number = $tmpTYPE\n"; print "DCT Name = $hash_ref->{'dct'}->{$TYPE}->{'name'}\n"; print "DCT Entry Quantity = $hash_ref->{'dct'}->{$TYPE}->{'qty'}\n"; print "DCT Toneable = $hash_ref->{'dct'}->{$TYPE}->{'tonable'}\n"; print "DCT Dial Timer = " . $hash_ref->{'dct'}->{$TYPE}->{'dtimer'}/100 . " seconds\n"; print "=" x 73 . "\n"; print "ENTRY PATTERN PATTERN (as seen by Perl)\n"; for my $key ( sort { $a $b } keys %{$hash_ref->{'dct'}->{$TYPE}->{'entries'}} ) { printf ("%-5s %-14s %s\n", $key,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$key}->{'origpatt'},($hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$key}->{'patt'})); } print "=" x 73 . "\n"; # Check for an exact match first for my $patt_orig (sort keys %$patt_ref) { my $dctentry = $patt_ref->{$patt_orig}; my $patt = $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'patt'}; if ( $dctentry eq 0 ) { next; } if ( $digits =~ /^$patt$/ ) { print " * Found exact match!\n"; &printdct($dctentry,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'origpatt'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'sc'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'val'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pre'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pos'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'mark'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'next'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'sb'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'sst'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'tid'}); print "#" x 73 . "\n"; if ( $hash_ref->{'dct'}->{$dctentry}->{'type'} eq 'sup' ) { print "User will be sent to a DCT equal to the Next field with Supervision\n"; print "#" x 73 . "\n"; $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'} = 'dct'; $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'val'} = $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'next'} } &processDCThash("$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'}$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'val'}",$digits,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pre'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pos'},length($patt)); } else { if ( substr($digits, 0, length($hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'origpatt'})) =~ /^$patt$/ ) { print " * Found DbyD exact match!\n"; &printdct($dctentry,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'origpatt'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'sc'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'val'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pre'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pos'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'mark'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'next'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'sb'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'sst'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'tid'}); print "#" x 73 . "\n"; if ( $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'} eq 'sup' ) { print "User will be sent to a DCT equal to the Next field with Supervision\n"; print "#" x 73 . "\n"; $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'} = 'dct'; $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'val'} = $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'next'} } &processDCThash("$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'type'}$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'val'}",$digits,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pre'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{$dctentry}->{'pos'},length($patt)); } } } print " * No match using Default.\n"; &printdct(0,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'origpatt'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'sc'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'type'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'val'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'pre'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'pos'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'mark'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'next'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'sb'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'sst'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'tid'}); print "#" x 73 . "\n"; if ( $hash_ref->{'dct'}->{'0'}->{'type'} eq 'sup' ) { print "User will be sent to a DCT equal to the Next field with Supervision\n"; print "#" x 73 . "\n"; $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'type'} = 'dct'; $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'val'} = $hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'next'} } &processDCThash("$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'type'}$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'val'}",$digits,$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'pre'},$hash_ref->{'dct'}->{$TYPE}->{'entries'}->{'0'}->{'pos'},0); } # make sure we exit incase we don't make it into the subroutines exit;
Sample output: Traffic routes to a local station.
Reading "net.db" file: [OK] ######################################################################### Processing 10 Digit Dialed Number "6235951206" DCT Number = 0 DCT Name = "Loop Originate" DCT Entry Quantity = 10 DCT Toneable = dial DCT Dial Timer = 7 seconds ========================================================================= ENTRY PATTERN PATTERN (as seen by Perl) 0 -default- -default- 1 * \* 2 # \# 3 911 911 4 zxxxx z[0-9][0-9][0-9][0-9] 5 1nxxnxxxxxx 1[2-9][0-9][0-9][2-9][0-9][0-9][0-9][0-9][0-9][0-9] 6 011~w 011\d+ 7 011~# 011\d+\# 8 1800nxxxxxx 1800[2-9][0-9][0-9][0-9][0-9][0-9][0-9] 9 NULL_PATTERN ========================================================================= * No match using Default. ENTRY PATTERN SC TYPE VAL PRE POS MARK NEXT SB/SNU SST/NST TID 0 -default- 0 dct 6 0 0 0 0 0 ######################################################################### ######################################################################### Processing 10 Digit Dialed Number "6235951206" DCT Number = 6 DCT Name = "NPA Check" DCT Entry Quantity = 10 DCT Toneable = sil DCT Dial Timer = 7 seconds ========================================================================= ENTRY PATTERN PATTERN (as seen by Perl) 0 -default- -default- 1 623 623 2 480 480 3 xxx [0-9][0-9][0-9] 4 NULL_PATTERN 5 NULL_PATTERN 6 NULL_PATTERN 7 NULL_PATTERN ========================================================================= * Found DbyD exact match! ENTRY PATTERN SC TYPE VAL PRE POS MARK NEXT SB/SNU SST/NST TID 1 623 0 dct 7 0 0 ac 0 0 ######################################################################### ######################################################################### Processing 7 Digit Dialed Number "5951206" DCT Number = 7 DCT Name = "Switch Code Check" DCT Entry Quantity = 7 DCT Toneable = sil DCT Dial Timer = 7 seconds ========================================================================= ENTRY PATTERN PATTERN (as seen by Perl) 0 -default- -default- 1 959 959 2 595 432 3 738 738 4 525 525 5 nxxxxxx [2-9][0-9][0-9][0-9][0-9][0-9][0-9] ========================================================================= * Found DbyD exact match! ENTRY PATTERN SC TYPE VAL PRE POS MARK NEXT SB/SNU SST/NST TID 2 595 0 dct 8 0 0 ac 0 0 ######################################################################### ######################################################################### Processing 4 Digit Dialed Number "1206" DCT Number = 8 DCT Name = "Local Numbers" DCT Entry Quantity = 20 DCT Toneable = sil DCT Dial Timer = 7 seconds ========================================================================= ENTRY PATTERN PATTERN (as seen by Perl) 0 -default- -default- 1 1155 1155 2 11xx 11[0-9][0-9] 3 12xx 12[0-9][0-9] 4 25xx 25[0-9][0-9] 5 26xx 26[0-9][0-9] 6 93xx 93[0-9][0-9] 7 94xx 94[0-9][0-9] 8 95xx 95[0-9][0-9] 9 xxxx [0-9][0-9][0-9][0-9] ========================================================================= * Found exact match! ENTRY PATTERN SC TYPE VAL PRE POS MARK NEXT SB/SNU SST/NST TID 3 12xx 0 stn 0 0 0 ac 0 0 ######################################################################### Digits will be sent to a local station. #########################################################################
Sample Output: Traffic goes out a Trunk to PSTN
Reading "net.db" file: [OK] ######################################################################### Processing 11 Digit Dialed Number "16134321209" DCT Number = 0 DCT Name = "Loop Originate" DCT Entry Quantity = 15 DCT Toneable = dial DCT Dial Timer = 7 seconds ========================================================================= ENTRY PATTERN PATTERN (as seen by Perl) 0 -default- -default- 1 * \* 2 # \# 3 911 911 4 zxxxx z[0-9][0-9][0-9][0-9] 5 1480nxxxxxx 1480[2-9][0-9][0-9][0-9][0-9][0-9][0-9] 6 1602nxxxxxx 1602[2-9][0-9][0-9][0-9][0-9][0-9][0-9] 7 1623nxxxxxx 1623[2-9][0-9][0-9][0-9][0-9][0-9][0-9] 8 1nxxnxxxxxx 1[2-9][0-9][0-9][2-9][0-9][0-9][0-9][0-9][0-9][0-9] 9 011~w 011\d+ 10 011~# 011\d+\# 11 1800nxxxxxx 1800[2-9][0-9][0-9][0-9][0-9][0-9][0-9] 12 NULL_PATTERN ========================================================================= * Found exact match! ENTRY PATTERN SC TYPE VAL PRE POS MARK NEXT SB/SNU SST/NST TID 8 1nxxnxxxxxx 0 rte 1 0 0 0 0 0 ######################################################################### Digits will be sent to: Primary Route: Route 1 "Primary PSTN" Group 8 "PRI Span 1/0" Type: trk,trk Alternate Route #1: Route 7 "Secondary PSTN" Group 6 "PRI Span 1/1" Type: trk,trk #########################################################################