Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Q] bug dans un script shell pour un inventaire

3 réponses
Avatar
Nicolas.MICHEL
Bonjour

J'ai un loginscript sur un parc de mac qui maintient un inventaire à
jour comprenant l'IP (dhcp),

je sort l'ip, la macaddresse, puis je fais ceci :

MacLog="mon/inventaire/sur/NFS"

ClearLog () {
cat $MacLog | grep -v $MacAddr >> $MacLog.tmp
rm $MacLog
mv $MacLog.tmp $MacLog
}

et ensuite je remet la ligne


PutLog () {
echo "$IP_addr;$MacAddr;$Commentaire;..." >>$MacLog
}

Or certaines machines, pas toutes, apparaissent plusieures fois dans
l'inventaire, et je ne comprends pas pourquoi.

Une idée ?

Merci d'avance :-)
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas

3 réponses

Avatar
Pascal Bourguignon
(Nicolas MICHEL) writes:

Bonjour

J'ai un loginscript sur un parc de mac qui maintient un inventaire à
jour comprenant l'IP (dhcp),

je sort l'ip, la macaddresse, puis je fais ceci :

MacLog="mon/inventaire/sur/NFS"

ClearLog () {
cat $MacLog | grep -v $MacAddr >> $MacLog.tmp
rm $MacLog
mv $MacLog.tmp $MacLog
}

et ensuite je remet la ligne


PutLog () {
echo "$IP_addr;$MacAddr;$Commentaire;..." >>$MacLog
}

Or certaines machines, pas toutes, apparaissent plusieures fois dans
l'inventaire, et je ne comprends pas pourquoi.

Une idée ?


Il n'y a pas de verrou, alors si deux machines font le ClearLog en
même temps, l'une des deux peut trés bien ne pas s'effacer.

Le plus sur et plus facile serait d'envoyer les informations à un
serveur qui sérialiserait les mises à jours:

[ tmp]$ cat cl
#!/bin/bash
server=localhost
portU55
ip=$1
mac=$2
com=$3
echo "$ip;$mac;$com;..." > /dev/tcp/$server/$port

Et sur $serveur:

[ tmp]$ cat se
#!/bin/bash
portU55
maclog=/tmp/maclog
touch $maclog
while netcat -l -p $port ; do true ; done
| while IFS=; read ip mac com rest ; do
cp $maclog ${maclog}~
&& ( grep -v $mac < ${maclog}~ ; echo "$ip;$mac;$com;$rest" ) > $maclog
done

[ tmp]$ ./se &

Alors, sur les clients:

[ tmp]$ ./cl 1 a hi
[ tmp]$ ./cl 2 b hi
[ tmp]$ ./cl 3 c hi
[ tmp]$ ./cl 22 b hi

Et sur le serveur:

[ tmp]$ cat /tmp/maclog
1;a;hi;...
3;c;hi;...
22;b;hi;...

Ce n'est pas forcément parfait; je ne sais pas comment bash se
comporte sur le >/dev/tcp/$server/$port quand netcat n'est pas en
train de s'exécuter. On pourrait utiliser syslog (cf logger(1)),
et sur le serveur, avec la bonne config /etc/syslog.conf:
tail -f /var/log/maclog | while read ... ip mac com rest ...

--
"Remember, Information is not knowledge; Knowledge is not Wisdom;
Wisdom is not truth; Truth is not beauty; Beauty is not love;
Love is not music; Music is the best." -- Frank Zappa

Avatar
David
Le Fri, 11 Nov 2005 17:19:12 +0100, Pascal Bourguignon a écrit :
Il n'y a pas de verrou, alors si deux machines font le ClearLog en même
temps, l'une des deux peut trés bien ne pas s'effacer.


Un pipe nommé serait plus simple non ?

Avatar
Nicolas.MICHEL
Pascal Bourguignon wrote:

Il n'y a pas de verrou, alors si deux machines font le ClearLog en
même temps, l'une des deux peut trés bien ne pas s'effacer.


C'est vrais, tu as raison.
Mais je penses que le problème ne vient pas uniquement de là, c'est
toujours les mêmes machines qui reviennent récursivement, pas juste 2x,
et avec d'autres ça marche.

Le plus sur et plus facile serait d'envoyer les informations à un
serveur qui sérialiserait les mises à jours:
[snip]


Je vais prendre du temps pour analiser tout ça, pour l'instant j'ai rien
compris :-)

Sinon un truc simple serait de mettre bêtement un petit script cron pour
éplucher le fichier toutes les nuits, à une heure où personne n'est
sensé se loguer.

Faut déjà que je comprenne ce que tu m'as expliqué

Mille merci Pascal !
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas