11dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#!/usr/bin/python -Es
21dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
31dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris# Copyright (C) 2012 Red Hat
41dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris# see file 'COPYING' for use and warranty information
51dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
61dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris# policygentool is a tool for the initial generation of SELinux policy
71dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
81dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    This program is free software; you can redistribute it and/or
91dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    modify it under the terms of the GNU General Public License as
101dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    published by the Free Software Foundation; either version 2 of
111dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    the License, or (at your option) any later version.
121dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
131dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    This program is distributed in the hope that it will be useful,
141dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    but WITHOUT ANY WARRANTY; without even the implied warranty of
151dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
161dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    GNU General Public License for more details.
171dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
181dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    You should have received a copy of the GNU General Public License
191dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    along with this program; if not, write to the Free Software
201dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
211dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#                                        02111-1307  USA
221dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
231dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris#
24e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshimport re, sys
25e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshimport sepolicy
261dce0bf16d6300d4858d611cb29de336bfd85f9aEric ParisADMIN_TRANSITION_INTERFACE = "_admin$"
271dce0bf16d6300d4858d611cb29de336bfd85f9aEric ParisUSER_TRANSITION_INTERFACE = "_role$"
281dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris
29e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh__all__ = [ 'get_all_interfaces', 'get_interfaces_from_xml', 'get_admin', 'get_user' ,'get_interface_dict', 'get_interface_format_text', 'get_interface_compile_format_text', 'get_xml_file', 'interface_compile_test' ]
301dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris
311dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris##
321dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris## I18N
331dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris##
341dce0bf16d6300d4858d611cb29de336bfd85f9aEric ParisPROGNAME="policycoreutils"
351dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris
361dce0bf16d6300d4858d611cb29de336bfd85f9aEric Parisimport gettext
371dce0bf16d6300d4858d611cb29de336bfd85f9aEric Parisgettext.bindtextdomain(PROGNAME, "/usr/share/locale")
381dce0bf16d6300d4858d611cb29de336bfd85f9aEric Parisgettext.textdomain(PROGNAME)
391dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paristry:
401dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    gettext.install(PROGNAME,
411dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris                    localedir="/usr/share/locale",
421dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris                    unicode=False,
431dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris                    codeset = 'utf-8')
441dce0bf16d6300d4858d611cb29de336bfd85f9aEric Parisexcept IOError:
451dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    import __builtin__
461dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    __builtin__.__dict__['_'] = unicode
471dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris
48e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_interfaces_from_xml(path):
49e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    """ Get all interfaces from given xml file"""
50e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    interfaces_list = []
51e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    idict = get_interface_dict(path)
52e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    for k in idict.keys():
53e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        interfaces_list.append(k)
54e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    return interfaces_list
55e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
56e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
57e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_all_interfaces(path=""):
58e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    from sepolicy import get_methods
59e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    all_interfaces = []
60e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    if not path:
61e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        all_interfaces = get_methods()
62e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    else:
63e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        xml_path = get_xml_file(path)
64e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        all_interfaces = get_interfaces_from_xml(xml_path)
65e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
66e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    return all_interfaces
67e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
68e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_admin(path=""):
69e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    """ Get all domains with an admin interface from installed policy."""
70e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    """ If xml_path is specified, func returns an admin interface from specified xml file"""
711dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    admin_list = []
72e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    if path:
73e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        try:
74e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            xml_path = get_xml_file(path)
75e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            idict = get_interface_dict(xml_path)
76e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            for k in idict.keys():
77e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                if k.endswith("_admin"):
78e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    admin_list.append(k)
79e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        except IOError, e:
80e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e)))
81e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            sys.exit(1)
82e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    else:
83e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        for i in sepolicy.get_methods():
84e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            if i.endswith("_admin"):
85e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                admin_list.append(i.split("_admin")[0])
86e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
871dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    return admin_list
881dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris
89e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_user(path=""):
901dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    """ Get all domains with SELinux user role interface"""
91e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    """ If xml_path is specified, func returns an user role interface from specified xml file"""
921dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    trans_list = []
93e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    if path:
94e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        try:
95e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            xml_path = get_xml_file(path)
96e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            idict = get_interface_dict(xml_path)
97e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            for k in idict.keys():
98e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                if k.endswith("_role"):
99e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    if (("%s_exec_t" % k[:-5]) in sepolicy.get_all_types()):
100e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                        trans_list.append(k)
101e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        except IOError, e:
102e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e)))
103e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            sys.exit(1)
104e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    else:
105e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        for i in sepolicy.get_methods():
106e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            m = re.findall("(.*)%s" % USER_TRANSITION_INTERFACE, i)
107e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            if len(m) > 0:
108e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                if "%s_exec_t" % m[0] in sepolicy.get_all_types():
109e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    trans_list.append(m[0])
110e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
1111dce0bf16d6300d4858d611cb29de336bfd85f9aEric Paris    return trans_list
112e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
113e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshinterface_dict = None
114e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_interface_dict(path="/usr/share/selinux/devel/policy.xml"):
115e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    global interface_dict
116e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    import os
117e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    import xml.etree.ElementTree
118e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    if interface_dict:
119e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        return interface_dict
120e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
121e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    interface_dict = {}
122e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    param_list = []
123e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
124e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    xml_path = """<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
125e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh<policy>
126e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh<layer name="admin">
127e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh"""
128e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    xml_path += path
129e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    xml_path +="""
130e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh</layer>
131e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh</policy>
132e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh"""
133e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
134e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    try:
135e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        if os.path.isfile(path):
136e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            tree = xml.etree.ElementTree.parse(path)
137e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        else:
138e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            tree = xml.etree.ElementTree.fromstring(xml_path)
139e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        for l in tree.findall("layer"):
140e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            for m in l.findall("module"):
141e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                for i in m.getiterator('interface'):
142e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    for e in i.findall("param"):
143e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                        param_list.append(e.get('name'))
144e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    interface_dict[(i.get("name"))] = [param_list,(i.find('summary').text),"interface"]
145e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    param_list = []
146e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                for i in m.getiterator('template'):
147e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    for e in i.findall("param"):
148e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                        param_list.append(e.get('name'))
149e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    interface_dict[(i.get("name"))] = [param_list,(i.find('summary').text),"template"]
150e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                    param_list = []
151e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    except IOError, e:
152e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        pass
153e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    return interface_dict
154e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
155e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_interface_format_text(interface,path = "/usr/share/selinux/devel/policy.xml"):
156e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    idict = get_interface_dict(path)
157e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    interface_text = "%s(%s) %s" % (interface, ", ".join(idict[interface][0]), " ".join(idict[interface][1].split("\n")))
158e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
159e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    return interface_text
160e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
161e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_interface_compile_format_text(interfaces_dict, interface):
162e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    from templates import test_module
163e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    param_tmp = []
164e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    for i in interfaces_dict[interface][0]:
165e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        param_tmp.append(test_module.dict_values[i])
166e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        interface_text = "%s(%s)\n" % (interface, ", ".join(param_tmp))
167e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
168e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    return interface_text
169e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
170e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef generate_compile_te(interface, idict, name="compiletest"):
171e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    from templates import test_module
172e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    te = ""
173e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    te += re.sub("TEMPLATETYPE", name, test_module.te_test_module )
174e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    te += get_interface_compile_format_text(idict,interface)
175e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
176e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    return te
177e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
178e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef get_xml_file(if_file):
179e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    """ Returns xml format of interfaces for given .if policy file"""
180e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    import os, commands
181e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    basedir = os.path.dirname(if_file)+"/"
182e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    filename = os.path.basename(if_file).split(".")[0]
183e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    rc, output=commands.getstatusoutput("python /usr/share/selinux/devel/include/support/segenxml.py -w -m %s" % basedir+filename)
184e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    if rc != 0:
185e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        sys.stderr.write("\n Could not proceed selected interface file.\n")
186e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        sys.stderr.write("\n%s" % output)
187e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        sys.exit(1)
188e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    else:
189e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        return output
190e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
191e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walshdef interface_compile_test(interface, path = "/usr/share/selinux/devel/policy.xml"):
192e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    exclude_interfaces = ["userdom","kernel","corenet","files", "dev"]
193e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    exclude_interface_type = ["template"]
194e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
195e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    import commands, os
196e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    policy_files = {'pp':"compiletest.pp", 'te':"compiletest.te", 'fc':"compiletest.fc", 'if':"compiletest.if"}
197e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    idict = get_interface_dict(path)
198e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
199e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    if not (interface.split("_")[0] in exclude_interfaces or idict[interface][2] in exclude_interface_type):
200e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        print(_("Compiling %s interface" % interface))
201e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        try:
202e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            fd = open(policy_files['te'], "w")
203e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            fd.write(generate_compile_te(interface, idict))
204e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            fd.close()
205e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            rc, output=commands.getstatusoutput("make -f /usr/share/selinux/devel/Makefile %s" % policy_files['pp'] )
206e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            if rc != 0:
207e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                sys.stderr.write(output)
208e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                sys.stderr.write(_("\nCompile test for %s failed.\n") % interface)
209e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
210e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        except EnvironmentError, e:
211e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            sys.stderr.write(_("\nCompile test for %s has not run. %s\n") % (interface, e))
212e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        for v in policy_files.values():
213e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh            if os.path.exists(v):
214e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh                os.remove(v)
215e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh
216e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh    else:
217e6a1298e5421e5e499ac79243ff2f794dce6ec22Dan Walsh        sys.stderr.write(_("\nCompiling of %s interface is not supported." % interface))
218