scripts/wifi/uname_bornes.py
Jeremie Dimino e4ae09c3e4 trop de shell tu le shell
darcs-hash:20090616090917-af139-47535d11e387ce5b8119ab54e786f4b7dc0d0c87.gz
2009-06-16 11:09:17 +02:00

69 lines
2 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# uname_bornes.py
# ---------------
# Copyright : (c) 2009, Jeremie Dimino <jeremie@dimino.org>
# Licence : BSD3
"""Script qui fait un uname sur toute les bornes à la fois.
La sortie est la sortie de `uname -v` sur chaque borne."""
import sys, os, commands
if len(sys.argv) > 1:
print """\
usage: python uname_bornes.py
Récupère la liste des bornes et récupère sur chacune le uname"""
sys.exit(2)
# Moyen rapide pour récupérer la liste des bornes:
names = []
for line in commands.getoutput("host -l wifi.crans.org").splitlines():
# Chaque ligne est de la forme:
# "truc.wifi.crans.org has address 138.231.148.42"
fields = line.split()
name = fields[0].split(".")[0]
ip = fields[3]
network = ip.rsplit(".", 1)[0]
# On ne prend que les machines du réseau 138.231.148.0/24, à par
# ragnarok:
if network == "138.231.148" and ip != "138.231.148.1":
names.append(name)
# Maintenant on lance une connection ssh par borne, le tout en parallèle:
outputs = {}
for name in names:
(stdin, stdout, stderr) = os.popen3("ssh -T -x -o BatchMode=yes -o ConnectTimeout=5 %s.wifi exec uname -v" % name)
outputs[name] = stdout
stdin.close()
stderr.close()
# On attend que tous les fils qu'on a lancé terminent, avec une petite
# animation si la sortie est un terminal:
count = 0
total = len(names)
show_anim = sys.stderr.isatty()
message = "Réception des résultats: %d/%d"
if show_anim: sys.stderr.write(message % (count, total))
while count < total:
os.wait()
count += 1
if show_anim: sys.stderr.write("\r" + message % (count, total))
if show_anim: sys.stderr.write("\n")
# On lit tout les résultats:
results = {}
for name, output in outputs.iteritems():
results[name] = output.read().strip()
output.close()
results = results.items()
results.sort(key=lambda x: x[0])
for name, result in results:
if result:
print "%-15s %s" % (name + ":", result)
else:
print "%-15s failure" % (name + ":")