Module perl sous Freeradius

Module perl sous Freeradius - Perl - Programmation

Marsh Posté le 22-01-2007 à 14:02:21    


Salut,
 
Voila, j'ai installé un freeradius sous debian. Comme les données (envoyées par un portail captif) ne sont pas du type: username/password, je dois modifier l'entrée des données. En clair, le portail captif envoie les données au freeradius qui dès le départ (section instantiate) appelle un module perl (preauth.pl) qui modifie les données et les renvoies au freeradius.
 
Dans l'idée tout va bien, sauf que j'ai une erreur de type: "can't return outside a subroutine at ..."
En clair: soit c'est ma ligne "return" qui n'a pas la bonne syntaxe, soit c'est le output_pairs qui n'est pas bon, soit c'est les deux. Le pb, c'est que je viens à peine de commencer le perl, et j'ai eu beau chercher sur google, j'ai pas trouvé quelque chose d'interessant.
 
 
Code interessant du radiud.conf :
 
 exec preauth{
  wait = yes
  input_pairs = request
  output_pairs = reply
  program = "/usr/bin/perl ${confdir}/preauth.pl"
 }    
instantiate {
 
 preauth
}
 
 
Code interessant du preauth.pl :    
$nomutil = $ENV{USER_NAME};
($Organization, $Location, $UserName) = split('_', $nomutil);
$Organization = $Organization."\"";
$Location = "\"".$Location."\"";
$UserName = "\"".$UserName;
$ENV{USER_NAME} = $Organization;
$ENV{Location} =  $Location;
$ENV{Utilisateur} = $UserName;
   
return ("Utilisateur =  $ENV{Utilisateur}", "Location =  $ENV{Location}", "USER_NAME =  $ENV{USER_NAME}" );
 
 
Je compte sur votre aide...  :D   :: croise les doigts ::
 
++

Reply

Marsh Posté le 22-01-2007 à 14:02:21   

Reply

Marsh Posté le 22-01-2007 à 14:12:03    

s'koi ce return là:

Code :
  1. return ("Utilisateur =  $ENV{Utilisateur}", "Location =  $ENV{Location}", "USER_NAME =  $ENV{USER_NAME}" );


ça serait pas un petit print plutôt?

Reply

Marsh Posté le 22-01-2007 à 14:40:23    

anapajari a écrit :

s'koi ce return là:


ça serait pas un petit print plutôt?
 
 

 


J'ai pas besoin d'un affichage, mais juste de renvoyer ces valeur ($ENV{Utilisateur}, $ENV{....) à freeradius. J'ai utilisé cette syntaxe sur un conseil trouvé sur le net. Mais je t'accorde que je trouve ca douteux. (mais quand on a aucune, idée, c'est mieux que rien)  :ange:  
 
 
(ceci dit, j'ai essayé le print. En mode debug de freeradius, ca m'affiche bien tout comme il faut, mais comme le module n'envoie pas les données au freeradius, ca ne marche pas.)

Reply

Marsh Posté le 22-01-2007 à 15:21:43    

t'as jeté un coup d'oeil à ça : http://wiki.freeradius.org/Rlm_perl ?
 
si j'ai bien compris (mais j'ai lu en diagonale et je connais pas freeradius), ton module doit définir un certain nombre de fonctions  que freeradius appelle au moment où il en a besoin.


---------------
TriScale innov
Reply

Marsh Posté le 22-01-2007 à 15:33:51    

J'avais deja vu le lien (ceci dit merci beaucoup de t'y interesser), mais:
- J'utilise pas le module perl intégré à freeradius, mais le module exec d'où j'appelle le module perl. (à priori ca change rien, sauf que si j'avais voulu utiliser le module perl de freeradius j'aurais du recompiler mon freeradius et c'est pas trop au programme étant donné que la dead line arrive)
- Mon module est tout bete en fait, disons qu'au lieu d'avoir un paramètre dans une variable, j'en ai 3 dans une variable. Mon module sert à séparer ces trois paramètres et à les remettres chacun dans une variable puis à rebalancer le tout (donc trois variables) à freeradius. en clair: une variable en entrée, 3 en sortie.

Reply

Marsh Posté le 22-01-2007 à 16:00:21    

OK, alors dans ce cas là il faut sûrement creuser dans le sens d'anapajari : la sortie de ton programme va être utilisée par freeradius pour modifier la valeur des variables.
 
petite question très bête au cas où : lorsque tu as fait tes tests avec un print, tu as bien mis des "\n" à la fin de tes lignes ?


---------------
TriScale innov
Reply

Marsh Posté le 22-01-2007 à 16:18:03    

franceso a écrit :

OK, alors dans ce cas là il faut sûrement creuser dans le sens d'anapajari : la sortie de ton programme va être utilisée par freeradius pour modifier la valeur des variables.

 

petite question très bête au cas où : lorsque tu as fait tes tests avec un print, tu as bien mis des "\n" à la fin de tes lignes ?

 


Mes compétences en perl étant ce qu'elles sont, j'ai simplement réutilisé un bout de code trouvé sur le net:
 
 

