#!/usr/bin/env python # -*- coding: utf-8 -*- # # uname_bornes.py # --------------- # Copyright : (c) 2009, Jeremie Dimino # 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 + ":")