Hi Bastian,
a perl module is brilliant idea. I would call it 'perl' to be clear that
adds Perl extensions to OpenSER, same as we did with mysql/postgres ...
Such a module will bring lot of flexibility and powerful functionality
to configuration.
See my other comments inline.
On 11/14/06 12:23, Bastian Friedrich wrote:
Dear OpenSER developer community,
Before starting with my questions, I'd first like to shortly introduce myself.
I've been studying computer sciences in Freiburg, Germany, for (quite) a while
now and now am writing my diploma thesis for the chair of communication
systems. The work itself is done here at Collax GmbH, an up-and-coming young
Linux company with future interest in VoIP technology.
The outcome of my work is to be published as Open Source. I'm looking forward
to see my code in the main OpenSER tree some time :)
Initial intent
==============
The initial topic of my thesis was to provide LDAP access for OpenSER, esp.
for the alias and user database. Unfortunately, the current model is
restricted to a relational database model; introducing a configurable LDAP
backend would probably only be possible by rewriting the modules in concern,
as the definition of data paths is not a matter of "configuration" in the
common sense, but rather a matter of "programming".
Solution
========
The solution to this problem is the implementation of a perl module within
OpenSER. This module will make it possible for OpenSER adminitrators to
implement arbitrary request functions by the means of perl scripts. By adding
an easily usable LDAP interface, alias database requests will (hopefully) be
as easy as a one or two-line request.
New possibilities
=================
A perl module within OpenSER will give a huge amount of new possibilities.
Instead of the hassles included when implementing custom modules, a simply
usable perl interface will provide the means to arbitrarily modify the
routing behavior within OpenSER. Quite possibly, current OpenSER
configuration files /may/ almost completely be rebuilt within perl.
Current state and perspective
=============================
The basic infrastructure for my module is running. Perl is integrated through
it's embedding mechanisms (see "perldoc perlembed"). The reverse direction,
modification of OpenSER structures from within perl, is done via XSUB
defintions. On the perl side, reading (msg->firstline.u.request.uri) and
updating the URI (alias_db's "rewrite_ruri") is already possible; arbitrary
header bodies can be retrieved. There's still lots of work to do, such as a
means to call arbitrary exported functions from other modules. Error handling
behavior is really bad, currently... ;)
I'm planning on implementing these functions:
* Get header names
* Get header list for one name
* Get full header
* Get full body
* Get full message
* Call functions from other modules (through "find_export")
* Rewrite URI
* Modify/Add a header line
Request for comments
====================
A couple of questions are arising during my design, and I'd like to hear your
opinions about them.
* It needs a name! :)) Current suggestions include "perl4ser" and "PerSer"
("Perser" is german for "Persian")
* Structure from the perl view: I'm planing on creating an OpenSER package
plus a number of access packages for the message structures, such as
OpenSER::Message and OpenSER::URI.
* Naming conventions: Would you prefer "perl style" naming conventions, such
as "RewriteRURI(newuri)", or would you rather want OpenSER naming
conventions ("rewrite_ruri(newuri)")?
openser style would integrate better in the scription, maybe prefixed by
'perl_' to be distinctive and suggestive, if you want to export
functions to openser configuration script. If it is about the Perl
library I think Perl-like style is better. So I would like to have (just
as example):
perl_exec("/sbin/script.pl");
and inside "/sbin/script.pl" to be able to use RewriteRURI(newuri). In
this way programming applications will look native in both sides.
* Do you have suggestions for additional functions?
Functions to access some internals of SIP message structure and global
environment would be great, like playing with flags, dst uri, branches,
AVPs, sockets... We can help if you have questions here
* My current "GetHeader" works on arbitrary headers. Header parsing
(parse_headers()) thus is done for all header types; I'm using "~0" (all
ones) as the "flags" parameter. Will this create too much overhead? Should I
restrict the call to certain header types?
Most of processings end up parsing all headers, for example the messages
going through nat processing. But if you can make it work with headers
type is better -- maybe as an improvement in next versions.
Any suggestions for the project are welcome. Let me know how far you're
interested in the "perl idea"; if you just don't mind, you probably don't
want to take any influence... ;)
I would like to play with as soon as possible, even in early stages.
And now... For the questions.
=============================
Unfortunately, I was not yet able to find any "use these functions in your
module" type of documentation.
Maybe it can built along with this case. dokuwiki is a good place to
start a new doc project.
In some cases, it is difficult to gather the
authors' intentions by reading the code :(
All will be glad to help as much as possible and time allows.
* There seems to be a relation between what can be done by the "do_action"
and "append_new_lump" functions. My understanding is that "do_action" is
sort of "typed" (as you add types of actions with parameters),
do_action() is used to execute the functions exported in configuration
script, it is like a generic function where you give the type of
function and parameters.
while the
*_lump functions let you arbitrarily modify the message. Is this correct?
yes, lump functions are used to change content of sip messages.
Add/remove header functions are using them.
In
this case, I'd rather create an interface for the "do_action" function...?
This should have higher priority, since there is no export of *_lump
functions for directly usage in configuration script.
* Is it correct that there are not too many negative effects when
calling "parse_headers" multiple times? The function will know that it
already parsed the header types concerned and (more or less) instantly
return - correct?
Should be no negative effect, parse functions should detect and return
immediately if the header was parsed already.
* After calling parse_headers and parse_sip_msg_uri, most "global" parsing
should be done, i.e. the header fields plus RURI are available. Other
parsing functions (e.g. parse_content_disposition,
parse_content_length, ...) are rarely necessary. Right or wrong?
yes
How
expensive are parse_headers
this is not very expensive, it parse the header in (name, body)
structure mainly. Just few of them do parsing of header content, and
those are parsed by default most of the time.
and parse_sip_msg_uri? Would you say it is
alright to always call these functions?
I do not know what you mean by 'always' -- if is needed, sure it is alright.
Looking forward to first version.
Cheers,
Daniel
I'll probably return with more questions during the next couple of months...
Thx a lot for your time and interest,
Bastian
_______________________________________________
Devel mailing list
[email protected]
http://openser.org/cgi-bin/mailman/listinfo/devel