Code :
  1. print "Content-type: text/html\n\n";
  2.    print "<tt>\n";
  3.    foreach $key (sort keys(%ENV)) {
  4.       print "$key = $ENV{$key}<p>";
  5.    }


 
Qui me permet d'afficher toutes les variables et donc de vérifier que l'affectation se fait bien. (Viens-je de me ridiculiser?  :sweat: )

Reply

Marsh Posté le 22-01-2007 à 16:30:40    

ok ça a l'air bon ... C'est quoi le problème maintenant?
Là tu le lances la main donc ça doit s'afficher, mais j'imagine que freeradius ( connais absolument pas ce truc hein ;) ) n'attend ni content-type ni les résultats sous cette forme.

 

En fait le truc c'est : ton script perl il est appelé par freeradius ou doit te permettre de "lancer" freeradius avec certains paramètres.?

Message cité 1 fois
Message édité par anapajari le 22-01-2007 à 16:31:06
Reply

Marsh Posté le 22-01-2007 à 16:38:16    

Ca, c'est bien pour afficher tes varaiables d'environnement (bon, tu pourrais enlever les sorties spécifiques HTML, mais c'est pas mal). Le problème de ça, c'est que c'est lisible pour toi mais pas pour freeradius.
 
Essaie un truc du genre :

Code :
  1. $nomutil = $ENV{USER_NAME};
  2. ($Organization, $Location, $UserName) = split('_', $nomutil);
  3. $ENV{USER_NAME} = $Organization;
  4. $ENV{Location} =  $Location;
  5. $ENV{Utilisateur} = $UserName;
  6. print "Utilisateur = \"$ENV{Utilisateur}\"\n";
  7. print "Location =  \"$ENV{Location}\"\n";
  8. print "USER_NAME = \"$ENV{USER_NAME}\"\n";


 
c'est un essai au pif : je ne sais pas du tout comment freeradius s'attend à trouver les données en sortie de ton programme. Mais tu peux faire des variations sur ce thème.
 
pour t'aider un peu à comprendre comment fonctionne la communication entre freeradius et le programme externe, le fichier de conf commenté sur le wiki (http://wiki.freeradius.org/Radiusd.conf) montre que "/bin/echo %{User-Name}" produit une sortie au bon format. Reste à savoir comment est étendue la chaine %{User-Name} dans le fichier de conf.
 
Je suis clair ou pas du tout ?


---------------
TriScale innov
Reply

Marsh Posté le 22-01-2007 à 17:27:43    

anapajari a écrit :

ok ça a l'air bon ... C'est quoi le problème maintenant?
Là tu le lances la main donc ça doit s'afficher, mais j'imagine que freeradius ( connais absolument pas ce truc hein  ;)  ) n'attend ni content-type ni les résultats sous cette forme.

 

En fait le truc c'est : ton script perl il est appelé par freeradius ou doit te permettre de "lancer" freeradius avec certains paramètres.?

 



   


Le freeradius est deja lancé, car c'est lui qui appelle le module perl.

 

En revanche, le module doit lui renvoyer des variables supplémentaires (que j'ai ajouté au préalable dans le /etc/freeradius/dictionnary).

 

LA question (The question) is: Comment (sous quelle forme) on renvoie les variables à freeradius? (comme l'a fait remarqué francesco).

 

(nota franceso: j'ai testé, mais c'est pas la bonne syntaxe. Pourtant, je sens que j'ai quand mm avancé, puisque au départ je partais sur un "return" et que manifestement, c'est plutot un "print" qu'il faut faire)

 

J'ai eu beau chercher partout quelle est la syntaxe, bah non, rien à faire. Les variables $ENV{USER_NAME}, $ENV{Location}, et $ENV{Utilisateur} ne sont pas comprises par le freeradius. J'ai l'impression que ce sont des variables d'environnement perl, et que freeradius n'affecte pas ces variables au siennes (malgrès le "Utilisateur = $ENV{Utilisateur}" et la variable "Utilisateur" définie dans le dictionnary de freeradius).

 


Je pense qu'il y a un pb entre la variable "User-Name" de freeradius et la variable "USER_NAME" de perl... Je sais pas pourquoi mais ca sent la blague cette histoire... (une histoire de convertion perl bizaroïde...)

 

(re-nota: merci en tout cas de vous pencher sur mon cas, c'est très sympa!!)

 


En attendant, je re-varie autour de ca (j'ai pas deja tout épuisé?), j'invoque les dieux et je commence à faire des petites poupées vaudoux...

 


 
 
EDIT:
 
Voila, en fait, j'ai abandonné l'idée d'utiliser un module externe. J'ai utilisé un module "pré-concu": rlm_attr_rewrite.
 
par exemple:
 

Code :
  1. attr_rewrite Utilisateur{
  2.         attribute = Utilisateur
  3.         searchin = config
  4.         searchfor = ".+_.+_"
  5.         replacewith = ""
  6.         ignore_case = no
  7.         new_attribute = no
  8.         max_matches = 1
  9.         append = no
  10.     }


 
 
Ca me permet (avec des expressions régulières) de redéfinir mes valeurs de variables. (n'oubliez pas de l'appeller dans le module "authorize" )
 
Merci à tous.


Message édité par supermattt le 05-02-2007 à 15:11:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed