[Freeswitch-svn] [commit] r12898 - freeswitch/trunk/scripts/contrib/mcollins
FreeSWITCH SVN
mcollins at freeswitch.org
Thu Apr 2 16:37:40 PDT 2009
Author: mcollins
Date: Thu Apr 2 18:37:40 2009
New Revision: 12898
Log:
Add chan var scripts (part of janitorial services)
Added:
freeswitch/trunk/scripts/contrib/mcollins/create-chanvars-html-page.pl (contents, props changed)
freeswitch/trunk/scripts/contrib/mcollins/extract-fs-vars-from-source-tree.sh (contents, props changed)
Added: freeswitch/trunk/scripts/contrib/mcollins/create-chanvars-html-page.pl
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/mcollins/create-chanvars-html-page.pl Thu Apr 2 18:37:40 2009
@@ -0,0 +1,240 @@
+#!/usr/bin/perl
+#
+# create-chanvars-html-page.pl
+#
+# Part of the janitorial process. :)
+#
+# NOTE: This script is used in conjunction with the extract-vars-from-source-tree.sh script
+# Do not run this script manually; use the shell script
+# Specify the source and temp directories in that script
+#
+# Goes through a bunch of source files to snag all lines with
+# switch_channel_(s|g)et_variable in *.c files
+# _VARIABLE is *.h files
+#
+# Creates a table of vars aliased in *.h (hash, actually)
+# Then cycles through each line and creates a data struct:
+# key = chan var, val = hashes of source file names
+# sub hashes are:
+# key = src file name, val = Array of Arrays
+# Each sub array has two elements:
+# 0 = line number
+# 1 = 'get' or 'set'
+#
+# example:
+#
+# remote_media_ip => {
+# "mod_esf.c" => [[114, "set"]],
+# "mod_sofia.c" => [[1050, "get"], [1078, "get"]],
+# "sofia_glue.c" => [[2812, "set"]],
+# }
+#
+# Also creates an index based on filename like so in a hash:
+# key = source file name, val = hash of chanvar names
+# sub hashes are:
+# key = chan var name, val = Array of arrays
+# Each sub array has two elements:
+# 0 = line number
+# 1 = 'get' or 'set'
+#
+# example:
+#
+# "mod_nibblebill.c" => {
+# nibble_account => [[334, "get"], [632, "get"]],
+# nibble_rate => [[333, "get"], [540, "get"]],
+# nibble_total_billed => [[411, "set"]],
+# }
+#
+# Finally we create a simple HTML file that lets the user easily click around to Fisheye source
+#
+
+use strict;
+use warnings;
+use Data::Dump qw(dump);
+use File::Basename;
+use Getopt::Long;
+use HTML::Tiny;
+
+$|++;
+
+# Get the cmd line options
+my $srcdir = '/usr/src/freeswitch.trunk';
+my $tmpdir = '/tmp';
+
+## Use these as defaults unless command line args are supplied
+GetOptions( 'srcdir=s' => \$srcdir,
+ 'tmpdir=s' => \$tmpdir,
+);
+
+my $srcdirlen = length $srcdir; # calculate this once since it doesn't change
+
+my $headerfile = $tmpdir . "/header-defs.txt";
+my $datafile = $tmpdir . "/get-set-vars.txt";
+my $htmlfile = "/Users/michaelcollins/Downloads/chanvars.html";
+
+my $site = 'http://fisheye.freeswitch.org/browse/FreeSWITCH';
+
+my $obvious_exceptions; # regex match for channel variable names we don't care about
+$obvious_exceptions = '^(|argv|v?var|var_?name|v?buf|char.*|inner_var_array.*|arg.*|string|tmp_name|[^_]*_var|\(char \*\) vvar)$';
+
+my %switch_types; # key = switch type def, val = chan var name
+my %channel_vars; # key = chan var name, val = HoA
+ # HoA: key = filename, val = [line number, set|get]
+my %source_idx; # key = src file name, val = HoA
+ # HoA: key = var name, val = [line number, set|get]
+my %source_files; # key = source filename, val = fisheye url where link is found
+
+open(FILEIN,"<",$headerfile) or die "$headerfile - $!\n";
+while(<FILEIN>) {
+ chomp;
+ my @RECIN = split /#define /,$_;
+ # debug
+ #print "$RECIN[1] \n";
+ $RECIN[1] =~ s/"//g; # strip quote chars
+ my ($key, $val) = split /\s/,$RECIN[1];
+ $switch_types{$key} = $val;
+}
+close(FILEIN);
+
+# debug
+#print dump(\%switch_types);
+
+open(FILEIN,"<",$datafile) or die "$datafile - $!\n";
+while(<FILEIN>) {
+ chomp;
+ next if m/switch_channel_get_variables/; # get variables != what we want
+ next unless m/switch_channel_(s|g)et_variable\s?\(/;
+ next if m/#define|SWITCH_DECLARE/;
+ next unless m/\.c(pp)?:/; # only c and cpp files for now
+ ## Extract source file name
+ my @RECIN = split /(\.c(pp)?)/,$_; # split on file name.c or name.cpp
+ my ($filename,$dir,$ext) = fileparse($RECIN[0]);
+ $filename .= $RECIN[1]; # append .c or .cpp
+ # debug
+ #print "$filename\n";
+ # trim off the srcdir from beginning of string
+ my $reldir = substr $dir, $srcdirlen;
+ #print "$filename $dir $ext ($reldir)\n";
+ if ( ! exists( $source_files{$filename} ) ) {
+ $source_files{ $filename } = $site . $reldir . $filename;
+ }
+
+ ## Extract line number for this occurrence in this source file
+ my $linenum = 0;
+ if ( $RECIN[3] =~ m/:(\d+):/ ) {
+ $linenum = $1;
+ }
+
+ ## Determine get or set
+ my $setget = 'set';
+ if ( $RECIN[3] =~ m/get_variable/ ) {
+ $setget = 'get';
+ }
+
+ ## Extract variable name
+ # Set is easier than get because splitting on comma does all the work
+ my @temp;
+ if ( $setget eq 'set' ) {
+ @temp = split /,\s*?/,$RECIN[3]; # second elem is channel variable name
+ $temp[1] =~ s/"//g;
+ } else {
+ # get is trickier - need to stop at first close paren
+ @temp = split /,\s+?/,$RECIN[3]; # second elem is channel variable name
+ $temp[1] =~ s/"//g;
+ $temp[1] =~ m/^([A-Za-z_]+)/;
+ $temp[1] = $1;
+ #debug
+ #print "$temp[1]\n";
+ }
+ my $channel_variable_name = $temp[1];
+ $channel_variable_name =~ s/"//g; # strip quote chars
+ $channel_variable_name =~ s/^\s*//; # strip leading whitespace
+ if ( exists( $switch_types{$channel_variable_name} ) ) {
+ ## This isn't actually a channel variable name but rather a def from switch_types.h
+ $channel_variable_name = $switch_types{$channel_variable_name};
+ }
+
+ ## Skip obvious exceptions...
+ next if $channel_variable_name =~ m/$obvious_exceptions/;
+
+ ## populate the hash for this variable, filename and line num & get/set val
+ push @{ $channel_vars{$channel_variable_name}{$filename} }, [$linenum, $setget];
+ push @{ $source_idx{$filename}{$channel_variable_name} }, [$linenum, $setget];
+}
+close(FILEIN);
+
+#debug
+#print dump(\%channel_vars);
+#foreach (sort keys %channel_vars) { print "'$_'\n"; }
+#print dump(\%source_idx) . "\n";
+#print dump(\%source_files) . "\n";
+
+## Test the creation of simple html file
+open(HTML,'>',$htmlfile) or die "$htmlfile - $!\n";
+my $h = HTML::Tiny->new;
+my @links; # contains the links for the HTML::Tiny p and a tags
+
+## Header Row
+#push @links, $h->tr( [ $h->th( 'Channel Variable', 'Source File', 'Links') ] );
+
+## Data Rows
+## NOTE: This does a case-insensitive sort
+foreach my $chanvar ( sort {lc $a cmp lc $b} keys %channel_vars ) {
+ my %this_var = %{ $channel_vars{$chanvar} };
+
+ ## Cycle through each source file for this chan var
+ foreach ( sort keys %this_var ) {
+ ## These keys are source file names
+ my @row = (
+ $chanvar,
+ $h->a( {
+ href => $source_files{$_}, target => '_blank',
+ },
+ $_
+ )
+ );
+ my $sourcename = $_;
+ foreach ( @{ $this_var{$_} } ) {
+ #$row[2] .= "@{ $_ }" . "<br/>";
+ my $linkname = "@{ $_ }";
+ my $linenum = @{ $_ }[0];
+ my $url = $source_files{$sourcename} . '?r=9999999#l' . $linenum;
+ $row[2] .= $h->a( { href => $url, target => '_blank' },
+ $linkname
+ ) . '<br/>';
+ }
+ push @links, $h->tr( [ $h->td(@row) ] );
+ }
+
+}
+
+## debug
+#print dump(\@links) . "\n";
+
+## Create a table
+my $table = $h->table(
+ {
+ border => 1, cellspacing => 5, cellpadding => 1,
+ },
+ [
+ $h->tr( [ $h->th( 'Channel Variable', 'Source File', 'Links') ] ),
+ @links,
+ ]
+);
+
+## Create the HTML
+print HTML $h->html(
+ [
+ $h->head( $h->title( 'FreeSWITCH Source Files' ) ),
+ $h->body(
+ [
+ $h->h1( { class => 'main' }, 'FreeSWITCH Channel Variables' ),
+ $table,
+ ]
+ )
+ ]
+);
+
+close(HTML);
+
+print "Operation complete\n";
Added: freeswitch/trunk/scripts/contrib/mcollins/extract-fs-vars-from-source-tree.sh
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/mcollins/extract-fs-vars-from-source-tree.sh Thu Apr 2 18:37:40 2009
@@ -0,0 +1,23 @@
+#!/bin/sh
+#
+# extract-fs-vars-from-source-tree.sh
+#
+# Walks the FreeSWITCH source tree
+#
+#
+# NOTES
+# Be sure to specify your source and temp directories below
+# Also, make this script and create-chanvars-html-page.pl executable
+#
+# MC 2009-04-02
+
+# Change these vars if your source directory is different
+SRCDIR=/usr/usr/freeswitch.trunk
+TMPDIR=/tmp
+
+# Grep the variables, then grep the aliases in the header files
+grep -rn "[sg]et_variable(" $SRCDIR/* | grep -v Binary | grep -v svn > $TMPDIR/get-set-vars.txt
+grep -n "_VARIABLE" $SRCDIR/src/include/*h > $TMPDIR/header-defs.txt
+
+# launch perl script here
+./extract-fs-chanvars.pl --srcdir=$SRCDIR --tmpdir=$TMPDIR
\ No newline at end of file
More information about the Freeswitch-svn
mailing list