[Perl] utilisé une librairie Win32 dans un script pouvant rouler unix

utilisé une librairie Win32 dans un script pouvant rouler unix [Perl] - Perl - Programmation

Marsh Posté le 16-03-2004 à 20:49:53    

J'ai un script, qui devra vérifier des trucs pour les serveurs web sous les OS suivants: AIX, linux (debian), MVS (zos) et Windows.
 
Je dois entre autre vérifier que le userid tournant le serveur web n'a pas de privilège système.
 
Sous Win32, je compte utilisé Win32::NetAdmin::UserGetAttributes
 
cependant, aussitot que je fais le use, même si c'est dans ma boucle "Si l'os est Win32", j'ai une erreur en tentant de le faire tourner sous unix (Can't locate Win32/NetAdmin.pm in @INC)

Reply

Marsh Posté le 16-03-2004 à 20:49:53   

Reply

Marsh Posté le 17-03-2004 à 11:48:43    

Reply

Marsh Posté le 17-03-2004 à 12:25:30    

Les "use" sont executé à la compilation, quelque soit l'endroit ou ils sont.
 
si tu le fait dans une boucle conditionnelle alors utilise un "require" à la place du "use". Par contre si tu veux importer des fonction (ou si il en importe par defaut et que tu les utilise), il faudra que tu fasse un "import" explicite.
L'autre solution c'est de faire un 'eval "use ...";'

Reply

Marsh Posté le 17-03-2004 à 13:28:13    

et dans mon cas qu'est-ce qui serait le plus approprié?
 
le script peut rouler sous divers OS, mais lorsque c'est windows, j'ai besoin de la Win32::NetAdmin et de certaines de ses fonctions

Reply

Marsh Posté le 17-03-2004 à 13:46:33    

moi je ferais:

Code :
  1. if ($^O =~ /win32/i) {
  2.   require Win32::NetAdmin;
  3.   import Win32::NetAdmin;
  4.   # ou eventuellement avec le nom des fonctions que tu veux importer si elles ne sont pas importées par defaut, exactement comme pour le use:
  5.   # import Win32::NetAdmin qw(func1 func2);
  6. }

Reply

Marsh Posté le 17-03-2004 à 13:53:25    

Si je fais
 

Code :
  1. use Win32::NetAdmin;


 
j'ai aucune erreur, sauf à l'exécution sous unix
 
 
Si je fais
 

Code :
  1. if ($^O =~ /win32/i) {
  2.   require Win32::NetAdmin;
  3.   import Win32::NetAdmin qw(USER_PRIV_ADMIN);
  4. }


 
j'ai une erreur de syntaxe en tentant d'utiliser USER_PRIV_ADMIN, que je n'avais pas avec le use
 

Code :
  1. ##########
  2.       # Must not have system privileges beyond what the web server requires to run
  3.       my ($curpassword, $curpasswordAge, $curprivilege, $curhomeDir, $curcomment, $curflags, $curscriptPath);
  4.       Win32::NetAdmin::UserGetAttributes(Win32::NodeName(), $httpd_conf->User, $curpassword, $curpasswordAge,
  5.                                          $curprivilege, $curhomeDir, $curcomment, $curflags, $curscriptPath,
  6.       );
  7.       if (($curprivilege & USER_PRIV_ADMIN)) {
  8.         push(@report, "1.1 Must not have system privileges beyond what the web server requires to run." );
  9.       }
  10.       ##########

Reply

Marsh Posté le 17-03-2004 à 14:02:11    

Tu ne l'a que sous Unix cette erreur non?
 
 

Reply

Marsh Posté le 17-03-2004 à 14:07:00    

pospos a écrit :

Tu ne l'a que sous Unix cette erreur non?


 
erreur sous win32

Code :
  1. use strict;
  2. #use Win32::NetAdmin;
  3. if ($^O =~ /win32/i) {
  4.   #require Win32::NetAdmin;
  5.   #import Win32::NetAdmin qw(USER_PRIV_ADMIN);
  6. }
  7. ##########
  8. # Must not have system privileges beyond what the web server requires to run
  9. my ($curpassword, $curpasswordAge, $curprivilege, $curhomeDir, $curcomment, $curflags, $curscriptPath);
  10. Win32::NetAdmin::UserGetAttributes(Win32::NodeName(), "yaberger", $curpassword, $curpasswordAge, $curprivilege, $curhomeDir, $curcomment, $curflags, $curscriptPath);
  11. if (($curprivilege & USER_PRIV_ADMIN)) {
  12.   print "1.1 Must not have system privileges beyond what the web server requires to run.\n";
  13. }
  14. ##########
  15. print "test";


 
si j'utilise le "use", ca print mon 1.1 must not have...
si j'utilise le require et le import, sous windows, j'ai cette erreur:
 
Z:\httpd_cops>perl ../test.pl
Bareword "USER_PRIV_ADMIN" not allowed while "strict subs" in use at ../test.pl line 17.
Execution of ../test.pl aborted due to compilation errors.


Message édité par burgergold le 17-03-2004 à 14:07:56
Reply

Marsh Posté le 17-03-2004 à 14:12:01    

ouai, c'est pasque Perl verifi les barewords à la compilation, et ta constant USER_PRIV_ADMIN n'existe pas encore à ce moment la...
 
donc la solution c'est soit de mettre tout le bloc du "if $^O..." dans un BEGIN (pas certian que ca marche cependant), soit de declarer une sub USER_PRIV_ADMIN qui sera ensuite ecrasée par la vraie constante au moment de l'importe. Du reste c'est le seul moyen de faire si tu veux que ca tourne aussi sous Unix car meme si tu n'execute pas les portions de code specifiques windows en testant une condition, Perl verifira tout de meme les barewords et si il y a aucune surt qui correspond il va gueuler

Reply

Marsh Posté le 17-03-2004 à 14:16:23    

je viens d'essayer ca et ca ne fonctionne pas
 

Code :
  1. BEGIN {
  2.   if ($^O =~ /win32/i) {
  3.     #use Win32::NetAdmin;
  4.     require Win32::NetAdmin;
  5.     import Win32::NetAdmin qw(USER_PRIV_ADMIN);
  6.   }
  7. }

Reply

Marsh Posté le 17-03-2004 à 14:16:23   

Reply

Marsh Posté le 17-03-2004 à 14:18:08    

Fonctionnel
 

Code :
  1. use strict;
  2. if ($^O =~ /win32/i) {
  3.   require Win32::NetAdmin;
  4.   import Win32::NetAdmin qw(USER_PRIV_ADMIN);
  5. }
  6. sub USER_PRIV_ADMIN;
  7. if ($^O =~ /win32/i) {
  8.   ##########
  9.   # Must not have system privileges beyond what the web server requires to run
  10.   my ($curpassword, $curpasswordAge, $curprivilege, $curhomeDir, $curcomment, $curflags, $curscriptPath);
  11.  
  12.   Win32::NetAdmin::UserGetAttributes(Win32::NodeName(), "yaberger", $curpassword, $curpasswordAge, $curprivilege, $curhomeDir, $curcomment, $curflags, $curscriptPath);
  13.  
  14.   if (($curprivilege & USER_PRIV_ADMIN)) {
  15.     print "1.1 Must not have system privileges beyond what the web server requires to run.\n";
  16.   }
  17.   ##########
  18. }
  19. print "test";


 
gros merci à toi Pospos, oh grand gourou Perl  :jap:

Reply

Marsh Posté le 17-03-2004 à 14:27:15    

http://www.pictobank.com/photoluc/gourou.jpg

Reply

Sujets relatifs:

Leave a Replay

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