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