Created
January 22, 2018 13:56
-
-
Save KeizerDev/25ed8c91f980fb5d959edb5cd8d5e22d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
### config_eduroam.py door Marco van den Boogaard | |
### Configureer WPA supplicant voor eduroam @HU | |
### Door de zeer specifieke instellingen van eduroam binnen de HU gaat | |
### dit handmatig vaak fout | |
### Het drie keer openen van het bestand is niet heel efficient, maar | |
### een bewuste keuze aangezien het bestand op die manier ook geheel | |
### ongemoeid gelaten kan worden. | |
### laatste wijziging: 10 juli 2017 | |
import smbpasswd | |
import sys | |
import getpass | |
import re | |
import errno | |
wpa_config="/etc/wpa_supplicant/wpa_supplicant.conf" | |
# Open het configuratiebestand om de bestaande configuratie in te lezen en | |
# te controleren of er een oude (al dan niet werkende) eduroam | |
# configuratie verwijderd moet worden | |
# Met behulp van reguliere expressies en hulpvariabelen wordt | |
# de configuratiefile geparsed en vastgelegd waar een | |
# eventuele eduroam configuratie zich bevindt. | |
eduroam = False | |
try: | |
with open(wpa_config, "r") as f: | |
alllines = f.readlines() | |
deletelist = [] | |
for linenr in range(len(alllines)): | |
if re.match("[ \t]*network[ \t]*=[{][ \t]*$", alllines[linenr]): | |
networkstart=linenr | |
if re.match("[ \t]*ssid[ \t]*=[ \t]*\"eduroam\"[ \t]*$", alllines[linenr].lower()): | |
eduroam=True | |
if eduroam and re.match("[ \t]*[}][ \t]*$", alllines[linenr]): | |
# tel in ieder geval 1 op bij het regelnummer aangezien we starten bij 0, en 2 als er een lege regel volgt (anders wordt bij herhaaldelijk gebruik van dit script het configuratiebestand steeds langer met lege regels | |
if linenr < len(alllines)-1 and re.match("^$", alllines[linenr+1]): | |
networkend=linenr+2 | |
else: | |
networkend=linenr+1 | |
# zet het hele blok met betrekking tot eduroam vooraan de lijst van te verwijderen regels, zodat de laatste regels het eerste weggaan (anders klopt gaandeweg de telling niet meer) | |
deletelist.insert(0, (networkstart, networkend)) | |
# reset eduroam hulpvariabele, mogelijk zijn er meer eduroam blokken | |
eduroam=False | |
except IOError as e: | |
if e.errno == errno.ENOENT: | |
print "Bestand {} niet gevonden".format(wpa_config) | |
exit(e.errno) | |
elif e.errno == errno.EACCES: | |
print "Kan bestand {} niet lezen.\nWordt het script wel met rootrechten gedraaid?\nDit kan met behulp van de applicatielink op de desktop,\nmet behulp van sudo of vanuit een root login".format(wpa_config) | |
exit(e.errno) | |
else: | |
raise | |
# Schrijf het bestand zonder de oude eduroam configuratie alleen weg | |
# indien nodig, en met toestemming van de gebruiker | |
if len(deletelist) > 0: | |
if raw_input("Er is een oude eduroam configuratie gevonden.\nConfiguratie van andere netwerken blijft ongemoeid.\nOude eduroam configuratie verwijderen (j/n)? ") == "j": | |
for (begin, eind) in deletelist: | |
del alllines[begin:eind] | |
else: | |
print "Programma afgebroken, er zijn geen wijzigingen aangebracht" | |
exit() | |
try: | |
with open(wpa_config, "w") as f: | |
for line in alllines: | |
f.write(line) | |
except IOError as e: | |
if e.errno == errno.ENOENT: | |
# Dit zou nu niet meer mogen gebeuren, er is al succesvol gelezen | |
print "Bestand {} niet gevonden".format(wpa_config) | |
exit(e.errno) | |
elif e.errno == errno.EACCES: | |
print "Kan bestand {} niet schrijven.\nWordt het script wel met rootrechten gedraaid?\nDit kan met behulp van de applicatielink op de desktop,\nmet behulp van sudo of vanuit een root login".format(wpa_config) | |
exit(e.errno) | |
else: | |
raise | |
# Vraag naar de Eduroam inloggegevens: | |
# username bevat hierna de inlognaam | |
# pwdhash bevat hierna de password hash in NTLM formaat (het is slechts | |
# een MD4 hash, maar beter dan een plaintext wachtwoord in | |
# het configuratiebestand op een systeem waar niet gegarandeerd | |
# is dat het root account erg veilig is | |
# pwdcheck is alleen tijdelijk nodig voor controle van het wachtwoord | |
print("Hieronder wordt gevraagd om gebruikersnaam en (2x) wachtwoord. Sluit af met <Enter>.\nBij het invoeren van het wachtwoord krijg je niets te zien, dit hoort zo.\n") | |
username=raw_input("HU account: ") | |
# Blijf om paren wachtwoorden vragen tot de twee wachtwoorden met elkaar matchen | |
while True: | |
pwdhash=str.lower(smbpasswd.nthash(getpass.getpass("Wachtwoord: "))) | |
pwdcheck=str.lower(smbpasswd.nthash(getpass.getpass("Herhaal wachtwoord: "))) | |
if pwdhash == pwdcheck: | |
# matchende wachtwoorden ingegeven, ga verder | |
break | |
else: | |
print("De ingevoerde wachtwoorden zijn niet gelijk. Probeer het opnieuw") | |
# Definieer nieuw configuratieblok voor eduroam; | |
# username en pwdhash worden met behulp van string.format() toegevoegd, | |
# daarom moeten ook de open- en sluitaccolades pas dan worden toegevoegd, | |
# anders raakt format() in de war | |
eduroam_config=""" | |
network={} | |
ssid=\"eduroam\" | |
proto=RSN | |
key_mgmt=WPA-EAP | |
pairwise=CCMP | |
auth_alg=OPEN | |
eap=PEAP | |
identity=\"{}\" | |
password=hash:{} | |
phase2=\"auth=MSCHAPV2\" | |
{} | |
""" | |
try: | |
with open(wpa_config, "a") as f: | |
f.write(eduroam_config.format("{",username, pwdhash,"}")) | |
except IOError as e: | |
if e.errno == errno.ENOENT: | |
# Dit zou nu niet meer mogen gebeuren, er is al succesvol gelezen | |
print "Bestand {} niet gevonden".format(wpa_config) | |
exit(e.errno) | |
elif e.errno == errno.EACCES: | |
print "Kan bestand {} niet schrijven.\nWordt het script wel met rootrechten gedraaid?\nDit kan met behulp van de applicatielink op de desktop,\nmet behulp van sudo of vanuit een root login".format(wpa_config) | |
exit(e.errno) | |
else: | |
raise |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment