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