Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2879 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Module perl sous Freeradius

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Module perl sous Freeradius

n°1505879
supermattt
meuh!
Posté le 22-01-2007 à 14:02:21  profilanswer
 


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 ::
 
++

mood
Publicité
Posté le 22-01-2007 à 14:02:21  profilanswer
 

n°1505888
anapajari
s/travail/glanding on hfr/gs;
Posté le 22-01-2007 à 14:12:03  profilanswer
 

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?

n°1505907
supermattt
meuh!
Posté le 22-01-2007 à 14:40:23  profilanswer
 

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.)

n°1505926
franceso
Posté le 22-01-2007 à 15:21:43  profilanswer
 

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
n°1505936
supermattt
meuh!
Posté le 22-01-2007 à 15:33:51  profilanswer
 

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.

n°1505951
franceso
Posté le 22-01-2007 à 16:00:21  profilanswer
 

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
n°1505963
supermattt
meuh!
Posté le 22-01-2007 à 16:18:03  profilanswer
 

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: )

n°1505968
anapajari
s/travail/glanding on hfr/gs;
Posté le 22-01-2007 à 16:30:40  profilanswer
 

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
n°1505975
franceso
Posté le 22-01-2007 à 16:38:16  profilanswer
 

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
n°1505996
supermattt
meuh!
Posté le 22-01-2007 à 17:27:43  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Module perl sous Freeradius

 

Sujets relatifs
[PERL] Ajouter des balises dans un fichier XMLModule TVA
Passer un tableau ou une hash Perl à JavaScriptDonner pour le developpement de perl
[PERL] Trier un tableau associatif par les valeursperl et log
[PERL] Timeouts et redirection de STDOUT et STDERRHELP! bases sur module beck
[perl] connexion à un serveur MSSQL via freetds[Perl] Récupérer valeur d'un programme Perl dans un batch
Plus de sujets relatifs à : Module perl sous Freeradius


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR