git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13998 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Brian West
2009-06-27 00:35:05 +00:00
parent f22fb723db
commit 87e6e63ebb
4 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,252 @@
#!/usr/bin/perl
# Simple script to add XML configuration for FreeSWITCH to use Gizmo5's phone network.
# This software has no support, warranty or liability: use at your own risk.
# Run without arguments for help.
use strict;
sub main () {
my ($command) = parseArgs();
my ($err) = checkArgs($command);
if ($err) {
usage($err);
exit(1);
}
if ($command->{action} && $command->{action} =~ /^add/i) {
if ($command->{object} && $command->{object} =~ /^gateway/i) {
($err) = createGizmo5Gateway($command) unless ($err);
($err) = createGizmo5DialPlan($command) unless ($err);
print "All files are in place. You must restart FreeSWITCH or run the console command: xml_reload\n" unless ($err);
print "for any changes to take effect.\n" unless ($err);
} elsif ($command->{object} && $command->{object} =~ /^callin/i) {
($err) = createGizmo5Callin($command) unless ($err);
print "All files are in place. You must restart FreeSWITCH or run the console command: xml_reload\n" unless ($err);
print "for any changes to take effect.\n" unless ($err);
}
### No support to remove yet.
} elsif ($command->{action} && $command->{action} =~ /^del/i) {
if ($command->{object} && $command->{object} =~ /^gateway/i) {
} elsif ($command->{object} && $command->{object} =~ /^callin/i) {
}
}
if ($err) {
print "Error: $err\n";
exit(1);
}
exit(0);
}
sub createGizmo5Callin($) {
my ($command) = @_;
my $template = <<"END_O_FILE";
<include>
<extension name="Gizmo5 DID SIP_DID">
<condition field="destination_number" expression="SIP_DID">
<action application="transfer" data="SIP_LOCALUSER XML default"/>
</condition>
</extension>
</include>
END_O_FILE
$template =~ s/SIP_LOCALUSER/$command->{extension}/g;
$template =~ s/SIP_DID/$command->{did}/g;
return("Gizmo callin for $command->{did} appears to already exist at $command->{prefix}/conf/dialplan/public/01_gizmo-$command->{did}.xml") if (-e "$command->{prefix}/conf/dialplan/public/01_gizmo-$command->{did}.xml");
open(DEFAULT,">$command->{prefix}/conf/dialplan/public/01_gizmo-$command->{did}.xml") || return ("Unable to open $command->{prefix}/conf/dialplan/public/01_gizmo-$command->{did}.xml");
print DEFAULT $template;
close (DEFAULT);
return();
}
sub createGizmo5DialPlan($) {
my ($command) = @_;
my $template = <<"END_O_FILE";
<!-- Gizmo5 default "catchall" dialplan extension. -->
<!-- Calls to all Gizmo5 users and SIP domains are free. -->
<!-- Callout to PSTN requires an account with a balance. -->
<!-- Visit https://my.gizmo5.com to top-up your accounts. -->
<include>
<extension name="Gizmo5 Default Gateway">
<condition field="destination_number" expression="^(.+)\$">
<action application="bridge" data="sofia/gateway/$command->{username}proxy01.sipphone.com/\$1"/>
</condition>
</extension>
<include>
END_O_FILE
return ("Gizmo Default callout appears to already exist at $command->{prefix}/conf/dialplan/default/01_gizmo-$command->{username}.xml") if (-e "$command->{prefix}/conf/dialplan/default/01_gizmo-$command->{username}.xml");
open(DEFAULT,">$command->{prefix}/conf/dialplan/default/01_gizmo-$command->{username}.xml") || return("Unable to open $command->{prefix}/conf/dialplan/default/01_gizmo-$command->{username}.xml");
print DEFAULT $template;
close (DEFAULT);
$template = <<"END_O_FILE";
<!-- Gizmo5 default SIP Number -->
<!-- This allows you to route incoming calls from your Gizmo5 account -->
<!-- to extension SIP_LOCALUSER. -->
<!-- You can use more logic to route from here. -->
<include>
<extension name="Gizmo5 Default Callin">
<condition field="destination_number" expression="SIP_DID">
<action application="transfer" data="SIP_LOCALUSER XML default"/>
</condition>
</extension>
</include>
END_O_FILE
$template =~ s/SIP_DID/$command->{username}/g;
$template =~ s/SIP_LOCALUSER/$command->{extension}/g;
return("Gizmo Default callin appears to already exist at $command->{prefix}/conf/dialplan/public/01_gizmo-$command->{username}.xml") if (-e "$command->{prefix}/conf/dialplan/public/01_gizmo-$command->{username}.xml");
open(DEFAULT,">>$command->{prefix}/conf/dialplan/public/01_gizmo-$command->{username}.xml") || return("Unable to open $command->{prefix}/conf/dialplan/public/01_gizmo-$command->{username}.xml");
print DEFAULT $template;
close (DEFAULT);
return();
}
sub createGizmo5Gateway($) {
my ($command) = @_;
my $template = <<"END_O_FILE";
<!-- Gizmo5 SIP Registration -->
<!-- This is required for FreeSWITCH to work with Gizmo5 -->
<include>
<user id="\$\${default_provider}\">
<gateways>
<gateway name="SIP_USERproxy01.sipphone.com">
<param name="username" value="SIP_USER"/>
<param name="from-domain" value="proxy01.sipphone.com"/>
<param name="password" value="SIP_PASS"/>
<param name="caller-id-in-from" value="false"/>
<param name="proxy" value="proxy01.sipphone.com"/>
<param name="expire-seconds" value="3600"/>
<param name="register-transport" value="tcp"/>
<param name="register" value="true"/>
<param name="retry_seconds" value="3600"/>
</gateway>
</gateways>
</user>
</include>
END_O_FILE
$template =~ s/SIP_USER/$command->{username}/g;
$template =~ s/SIP_PASS/$command->{password}/;
return "Gizmo Gateway appears to already exist at $command->{prefix}/conf/directory/default/01_gizmo-$command->{username}.xml" if (-e "$command->{prefix}/conf/directory/default/01_gizmo-$command->{username}.xml");
open(GIZMO,">$command->{prefix}/conf/directory/default/01_gizmo-$command->{username}.xml") || return ("Unable to open $command->{prefix}/conf/directory/default/01_gizmo-$command->{username}.xml to write");
print GIZMO $template;
close(GIZMO);
return();
}
sub checkArgs($) {
my ($command) = @_;
my ($err) = 0;
return("Bad Action") if (!defined $command->{action} || $command->{action} !~ /^(add)/);
return("Bad Object") if (!defined $command->{object} || $command->{object} !~ /^(gateway|callin)$/i);
return("Bad Username") if ($command->{action} && $command->{action} =~ /^add/i && (!defined $command->{username} || $command->{username} !~ /^1747\d{7}$/));
return("Bad Extension") if ($command->{action} && $command->{action} =~ /^add/i && (!defined $command->{extension} || $command->{extension} eq '' ));
return("No Password Given") if ($command->{action} && $command->{action} =~ /^add/i && $command->{object} && $command->{object} =~ /^gateway/i && (!defined $command->{password} || $command->{password} eq ''));
return("No Local Extension Given") if ($command->{action} && $command->{action} =~ /^add/i && $command->{object} && $command->{object} =~ /^callin/i && (!defined $command->{extension} || $command->{extension} eq ''));
return("DID must be purely numeric") if ($command->{action} && $command->{action} =~ /^add/i && $command->{object} && $command->{object} =~ /^callin/i && (!defined $command->{did} || $command->{did} !~ /^\d+$/));
return("Cannot find FreeSWITCH install at $command->{prefix}") unless (-e "$command->{prefix}/conf" && -d "$command->{prefix}/conf");
return("Cannot write to FreeSWITCH install at $command->{prefix}") unless (-w "$command->{prefix}/conf");
return();
}
sub parseArgs() {
my $command;
foreach (@ARGV) {
if (/^(.*)=(.*)/) {
$command->{lc($1)} = $2;
}
}
$command->{action} = $ARGV[0] || undef;
$command->{object} = $ARGV[1] || undef;
$command->{prefix} = '/usr/local/freeswitch' unless ($command->{prefix} && $command->{prefix} ne '');
return ($command);
}
sub usage($) {
my ($err) = @_;
print STDERR "$err\n" if ($err);
print STDERR "Usage: ./FreeSWITCH-GizmoConfig.pl action object [arguments [...]]\n";
print STDERR "Valid actions:\n";
print STDERR "add gateway username=1747NNNNNNN password=xxxxxx extension=YourExtension [prefix=/usr/local/freeswitch]\n";
print STDERR "add callin did=NNNNNNNNN extension=YourExension [prefix=/usr/local/freeswitch]\n";
print STDERR "\n";
print STDERR "Example of adding user 17472075873:\n";
print STDERR "./FreeSWITCH-Gizmo.pl add gateway username=17472075873 password=Secret extension=1001\n";
print STDERR "\n";
print STDERR "Adding support for a US callin Number: +1-858-625-0499 (You must add a user that purchased the number to receive calls):\n";
print STDERR "./FreeSWITCH-Gizmo.pl add callin did=18586250499 extension=1001\n";
print STDERR "\n";
print STDERR "Adding support for a UK or other International callin Number: +44 20 7499-9000 :\n";
print STDERR "./FreeSWITCH-Gizmo.pl add callin did=442074999000 extension=brian\n";
}
main();

View File

@@ -0,0 +1,49 @@
#!/usr/bin/perl -w
use strict;
=head1 NAME
combineconf.pl - expand #include PIs in a freeswitch conf file
=head1 SYNOPSIS
# cd conf
# ../scripts/combineconf.pl freeswitch.xml > freeswitch_combined.xml
=head1 DESCRIPTION
This is recursive, and will take multiple input files on the command line.
You need to run it from the working directory that the relative include paths
except to be resolved from.
=head1 AUTHOR
Mark D. Anderson (mda@discerning.com)
Released under same terms as Perl, or alternatively the MPL.
=cut
use IO::File;
sub filter_file {
my ($f) = @_;
my $fh = $f eq '-' ? \*STDIN : IO::File->new($f, 'r');
die "ERROR: Can't open $f: $!\n" unless $fh;
while(<$fh>) {
if (m/<!--#include\s+"(.*?)"/) {
filter_file($1);
}
else {print;}
}
undef $fh;
}
sub main {
die "Usage: $0 file1 ...\nCombined output goes to stdout. Use '-' as the filename to use stdin." unless @ARGV;
for(@ARGV) {
filter_file($_);
}
}
main();

View File

@@ -0,0 +1,43 @@
#!/usr/bin/perl
use Time::Local;
my $file = shift;
my $start = shift;
my $stop = shift;
sub parse_date($) {
my $str = shift;
if (my ($yr, $mo, $day, $hr, $min, $sec) = $str =~ /(\d{4})\-(\d{2})\-(\d{2}) (\d{2})\:(\d{2})\:(\d{2})/) {
return timelocal($sec, $min, $hr, $day - 1, $mo - 1, $yr);
} else {
die $str;
}
}
if ($start =~ /\:/) {
$start = parse_date($start);
}
if ($stop =~ /\:/) {
$stop = parse_date($stop);
} elsif ($stop =~ /^\+(\d+)/) {
$stop = $start + $1;
}
open(I, $file);
while (<I>) {
my $str = $_;
$epoch = parse_date($str);
if ($epoch > $start) {
if ($stop && $epoch > $stop) {
last;
}
print;
}
}
close(I);