Browse Source

Refactored error handling.

Félix Baylac-Jacqué 6 years ago
parent
commit
b40baf4c51
2 changed files with 55 additions and 35 deletions
  1. 0 2
      todo.txt
  2. 55 33
      wireguardCreate

+ 0 - 2
todo.txt

@@ -1,6 +1,4 @@
 TODO
 
-- Refactor error handling.
-- Implement tinfoil hat mode.
 - Write proper makefile to distribute.
 - Expose config via CLI flags.

+ 55 - 33
wireguardCreate

@@ -158,6 +158,7 @@ def send_mail(email, wgconfig_path):
     server.login(email.username, email.passwd)
     server.sendmail(email.from_addr, email.to_addr, msg.as_string())
     server.quit()
+    print("[+] E-Mail envoyé à %s." % email.to_addr)
 
 # Main Function
 # =============
@@ -173,36 +174,57 @@ if __name__ == '__main__':
     config = Config(cp)
     (member_email, member_id) = check_env()
     with tempfile.TemporaryDirectory() as temp_dir:
-        print("[+] Génération des clés wireguard")
-        (privkey_path, pubkey_path, psk_path) = gen_wg_keys(temp_dir)
-        print("[+] Modification de la configuration wireguard")
-        if not is_duplicate_entry_wg_conf(member_id, config_file):
-            update_wg_config(member_id, config_file, pubkey_path, psk_path)
-        else:
-            print("Le membre {} semble déja avoir un compte VPN.".format(member_id))
-            print("Veuillez contacter la liste de diffusion technique\
-                    si son compte necessite une ré-activation.")
-            sys.exit(1)
-        print("[+] Chargement de la nouvelle interface réseau")
-        _run_cmd("systemctl restart %s" % (config.wg_service)) 
-        print("[+] Envoi de la clé privée au nouveau membre")
-        if use_email:
-            with open(privkey_path, "r") as pkh:
-               peer_privkey = pkh.read() 
-            with open(psk_path, "r") as pskh:
-               peer_psk = pskh.read() 
-            email = Email(config.smtp_user, config.smtp_pass, config.smtp_from,\
-                          member_email, config.smtp_server)
-            send_email(email, generate_wg_quick_client_config(peer_privkey, member_id, config.pubkey,\
-                       peer_psk, config.endpoint))
-        else:
-            print("Mode utilisateur avancé")
-            print("=======================")
-            print("À vous de vous débrouiller pour donner les clés/config à l'utilisateur")
-            print("Clé privée: %s" % (privkey_path))
-            print("Clé pré-partagée (psk): %s" % (psk_path)) 
-            print("Clé publique (psk): %s" % (pubkey_path)) 
-            input("Appuyez sur entrée pour continuer (les clés privées seront détruites): ")
-        print("[+] Nettoyage des clés")
-        _run_cmd("shred -u %s %s %s" % (privkey_path, pubkey_path, psk_path))
-        print("[+] COMPTE CRÉE AVEC SUCCÈS")
+        try:
+            print("[+] Génération des clés wireguard")
+            (privkey_path, pubkey_path, psk_path) = gen_wg_keys(temp_dir)
+            print("[+] Envoi de la clé privée au nouveau membre")
+            print("Deux solutions ici:")
+            print("1- On envoie la configuration du nouveau membre en ligne. (automatique)")
+            print("2- On utilise une autre méthode pour passer la configuration au nouveau membre. (manuel)")
+            print("")
+            print("Suivant votre modèle de menace, envoyer la clé privée par e-mail peut ou peut ne pas être une bonne idée.")
+            use_email = input("Envoyer la configuration (contenant la clé privée) par email? (O/n)")
+            if use_email.strip().lower() == "o" :
+                with open(privkey_path, "r") as pkh:
+                   peer_privkey = pkh.read() 
+                with open(psk_path, "r") as pskh:
+                   peer_psk = pskh.read() 
+                email = Email(config.smtp_user, config.smtp_pass, config.smtp_from,\
+                              member_email, config.smtp_server)
+                send_email(email, generate_wg_quick_client_config(peer_privkey, member_id, config.pubkey,\
+                           peer_psk, config.endpoint))
+            else:
+                print("Mode utilisateur avancé")
+                print("=======================")
+                print("À vous de vous débrouiller pour passer les clés/config à l'utilisateur")
+                print("Clé privée: %s" % (privkey_path))
+                print("Clé pré-partagée (psk): %s" % (psk_path)) 
+                print("Clé publique (psk): %s" % (pubkey_path)) 
+                input("Appuyez sur entrée pour continuer (les clés privées seront détruites): ")
+        except Exception as e:
+            print("ERREUR: erreur lors de la génération/transfert de la clé:")
+            print(e)
+            print("Si vous ne comprenez pas le problème, transférez le message d'erreur complet à la liste\
+                    de diffusion technique.")
+            print("Pas de panique: on n'a pas touché à la configuration du serveur de wireguard, \
+                    rien n'a cassé.")
+        try:
+            print("[+] Modification de la configuration wireguard")
+            if not is_duplicate_entry_wg_conf(member_id, config_file):
+                update_wg_config(member_id, config_file, pubkey_path, psk_path)
+            else:
+                print("Le membre {} semble déja avoir un compte VPN.".format(member_id))
+                print("Veuillez contacter la liste de diffusion technique\
+                        si son compte necessite une ré-activation.")
+                sys.exit(1)
+            print("[+] Chargement de la nouvelle interface réseau")
+            _run_cmd("systemctl restart %s" % (config.wg_service)) 
+            print("[+] Nettoyage des clés")
+            _run_cmd("shred -u %s %s %s" % (privkey_path, pubkey_path, psk_path))
+            print("[+] COMPTE CRÉE AVEC SUCCÈS")
+        except Exception as e:
+            print("ERREUR CRITIQUE: attention, la configuration wireguard est cassée, il y a probablement urgence.")
+            print(e)
+            print("Si vous ne savez pas quoi faire pour régler le problème, contactez en urgence la\
+                    liste de diffusion technique en joignant le message d'erreur ci-dessus.")
+            print("Je le répète: le serveur VPN est probablement cassé, c'est une urgence.")