Skip to content

Instantly share code, notes, and snippets.

@KeizerDev
Created January 22, 2018 13:56
Show Gist options
  • Save KeizerDev/25ed8c91f980fb5d959edb5cd8d5e22d to your computer and use it in GitHub Desktop.
Save KeizerDev/25ed8c91f980fb5d959edb5cd8d5e22d to your computer and use it in GitHub Desktop.
#!/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