diff --git a/radius_auth.py b/radius_auth.py index f9ae22c9..7cafdea6 100755 --- a/radius_auth.py +++ b/radius_auth.py @@ -3,6 +3,7 @@ import os, md5, sys, binascii from commands import getoutput +from syslog import * sys.path.append('/usr/scripts/gestion') from ldap_crans import crans_ldap, AssociationCrans @@ -26,42 +27,50 @@ def chap_ok(password, challenge, clear_pass) : return False -if __name__ == '__main__' : +def do_auth(): # Test chap (comme cela on est sur que c'est bien un switch qui demande) - mac=os.getenv('USER_NAME','').replace('"','') + mac = os.getenv('USER_NAME', '').replace('"', '') - if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac) : - sys.stdout.write("Echec test CHAP") - sys.exit(-1) + if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac): + return (-1, "Échec test CHAP") # Mac dans la base LDAP - m=crans_ldap(readonly=True).search('mac=%s'%mac)['machine'] - if len(m)!=1 : - sys.stdout.write("Pb recherche mac (nb résultat !=1)") - sys.exit(-1) + m = crans_ldap(readonly=True).search('mac=%s' % mac)['machine'] + if len(m) != 1: + return (-1, "Pb recherche mac (nb résultat !=1)") # N'appartient pas au Crans et n'a pas de prise attribuée # donc sur uplink ou switch non filtré # But : éviter le spoof d'une mac d'une machine clef - proprio=m[0].proprietaire() - if proprio.__class__ == AssociationCrans and m[0].prise() == u'N/A' : - sys.stdout.write("Machine du crans") - sys.exit(-1) + proprio = m[0].proprietaire() + if proprio.__class__ == AssociationCrans and m[0].prise() == u'N/A': + return (-1, "Machine du crans") # blockliste bloq if 'bloq' in m[0].blacklist_actif(): - sys.stdout.write("Bloquage total des services pour cette machine") - sys.exit(-1) + return (-1, "Bloquage total des services pour cette machine") # Paiment ok ? - paid=max(proprio.paiement()+[0]) - if dat[1]==9 : - # En septembre les anciennes adhésion sont OK + paid = max(proprio.paiement() + [0]) + if dat[1] == 9: + # En septembre les anciennes adhésions sont OK ann_scol -= 1 - if ann_scol > paid : - sys.stdout.write("Echec test LDAP") - sys.exit(-1) + if ann_scol > paid: + return (-1, "Échec test LDAP") # C'est bon - sys.stdout.write("Acces OK") - sys.exit(0) + return (0, "Accès OK") + +if __name__ == '__main__' : + # On vérifie si la mac est autorisée + (r, msg) = do_auth() + + # On logue la prise sur laquelle a lieu la tentative + openlog("radius_auth.py") + switch = os.getenv("NAS_IDENTIFIER", "").replace('"', '') + prise = (len(switch) == 6 and (switch[3] + switch[5]) or (switch + "-")) + prise += "%02d" % int(os.getenv("NAS_PORT", 0)) + syslog("%s -> %s [%s]" % (prise, mac, msg)) + + pring msg + sys.exit(r)