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