113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> 213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# 398455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava# 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 Brindle 2098455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastavaimport os 2198455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastavaimport re 2298455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava 2398455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava# Select the correct location for the development files based on a 2498455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava# path variable (optionally read from a configuration file) 2598455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastavaclass PathChoooser(object): 2698455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava def __init__(self, pathname): 2798455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava self.config = dict() 2898455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava if not os.path.exists(pathname): 2998455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava self.config_pathname = "(defaults)" 3098455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava self.config["SELINUX_DEVEL_PATH"] = "/usr/share/selinux/default:/usr/share/selinux/mls:/usr/share/selinux/devel" 3198455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava return 3298455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava self.config_pathname = pathname 3398455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava ignore = re.compile(r"^\s*(?:#.+)?$") 3498455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava consider = re.compile(r"^\s*(\w+)\s*=\s*(.+?)\s*$") 3598455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava for lineno, line in enumerate(open(pathname)): 3698455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava if ignore.match(line): continue 3798455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava mo = consider.match(line) 3898455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava if not mo: 3998455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava raise ValueError, "%s:%d: line is not in key = value format" % (pathname, lineno+1) 4098455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava self.config[mo.group(1)] = mo.group(2) 4198455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava 4298455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava # We're only exporting one useful function, so why not be a function 4398455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava def __call__(self, testfilename, pathset="SELINUX_DEVEL_PATH"): 4498455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava paths = self.config.get(pathset, None) 4598455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava if paths is None: 4698455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava raise ValueError, "%s was not in %s" % (pathset, self.config_pathname) 4798455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava paths = paths.split(":") 4898455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava for p in paths: 4998455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava target = os.path.join(p, testfilename) 5098455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava if os.path.exists(target): return target 5198455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava return os.path.join(paths[0], testfilename) 5298455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava 5398455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava 5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle""" 5513cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleVarious default settings, including file and directory locations. 5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle""" 5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef data_dir(): 5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return "/var/lib/sepolgen" 6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef perm_map(): 6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return data_dir() + "/perm_map" 6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef interface_info(): 6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return data_dir() + "/interface_info" 6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 67037285e936d252eeb734a956b80158d3bf6685d9Dan Walshdef attribute_info(): 68037285e936d252eeb734a956b80158d3bf6685d9Dan Walsh return data_dir() + "/attribute_info" 69037285e936d252eeb734a956b80158d3bf6685d9Dan Walsh 7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef refpolicy_makefile(): 7198455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava chooser = PathChoooser("/etc/selinux/sepolgen.conf") 7298455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava return chooser("Makefile") 7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledef headers(): 7598455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava chooser = PathChoooser("/etc/selinux/sepolgen.conf") 7698455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava return chooser("include") 7798455c552451133e1b62fd120b7ae7d921fa59d7Manoj Srivastava 78