[sr-dev] git:ser_modules: - minor ERR message improvment

Andrei Pelinescu-Onciul andrei at iptel.org
Fri Jul 17 17:40:13 CEST 2009


Module: sip-router
Branch: ser_modules
Commit: c13d686fb4b289968c707a1f45fc648f9773eaee
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c13d686fb4b289968c707a1f45fc648f9773eaee

Author: Tomas Mandys <tomas.mandys at iptel.org>
Committer: Tomas Mandys <tomas.mandys at iptel.org>
Date:   Tue Jul 14 16:56:23 2009 +0000

- minor ERR message improvment
- new clean_rtpproxy_attrs script

---

 .../iptrtpproxy/examples/clean_rtpproxy_attrs      |  217 ++++++++++++++++++++
 modules_s/iptrtpproxy/iptrtpproxy.c                |   19 +-
 2 files changed, 226 insertions(+), 10 deletions(-)

diff --git a/modules_s/iptrtpproxy/examples/clean_rtpproxy_attrs b/modules_s/iptrtpproxy/examples/clean_rtpproxy_attrs
new file mode 100755
index 0000000..5c93078
--- /dev/null
+++ b/modules_s/iptrtpproxy/examples/clean_rtpproxy_attrs
@@ -0,0 +1,217 @@
+#!/usr/bin/env perl
+
+# $Id$
+
+# The script cleans up orphaned RTP proxy attributes from rtpproxy_attrs.
+# The orphaned attribute is the attribute having none of its sessions.
+# in iptrtpproxy session list.
+
+use warnings;
+#use strict;
+use DBI;
+
+my $version = "0.1";
+my $defConfigFile = "/etc/iptrtpproxy.cfg";
+my $configFile = $defConfigFile;
+my $verbose = 0;
+
+my $mysqlhost = 'localhost';
+my $mysqldb = 'ser';
+my $mysqluser = 'ser';
+my $mysqlpassword = 'heslo';
+
+use Config::IniFiles;
+
+sub dbg {
+	if ($verbose) {
+		print STDERR "DBG: $_[0]\n";
+	}
+}
+
+sub myexit ($$)
+{
+	my ($msg, $exitcode ) = @_;
+	print "# ERROR: $msg\n";
+	DBI->disconnect_all();
+	exit $exitcode;
+}
+
+
+sub do_exec($) 
+{
+	my $cmd = $_[0];
+	dbg "Exec: $cmd";
+	my @res = `$cmd`;
+	dbg "Exit code: $?";	
+	@res;
+}
+
+
+# parse config file to $cfg
+sub parseConfigFile($)
+{
+	my $fileName = $_[0];
+	dbg "Parsing config file '$fileName'\n" if $verbose;
+	my %switchboards = ();
+	goto ret unless -e $configFile;
+	my $cfg = Config::IniFiles->new( -file => $configFile, -default => "<default>" );
+
+	for my $section ($cfg->Sections) {
+		if ($section =~ /^[a-zA-Z_]+$/) {
+			print STDERR "Parsing section '$section'\n" if $verbose;
+			for my $param ('addr-a', 'addr-b', 'port-a', 'port-b') {
+				my $val = $cfg->val($section, $param);
+				if ($val) {
+					$switchboards{$section}{$param} = $val;
+				}
+			}
+		}
+
+	}
+ret:
+	return %switchboards;
+}
+
+my $scriptName = $0;
+$scriptName =~ s!^.*/!!;
+
+sub printUsage {
+	print "$scriptName, Version: $version\n";
+	print "usage: $scriptName [-f <config>] [-v] [-h] [-H <db_host>] [-D <database_name>] [-u <user>] [-p <password>]\n";
+	
+}
+
+my $command = '';
+my $arg;
+
+while ($#ARGV >= 0) {
+	$arg = shift(@ARGV);
+	if ($arg eq '-f') {
+		if ($#ARGV < 0) {
+			print STDERR "ERROR: config file name required\n";
+			&printUsage();
+			exit(1);
+		} else {
+			$configFile = shift(@ARGV);
+		}
+	} elsif ($arg eq '-D') {
+		if ($#ARGV < 0) {
+			print STDERR "ERROR: database name required\n";
+			&printUsage();
+			exit(1);
+		} else {
+			$mysqldb = shift(@ARGV);
+		}
+	} elsif ($arg eq '-u') {
+		if ($#ARGV < 0) {
+			print STDERR "ERROR: user name required\n";
+			&printUsage();
+			exit(1);
+		} else {
+			$mysqluser = shift(@ARGV);
+		}
+	} elsif ($arg eq '-p') {
+		if ($#ARGV < 0) {
+			print STDERR "ERROR: password required\n";
+			&printUsage();
+			exit(1);
+		} else {
+			$mysqlpassword = shift(@ARGV);
+		}
+	} elsif ($arg eq '-H') {
+		if ($#ARGV < 0) {
+			print STDERR "ERROR: hostname required\n";
+			&printUsage();
+			exit(1);
+		} else {
+			$mysqlhost = shift(@ARGV);
+		}
+	} elsif ($arg eq '-v') {
+		$verbose++;
+	} elsif ($arg eq '-h') {
+		&printUsage();
+		exit(0);
+	} else {
+		print STDERR "ERROR: unknown argument '$arg'\n";
+		&printUsage();
+		exit(1);
+	}	
+}
+
+dbg "Verbose: $verbose";
+
+dbg "Connecting: mysql://$mysqluser\@$mysqlhost/$mysqldb";
+myexit("Cannot connect database", 2) unless my $dbh = DBI->connect("dbi:mysql:database=$mysqldb;host=$mysqlhost", $mysqluser, $mysqlpassword);
+
+dbg "Reading rtpproxy_attrs";
+my %attrs = ();
+# copy rtpproxy_attrs to memory, we need snapshot of table
+$sth = $dbh->prepare("SELECT * FROM rtpproxy_attrs");
+$sth->execute();
+my $i = 0;
+while (my $href = $sth->fetchrow_hashref()) {
+
+	if ($href->{'name'} eq 'dlg_sess_ids') {
+		$attrs{$href->{'id'}} = $href->{'value'};
+		$i++;
+	}
+}
+$sth->finish();
+dbg "rtpproxy_attrs records: $i";
+
+my %cfgSwitchboards = &parseConfigFile($configFile);
+
+my %switchboards = ();
+for my $id (keys %cfgSwitchboards) {
+	dbg "Switchboard: $id";
+	$cmd = "iptrtpproxy list --addr-a $cfgSwitchboards{$id}{'addr-a'} --port-a $cfgSwitchboards{$id}{'port-a'} --addr-b $cfgSwitchboards{$id}{'addr-b'} --port-b $cfgSwitchboards{$id}{'port-b'} --force-switchboard-audit --format tab";
+	my @lines = &do_exec($cmd);
+	my @l = split(/\t/, $lines[0]);
+	my $sess_id = -1;
+	my $tick = -1;
+	for my $i (0..$#l) {
+		if ($l[$i] eq 'sess-id') {
+			$sess_id = $i;
+		} elsif ($l[$i] eq 'created/tick') {
+			$tick = $i;
+		}
+	}
+	dbg "Lines: $#lines, Columns: sess-id: $sess_id, tick: $tick";
+	for my $i (1..$#lines) {
+		my @l = split(/\t/, $lines[$i]);
+		$switchboards{$id}{$l[$sess_id]} = $l[$tick];
+	}
+}
+
+dbg "Clean rtpproxy_attrs";
+# get iptrtpproxy switchboards
+my $delCnt = 0;
+$sth = $dbh->prepare("DELETE FROM rtpproxy_attrs WHERE id=?");
+loop: for my $id (keys %attrs) {
+	# format name:session_id/stamp (, session_id/stamp)*] 
+	my $found = 0;
+	my ($name, $s) = split( /:/, $attrs{$id});
+	if (!defined $s) {
+		goto del;
+	}
+	my @ss = split( /,/, $s);
+	for $i (0..$#ss) {
+		my ($sess_id, $tick) = split ( /\//, $ss[$i]);
+		if ($sess_id eq "" || !defined $tick || $tick eq "") {
+			next;
+		}
+		if ($switchboards{$name}{$sess_id} && $switchboards{$name}{$sess_id} eq $tick) {
+			dbg "Leave: $id=$attrs{$id}";
+			next loop;
+		}
+	}
+del:
+	dbg "Delete: $id=$attrs{$id}";
+	$sth->execute($id);
+	$delCnt++;
+}
+dbg "Deleted: $delCnt records";
+
+exit(0);
+
+
diff --git a/modules_s/iptrtpproxy/iptrtpproxy.c b/modules_s/iptrtpproxy/iptrtpproxy.c
index d8c2bc2..32cfdf6 100644
--- a/modules_s/iptrtpproxy/iptrtpproxy.c
+++ b/modules_s/iptrtpproxy/iptrtpproxy.c
@@ -329,10 +329,10 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
 				}
 				break;
 			invalidate:
