Ajustements Unicode et couleurs, version 16.03.11.
[ansible.git] / scripts / ansible-debian-versions
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 """Outil d'extraction d'informations système sur les serveurs Debian.
4
5 Copyright ©2016  Agence universitaire de la Francophonie -- www.auf.org
6 Licence : GPL version 3
7 Auteur : Progfou <jean-christophe.andre@auf.org>
8 """
9 import sys
10 import ansible.runner
11 from os import getenv
12 from time import strftime
13 import re
14
15 if len(sys.argv) != 2:
16     print (u"Usage : %s <nom-d-ensemble-de-machines>" % sys.argv[0]).encode('utf-8')
17     sys.exit(1)
18 subset = sys.argv[1]
19
20 # constantes
21
22 URL = "http://git.auf.org/?p=ansible.git;a=blob;f=scripts/ansible-debian-versions"
23
24 VERSION = "16.03.11"
25
26 RELEASE_NAME = {
27   u'Debian': {
28     u'8': 'jessie', u'7': 'wheezy', u'6': 'squeeze', u'5': 'lenny', u'4': 'etch', u'3': 'sarge',
29   },
30 }
31
32 RELEASE_COLOR = {
33   u'Debian': {
34     u"8": "00ae00", u"7": "e6ff00", u"6": "ff950e", u"5": "ff420e",
35   },
36   u'FreeBSD': {
37     u"10": "00ae00", u"9": "e6ff00", u"8": "ff950e", u"7": "ff420e",
38   },
39 }
40 DEFAULT_RELEASE_COLOR = "ff0000"
41 UNKNOWN_RELEASE_COLOR = "f0f0f0"
42
43 VIRTUAL_INDEX = {
44   u"inconnu": 0,
45   u"physique": 5,
46   u"openvz / hôte": 10,
47   u"openvz / invité": 15,
48   u"kvm / hôte": 20,
49   u"QEMU / invité": 23,
50   u"kvm / invité": 25,
51 }
52
53 VIRTUAL_COLOR = {
54   u"kvm / hôte": "e0ffe0",
55   u"kvm / invité": "e0ffe0",
56   u"openvz / invité": "ffe0a0", #"e6ff00",
57   u"openvz / hôte": "ffc0c0", #"ff950e",
58   u"physique": "ffffa0", #"ff420e",
59 }
60 UNKNOWN_VIRTUAL_COLOR = "f0f0f0"
61
62 # collecte des données
63
64 pm = ansible.runner.Runner(module_name='setup', timeout=5, subset=subset)
65 out = pm.run()
66
67 # sauvegarde temporaire pour débogage
68
69 import json
70 file('/tmp/out-%s.json' % getenv('USER'), 'w').write(json.dumps(out, sort_keys=True, indent=4, separators=(',', ': ')))
71
72 # traitement des données
73
74 server_list = []
75
76 for server,data in out['contacted'].items():
77     data['name'] = server
78     facts = data['ansible_facts']
79     # famille
80     if 'ansible_os_family' in facts:
81         data['os_family'] = facts['ansible_os_family']
82     else:
83         data['os_family'] = u'inconnue'
84     # distribution
85     if 'ansible_distribution' in facts:
86         major = re.findall(r'[0-9]+', facts['ansible_distribution_version'])
87         if len(major) > 0:
88             data['major_release'] = major[0]
89         else:
90             data['major_release'] = u'0'
91         version = re.findall(r'[0-9\.]+', facts['ansible_distribution_version'])
92         if len(version) > 0:
93             data['version'] = version[0]
94         else:
95             data['version'] = u'0'
96         data['description'] = u'%s %s' % (facts['ansible_distribution'],
97                                                             data['version'])
98         release = facts.get('ansible_distribution_release', u'NA')
99         if release == u'NA' and data['os_family'] in RELEASE_NAME:
100             os_release_name = RELEASE_NAME[data['os_family']]
101             if data['major_release'] in os_release_name:
102                 release = os_release_name[data['major_release']]
103         if release != u'NA':
104             data['description'] += u' (%s)' % release
105     else:
106         data['major_release'] = u'0'
107         data['description'] = u'inconnue (information non disponible)'
108     # virtualisation
109     if 'ansible_virtualization_type' in facts and \
110        'ansible_virtualization_role' in facts:
111         if facts['ansible_virtualization_role'] == u'guest':
112             virtual_info = u'%s / invité' % facts['ansible_virtualization_type']
113         elif facts['ansible_virtualization_role'] == u'host':
114             virtual_info = u'%s / hôte' % facts['ansible_virtualization_type']
115         elif facts['ansible_virtualization_role'] == u'NA':
116             virtual_info = u'physique'
117         else:
118             virtual_info = u'inconnu (%s / %s)' % (
119                 facts['ansible_virtualization_type'],
120                 facts['ansible_virtualization_role'] )
121         data['virtual_info'] = virtual_info
122     elif 'ansible_processor' in facts and facts['ansible_processor'][0].startswith('QEMU'):
123         data['virtual_info'] = u'QEMU / invité'
124     else:
125         data['virtual_info'] = u'inconnu'
126     # architecture
127     if 'ansible_machine' in facts and 'ansible_userspace_bits' in facts:
128         data['architecture'] = u'%s bits / %s' % (
129             facts['ansible_userspace_bits'], facts['ansible_machine'] )
130     else:
131         data['architecture'] = u'inconnue'
132     # ajout à la liste
133     server_list.append({
134         'name': data['name'],
135         'os_family': data['os_family'],
136         'description': data['description'],
137         'major_release': data['major_release'],
138         'architecture': data['architecture'],
139         'virtual_info': data['virtual_info'],
140     })
141
142 for server,data in out['dark'].items():
143     # ajout à la liste
144     server_list.append({
145         'name': server,
146         'os_family': u'inconnue',
147         'description': u'inconnue (échec de connexion)',
148         'major_release': u'0',
149         'architecture': u'inconnu',
150         'virtual_info': u'inconnu',
151     })
152
153 # tri de la liste des serveurs par version de distribution croissante
154
155 def sort_key(x):
156     os_family = u'0' if x['os_family'] == u'inconnue' else x['os_family']
157     virtual_index = VIRTUAL_INDEX.get(x['virtual_info'], 1)
158     reversed_name = '.'.join(reversed(x['name'].split('.')))
159     return u'%s-%03d-%02d-%s' % ( os_family, int(x['major_release']),
160         virtual_index, reversed_name )
161
162 server_list.sort(key=sort_key)
163
164 # affichage du code wiki MoinMoin correspondant
165
166 print u"||<rowstyle=\"background-color: #cccccc;\">'''Serveur'''||'''Version du système'''||'''Architecture'''||'''Virtualisation'''||".encode('utf-8')
167
168 for server in server_list:
169     # couleur pour la version
170     if server['major_release'] == u'0':
171         server['release_color'] = UNKNOWN_RELEASE_COLOR
172     elif server['os_family'] in RELEASE_COLOR:
173         os_release_color = RELEASE_COLOR[server['os_family']]
174         if server['major_release'] in os_release_color:
175             server['release_color'] = os_release_color[server['major_release']]
176         else:
177             server['release_color'] = DEFAULT_RELEASE_COLOR
178     else:
179         server['release_color'] = DEFAULT_RELEASE_COLOR
180     # couleur pour la virtualisation
181     if server['virtual_info'] in VIRTUAL_COLOR:
182         server['virtual_color'] = VIRTUAL_COLOR[server['virtual_info']]
183     else:
184         server['virtual_color'] = UNKNOWN_VIRTUAL_COLOR
185     if u'invité' not in server['virtual_info']:
186         server['virtual_info'] = u"'''%s'''" % server['virtual_info']
187     # affichage
188     print ( (u"||<)>%(name)s||<#%(release_color)s>%(description)s||" +
189         u"%(architecture)s||<#%(virtual_color)s>%(virtual_info)s||") % \
190         server ).encode('utf-8')
191
192 print ( u"(tableau généré le %s à %s avec [[%s|ansible-debian-versions]] %s)" % \
193     (strftime('%Y-%m-%d'), strftime('%H:%M:%S UTC'), URL, VERSION) ).encode('utf-8')