1a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep#!/usr/bin/python
2a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# Copyright 2014-2015, Tresys Technology, LLC
3a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep#
4a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# This file is part of SETools.
5a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep#
6a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# SETools is free software: you can redistribute it and/or modify
7a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# it under the terms of the GNU General Public License as published by
8a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# the Free Software Foundation, either version 2 of the License, or
9a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# (at your option) any later version.
10a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep#
11a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# SETools is distributed in the hope that it will be useful,
12a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# but WITHOUT ANY WARRANTY; without even the implied warranty of
13a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# GNU General Public License for more details.
15a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep#
16a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# You should have received a copy of the GNU General Public License
17a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep# along with SETools.  If not, see <http://www.gnu.org/licenses/>.
18a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep#
19a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
20a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepfrom __future__ import print_function
21a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepimport setools
22a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepimport argparse
23a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepimport sys
24a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepimport logging
25a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
26a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepparser = argparse.ArgumentParser(
27a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    description="SELinux policy rule search tool.",
28a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    epilog="TE/MLS rule searches cannot be mixed with RBAC rule searches.")
29a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepparser.add_argument("--version", action="version", version=setools.__version__)
30a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepparser.add_argument("policy", help="Path to the SELinux policy to search.", nargs="?")
31a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepparser.add_argument("-v", "--verbose", action="store_true",
32a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Print extra informational messages")
33a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepparser.add_argument("--debug", action="store_true", dest="debug", help="Enable debugging.")
34a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
35a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes = parser.add_argument_group("TE Rule Types")
36a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes.add_argument("-A", "--allow", action="append_const",
37a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    const="allow", dest="tertypes",
38a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Search allow rules.")
39a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes.add_argument("--auditallow", action="append_const",
40a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    const="auditallow", dest="tertypes",
41a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Search auditallow rules.")
42a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes.add_argument("--dontaudit", action="append_const",
43a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    const="dontaudit", dest="tertypes",
44a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Search dontaudit rules.")
45a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes.add_argument("-T", "--type_trans", action="append_const",
46a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    const="type_transition", dest="tertypes",
47a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Search type_transition rules.")
48a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes.add_argument("--type_change", action="append_const",
49a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    const="type_change", dest="tertypes",
50a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Search type_change rules.")
51a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprtypes.add_argument("--type_member", action="append_const",
52a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    const="type_member", dest="tertypes",
53a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                    help="Search type_member rules.")
54a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
55a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprbacrtypes = parser.add_argument_group("RBAC Rule Types")
56a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprbacrtypes.add_argument("--role_allow", action="append_const",
57a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                        const="allow", dest="rbacrtypes",
58a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                        help="Search role allow rules.")
59a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeprbacrtypes.add_argument("--role_trans", action="append_const",
60a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                        const="role_transition", dest="rbacrtypes",
61a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                        help="Search role_transition rules.")
62a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
63a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepmlsrtypes = parser.add_argument_group("MLS Rule Types")
64a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepmlsrtypes.add_argument("--range_trans", action="append_const",
65a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                       const="range_transition", dest="mlsrtypes",
66a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                       help="Search range_transition rules.")
67a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
68a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr = parser.add_argument_group("Expressions")
69a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr.add_argument("-s", "--source",
70a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Source type/role of the TE/RBAC rule.")
71a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr.add_argument("-t", "--target",
72a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Target type/role of the TE/RBAC rule.")
73a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr.add_argument("-c", "--class", dest="tclass",
74a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Comma separated list of object classes")
75a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr.add_argument("-p", "--perms", metavar="PERMS",
76a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Comma separated list of permissions.")
77a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr.add_argument("-D", "--default",
78a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Default of the rule. (type/role/range transition rules)")
79a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexpr.add_argument("-b", "--bool", dest="boolean", metavar="BOOL",
80a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Comma separated list of Booleans in the conditional expression.")
81a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
82a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts = parser.add_argument_group("Search options")
83a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-eb", action="store_true", dest="boolean_equal",
84a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Match Boolean list exactly instead of matching any listed Boolean.")
85a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-ep", action="store_true", dest="perms_equal",
86a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Match permission set exactly instead of matching any listed permission.")
87a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-ds", action="store_false", dest="source_indirect",
88a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Match source attributes directly instead of matching member types/roles.")
89a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-dt", action="store_false", dest="target_indirect",
90a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Match target attributes directly instead of matching member types/roles.")
91a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-rs", action="store_true", dest="source_regex",
92a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Use regular expression matching for the source type/role.")
93a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-rt", action="store_true", dest="target_regex",
94a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Use regular expression matching for the target type/role.")
95a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-rc", action="store_true", dest="tclass_regex",
96a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Use regular expression matching for the object class.")
97a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-rd", action="store_true", dest="default_regex",
98a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Use regular expression matching for the default type/role.")
99a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepopts.add_argument("-rb", action="store_true", dest="boolean_regex",
100a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                  help="Use regular expression matching for Booleans.")
101a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
102a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepargs = parser.parse_args()
103a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
104a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepif not args.tertypes and not args.mlsrtypes and not args.rbacrtypes:
105a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    parser.error("At least one rule type must be specified.")
106a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
107a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepif args.debug:
108a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    logging.basicConfig(level=logging.DEBUG,
109a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                        format='%(asctime)s|%(levelname)s|%(name)s|%(message)s')
110a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepelif args.verbose:
111a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    logging.basicConfig(level=logging.INFO, format='%(message)s')
112a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepelse:
113a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    logging.basicConfig(level=logging.WARNING, format='%(message)s')
114a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
115a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoeptry:
116a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    p = setools.SELinuxPolicy(args.policy)
117a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
118a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    if args.tertypes:
119a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        q = setools.TERuleQuery(p,
120a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                ruletype=args.tertypes,
121a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                source=args.source,
122a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                source_indirect=args.source_indirect,
123a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                source_regex=args.source_regex,
124a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                target=args.target,
125a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                target_indirect=args.target_indirect,
126a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                target_regex=args.target_regex,
127a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                tclass_regex=args.tclass_regex,
128a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                perms_equal=args.perms_equal,
129a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                default=args.default,
130a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                default_regex=args.default_regex,
131a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                boolean_regex=args.boolean_regex,
132a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                boolean_equal=args.boolean_equal)
133a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
134a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        # these are broken out from the above statement to prevent making a list
135a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        # with an empty string in it (split on empty string)
136a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        if args.tclass:
137a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            if args.tclass_regex:
138a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.tclass = args.tclass
139a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            else:
140a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.tclass = args.tclass.split(",")
141a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
142a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        if args.perms:
143a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            q.perms = args.perms.split(",")
144a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
145a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        if args.boolean:
146a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            if args.boolean_regex:
147a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.boolean = args.boolean
148a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            else:
149a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.boolean = args.boolean.split(",")
150a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
151a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        for r in sorted(q.results()):
152a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            print(r)
153a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
154a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    if args.rbacrtypes:
155a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        q = setools.RBACRuleQuery(p,
156a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  ruletype=args.rbacrtypes,
157a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  source=args.source,
158a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  source_indirect=args.source_indirect,
159a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  source_regex=args.source_regex,
160a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  target=args.target,
161a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  target_indirect=args.target_indirect,
162a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  target_regex=args.target_regex,
163a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  default=args.default,
164a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  default_regex=args.default_regex,
165a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                  tclass_regex=args.tclass_regex)
166a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
167a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        # these are broken out from the above statement to prevent making a list
168a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        # with an empty string in it (split on empty string)
169a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        if args.tclass:
170a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            if args.tclass_regex:
171a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.tclass = args.tclass
172a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            else:
173a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.tclass = args.tclass.split(",")
174a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
175a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        for r in sorted(q.results()):
176a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            print(r)
177a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
178a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    if args.mlsrtypes:
179a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        q = setools.MLSRuleQuery(p,
180a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 ruletype=args.mlsrtypes,
181a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 source=args.source,
182a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 source_regex=args.source_regex,
183a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 target=args.target,
184a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 target_regex=args.target_regex,
185a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 tclass_regex=args.tclass_regex,
186a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                                 default=args.default)
187a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
188a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        # these are broken out from the above statement to prevent making a list
189a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        # with an empty string in it (split on empty string)
190a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        if args.tclass:
191a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            if args.tclass_regex:
192a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.tclass = args.tclass
193a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            else:
194a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep                q.tclass = args.tclass.split(",")
195a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
196a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        for r in sorted(q.results()):
197a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep            print(r)
198a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
199a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoepexcept Exception as err:
200a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    if args.debug:
201a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        import traceback
202a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        traceback.print_exc()
203a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    else:
204a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep        print(err)
205a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep
206a8a6732ff6e9d5e49a8c6e888716ed98d64e2609Jeff Vander Stoep    sys.exit(-1)
207