]> gitweb.pimeys.fr Git - scripts-20-100.git/commitdiff
Génération automatique de .ssh/config
authorVincent Le Gallic <legallic@crans.org>
Sun, 29 Sep 2013 12:43:05 +0000 (14:43 +0200)
committerVincent Le Gallic <legallic@crans.org>
Sun, 29 Sep 2013 12:45:35 +0000 (14:45 +0200)
.gitignore
ssh/generate_config.py [new file with mode: 0755]
ssh/static_after [new file with mode: 0644]
ssh/static_before [new file with mode: 0644]

index eeaee31ffad94081b74d85493feb1a792f35634c..fd6bdcc03facf86cb9aca7eb1a09c0ba005bf215 100644 (file)
@@ -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 (executable)
index 0000000..d71b488
--- /dev/null
@@ -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 (file)
index 0000000..22ed017
--- /dev/null
@@ -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 (file)
index 0000000..292892b
--- /dev/null
@@ -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
+