69 lines
2 KiB
Python
Executable file
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 + ":")
|