LINUX.ORG.RU

freeradius 3 + rlm_perl + mysql

 , ,


0

3

Всем привет. В freeradius 2 была такая ф-ция CLONE, в которой можно было инициализировать db коннектор. В freeradius 3 её , я так понял не стало. Вывернулся объявив:

use vars qw(%RAD_REQUEST %RAD_REPLY %RAD_CHECK $db);
...
sub DBCONN {
    if ( ! defined $db ){
        $db = DBI->connect("dbi:mysql:dbname=".DB_NAME.";host=".DB_HOSTNAME, DB_USER, DB_PASS, {'RaiseError' => 1});
    if ($DBI::err) {
            &ERROR("DB Connect Error. $DBI::errstr");
    }
    else {
        &INFO("DB Connect Success");
    }
    }
}

и вызываю DBCONN в каждой процедуре: authorize, accounting_start, accounting и т.д. Это есть правильно или надо както по другом? Спасибо

★★

Ответ на: комментарий от pinachet

Посмотрел, имхо не очень - в каждой процедуре: authorize, accounting_start, accounting и т.д. есть вызов my ($db, $nas) = sql_connect(); т.е. каждый раз подключается к базе,а это не есть хорошо

PETER ★★
() автор топика
Ответ на: комментарий от pinachet

Вроде нашел косяк, у меня «криво» скорее всего собрался фрирадиус под гентой:
- во второй версии в rlm_perl.c имеется:

static PerlInterpreter *rlm_perl_clone(PerlInterpreter *perl, pthread_key_t *key)
{
	PerlInterpreter *interp;
	UV clone_flags = 0;

	PERL_SET_CONTEXT(perl);

	interp = pthread_getspecific(*key);
	if (interp) return interp;

	interp = perl_clone(perl, clone_flags);
	{
		dTHXa(interp);
	}
#if PERL_REVISION >= 5 && PERL_VERSION <8
	call_pv("CLONE",0);
#endif
	ptr_table_free(PL_ptr_table);
	PL_ptr_table = NULL;

	PERL_SET_CONTEXT(aTHX);
    	rlm_perl_clear_handles(aTHX);

	pthread_setspecific(*key, interp);

	return interp;
} 
- во 3-ей версии в rlm_perl.c имеется:
static PerlInterpreter *rlm_perl_clone(PerlInterpreter *perl, pthread_key_t *key)
{
	int ret;

	PerlInterpreter *interp;
	UV clone_flags = 0;

	PERL_SET_CONTEXT(perl);

	interp = pthread_getspecific(*key);
	if (interp) return interp;

	interp = perl_clone(perl, clone_flags);
	{
		dTHXa(interp);
	}
#  if PERL_REVISION >= 5 && PERL_VERSION <8
	call_pv("CLONE",0);
#  endif
	ptr_table_free(PL_ptr_table);
	PL_ptr_table = NULL;

	PERL_SET_CONTEXT(aTHX);
	rlm_perl_clear_handles(aTHX);

	ret = pthread_setspecific(*key, interp);
	if (ret != 0) {
		DEBUG("rlm_perl: Failed associating interpretor with thread %s", fr_syserror(ret));

		rlm_perl_destruct(interp);
		return NULL;
	}

	return interp;
} 
т.е. вызов CLONE присутствует и там и там, Спасибо, бум думать )

PETER ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.