Fixed getResult* and getRessource* sets of functions.
[py-rsbac] / rsbac / _misc.py
1 # -*- coding:utf-8 -*-
2
3 # py-rsbac - RSBAC Python bindings
4 # Copyright (C) 2006  Frederic Jolliton <pyrsbac@tuxee.net>
5
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20 __all__ = []
21
22 from ctypes import c_char, byref, create_string_buffer
23
24 from rsbac import headers, lib
25 from rsbac.errors import raiseIfError
26 from rsbac._utils import aptr
27
28 def export( fun ) :
29     __all__.append( fun.__name__ )
30     return fun
31
32 @export
33 def kernelVersion() :
34     """Return the RSBAC kernel version as a 3-tuple.
35
36     """
37     v = lib.rsbac_version()
38     v , z = divmod( v , 256 )
39     v , y = divmod( v , 256 )
40     x = v
41     return x , y , z
42
43 @export
44 def dumpStats() :
45     """Dump statistics about RSBAC to kernel log.
46
47     """
48     return raiseIfError( lib.rsbac_stats() )
49
50 @export
51 def checkConsistency( correct , checkInode ) :
52     """Consistency checking (as far as possible)
53
54     correct = 0: do not correct errors
55     correct = 1: correct errors
56     correct = 2: correct more
57     checkInode = 0: do not check inode numbers
58     checkInode = 1: also check inode numbers (only ext2/3 on 2.4 kernels)
59
60     """
61     return raiseIfError( lib.rsbac_check( correct , checkInode ) )
62
63 @export
64 def writeDirtyLists() :
65     """Write all dirty lists to disk. Returns number of lists written.
66
67     """
68     return raiseIfError( lib.rsbac_write() )
69
70 def _rsbacLog( type , size = None ) :
71     if type in ( 2 , 3 , 4 ) :
72         if size is None :
73             size = 4096
74         buffer = ( c_char * size )()
75         raiseIfError( lib.rsbac_log( type , aptr( buffer ) , size ) )
76         return buffer.value
77     else :
78         return raiseIfError( lib.rsbac_log( type , None , 0 ) )
79
80 @export
81 def openLog() :
82     """Open RSBAC log (Warning: no-op)
83
84     """
85     return _rsbacLog( 1 )
86
87 @export
88 def closeLog() :
89     """Close RSBAC log (Warning: no-op)
90
91     """
92     return _rsbacLog( 0 )
93
94 @export
95 def readLog( size = 4096 ) :
96     """Read RSBAC log.
97
98     """
99     return _rsbacLog( 2 , size )
100
101 @export
102 def readRingBuffer( size = 4096 ) :
103     """Read the ring buffer.
104
105     """
106     return _rsbacLog( 3 , size )
107
108 @export
109 def readAndClearRingBuffer( size = 4096 ) :
110     """Read and clear the ring buffer.
111
112     """
113     return _rsbacLog( 4 , size )
114
115 @export
116 def clearRingBuffer() :
117     """Clear the ring buffer.
118
119     """
120     return _rsbacLog( 5 )
121
122 @export
123 def init( path ) :
124     """Initialize a filesystem with RSBAC.
125
126     """
127     return raiseIfError( lib.rsbac_init( path ) )
128
129 #--[ getname ]----------------------------------------------------------------
130
131 g_nameBuffer = create_string_buffer( 65536 )
132
133 #
134 # This function creates 3 functions to wrap get_XX_name and get_XX_nr
135 # RSBAC functions. The resulting functions are named getXxxName,
136 # getXxxNames and getXxxNumber.
137 #
138 # __makeGetNameFunctions( 'Foo' , 'foo' , .. ) creates
139 # getFooName(value), getFooNames(), getFooNumber(name)
140 #
141 def __makeGetNameFunctions( name , fname , limit ) :
142     byName = getattr( lib , 'get_' + fname + '_name' )
143     byNumber = getattr( lib , 'get_' + fname + '_nr' )
144     names = []
145     def getName( value ) :
146         if 0 <= value < limit :
147             return byName( g_nameBuffer , value )
148     def getNames() :
149         if not names :
150             names[ : ] = map( getName , range( limit ) )
151         return names
152     def getNumber( name ) :
153         result = byNumber( name )
154         if getName( result ) == name :
155             return result
156     import sys
157     m = sys.modules[ __name__ ]
158     a = 'get' + name + 'Name'
159     b = 'get' + name + 'Names'
160     c = 'get' + name + 'Number'
161     setattr( m , a , getName )
162     setattr( m , b , getNames )
163     setattr( m , c , getNumber )
164     __all__.extend( [ a , b , c ] )
165
166 # getname.c
167
168 __makeGetNameFunctions( 'Request' , 'request' , headers.R_NONE )
169 __makeGetNameFunctions( 'Result' , 'result' , headers.UNDEFINED + 1 )
170
171 @export
172 def getAttributeModule( attribute ) :
173     if 0 <= attribute <= headers.A_none :
174         return lib.get_attr_module( attribute )
175
176 __makeGetNameFunctions( 'Attribute' , 'attribute' , headers.A_none + 1 )
177
178 # def getAttributeValueName( .. ) : pass
179
180 __makeGetNameFunctions( 'ScdType' , 'scd_type' , headers.ST_none + 1 )
181
182 # We choose the following mapping:
183 # get_target_name -> getTargetNameFull
184 # get_target_name_only -> getTargetName
185
186 # def getTargetNameFull( .. ) : pass
187
188 # FIXME: Update __makeGetNameFunctions to handle this. (Allowing to
189 # use an alternative suffix.)
190 @export
191 def getTargetName( target ) :
192     if 0 <= target <= headers.T_NONE :
193         return lib.get_target_name_only( g_nameBuffer , target )
194
195 @export
196 def getTargetNames( __r = [] ) :
197     if not __r :
198         __r[ : ] = map( getTargetName , range( headers.T_NONE + 1 ) )
199     return __r
200
201 @export
202 def getTargetNumber( name ) :
203     target = lib.get_target_nr( name )
204     if getTargetName( target ) == name :
205         return target
206
207 __makeGetNameFunctions( 'IpcTarget' , 'ipc_target' , headers.I_none + 1 )
208 __makeGetNameFunctions( 'SwitchTarget' , 'switch_target' , headers.SW_NONE + 1 )
209
210 @export
211 def getErrorName( error ) :
212     return lib.get_error_name( g_nameBuffer , error )
213
214 @export
215 def getAttributeParameters( attribute ) :
216     if 0 <= attribute <= headers.A_none :
217         return lib.get_attribute_param( g_nameBuffer , attribute )
218
219 __makeGetNameFunctions( 'LogLevel' , 'log_level' , headers.LL_invalid + 1 )
220
221 @export
222 def getCapName( value ) :
223     name = lib.get_cap_name( g_nameBuffer , value )
224     if name != 'ERROR!' :
225         return name
226
227 @export
228 def getCapNames( __r = [] ) :
229     if not __r :
230         i = 0
231         while 1 :
232             name = getCapName( i )
233             if not name :
234                 break
235             __r.append( name )
236             i += 1
237     return __r
238
239 @export
240 def getCapNumber( name ) :
241     value = lib.get_cap_nr( name )
242     if getCapName( value ) == name :
243         return value
244
245 # rc_getname.c
246
247 __makeGetNameFunctions( 'RcTarget' , 'rc_target' , headers.RT_NONE + 1 )
248 __makeGetNameFunctions( 'RcAdmin' , 'rc_admin' , headers.RC_none + 1 )
249
250 @export
251 def getRcScdTypeName( value ) :
252     name = lib.get_rc_scd_type_name( g_nameBuffer , value )
253     if name != 'ERROR!' :
254         return name
255
256 @export
257 def getRcScdTypeNames( __r = [] ) :
258     if not __r :
259         __r[ : ] = map( getRcScdTypeName , range( headers.RST_none + 1 ) )
260     return __r
261
262 @export
263 def getRcScdTypeNumber( name ) :
264     value = lib.get_rc_scd_type_nr( name )
265     if getRcScdTypeName( value ) == name :
266         return value
267
268 __makeGetNameFunctions( 'RcItem' , 'rc_item' , headers.RI_none + 1 )
269
270 @export
271 def getRcItemParameters( value ) :
272     if 0 <= value <= headers.RI_none :
273         return lib.get_rc_item_param( g_nameBuffer , value )
274
275 @export
276 def getRcSpecialRightName( value ) :
277     name = lib.get_rc_special_right_name( g_nameBuffer , value )
278     if name != 'ERROR!' :
279         return name
280
281 @export
282 def getRcSpecialRightNames( __r = [] ) :
283     if not __r :
284         __r[ : ] = map( getRcSpecialRightName , range( headers.RCR_NONE + 1 ) )
285     return __r
286
287 @export
288 def getRcSpecialRightNumber( name ) :
289     value = lib.get_rc_special_right_nr( name )
290     if getRcSpecialRightName( value ) == name :
291         return value
292
293 # res_getname.c
294
295 @export
296 def getRessourceName( value ) :
297     name = lib.get_res_name( g_nameBuffer , value )
298     if name != 'ERROR!' :
299         return name
300
301 @export
302 def getRessourceNames( __r = [] ) :
303     if not __r :
304         i = 0
305         while 1 :
306             name = getRessourceName( i )
307             if not name :
308                 break
309             __r.append( name )
310             i += 1
311     return __r
312
313 @export
314 def getRessourceNumber( name ) :
315     value = lib.get_res_nr( name )
316     if getRessourceName( value ) == name :
317         return value
318
319 # Local Variables:
320 # indent-tabs-mode: nil
321 # python-indent: 4
322 # End: