113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com>
213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Copyright (C) 2006 Red Hat
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# see file 'COPYING' for use and warranty information
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# This program is free software; you can redistribute it and/or
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# modify it under the terms of the GNU General Public License as
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# published by the Free Software Foundation; version 2 only
913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# This program is distributed in the hope that it will be useful,
1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# but WITHOUT ANY WARRANTY; without even the implied warranty of
1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# GNU General Public License for more details.
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# You should have received a copy of the GNU General Public License
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# along with this program; if not, write to the Free Software
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleimport sys
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletokens = ('DEFINE',
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'NAME',
2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'TICK',
2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'SQUOTE',
2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'OBRACE',
2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'CBRACE',
2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'SEMI',
2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'OPAREN',
2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'CPAREN',
3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle          'COMMA')
3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlereserved = {
3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    'define' : 'DEFINE' }
3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_TICK      = r'\`'
3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_SQUOTE    = r'\''
3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_OBRACE    = r'\{'
3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_CBRACE    = r'\}'
3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_SEMI      = r'\;'
4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_OPAREN    = r'\('
4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_CPAREN    = r'\)'
4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_COMMA     = r'\,'
4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlet_ignore    = " \t\n"
4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef t_NAME(t):
4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    r'[a-zA-Z_][a-zA-Z0-9_]*'
4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    t.type = reserved.get(t.value,'NAME')
4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    return t
5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef t_error(t):
5215a7553d2274a351fb1098f7bfab86346c5a04b8Robert Kuska    print("Illegal character '%s'" % t.value[0])
5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    t.skip(1)
5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
55fd00e882c4886124008cf473e4a9af1dd7a93b68Robert Kuskafrom . import lex
5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlelex.lex()
5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef p_statements(p):
5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''statements : define_stmt
6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle                  | define_stmt statements
6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''
6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if len(p) == 2:
6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        p[0] = [p[1]]
6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    else:
6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        p[0] = [p[1]] + [p[2]]
6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef p_define_stmt(p):
6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    # This sucks - corresponds to 'define(`foo',`{ read write }')
6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''define_stmt : DEFINE OPAREN TICK NAME SQUOTE COMMA TICK list SQUOTE CPAREN
7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    p[0] = [p[4], p[8]]
7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef p_list(p):
7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''list : NAME
7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle            | OBRACE names CBRACE
7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''
7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if p[1] == "{":
7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        p[0] = p[2]
8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    else:
8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        p[0] = [p[1]]
8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef p_names(p):
8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''names : NAME
8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle             | NAME names
8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    '''
8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if len(p) == 2:
8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        p[0] = [p[1]]
8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    else:
9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        p[0] = [p[1]] + p[2]
9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef p_error(p):
9315a7553d2274a351fb1098f7bfab86346c5a04b8Robert Kuska    print("Syntax error on line %d %s [type=%s]" % (p.lineno, p.value, p.type))
9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
95fd00e882c4886124008cf473e4a9af1dd7a93b68Robert Kuskafrom . import yacc
9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleyacc.yacc()
9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlef = open("all_perms.spt")
10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletxt = f.read()
10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlef.close()
10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#lex.input(txt)
10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#while 1:
10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#    tok = lex.token()
10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#    if not tok:
10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#        break
10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#    print tok
10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletest = "define(`foo',`{ read write append }')"
11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletest2 = """define(`all_filesystem_perms',`{ mount remount unmount getattr relabelfrom relabelto transition associate quotamod quotaget }')
11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledefine(`all_security_perms',`{ compute_av compute_create compute_member check_context load_policy compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot }')
11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle"""
11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleresult = yacc.parse(txt)
11515a7553d2274a351fb1098f7bfab86346c5a04b8Robert Kuskaprint(result)
11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
117