Bonjour à tous,

Un premier post ici pour moi, aussi quelques mots de présentation.

D'ordinaire je ne code pas sur des machines classiques puisque je réalise essentiellement du code bas niveau en robotique sur des OS propriétaires, µitron SH4 par ex.

Dernièrement il m'est tombé sous la main un embedded computer Moxa 7112 LX Plus dans lequel je mets du code compilé pour réaliser de conversion de protocole de comm. Dedans c'est un arm-linux, peu de place dispo 8Mo de flash restant pour les applis.

L'idée d'utiliser cette micro machine pour faire du vpn est venue dernièrement car openvpn y est déjà installé, comme apache et perl.

La question du vpn n'est envisageable que si l'on peut "administrer" un minimum la conf ethernet et vpn de la boite. Après avoir jeté un coup d'oeuil rapide sur le sujet, je prends donc en considération l'existence d'un interpréteur perl déjà compilé sur arm, et décides de faire quelques tests.
un perl - v indique : This is perl, v5.8.7 built for arm-linux !

J'ai fais divers tests de CGI/perl qui se passent tous pas mal sauf un qui commence à me rendre plus que songeur, voici le topo :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#!/usr/bin/perl 
 
use strict;
 
my $len;
my $buffer;
 
$buffer = `/var/sd/net_iface_info`;
$len = length($buffer);
 
 
print "Content-type: text/html\n\n";
 
print  << "FIN";
<html><head><title>Sortie du test</title></head><body>
<h1>perl_info :</h1>
<p><pre>\n$buffer</pre></p>
<p><pre>\nlength(buffer)=$len</pre></p>
</body></html>
FIN
Très basique comme on peut le voir, mais la sortie en HTML est étrange.
perl_info :

*** Network Interface Settings ***
Interface eth0
IP Addr 192.168.3.127
Netmask 255.255.255.0
Broadcast 192.168.3.255
MAC 00:90:E8:25:77:CF
DNS 212.27.40.240 212.27.40.241
Interface eth1
IP Addr 192.168.2.142
Netmask 255.255.255.0
Broadcast 192.168.2.255
MAC 00:90:E8:25:77: D0
DNS 212.27.40.240 212.27.40.241
*** Network Interfaces defined in file ***

length(buffer)=352

On peut noter que la capture à l'aide de "backticks" de $buffer = `/var/sd/net_iface_info`; n'a rien de particulière et fonctionne parfaitement avec quelque chose du style $buffer = `ps -ef`; par exemple.

Mais dans l'appel de `/var/sd/net_iface_info` (un C compilé) la valeur de retour est incomplète !

voici ce que donne le même script lancé depuis la console :

perl /home/httpd/cgi-bin/nbline2.pl
Content-type: text/html

<html><head><title>Sortie du test</title></head><body>
<h1>perl_info :</h1>
<p><pre>
*** Network Interface Settings ***
Interface eth0
IP Addr 192.168.3.127
Netmask 255.255.255.0
Broadcast 192.168.3.255
MAC 00:90:E8:25:77:CF
DNS 212.27.40.240 212.27.40.241
Interface eth1
IP Addr 192.168.2.142
Netmask 255.255.255.0
Broadcast 192.168.2.255
MAC 00:90:E8:25:77: D0
DNS 212.27.40.240 212.27.40.241
*** Network Interfaces defined in file ***
Interface eth0
IP Addr 192.168.3.127
Netmask 255.255.255.0
Network 192.168.3.0
Broadcast 192.168.3.255
Interface eth1
DHCP enabled
</pre></p>
<p><pre>
length(buffer)=483</pre></p>
</body></html>

Sauf si à force de chercher je ne vois plus la forêt, ou l'arbre, il me semble toutefois que le code HTML devrait pouvoir s'afficher correctement.

Le plus troublant restant pour moi la longueur du buffer mesurée plus courte lors de l'appel CGI via l'Apache embarqué que lors de l'appel par la console.
J'ai testé diverses façon de faire, open(PIPE ... etc.) qx(...) et le résultat est tjrs le même.

Le temps de latence en C est négligeable, j'ai même ajouté un beep du buzzer de 100ms pour être sûr de passer par la fin de proc.

Une chose est étrange, l'appel en console est plus long que via le passage par CGI de Apache, et le résultat complet dans ce cas.

Un guru aurait-il une idée lumineuse sur ce mystère ?


Franck