def create_parser(): DOTS = p.Suppress("...") NSTAT_PREFIX = p.Suppress("Status of node") PERM_PREFIX = p.Suppress("Permissions on") nodename = p.Word(p.alphanums + '\'_-@') block_nstat = p.Group(NSTAT_PREFIX + nodename + DOTS + erlblock_parser()) nstat = p.Dict(p.OneOrMore(p.Suppress(p.SkipTo(NSTAT_PREFIX)) + block_nstat)).setResultsName('nstat') perm = p.Suppress(p.SkipTo(PERM_PREFIX)) + perm_parser().setResultsName('perm') return nstat + perm
def perm_parser(): COLON = p.Suppress(":") WHITE = p.Suppress(p.White()) vhostname = p.Word(p.alphanums + '_-/') username = p.Word(p.alphanums + '_-') conf = p.Word(p.alphanums + '.*#') perm_vhost = p.Suppress("Permissions on") + vhostname + COLON ucwr = p.Suppress("user" + WHITE + "configure" + WHITE + "write" + WHITE + "read") perm_line = p.Group(username + 3 * (WHITE + conf)) perm_con = p.Optional(ucwr + p.Dict(p.OneOrMore(perm_line))) perm_block = p.Group(perm_vhost + perm_con) perm = p.Dict(p.OneOrMore(perm_block)) return perm
def erlblock_parser(): COMMA = p.Suppress(',') LBRACE, RBRACE = map(p.Suppress, "{}") LBRACKET, RBRACKET = map(p.Suppress, "[]") key = p.Word(p.alphas + '_') value_tnum = p.Word(p.nums + '.') value_tword = p.Word(p.alphanums + '/"-[]:.()') value_tstr = p.OneOrMore(value_tword) value_tdoustrs = value_tstr + COMMA + value_tstr value_tnumstr = value_tnum + value_tstr value = value_tdoustrs | value_tnumstr | value_tstr | value_tnum attr = LBRACE + p.Group(key + COMMA + value) + RBRACE attr_list = p.Dict(p.ZeroOrMore(attr + COMMA) + p.ZeroOrMore(attr)) block = LBRACKET + attr_list + RBRACKET value_plus = block | attr | value attr = LBRACE + p.Group(key + COMMA + value_plus) + RBRACE attr_list = p.Dict(p.OneOrMore(attr + COMMA) + p.OneOrMore(attr)) block = LBRACKET + attr_list + RBRACKET return block