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