From 5adc8d9819f83e3e0e8a97797d5fad23a5bc61a0 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Sun, 29 Sep 2013 14:43:05 +0200 Subject: [PATCH] =?utf8?q?G=C3=A9n=C3=A9ration=20automatique=20de=20.ssh/c?= =?utf8?q?onfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + ssh/generate_config.py | 155 ++++++++++++++++++++++++++++++++ ssh/static_after | 105 ++++++++++++++++++++++ ssh/static_before | 195 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 459 insertions(+) create mode 100755 ssh/generate_config.py create mode 100644 ssh/static_after create mode 100644 ssh/static_before diff --git a/.gitignore b/.gitignore index eeaee31..fd6bdcc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ vrun/ +# Pas utile +regen_config_SOGo.sh + # gruik newsbot/workingfile newsbot/dicoread.txt +ssh/plouf.json diff --git a/ssh/generate_config.py b/ssh/generate_config.py new file mode 100755 index 0000000..d71b488 --- /dev/null +++ b/ssh/generate_config.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Script de génération automatique de fichier ~/.ssh/config + +TODO : mettre une option pour append le ssh des bornes +""" + +import sys +import re +sys.path.append('/usr/scripts/') + +import lc_ldap.shortcuts +import lc_ldap.objets + +#: Fichier à inclure au début +static_before_file = "./static_before" + +#: Fichier à inclure à la fin +static_after_file = "./static_after" + +#: regexp pour exclure certains "serveurs" +black_regex = re.compile('^((bigbrother|hugebrother|littlebrother|tinybrother|imprimante|vigile(--?\d[a-z])?|bat[abcghijmopk]-\d|minigiga|multiprise-v6|chu|pika|kvm|pulsar|nols2?).adm.crans.org|ftp.federez.net|ns1.crans.ens-cachan.fr)$') + +#: Proxy pour contacter le VLAN adm +adm_proxy = u"sable.crans.org" + +#: Login pour se connecter sur les serveurs Cr@ns +login_crans = u"legallic" + +#: À afficher avant les serveurs Cr@ns +crans_header = u""" +# +-------------------+ +# | Serveurs du Cr@ns | +# +-------------------+ +# Accessible aux apprentis +# sauf zamok et ssh2, accessibles à tous les adhérents + +""" + +#: À afficher avant les serveurs adm +crans_adm_header = u""" +# +-------------------------+ +# | Serveurs Cr@ns adm-only | +# +-------------------------+ +# Accessibles aux apprentis, mais ne sont que sur le VLAN adm +# d'où la ProxyCommand +# fy et fz ne sont accessibles qu'aux nounous + +""" + +def blacklisted(key, aliases): + """Répond True si le serveur ne doit pas apparaître dans le fichier de conf.""" + for a in aliases: + if black_regex.match(a): + return True + return False + +def cache_servers(servs): + import json + json.dump(servs, open("plouf.json", "w")) + +def load_servers(): + import json + return json.load(open("plouf.json")) + +def get_servers(help=None): + """Récupère la liste des serveurs dans la base LDAP.""" + if help is None: + c = lc_ldap.shortcuts.lc_ldap_readonly(user=u"legallic") + + l = c.allMachines() + l = [m for m in l if isinstance(m, lc_ldap.objets.machineCrans)] + else: + l = help + + hosts = {} + for m in l: + host = m["host"][0].value + h = host.replace(".crans.org", "") + if hosts.has_key(h): + print (u"Doublon : clé %s had %r and wants %r" % (h, hosts[h], [host] + [a.value for a in m["hostAlias"]])).encode("utf-8") + else: + hosts[h] = [host] + [a.value for a in m["hostAlias"]] + return hosts + +def output(key, aliases, use_adm_proxy=False): + """ Renvoie le block de conf pour un host. + Traite particulièrment : ssh2, les ilo, la ferme""" + # On teste si le serveur est dans la ferme + ferme = any([a.endswith(u".ferme.crans.org") for a in aliases]) + shorts = list(set([a.replace(".crans.org", "") for a in aliases])) + if ferme: + shorts.append(a.split(".", 1)[0]) + shorts.sort() + if key in shorts: + shorts.remove(key) + out = u"Host %s\n" % (u" ".join([key] + shorts + aliases)) + if key=="ssh2": + out += u" # Un serveur ssh qui n'est qu'un nat vers 138.231.136.1:22\n" + out += u" # pour passer à travers les blocages de ports (443 = https)\n" + out += u" HostName 138.231.136.2\n" + out += u" Port 443\n" + out += u" User %s\n" % login_crans + out += u" ForwardAgent yes\n" + out += u"\n" + return out + hostname = u"%s.crans.org" % (key) + out += u" HostName %s\n" % (hostname) + out += u" User %s\n" % login_crans + if not key in ["apprentis", "batk-0"]: + out += u" ForwardAgent yes\n" + if use_adm_proxy: + out += u" ProxyCommand ssh %s -W %%h:%%p\n" % (adm_proxy) + if key.endswith("-ilo.adm"): + out += u" HostKeyAlgorithms ssh-rsa\n" + out += u"\n" + return out + +def compute_ssh_config(servers): + """Affiche le ssh_config à partir de la liste de serveurs.""" + # Un serveur "plouf.adm.crans.org" est adm-only si aucune clé "plouf", "plouf.ferme" n'existe + keys = servers.keys() + adm_only = {k : aliases for k, aliases in servers.items() if all([not k.replace(".adm", zone) in keys + for zone in [".ferme", ""]])} + # On veut pouvoir utiliser babar et pas seulement babar.adm + for k in adm_only.keys(): + newk = k.replace(".adm", "") + if not newk in adm_only[k]: + adm_only[k] = [k.replace(".adm", "")] + adm_only[k] + for a in adm_only.keys(): + del servers[a] + s = crans_header + keys = servers.keys() + keys.sort() + for h in keys: + s += output(h, servers[h]) + s += crans_adm_header + keys = adm_only.keys() + keys.sort() + for h in keys: + s += output(h, adm_only[h], use_adm_proxy=True) + return s + +if __name__ == '__main__': + try: + servers = load_servers() + except: + servers = get_servers() + cache_servers(servers) + servers = {h:aliases for h, aliases in servers.iteritems() if not blacklisted(h, aliases)} + out = compute_ssh_config(servers) + before = open(static_before_file).read().decode("utf-8") + after = open(static_after_file).read().decode("utf-8") + print (before + out + after).encode("utf-8") diff --git a/ssh/static_after b/ssh/static_after new file mode 100644 index 0000000..22ed017 --- /dev/null +++ b/ssh/static_after @@ -0,0 +1,105 @@ + +# +---------+ +# | FedeRez | +# +---------+ +# Accessibles aux membres de l'équipe d'admin de FedeRez + +# Actuellement down, mais on ne sait jamais +Host nautilus nautilus.federez.net + HostName nautilus.federez.net + User legallic + ForwardAgent yes + +Host forge forge.federez.net baldrick.federez.net baldrick baldrick.crans.org + HostName baldrick.federez.net + User legallic + ForwardAgent yes + +Host quigon quigon.federez.net + HostName quigon.federez.net + User legallic + ForwardAgent yes + +Host polygon polygon.federez.net + HostName polygon.federez.net + User legallic + ForwardAgent yes + +Host hexagon hexagon.federez.net + HostName hexagon.federez.net + User legallic + ForwardAgent yes + + +# +-------------------+ +# | Serveurs de l'ENS | +# +-------------------+ +# Accessibles aux élèves de l'ENS + +Host tselin tselin.clietu tselin.clietu.ens-cachan.fr acces1.rip.ens-cachan.fr acces1 rip + HostName tselin.clietu.ens-cachan.fr + User vlegalli + ProxyCommand ssh vlegalli@tahines.ens-cachan.fr -W %h:%p + +Host tahines.ens-cachan.fr tahines2 tahines + HostName tahines.ens-cachan.fr + User vlegalli + + +# +-----+ +# | Ulm | +# +-----+ +# Parce que je me suis inscrit à la DSI d'Ulm + +Host clipper clipper.ens.fr + HostName clipper.ens.fr + User legallic + + +# +------------------+ +# | Département info | +# +------------------+ +# Machines du département informatique de l'ENSC + +Host dptinfo21.dptinfo.ens-cachan.fr info21 infossh ssh.dptinfo + #HostName 138.231.36.60 + HostName ssh.dptinfo.ens-cachan.fr + User vlegalli + ForwardAgent yes + +Host dptinfo*.dptinfo.ens-cachan.fr + HostName %h + User vlegalli + ProxyCommand ssh vlegalli@ssh.dptinfo.ens-cachan.fr -W %h:%p + ForwardAgent yes + +Host info* + HostName dpt%h.dptinfo.ens-cachan.fr + User vlegalli + ProxyCommand ssh vlegalli@ssh.dptinfo.ens-cachan.fr -W %h:%p + ForwardAgent yes + + +# +---------+ +# | Télécom | +# +---------+ +# Stage au labo de Télécom ParisTech + +Host ssh.enst enst ssh.enst.fr + HostName ssh.enst.fr + User legallic + ForwardAgent yes + +Host infres infres.enst.fr + HostName infres.enst.fr + User legallic + ProxyCommand ssh ssh.enst.fr -W %h:%p + ForwardAgent yes + +Host tipaza tipaza.enst.fr + HostName tipaza.enst.fr + User legallic + ProxyCommand ssh ssh.enst.fr -W %h:%p + ForwardAgent yes + +# END (utile pour éviter les merge conflicts) diff --git a/ssh/static_before b/ssh/static_before new file mode 100644 index 0000000..292892b --- /dev/null +++ b/ssh/static_before @@ -0,0 +1,195 @@ +# .ssh/config générique mis à votre disposition +# par les gentils membres actifs du Cr@ns +# Vous pouvez l'utilisez, le redistribuer, le modifier à votre convenance. +# Des questions, des suggestions : {nounou,ca}@lists.crans.org +# Typiquement, vous pouvez proposer d'ajouter la conf pour accéder à votre département +# Licence : WTFPL + +# Les sections commentées par #~# sont des features qui ne sont pas activées +# par défaut. Sentez-vous libre de les décommenter pour les utiliser. + +# À noter que la plupart des serveurs présents dedans sont des serveurs +# du Cr@ns, qui risquent donc d'intéresser essentiellement des membres actifs. +# Pensez à remplacer "loginCr@ns", "loginFedeRez" et "loginENS" par les login idoines + +#------------------------------------------------------------------------------ + +# Les options qui ne sont pas identées sont activées pour toutes les connexions +# Mêmes celles qui ne correspondent à aucun bloc plus bas +# Activer la compression des données transmises lorsque c'est possible +Compression yes + +#~# # Afficher la fingerprint du serveur sous la forme d'un ASCII art +#~# VisualHostKey yes + +# Ne pas hasher les noms des machines auxquelles ont se connecte dans +# le fichier known_hosts +HashKnownHosts no + +# Vérifier la concordance du champ DNS SSHFP de la machine (si existant) +# et de la fingerprint présentée par le serveur +VerifyHostKeyDNS yes + +# Les options suivantes apparaissent dans les blocs +# Host = commence un bloc avec les noms qui utiliseront ce bloc +# HostName = nom réellement utilisé pour se connecter au serveur (ou son IP) +# User = nom d'utilisateur distant +# Port = port de connexion (pour override le port 22) +# ForwardAgent = forwarder l'agent ssh sur la machine +# (il vaut mieux qu'elle et ses administrateurs soient de confiance) +# ProxyCommand = pour passer par un autre serveur intermédiaire +# (pour un serveur qui ne peut pas être contacté directement) + + +# +--------------+ +# | Mes machines | +# +--------------+ + +Host cerebro.crans.org cerebro + HostName cerebro.crans.org + User vincent + ForwardAgent yes + +Host eva.crans.org eva eeepc + HostName eva.crans.org + User vincent + ForwardX11 yes + ForwardAgent yes + +Host cabal.crans.org cabal + HostName cabal.crans.org + User vincent + ForwardX11 yes + ForwardAgent yes + +Host viki viki.wifi viki.wifi.crans.org + HostName viki.wifi.crans.org + User root + Port 2222 + +# Les bots sur cerebro +Host basile + HostName cerebro.crans.org + User basile + ForwardAgent yes +Host note-cerebro + HostName cerebro.crans.org + User note + ForwardAgent yes +Host deconnaisseur + HostName cerebro.crans.org + User deconnaisseur + ForwardAgent yes +Host pendu Hung hung + HostName cerebro.crans.org + User hung + ForwardAgent yes +Host historien + HostName cerebro.crans.org + User historien + ForwardAgent yes +Host salesman Salesman + HostName cerebro.crans.org + User salesman + ForwardAgent yes +Host themis Themis + HostName cerebro.crans.org + User themis + ForwardAgent yes +Host saturnin Saturnin + HostName cerebro.crans.org + User saturnin + ForwardAgent yes +Host ibot iBot + HostName cerebro.crans.org + User ibot + ForwardAgent yes + + +# +--------+ +# | Pimeys | +# +--------+ +# Serveur dédié ovh +# pimeys.fr = 176.31.106.206 + +Host pimeys pimeys.fr + HostName pimeys.fr + User vincent + ForwardAgent yes + + +# +-----------------+ +# | Machines du BDE | +# +-----------------+ +# Parce que j'étais respo-info Makiavé[list] + +Host kfet kfet.crans.org kfet1 + HostName kfet.crans.org + User bde + +Host kfet2 kfet2.crans.org + HostName kfet2.crans.org + User vincent + +Host bde bde.crans.org note mininote invitation invitations note.crans.org mininote.crans.org invitations.crans.org invitation.crans.org + HostName bde.crans.org + User vincent + ForwardAgent yes + +Host bde2 bde2.crans.org note2 + HostName bde2.crans.org + User vincent + ForwardAgent yes + +Host bde3 bde3.crans.org + HostName bde3.crans.org + User vincent + ForwardAgent yes + +Host video videobde videobde.crans.org + HostName videobde.crans.org + User vincent + ForwardAgent yes + +Host bureau bureau-bde bureau-bde.crans.org + HostName bureau-bde.crans.org + User bde + + +# +----+ +# | PE | +# +----+ +# Parce que j'y suis le bienvenu + +Host linkki linkki.crans.org + HostName linkki.crans.org + User sword + +Host ilma ilma.wifi ilma.wifi.crans.org + HostName ilma.wifi.crans.org + User sword + +Host ruoska ruoska.crans.org + HostName ruoska.crans.org + User vincent + + +# +-------+ +# | Power | +# +-------+ +# Le ftp de Nit, gère A♡-TV. Parce que j'y suis aussi le bienvenu + +Host power power.crans.org nit-git nit-git.crans.org + HostName power.crans.org + User vincent + + +# +----+ +# | A♡ | +# +----+ +# Parce que le département A♡ a une raspberry PI ! + +Host rasputin rasputin.crans.org raspyjordy.crans.org raspyjordy + HostName rasputin.crans.org + User vincent + -- 2.39.2