-					if (sess_fl == 2) {
-						sess->media[sess->media_count-1].active = 0;
-					}
-					break;
+				if (sess_fl == 2) {
+					sess->media[sess->media_count-1].active = 0;
+				}
+				break;
 			case 'm':
 				/* Media Announcements: m=<media> <port>[/<number of ports>] <transport> <fmt list>, eg. m=audio 49170 RTP/AVP 0 */
 				switch (sess_fl) {
@@ -492,17 +492,17 @@ static int unserialize_ipt_session(str* session_ids, struct ipt_session* sess) {
 	s.len = p-s.s;
 	sess->switchboard = find_switchboard(&s);
 	if (!sess->switchboard) {
-		ERR(MODULE_NAME": unserialize_ipt_session: switchboard '%.*s' not found\n", s.len, s.s);
+		ERR(MODULE_NAME": unserialize_ipt_session: '%.*s', switchboard '%.*s' not found\n", session_ids->len, session_ids->s, s.len, s.s);
 		return -1;
 	}
 	if (p == pend) return 0;
 	if (*p != ':') {
-		ERR(MODULE_NAME": unserialize_ipt_session: colon expected near '%.*s'\n", pend-p, p);
+		ERR(MODULE_NAME": unserialize_ipt_session: '%.*s', colon expected near '%.*s'\n", session_ids->len, session_ids->s, pend-p, p);
 		return -1;
 	}
 	do {
 		if (sess->stream_count >= MAX_MEDIA_NUMBER) {
-		ERR(MODULE_NAME": unserialize_ipt_session: max.media number (%d) exceeded\n", MAX_MEDIA_NUMBER);
+		ERR(MODULE_NAME": unserialize_ipt_session: '%.*s', max.media number (%d) exceeded\n", session_ids->len, session_ids->s, MAX_MEDIA_NUMBER);
 			return -1;
 		}
 		p++;
@@ -512,7 +512,7 @@ static int unserialize_ipt_session(str* session_ids, struct ipt_session* sess) {
 		s.s = p;
 		while (p < pend && (*p >= '0' && *p <= '9')) p++;
 		if (p != pend && *p != '/') {
-			ERR(MODULE_NAME": unserialize_ipt_session: '/' expected near '%.*s'\n", pend-p, p);
+			ERR(MODULE_NAME": unserialize_ipt_session: '%.*s', '/' expected near '%.*s'\n", session_ids->len, session_ids->s, pend-p, p);
 			return -1;
 		}
 		s.len = p-s.s;
@@ -527,7 +527,7 @@ static int unserialize_ipt_session(str* session_ids, struct ipt_session* sess) {
 		while (p < pend && (*p >= '0' && *p <= '9')) p++;
 		if (p != pend && *p != ',') {
 			sess->streams[sess->stream_count-1].sess_id = -1;
-			ERR(MODULE_NAME": unserialize_ipt_session: comma expected near '%.*s'\n", pend-p, p);
+			ERR(MODULE_NAME": unserialize_ipt_session: '%.*s', comma expected near '%.*s'\n", session_ids->len, session_ids->s, pend-p, p);
 			return -1;
 		}
 		s.len = p-s.s;
@@ -732,7 +732,6 @@ static int rtpproxy_update(struct sip_msg* msg, char* _flags, char* _session_ids
 			}
 		}
 	}
-serialize_ipt_session(&ipt_sess, &session_ids);
 	if (update_sdp_content(msg, GATE_A_TO_B(flags), &sdp_sess, &ipt_sess) < 0) {
 		/* delete all sessions ? */
 		return -1;




More information about the sr-dev mailing list