File: classperms.py

package info (click to toggle)
sepolgen 1.1.5-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,976 kB
  • sloc: python: 5,679; makefile: 52
file content (116 lines) | stat: -rw-r--r-- 2,801 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com>
#
# Copyright (C) 2006 Red Hat 
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; version 2 only
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import sys

tokens = ('DEFINE',
          'NAME',
          'TICK',
          'SQUOTE',
          'OBRACE',
          'CBRACE',
          'SEMI',
          'OPAREN',
          'CPAREN',
          'COMMA')

reserved = {
    'define' : 'DEFINE' }

t_TICK      = r'\`'
t_SQUOTE    = r'\''
t_OBRACE    = r'\{'
t_CBRACE    = r'\}'
t_SEMI      = r'\;'
t_OPAREN    = r'\('
t_CPAREN    = r'\)'
t_COMMA     = r'\,'

t_ignore    = " \t\n"

def t_NAME(t):
    r'[a-zA-Z_][a-zA-Z0-9_]*'
    t.type = reserved.get(t.value,'NAME')
    return t

def t_error(t):
    print "Illegal character '%s'" % t.value[0]
    t.skip(1)

import lex
lex.lex()

def p_statements(p):
    '''statements : define_stmt
                  | define_stmt statements
    '''
    if len(p) == 2:
        p[0] = [p[1]]
    else:
        p[0] = [p[1]] + [p[2]]

def p_define_stmt(p):
    # This sucks - corresponds to 'define(`foo',`{ read write }')
    '''define_stmt : DEFINE OPAREN TICK NAME SQUOTE COMMA TICK list SQUOTE CPAREN
    '''
    
    p[0] = [p[4], p[8]]

def p_list(p):
    '''list : NAME
            | OBRACE names CBRACE
    '''
    if p[1] == "{":
        p[0] = p[2]
    else:
        p[0] = [p[1]]

def p_names(p):
    '''names : NAME
             | NAME names
    '''
    if len(p) == 2:
        p[0] = [p[1]]
    else:
        p[0] = [p[1]] + p[2]

def p_error(p):
    print "Syntax error on line %d %s [type=%s]" % (p.lineno, p.value, p.type)
    
import yacc
yacc.yacc()


f = open("all_perms.spt")
txt = f.read()
f.close()

#lex.input(txt)
#while 1:
#    tok = lex.token()
#    if not tok:
#        break
#    print tok

test = "define(`foo',`{ read write append }')"
test2 = """define(`all_filesystem_perms',`{ mount remount unmount getattr relabelfrom relabelto transition associate quotamod quotaget }')
define(`all_security_perms',`{ compute_av compute_create compute_member check_context load_policy compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot }')
"""
result = yacc.parse(txt)
print result