2.87 KB
Newer Older
canterburym's avatar
canterburym committed
import logging

from asn1tools import parse_files, compile_dict, ParseError, CompileError
from glob import glob
from pathlib import Path

from pprint import pprint

def parseASN1File (asnFile):
    except ParseError as ex:
        return [ex]
    return []

def parseASN1Files (fileList):
    if len(fileList) == 0:
        logging.warning ("No files specified")
        return {}
    errors = {}"Parsing files...")
    for f in fileList:
        ex = parseASN1File(f)
        if ex: 
   (f"  {f}: Failed - {ex!r}")
   (f"  {f}: OK")            
        errors[f] = ex
    return errors

def compileASN1Files (fileList):"Compiling files...")
    errors = []
        d = parse_files(fileList)
        for modulename, module in d.items():
            # Weird fix because the compiler doesn't like RELATIVE-OID as a type
            # Not sure if the on-the-wire encoding would be affected or not
            # but for most checking purposes this doesn't matter
            module['types']["RELATIVE-OID"] = {'type' : 'OBJECT IDENTIFIER'}
        c = compile_dict(d)
    except CompileError as ex: (f"Compiler  error: {ex}")
    except ParseError as ex: (f"Parse error: {ex}")
        errors.append(ex) ("Compiled OK")
    return errors

def validateASN1Files (fileList):
    parseErrors = parseASN1Files(fileList)
#    if len(parseErrors > 0):
# ("Abandonding compile due to parse errors")
#    compileErrors = compileASN1Files(fileList)
#   leave this for now - TBD
    compileErrors = []
    return parseErrors, compileErrors

def validateAllASN1FilesInPath (path):
    p = Path(path)
    fileGlob = [str(f) for f in  p.rglob('*.asn')]
    fileGlob += [str(f) for f in p.rglob('*.asn1')]
    return validateASN1Files(fileGlob)    

if __name__ == '__main__':
    parseErrors, compileErrors = validateAllASN1FilesInPath("./")
    parseErrorCount = 0
    print ("ASN.1 Parser checks:")
    print ("-----------------------------")
    for filename, errors in parseErrors.items():
        if len(errors) > 0:
            parseErrorCount += len(errors)
            print (f"{filename}: {len(errors)} errors")
            for error in errors:
                print ("  " + str(error))
            print (f"{filename}: OK")
    print ("-----------------------------")
    print ("ASN.1 Compilation:")
    print ("-----------------------------")
    if len(compileErrors) > 0:
        for error in compileErrors:            
            print ("  " + str(error))
        print ("Compilation OK")
    print ("-----------------------------")
    print (f"{parseErrorCount} parse errors, {len(compileErrors)} compile errors")
    exit (parseErrorCount + len(compileErrors))