rlm_python in v3.0.x

Arran Cudbard-Bell a.cudbardb at freeradius.org
Thu May 5 16:06:06 CEST 2016


rlm_python from v3.1.x has been backported to the v3.0.x branch.

This addresses all but 1 of the ~7 rlm_python issues that had accumulated in the issue tracker.

Namely:

- Instantiation and destruction with multiple instances is always clean, and should never result in a SEGV.
- The module is 'threaded', without any side effects (race conditions or crashes).
- Thread Local Storage is now distinct between instances of rlm_python
- Multiple sub interpreters can be used, but this is disabled by default in v3.0.x because of compatibility issues with some C extensions to python.
- Double quotes are no longer escaped.
- Constants are synced with the server constants.

In v3.1.x I also added conversion to proper Python types, i.e. unsigned/signed integers get converted to Python Long numbers, floats get converted to decimals, strings get converted from UTF-8 to UTF-16 (and are binary safe), octet strings are left in their original form (not converted to hex).

Conversion back to C types is still done with string parsing.  That can be addressed by someone sufficiently motivated.  I don't think it's significantly more difficult than conversion to Python types.

Encourage anyone that depends on Python in v3.0.x to test *before* 3.0.12 is released and report any issues.

Thanks to Guillaume Pannatier for all the recent testing and automated test cases, and to all those that opened issues against rlm_python.

No thanks to the Python team for creating an extraordinarily obtuse C API.

My favourite, lease favourite part is this:

		/*
		 *	Initialise a new module, with our default methods
		 */
		inst->module = Py_InitModule3("radiusd", module_methods, "FreeRADIUS python module");
		if (!inst->module) {
		error:
			python_error_log();
			PyEval_SaveThread();
			return -1;
		}

		/*
		 *	Py_InitModule3 returns a borrowed ref, the actual
		 *	module is owned by sys.modules, so we also need
		 *	to own the module to prevent it being freed early.
		 */
		Py_IncRef(inst->module);

Just wow...

-Arran

Arran Cudbard-Bell <a.cudbardb at freeradius.org>
FreeRADIUS Development Team

FD31 3077 42EC 7FCD 32FE 5EE2 56CF 27F9 30A8 CAA2

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 872 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freeradius.org/pipermail/freeradius-users/attachments/20160505/2b0ab235/attachment.sig>


More information about the Freeradius-Users mailing list