?
#!/usr/bin/python3 -EsI # Copyright (C) 2012-2013 Red Hat # AUTHOR: Miroslav Grepl <mgrepl@redhat.com> # AUTHOR: David Quigley <selinux@davequigley.com> # see file 'COPYING' for use and warranty information # # semanage is a tool for managing SELinux configuration files # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA # 02111-1307 USA # # import argparse import os import re import seobject import sys import traceback PROGNAME = "selinux-python" try: import gettext kwargs = {} if sys.version_info < (3,): kwargs['unicode'] = True t = gettext.translation(PROGNAME, localedir="/usr/share/locale", **kwargs, fallback=True) _ = t.gettext except: try: import builtins builtins.__dict__['_'] = str except ImportError: import __builtin__ __builtin__.__dict__['_'] = unicode # define custom usages for selected main actions usage_login = "semanage login [-h] [-n] [-N] [-S STORE] [" usage_login_dict = {' --add': ('-s SEUSER', '-r RANGE', 'LOGIN',), ' --modify': ('-s SEUSER', '-r RANGE', 'LOGIN',), ' --delete': ('LOGIN',), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_fcontext = "semanage fcontext [-h] [-n] [-N] [-S STORE] [" usage_fcontext_dict = {' --add': ('(', '-t TYPE', '-f FTYPE', '-r RANGE', '-s SEUSER', '|', '-e EQUAL', ')', 'FILE_SPEC',), ' --delete': ('(', '-t TYPE', '-f FTYPE', '|', '-e EQUAL', ')', 'FILE_SPEC',), ' --modify': ('(', '-t TYPE', '-f FTYPE', '-r RANGE', '-s SEUSER', '|', '-e EQUAL', ')', 'FILE_SPEC',), ' --list': ('[-C]',), ' --extract': ('',), ' --deleteall': ('',)} usage_user = "semanage user [-h] [-n] [-N] [-S STORE] [" usage_user_dict = {' --add': ('(', '-L LEVEL', '-R ROLES', '-r RANGE', 'SEUSER', ')'), ' --delete': ('SEUSER',), ' --modify': ('(', '-L LEVEL', '-R ROLES', '-r RANGE', '-s SEUSER', 'SEUSER', ')'), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_port = "semanage port [-h] [-n] [-N] [-S STORE] [" usage_port_dict = {' --add': ('-t TYPE', '-p PROTOCOL', '-r RANGE', '(', 'port_name', '|', 'port_range', ')'), ' --modify': ('-t TYPE', '-p PROTOCOL', '-r RANGE', '(', 'port_name', '|', 'port_range', ')'), ' --delete': ('-p PROTOCOL', '(', 'port_name', '|', 'port_range', ')'), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_ibpkey = "semanage ibpkey [-h] [-n] [-N] [-s STORE] [" usage_ibpkey_dict = {' --add': ('-t TYPE', '-x SUBNET_PREFIX', '-r RANGE', '(', 'ibpkey_name', '|', 'pkey_range', ')'), ' --modify': ('-t TYPE', '-x SUBNET_PREFIX', '-r RANGE', '(', 'ibpkey_name', '|', 'pkey_range', ')'), ' --delete': ('-x SUBNET_PREFIX', '(', 'ibpkey_name', '|', 'pkey_range', ')'), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_ibendport = "semanage ibendport [-h] [-n] [-N] [-s STORE] [" usage_ibendport_dict = {' --add': ('-t TYPE', '-z IBDEV_NAME', '-r RANGE', '(', 'port', ')'), ' --modify': ('-t TYPE', '-z IBDEV_NAME', '-r RANGE', '(', 'port', ')'), ' --delete': ('-z IBDEV_NAME', '-r RANGE', '(', 'port', ')'), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_node = "semanage node [-h] [-n] [-N] [-S STORE] [" usage_node_dict = {' --add': ('-M NETMASK', '-p PROTOCOL', '-t TYPE', '-r RANGE', 'node'), ' --modify': ('-M NETMASK', '-p PROTOCOL', '-t TYPE', '-r RANGE', 'node'), ' --delete': ('-M NETMASK', '-p PROTOCOL', 'node'), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_interface = "semanage interface [-h] [-n] [-N] [-S STORE] [" usage_interface_dict = {' --add': ('-t TYPE', '-r RANGE', 'interface'), ' --modify': ('-t TYPE', '-r RANGE', 'interface'), ' --delete': ('interface',), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} usage_boolean = "semanage boolean [-h] [-n] [-N] [-S STORE] [" usage_boolean_dict = {' --modify': ('(', '--on', '|', '--off', ')', 'boolean'), ' --list': ('-C',), ' --extract': ('',), ' --deleteall': ('',)} class CheckRole(argparse.Action): def __call__(self, parser, namespace, value, option_string=None): newval = getattr(namespace, self.dest) if not newval: newval = [] try: # sepolicy tries to load the SELinux policy and raises ValueError if it fails. import sepolicy roles = sepolicy.get_all_roles() except ValueError: roles = [] for v in value.split(): if v not in roles: raise ValueError("%s must be an SELinux role:\nValid roles: %s" % (v, ", ".join(roles))) newval.append(v) setattr(namespace, self.dest, newval) class seParser(argparse.ArgumentParser): def error(self, message): if len(sys.argv) == 2: self.print_help() else: self.print_usage() self.exit(2, ('%s: error: %s\n') % (self.prog, message)) class SetExportFile(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): if values: if values != "-": try: sys.stdout = open(values, 'w') except: sys.stderr.write(traceback.format_exc()) sys.exit(1) setattr(namespace, self.dest, values) class SetImportFile(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): if values and values != "-": try: sys.stdin = open(values, 'r') except IOError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) sys.exit(1) setattr(namespace, self.dest, values) # define dictionary for seobject OBJECTS object_dict = { 'login': seobject.loginRecords, 'user': seobject.seluserRecords, 'port': seobject.portRecords, 'module': seobject.moduleRecords, 'interface': seobject.interfaceRecords, 'node': seobject.nodeRecords, 'fcontext': seobject.fcontextRecords, 'boolean': seobject.booleanRecords, 'permissive': seobject.permissiveRecords, 'dontaudit': seobject.dontauditClass, 'ibpkey': seobject.ibpkeyRecords, 'ibendport': seobject.ibendportRecords } def generate_custom_usage(usage_text, usage_dict): # generate custom usage from given text and dictionary sorted_keys = [] for i in usage_dict.keys(): sorted_keys.append(i) sorted_keys.sort() for k in sorted_keys: usage_text += "%s %s |" % (k, (" ".join(usage_dict[k]))) usage_text = usage_text[:-1] + "]" usage_text = _(usage_text) return usage_text def handle_opts(args, dict, target_key): # handle conflict and required options for given dictionary # {action:[conflict_opts,require_opts]} # first we need to catch conflicts for k in args.__dict__.keys(): try: if k in dict[target_key][0] and args.__dict__[k]: print("%s option can not be used with --%s" % (target_key, k)) sys.exit(2) except KeyError: continue for k in args.__dict__.keys(): try: if k in dict[target_key][1] and not args.__dict__[k]: print("%s option is needed for %s" % (k, target_key)) sys.exit(2) except KeyError: continue def handleLogin(args): # {action:[conflict_opts,require_opts]} login_args = {'list': [('login', 'seuser'), ('')], 'add': [('locallist'), ('seuser', 'login')], 'modify': [('locallist'), ('login')], 'delete': [('locallist'), ('login')], 'extract': [('locallist', 'login', 'seuser'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, login_args, args.action) OBJECT = object_dict['login'](args) if args.action == "add": OBJECT.add(args.login, args.seuser, args.range) if args.action == "modify": OBJECT.modify(args.login, args.seuser, args.range) if args.action == "delete": OBJECT.delete(args.login) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("login %s" % (str(i))) def parser_add_store(parser, name): parser.add_argument('-S', '--store', default='', help=_("Select an alternate SELinux Policy Store to manage")) def parser_add_priority(parser, name): parser.add_argument('-P', '--priority', type=int, default=400, help=_("Select a priority for module operations")) def parser_add_noheading(parser, name): parser.add_argument('-n', '--noheading', action='store_false', default=True, help=_("Do not print heading when listing %s object types") % name) def parser_add_noreload(parser, name): parser.add_argument('-N', '--noreload', action='store_true', default=False, help=_('Do not reload policy after commit')) def parser_add_locallist(parser, name): parser.add_argument('-C', '--locallist', action='store_true', default=False, help=_("List %s local customizations") % name) def parser_add_add(parser, name): parser.add_argument('-a', '--add', dest='action', action='store_const', const='add', help=_("Add a record of the %s object type") % name) def parser_add_type(parser, name): parser.add_argument('-t', '--type', help=_('SELinux Type for the object')) def parser_add_level(parser, name): parser.add_argument('-L', '--level', default='s0', help=_('Default SELinux Level for SELinux user, s0 Default. (MLS/MCS Systems only)')) def parser_add_range(parser, name): parser.add_argument('-r', '--range', default='', help=_( "MLS/MCS Security Range (MLS/MCS Systems only) SELinux Range for SELinux login mapping defaults to the SELinux user record range. \ SELinux Range for SELinux user defaults to s0." )) def parser_add_proto(parser, name): parser.add_argument('-p', '--proto', help=_( "Protocol for the specified port (tcp|udp|dccp|sctp) or internet protocol version for the specified node (ipv4|ipv6)." )) def parser_add_subnet_prefix(parser, name): parser.add_argument('-x', '--subnet_prefix', help=_('Subnet prefix for the specified infiniband ibpkey.')) def parser_add_ibdev_name(parser, name): parser.add_argument('-z', '--ibdev_name', help=_("Name for the specified infiniband end port.")) def parser_add_modify(parser, name): parser.add_argument('-m', '--modify', dest='action', action='store_const', const='modify', help=_("Modify a record of the %s object type") % name) def parser_add_list(parser, name): parser.add_argument('-l', '--list', dest='action', action='store_const', const='list', help=_("List records of the %s object type") % name) def parser_add_delete(parser, name): parser.add_argument('-d', '--delete', dest='action', action='store_const', const='delete', help=_("Delete a record of the %s object type") % name) def parser_add_extract(parser, name): parser.add_argument('-E', '--extract', dest='action', action='store_const', const='extract', help=_("Extract customizable commands, for use within a transaction")) def parser_add_deleteall(parser, name): parser.add_argument('-D', '--deleteall', dest='action', action='store_const', const='deleteall', help=_('Remove all %s objects local customizations') % name) def parser_add_seuser(parser, name): parser.add_argument('-s', '--seuser', default="", help=_("SELinux user name")) def setupLoginParser(subparsers): generated_usage = generate_custom_usage(usage_login, usage_login_dict) loginParser = subparsers.add_parser('login', usage=generated_usage, help=_("Manage login mappings between linux users and SELinux confined users")) parser_add_locallist(loginParser, "login") parser_add_noheading(loginParser, "login") parser_add_noreload(loginParser, "login") parser_add_store(loginParser, "login") parser_add_range(loginParser, "login") login_action = loginParser.add_mutually_exclusive_group(required=True) parser_add_add(login_action, "login") parser_add_delete(login_action, "login") parser_add_modify(login_action, "login") parser_add_list(login_action, "login") parser_add_extract(login_action, "login") parser_add_deleteall(login_action, "login") parser_add_seuser(loginParser, "login") loginParser.add_argument('login', nargs='?', default=None, help=_("login_name | %%groupname")) loginParser.set_defaults(func=handleLogin) def handleFcontext(args): fcontext_args = {'list': [('equal', 'ftype', 'seuser', 'type'), ('')], 'add': [('locallist'), ('type', 'file_spec')], 'modify': [('locallist'), ('type', 'file_spec')], 'delete': [('locallist'), ('file_spec')], 'extract': [('locallist', 'equal', 'ftype', 'seuser', 'type'), ('')], 'deleteall': [('locallist'), ('')]} # we can not use mutually for equal because we can define some actions together with equal fcontext_equal_args = {'equal': [('list', 'locallist', 'type', 'ftype', 'seuser', 'deleteall', 'extract'), ()]} if args.action and args.equal: handle_opts(args, fcontext_equal_args, "equal") else: handle_opts(args, fcontext_args, args.action) OBJECT = object_dict['fcontext'](args) if args.action == "add": if args.equal: OBJECT.add_equal(args.file_spec, args.equal) else: OBJECT.add(args.file_spec, args.type, args.ftype, args.range, args.seuser) if args.action == "modify": if args.equal: OBJECT.modify_equal(args.file_spec, args.equal) else: OBJECT.modify(args.file_spec, args.type, args.ftype, args.range, args.seuser) if args.action == "delete": if args.equal: OBJECT.delete(args.file_spec, args.equal) else: OBJECT.delete(args.file_spec, args.ftype) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("fcontext %s" % str(i)) def setupFcontextParser(subparsers): generate_usage = generate_custom_usage(usage_fcontext, usage_fcontext_dict) fcontextParser = subparsers.add_parser('fcontext', usage=generate_usage, help=_("Manage file context mapping definitions")) parser_add_locallist(fcontextParser, "fcontext") parser_add_noheading(fcontextParser, "fcontext") parser_add_noreload(fcontextParser, "fcontext") parser_add_store(fcontextParser, "fcontext") fcontext_action = fcontextParser.add_mutually_exclusive_group(required=True) parser_add_add(fcontext_action, "fcontext") parser_add_delete(fcontext_action, "fcontext") parser_add_modify(fcontext_action, "fcontext") parser_add_list(fcontext_action, "fcontext") parser_add_extract(fcontext_action, "fcontext") parser_add_deleteall(fcontext_action, "fcontext") fcontextParser.add_argument('-e', '--equal', help=_( 'Substitute target path with sourcepath when generating default label. This is used with fcontext. Requires source and target \ path arguments. The context labeling for the target subtree is made equivalent to that defined for the source.' )) fcontextParser.add_argument('-f', '--ftype', default="", choices=["a", "f", "d", "c", "b", "s", "l", "p"], help=_( 'File Type. This is used with fcontext. Requires a file type as shown in the mode field by ls, e.g. use d to match only \ directories or f to match only regular files. The following file type options can be passed: f (regular file), d (directory), \ c (character device), b (block device), s (socket), l (symbolic link), p (named pipe). \ If you do not specify a file type, the file type will default to "all files".' )) parser_add_seuser(fcontextParser, "fcontext") parser_add_type(fcontextParser, "fcontext") parser_add_range(fcontextParser, "fcontext") fcontextParser.add_argument('file_spec', nargs='?', default=None, help=_('Path to be labeled (may be in the form of a Perl compatible regular expression)')) fcontextParser.set_defaults(func=handleFcontext) def handleUser(args): user_args = {'list': [('selinux_name', 'seuser', 'roles'), ('')], 'add': [('locallist'), ('roles', 'selinux_name')], 'modify': [('locallist'), ('selinux_name')], 'delete': [('locallist'), ('selinux_name')], 'extract': [('locallist', 'selinux_name', 'seuser', 'role'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, user_args, args.action) OBJECT = object_dict['user'](args) if args.action == "add": OBJECT.add(args.selinux_name, args.roles, args.level, args.range, args.prefix) if args.action == "modify": OBJECT.modify(args.selinux_name, args.roles, args.level, args.range, args.prefix) if args.action == "delete": OBJECT.delete(args.selinux_name) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("user %s" % str(i)) def setupUserParser(subparsers): generated_usage = generate_custom_usage(usage_user, usage_user_dict) userParser = subparsers.add_parser('user', usage=generated_usage, help=_('Manage SELinux confined users (Roles and levels for an SELinux user)')) parser_add_locallist(userParser, "user") parser_add_noheading(userParser, "user") parser_add_noreload(userParser, "user") parser_add_store(userParser, "user") user_action = userParser.add_mutually_exclusive_group(required=True) parser_add_add(user_action, "user") parser_add_delete(user_action, "user") parser_add_modify(user_action, "user") parser_add_list(user_action, "user") parser_add_extract(user_action, "user") parser_add_deleteall(user_action, "user") parser_add_level(userParser, "user") parser_add_range(userParser, "user") userParser.add_argument('-R', '--roles', default=[], action=CheckRole, help=_("SELinux Roles. You must enclose multiple roles within quotes, separate by spaces. Or specify -R multiple times.")) userParser.add_argument('-P', '--prefix', default="user", help=argparse.SUPPRESS) userParser.add_argument('selinux_name', nargs='?', default=None, help=_('selinux_name')) userParser.set_defaults(func=handleUser) def handlePort(args): port_args = {'list': [('port', 'type', 'proto'), ('')], 'add': [('locallist'), ('type', 'port', 'proto')], 'modify': [('localist'), ('port', 'proto')], 'delete': [('locallist'), ('port', 'proto')], 'extract': [('locallist', 'port', 'type', 'proto'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, port_args, args.action) OBJECT = object_dict['port'](args) if args.action == "add": OBJECT.add(args.port, args.proto, args.range, args.type) if args.action == "modify": OBJECT.modify(args.port, args.proto, args.range, args.type) if args.action == "delete": OBJECT.delete(args.port, args.proto) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("port %s" % str(i)) def setupPortParser(subparsers): generated_usage = generate_custom_usage(usage_port, usage_port_dict) portParser = subparsers.add_parser('port', usage=generated_usage, help=_('Manage network port type definitions')) parser_add_locallist(portParser, "port") parser_add_noheading(portParser, "port") parser_add_noreload(portParser, "port") parser_add_store(portParser, "port") port_action = portParser.add_mutually_exclusive_group(required=True) parser_add_add(port_action, "port") parser_add_delete(port_action, "port") parser_add_modify(port_action, "port") parser_add_list(port_action, "port") parser_add_extract(port_action, "port") parser_add_deleteall(port_action, "port") parser_add_type(portParser, "port") parser_add_range(portParser, "port") parser_add_proto(portParser, "port") portParser.add_argument('port', nargs='?', default=None, help=_('port | port_range')) portParser.set_defaults(func=handlePort) def handlePkey(args): ibpkey_args = {'list': [('ibpkey', 'type', 'subnet_prefix'), ('')], 'add': [('locallist'), ('type', 'ibpkey', 'subnet_prefix')], 'modify': [('localist'), ('ibpkey', 'subnet_prefix')], 'delete': [('locallist'), ('ibpkey', 'subnet_prefix')], 'extract': [('locallist', 'ibpkey', 'type', 'subnet prefix'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, ibpkey_args, args.action) OBJECT = object_dict['ibpkey'](args) if args.action == "add": OBJECT.add(args.ibpkey, args.subnet_prefix, args.range, args.type) if args.action == "modify": OBJECT.modify(args.ibpkey, args.subnet_prefix, args.range, args.type) if args.action == "delete": OBJECT.delete(args.ibpkey, args.subnet_prefix) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("ibpkey %s" % str(i)) def setupPkeyParser(subparsers): generated_usage = generate_custom_usage(usage_ibpkey, usage_ibpkey_dict) ibpkeyParser = subparsers.add_parser('ibpkey', usage=generated_usage, help=_('Manage infiniband ibpkey type definitions')) parser_add_locallist(ibpkeyParser, "ibpkey") parser_add_noheading(ibpkeyParser, "ibpkey") parser_add_noreload(ibpkeyParser, "ibpkey") parser_add_store(ibpkeyParser, "ibpkey") ibpkey_action = ibpkeyParser.add_mutually_exclusive_group(required=True) parser_add_add(ibpkey_action, "ibpkey") parser_add_delete(ibpkey_action, "ibpkey") parser_add_modify(ibpkey_action, "ibpkey") parser_add_list(ibpkey_action, "ibpkey") parser_add_extract(ibpkey_action, "ibpkey") parser_add_deleteall(ibpkey_action, "ibpkey") parser_add_type(ibpkeyParser, "ibpkey") parser_add_range(ibpkeyParser, "ibpkey") parser_add_subnet_prefix(ibpkeyParser, "ibpkey") ibpkeyParser.add_argument('ibpkey', nargs='?', default=None, help=_('pkey | pkey_range')) ibpkeyParser.set_defaults(func=handlePkey) def handleIbendport(args): ibendport_args = {'list': [('ibendport', 'type', 'ibdev_name'), ('')], 'add': [('locallist'), ('type', 'ibendport', 'ibdev_name'), ('')], 'modify': [('localist'), ('ibendport', 'ibdev_name')], 'delete': [('locallist'), ('ibendport', 'ibdev_name')], 'extract': [('locallist', 'ibendport', 'type', 'ibdev_name'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, ibendport_args, args.action) OBJECT = object_dict['ibendport'](args) if args.action == "add": OBJECT.add(args.ibendport, args.ibdev_name, args.range, args.type) if args.action == "modify": OBJECT.modify(args.ibendport, args.ibdev_name, args.range, args.type) if args.action == "delete": OBJECT.delete(args.ibendport, args.ibdev_name) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("ibendport %s" % str(i)) def setupIbendportParser(subparsers): generated_usage = generate_custom_usage(usage_ibendport, usage_ibendport_dict) ibendportParser = subparsers.add_parser('ibendport', usage=generated_usage, help=_('Manage infiniband end port type definitions')) parser_add_locallist(ibendportParser, "ibendport") parser_add_noheading(ibendportParser, "ibendport") parser_add_noreload(ibendportParser, "ibendport") parser_add_store(ibendportParser, "ibendport") ibendport_action = ibendportParser.add_mutually_exclusive_group(required=True) parser_add_add(ibendport_action, "ibendport") parser_add_delete(ibendport_action, "ibendport") parser_add_modify(ibendport_action, "ibendport") parser_add_list(ibendport_action, "ibendport") parser_add_extract(ibendport_action, "ibendport") parser_add_deleteall(ibendport_action, "ibendport") parser_add_type(ibendportParser, "ibendport") parser_add_range(ibendportParser, "ibendport") parser_add_ibdev_name(ibendportParser, "ibendport") ibendportParser.add_argument('ibendport', nargs='?', default=None, help=_('ibendport')) ibendportParser.set_defaults(func=handleIbendport) def handleInterface(args): interface_args = {'list': [('interface'), ('')], 'add': [('locallist'), ('type', 'interface')], 'modify': [('locallist'), ('type', 'interface')], 'delete': [('locallist'), ('interface')], 'extract': [('locallist', 'interface', 'type'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, interface_args, args.action) OBJECT = object_dict['interface'](args) if args.action == "add": OBJECT.add(args.interface, args.range, args.type) if args.action == "modify": OBJECT.modify(args.interface, args.range, args.type) if args.action == "delete": OBJECT.delete(args.interface) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("interface %s" % str(i)) def setupInterfaceParser(subparsers): generated_usage = generate_custom_usage(usage_interface, usage_interface_dict) interfaceParser = subparsers.add_parser('interface', usage=generated_usage, help=_('Manage network interface type definitions')) parser_add_locallist(interfaceParser, "interface") parser_add_noheading(interfaceParser, "interface") parser_add_noreload(interfaceParser, "interface") parser_add_store(interfaceParser, "interface") parser_add_type(interfaceParser, "interface") parser_add_range(interfaceParser, "interface") interface_action = interfaceParser.add_mutually_exclusive_group(required=True) parser_add_add(interface_action, "interface") parser_add_delete(interface_action, "interface") parser_add_modify(interface_action, "interface") parser_add_list(interface_action, "interface") parser_add_extract(interface_action, "interface") parser_add_deleteall(interface_action, "interface") interfaceParser.add_argument('interface', nargs='?', default=None, help=_('interface_spec')) interfaceParser.set_defaults(func=handleInterface) def handleModule(args): OBJECT = seobject.moduleRecords(args) if args.action_add: OBJECT.add(args.action_add[0], args.priority) if args.action_enable: OBJECT.set_enabled(" ".join(args.action_enable), True) if args.action_disable: OBJECT.set_enabled(" ".join(args.action_disable), False) if args.action_remove: OBJECT.delete(" ".join(args.action_remove), args.priority) if args.action == "deleteall": OBJECT.deleteall() if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "extract": for i in OBJECT.customized(): print("module %s" % str(i)) def setupModuleParser(subparsers): moduleParser = subparsers.add_parser('module', help=_('Manage SELinux policy modules')) parser_add_noheading(moduleParser, "module") parser_add_noreload(moduleParser, "module") parser_add_store(moduleParser, "module") parser_add_locallist(moduleParser, "module") parser_add_priority(moduleParser, "module") mgroup = moduleParser.add_mutually_exclusive_group(required=True) parser_add_list(mgroup, "module") parser_add_extract(mgroup, "module") parser_add_deleteall(mgroup, "module") mgroup.add_argument('-a', '--add', dest='action_add', action='store', nargs=1, metavar='module_name', help=_("Add a module")) mgroup.add_argument('-r', '--remove', dest='action_remove', action='store', nargs='+', metavar='module_name', help=_("Remove a module")) mgroup.add_argument('-d', '--disable', dest='action_disable', action='store', nargs='+', metavar='module_name', help=_("Disable a module")) mgroup.add_argument('-e', '--enable', dest='action_enable', action='store', nargs='+', metavar='module_name', help=_("Enable a module")) moduleParser.set_defaults(func=handleModule) def handleNode(args): node_args = {'list': [('node', 'type', 'proto', 'netmask'), ('')], 'add': [('locallist'), ('type', 'node', 'proto', 'netmask')], 'modify': [('locallist'), ('node', 'netmask', 'proto')], 'delete': [('locallist'), ('node', 'netmask', 'prototype')], 'extract': [('locallist', 'node', 'type', 'proto', 'netmask'), ('')], 'deleteall': [('locallist'), ('')]} handle_opts(args, node_args, args.action) OBJECT = object_dict['node'](args) if args.action == "add": OBJECT.add(args.node, args.netmask, args.proto, args.range, args.type) if args.action == "modify": OBJECT.modify(args.node, args.netmask, args.proto, args.range, args.type) if args.action == "delete": OBJECT.delete(args.node, args.netmask, args.proto) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("node %s" % str(i)) def setupNodeParser(subparsers): generated_usage = generate_custom_usage(usage_node, usage_node_dict) nodeParser = subparsers.add_parser('node', usage=generated_usage, help=_('Manage network node type definitions')) parser_add_locallist(nodeParser, "node") parser_add_noheading(nodeParser, "node") parser_add_noreload(nodeParser, "node") parser_add_store(nodeParser, "node") node_action = nodeParser.add_mutually_exclusive_group(required=True) parser_add_add(node_action, "node") parser_add_delete(node_action, "node") parser_add_modify(node_action, "node") parser_add_list(node_action, "node") parser_add_extract(node_action, "node") parser_add_deleteall(node_action, "node") nodeParser.add_argument('-M', '--netmask', help=_('Network Mask')) parser_add_type(nodeParser, "node") parser_add_range(nodeParser, "node") parser_add_proto(nodeParser, "node") nodeParser.add_argument('node', nargs='?', default=None, help=_('node')) nodeParser.set_defaults(func=handleNode) def handleBoolean(args): boolean_args = {'list': [('state', 'boolean'), ('')], 'modify': [('localist'), ('boolean', 'state')], 'extract': [('locallist', 'state', 'boolean'), ('')], 'deleteall': [('locallist'), ('')], 'state': [('locallist', 'list', 'extract', 'deleteall'), ('modify')]} handle_opts(args, boolean_args, args.action) OBJECT = object_dict['boolean'](args) if args.action == "modify": if args.boolean: OBJECT.modify(args.boolean, args.state, False) if args.action == "list": OBJECT.list(args.noheading, args.locallist) if args.action == "deleteall": OBJECT.deleteall() if args.action == "extract": for i in OBJECT.customized(): print("boolean %s" % str(i)) def setupBooleanParser(subparsers): generated_usage = generate_custom_usage(usage_boolean, usage_boolean_dict) booleanParser = subparsers.add_parser('boolean', usage=generated_usage, help=_('Manage booleans to selectively enable functionality')) parser_add_locallist(booleanParser, "boolean") parser_add_noheading(booleanParser, "boolean") parser_add_noreload(booleanParser, "boolean") parser_add_store(booleanParser, "boolean") booleanParser.add_argument('boolean', nargs="?", default=None, help=_('boolean')) boolean_action = booleanParser.add_mutually_exclusive_group(required=True) #add_add(boolean_action) parser_add_modify(boolean_action, "boolean") parser_add_list(boolean_action, "boolean") parser_add_extract(boolean_action, "boolean") parser_add_deleteall(boolean_action, "boolean") booleanGroup = booleanParser.add_mutually_exclusive_group(required=False) booleanGroup.add_argument('-1', '--on', dest='state', action='store_const', const='on', help=_('Enable the boolean')) booleanGroup.add_argument('-0', '--off', dest='state', action='store_const', const='off', help=_('Disable the boolean')) booleanParser.set_defaults(func=handleBoolean) def handlePermissive(args): OBJECT = object_dict['permissive'](args) if args.action == "list": OBJECT.list(args.noheading) elif args.action == "deleteall": OBJECT.deleteall() elif args.action == "extract": for i in OBJECT.customized(): print("permissive %s" % str(i)) elif args.type is not None: if args.action == "add": OBJECT.add(args.type) if args.action == "delete": OBJECT.delete(args.type) else: args.parser.error(message=_('semanage permissive: error: the following argument is required: type\n')) def setupPermissiveParser(subparsers): permissiveParser = subparsers.add_parser('permissive', help=_('Manage process type enforcement mode')) pgroup = permissiveParser.add_mutually_exclusive_group(required=True) parser_add_add(pgroup, "permissive") parser_add_delete(pgroup, "permissive") parser_add_deleteall(pgroup, "permissive") parser_add_extract(pgroup, "permissive") parser_add_list(pgroup, "permissive") parser_add_noheading(permissiveParser, "permissive") parser_add_noreload(permissiveParser, "permissive") parser_add_store(permissiveParser, "permissive") permissiveParser.add_argument('type', nargs='?', default=None, help=_('type')) permissiveParser.set_defaults(func=handlePermissive) permissiveParser.set_defaults(parser=permissiveParser) def handleDontaudit(args): OBJECT = object_dict['dontaudit'](args) OBJECT.toggle(args.action) def setupDontauditParser(subparsers): dontauditParser = subparsers.add_parser('dontaudit', help=_('Disable/Enable dontaudit rules in policy')) parser_add_noreload(dontauditParser, "dontaudit") parser_add_store(dontauditParser, "dontaudit") dontauditParser.add_argument('action', choices=["on", "off"]) dontauditParser.set_defaults(func=handleDontaudit) def handleExport(args): manageditems = ["boolean", "login", "interface", "user", "port", "node", "fcontext", "module", "ibendport", "ibpkey", "permissive"] for i in manageditems: print("%s -D" % i) for i in manageditems: OBJECT = object_dict[i](args) for c in OBJECT.customized(): print("%s %s" % (i, str(c))) sys.exit(0) def setupExportParser(subparsers): exportParser = subparsers.add_parser('export', help=_('Output local customizations')) parser_add_store(exportParser, "export") exportParser.add_argument('-f', '--output_file', dest='output_file', action=SetExportFile, help=_('Output file')) exportParser.set_defaults(func=handleExport) def mkargv(line): dquote = "\"" squote = "\'" l = line.split() ret = [] i = 0 while i < len(l): cnt = len(re.findall(dquote, l[i])) if cnt > 1: ret.append(l[i].strip(dquote)) i = i + 1 continue if cnt == 1: quote = [l[i].strip(dquote)] i = i + 1 while i < len(l) and dquote not in l[i]: quote.append(l[i]) i = i + 1 quote.append(l[i].strip(dquote)) ret.append(" ".join(quote)) i = i + 1 continue cnt = len(re.findall(squote, l[i])) if cnt > 1: ret.append(l[i].strip(squote)) i = i + 1 continue if cnt == 1: quote = [l[i].strip(squote)] i = i + 1 while i < len(l) and squote not in l[i]: quote.append(l[i]) i = i + 1 quote.append(l[i].strip(squote)) ret.append(" ".join(quote)) i = i + 1 continue ret.append(l[i]) i = i + 1 return ret def handleImport(args): trans = seobject.semanageRecords(args) trans.start() deleteCommands = [] commands = [] # separate commands for deletion from the rest so they can be # applied in a separate transaction for l in sys.stdin.readlines(): if len(l.strip()) == 0: continue if "-d" in l or "-D" in l: deleteCommands.append(l) else: commands.append(l) if deleteCommands: importHelper(deleteCommands) trans.finish() trans.start() importHelper(commands) trans.finish() def importHelper(commands): for l in commands: try: commandParser = createCommandParser() args = commandParser.parse_args(mkargv(l)) args.func(args) except ValueError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) sys.exit(1) except IOError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) sys.exit(1) except KeyboardInterrupt: sys.exit(0) def setupImportParser(subparsers): importParser = subparsers.add_parser('import', help=_('Import local customizations')) parser_add_noreload(importParser, "import") parser_add_store(importParser, "import") importParser.add_argument('-f', '--input_file', dest='input_file', action=SetImportFile, help=_('Input file')) importParser.set_defaults(func=handleImport) def createCommandParser(): commandParser = seParser(prog='semanage', formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=_( "semanage is used to configure certain elements of SELinux policy with-out requiring modification or recompilation from policy source." )) #To add a new subcommand define the parser for it in a function above and call it here. subparsers = commandParser.add_subparsers(dest='subcommand') subparsers.required = True setupImportParser(subparsers) setupExportParser(subparsers) setupLoginParser(subparsers) setupUserParser(subparsers) setupPortParser(subparsers) setupPkeyParser(subparsers) setupIbendportParser(subparsers) setupInterfaceParser(subparsers) setupModuleParser(subparsers) setupNodeParser(subparsers) setupFcontextParser(subparsers) setupBooleanParser(subparsers) setupPermissiveParser(subparsers) setupDontauditParser(subparsers) return commandParser def make_io_args(args): # import/export backward compatibility args_origin = ["-S", "-o", "-i", "targeted", "minimum", "mls"] args_file = [] args_ie = [] args_subcommand = [] for i in args: if i == "-o": args_subcommand = ["export"] continue if i == "-i": args_subcommand = ["import"] continue if i not in args_origin: args_file = ["-f", i] continue args_ie.append(i) return args_subcommand + args_ie + args_file def make_args(sys_args): args = [] if "-o" in sys_args[1:] or "-i" in sys_args[1:]: args = make_io_args(sys_args[1:]) else: args = sys_args[1:] return args def do_parser(): try: commandParser = createCommandParser() args = commandParser.parse_args(make_args(sys.argv)) args.func(args) sys.exit(0) except BrokenPipeError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) # Python flushes standard streams on exit; redirect remaining output # to devnull to avoid another BrokenPipeError at shutdown devnull = os.open(os.devnull, os.O_WRONLY) os.dup2(devnull, sys.stdout.fileno()) sys.exit(1) except OSError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, e.args[1])) sys.exit(1) except KeyboardInterrupt: sys.exit(0) except ValueError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, e.args[0])) sys.exit(1) except KeyError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, e.args[0])) sys.exit(1) except RuntimeError as e: sys.stderr.write("%s: %s\n" % (e.__class__.__name__, e.args[0])) sys.exit(1) if __name__ == '__main__': do_parser()
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
NetworkManager | File | 3.59 MB | 0755 |
|
accessdb | File | 15.42 KB | 0755 |
|
addgnupghome | File | 3.01 KB | 0755 |
|
addpart | File | 15.34 KB | 0755 |
|
adduser | File | 138.02 KB | 0755 |
|
agetty | File | 56.9 KB | 0755 |
|
alternatives | File | 39.6 KB | 0755 |
|
anacron | File | 39.69 KB | 0755 |
|
apachectl | File | 4.52 KB | 0755 |
|
applygnupgdefaults | File | 2.17 KB | 0755 |
|
arp | File | 63.21 KB | 0755 |
|
arpd | File | 27.4 KB | 0755 |
|
arping | File | 27.42 KB | 0755 |
|
arptables | File | 231.4 KB | 0755 |
|
arptables-nft | File | 231.4 KB | 0755 |
|
arptables-nft-restore | File | 231.4 KB | 0755 |
|
arptables-nft-save | File | 231.4 KB | 0755 |
|
arptables-restore | File | 231.4 KB | 0755 |
|
arptables-save | File | 231.4 KB | 0755 |
|
atd | File | 31.91 KB | 0755 |
|
atrun | File | 70 B | 0755 |
|
auditctl | File | 51.77 KB | 0755 |
|
auditd | File | 137.26 KB | 0755 |
|
augenrules | File | 4.05 KB | 0755 |
|
aureport | File | 120.53 KB | 0755 |
|
ausearch | File | 120.47 KB | 0755 |
|
autrace | File | 19.37 KB | 0750 |
|
avcstat | File | 15.17 KB | 0755 |
|
badblocks | File | 35.35 KB | 0755 |
|
blkdeactivate | File | 15.97 KB | 0555 |
|
blkdiscard | File | 23.39 KB | 0755 |
|
blkid | File | 51.8 KB | 0755 |
|
blkmapd | File | 39.61 KB | 0755 |
|
blkzone | File | 35.65 KB | 0755 |
|
blockdev | File | 31.61 KB | 0755 |
|
bridge | File | 114.78 KB | 0755 |
|
capsh | File | 31.21 KB | 0755 |
|
cfdisk | File | 96.55 KB | 0755 |
|
chcpu | File | 31.63 KB | 0755 |
|
chgpasswd | File | 59.95 KB | 0755 |
|
chkconfig | File | 43.78 KB | 0755 |
|
chpasswd | File | 55.81 KB | 0755 |
|
chronyd | File | 361.62 KB | 0755 |
|
chroot | File | 39.73 KB | 0755 |
|
clock | File | 59.96 KB | 0755 |
|
consoletype | File | 15.3 KB | 0755 |
|
convertquota | File | 69.03 KB | 0755 |
|
cracklib-check | File | 15.7 KB | 0755 |
|
cracklib-format | File | 255 B | 0755 |
|
cracklib-packer | File | 15.7 KB | 0755 |
|
cracklib-unpacker | File | 15.69 KB | 0755 |
|
create-cracklib-dict | File | 994 B | 0755 |
|
crond | File | 76.34 KB | 0755 |
|
ctrlaltdel | File | 15.39 KB | 0755 |
|
ctstat | File | 23.71 KB | 0755 |
|
dcb | File | 86.59 KB | 0755 |
|
ddns-confgen | File | 27.45 KB | 0755 |
|
debugfs | File | 233.02 KB | 0755 |
|
delpart | File | 15.31 KB | 0755 |
|
depmod | File | 165.76 KB | 0755 |
|
devlink | File | 161.81 KB | 0755 |
|
dmfilemapd | File | 23.49 KB | 0555 |
|
dmsetup | File | 156.96 KB | 0555 |
|
dmstats | File | 156.96 KB | 0555 |
|
dnssec-cds | File | 47.87 KB | 0755 |
|
dnssec-checkds | File | 924 B | 0755 |
|
dnssec-coverage | File | 926 B | 0755 |
|
dnssec-dsfromkey | File | 39.63 KB | 0755 |
|
dnssec-importkey | File | 35.63 KB | 0755 |
|
dnssec-keyfromlabel | File | 39.62 KB | 0755 |
|
dnssec-keygen | File | 47.63 KB | 0755 |
|
dnssec-keymgr | File | 922 B | 0755 |
|
dnssec-revoke | File | 31.61 KB | 0755 |
|
dnssec-settime | File | 47.63 KB | 0755 |
|
dnssec-signzone | File | 96.08 KB | 0755 |
|
dnssec-verify | File | 31.63 KB | 0755 |
|
dovecot | File | 124.94 KB | 0755 |
|
dovecot_cpshutdown | File | 3.27 KB | 0755 |
|
dumpe2fs | File | 31.29 KB | 0755 |
|
e2freefrag | File | 15.19 KB | 0755 |
|
e2fsck | File | 356.03 KB | 0755 |
|
e2image | File | 43.41 KB | 0755 |
|
e2label | File | 104.46 KB | 0755 |
|
e2mmpstatus | File | 31.29 KB | 0755 |
|
e2undo | File | 23.16 KB | 0755 |
|
e4crypt | File | 31.3 KB | 0755 |
|
e4defrag | File | 31.25 KB | 0755 |
|
ebtables | File | 231.4 KB | 0755 |
|
ebtables-nft | File | 231.4 KB | 0755 |
|
ebtables-nft-restore | File | 231.4 KB | 0755 |
|
ebtables-nft-save | File | 231.4 KB | 0755 |
|
ebtables-restore | File | 231.4 KB | 0755 |
|
ebtables-save | File | 231.4 KB | 0755 |
|
ebtables-translate | File | 231.4 KB | 0755 |
|
edquota | File | 89.5 KB | 0755 |
|
ether-wake | File | 50.24 KB | 0755 |
|
ethtool | File | 612.05 KB | 0755 |
|
exicyclog | File | 11.1 KB | 0755 |
|
exigrep | File | 10.52 KB | 0755 |
|
exim | File | 1.51 MB | 4755 |
|
exim_checkaccess | File | 4.83 KB | 0755 |
|
exim_dbmbuild | File | 29.2 KB | 0755 |
|
exim_dumpdb | File | 30.48 KB | 0755 |
|
exim_fixdb | File | 39.05 KB | 0755 |
|
exim_lock | File | 29.46 KB | 0755 |
|
exim_tidydb | File | 30.51 KB | 0755 |
|
eximstats | File | 148.26 KB | 0755 |
|
exinext | File | 7.13 KB | 0755 |
|
exiqgrep | File | 5.66 KB | 0755 |
|
exiqsumm | File | 5.31 KB | 0755 |
|
exiwhat | File | 4.42 KB | 0755 |
|
exportfs | File | 68.66 KB | 0755 |
|
faillock | File | 23.36 KB | 0755 |
|
fcgistarter | File | 24.71 KB | 0755 |
|
fdformat | File | 23.38 KB | 0755 |
|
fdisk | File | 112.23 KB | 0755 |
|
filefrag | File | 19.22 KB | 0755 |
|
findfs | File | 15.35 KB | 0755 |
|
firewalld | File | 9.75 KB | 0755 |
|
fix-info-dir | File | 7.85 KB | 0755 |
|
fixfiles | File | 12.13 KB | 0755 |
|
fsck | File | 43.75 KB | 0755 |
|
fsck.cramfs | File | 31.57 KB | 0755 |
|
fsck.ext2 | File | 356.03 KB | 0755 |
|
fsck.ext3 | File | 356.03 KB | 0755 |
|
fsck.ext4 | File | 356.03 KB | 0755 |
|
fsck.minix | File | 55.9 KB | 0755 |
|
fsck.xfs | File | 2.54 KB | 0755 |
|
fsfreeze | File | 15.34 KB | 0755 |
|
fstrim | File | 43.69 KB | 0755 |
|
fuser | File | 41.09 KB | 0755 |
|
g13-syshelp | File | 88.6 KB | 0755 |
|
genhomedircon | File | 32.16 KB | 0755 |
|
genhostid | File | 15.3 KB | 0755 |
|
genl | File | 124.11 KB | 0755 |
|
getcap | File | 15.13 KB | 0755 |
|
getenforce | File | 15.1 KB | 0755 |
|
getpcaps | File | 15.12 KB | 0755 |
|
getpidprevcon | File | 15.11 KB | 0755 |
|
getpolicyload | File | 15.11 KB | 0755 |
|
getsebool | File | 15.13 KB | 0755 |
|
groupadd | File | 68.93 KB | 0755 |
|
groupdel | File | 64.7 KB | 0755 |
|
groupmems | File | 55.95 KB | 0755 |
|
groupmod | File | 72.92 KB | 0755 |
|
grpck | File | 59.93 KB | 0755 |
|
grpconv | File | 51.73 KB | 0755 |
|
grpunconv | File | 51.7 KB | 0755 |
|
grub2-bios-setup | File | 1.33 MB | 0755 |
|
grub2-get-kernel-settings | File | 2.68 KB | 0755 |
|
grub2-install | File | 1.63 MB | 0755 |
|
grub2-mkconfig | File | 9.21 KB | 0755 |
|
grub2-probe | File | 1.33 MB | 0755 |
|
grub2-reboot | File | 4.7 KB | 0755 |
|
grub2-set-bootflag | File | 15.24 KB | 0755 |
|
grub2-set-default | File | 3.46 KB | 0755 |
|
grub2-set-password | File | 2.74 KB | 0755 |
|
grub2-setpassword | File | 2.74 KB | 0755 |
|
grub2-switch-to-blscfg | File | 8.81 KB | 0755 |
|
grubby | File | 260 B | 0755 |
|
gssproxy | File | 124.89 KB | 0755 |
|
halt | File | 298.59 KB | 0755 |
|
htcacheclean | File | 52.8 KB | 0755 |
|
httpd | File | 1.08 MB | 0755 |
|
hwclock | File | 59.96 KB | 0755 |
|
iconvconfig | File | 31.93 KB | 0755 |
|
ifconfig | File | 78.98 KB | 0755 |
|
ifenslave | File | 23.91 KB | 0755 |
|
ifstat | File | 39.72 KB | 0755 |
|
imunify-notifier | File | 9.86 MB | 0755 |
|
init | File | 95.93 KB | 0755 |
|
insmod | File | 165.76 KB | 0755 |
|
install-info | File | 106.7 KB | 0755 |
|
installkernel | File | 323 B | 0755 |
|
intel_sdsi | File | 22.43 KB | 0755 |
|
ip | File | 755.99 KB | 0755 |
|
ip6tables | File | 231.4 KB | 0755 |
|
ip6tables-nft | File | 231.4 KB | 0755 |
|
ip6tables-nft-restore | File | 231.4 KB | 0755 |
|
ip6tables-nft-save | File | 231.4 KB | 0755 |
|
ip6tables-restore | File | 231.4 KB | 0755 |
|
ip6tables-restore-translate | File | 231.4 KB | 0755 |
|
ip6tables-save | File | 231.4 KB | 0755 |
|
ip6tables-translate | File | 231.4 KB | 0755 |
|
ipmaddr | File | 19.45 KB | 0755 |
|
ipset | File | 15.09 KB | 0755 |
|
ipset-translate | File | 15.09 KB | 0755 |
|
iptables | File | 231.4 KB | 0755 |
|
iptables-nft | File | 231.4 KB | 0755 |
|
iptables-nft-restore | File | 231.4 KB | 0755 |
|
iptables-nft-save | File | 231.4 KB | 0755 |
|
iptables-restore | File | 231.4 KB | 0755 |
|
iptables-restore-translate | File | 231.4 KB | 0755 |
|
iptables-save | File | 231.4 KB | 0755 |
|
iptables-translate | File | 231.4 KB | 0755 |
|
iptunnel | File | 19.5 KB | 0755 |
|
irqbalance | File | 60.59 KB | 0755 |
|
irqbalance-ui | File | 39.79 KB | 0755 |
|
kexec | File | 188.76 KB | 0755 |
|
key.dns_resolver | File | 31.35 KB | 0755 |
|
kpartx | File | 47.72 KB | 0755 |
|
lchage | File | 23.37 KB | 0755 |
|
ldattach | File | 27.41 KB | 0755 |
|
ldconfig | File | 1.12 MB | 0755 |
|
lgroupadd | File | 15.31 KB | 0755 |
|
lgroupdel | File | 15.31 KB | 0755 |
|
lgroupmod | File | 23.32 KB | 0755 |
|
lid | File | 19.33 KB | 0755 |
|
lnewusers | File | 23.31 KB | 0755 |
|
lnstat | File | 23.71 KB | 0755 |
|
load_policy | File | 15.24 KB | 0755 |
|
logrotate | File | 99.65 KB | 0755 |
|
logsave | File | 15.19 KB | 0755 |
|
losetup | File | 72.27 KB | 0755 |
|
lpasswd | File | 23.32 KB | 0755 |
|
lshw | File | 849.57 KB | 0755 |
|
lsmod | File | 165.76 KB | 0755 |
|
luseradd | File | 23.33 KB | 0755 |
|
luserdel | File | 15.31 KB | 0755 |
|
lusermod | File | 23.31 KB | 0755 |
|
makedumpfile | File | 428.03 KB | 0755 |
|
mariadbd | File | 26.23 MB | 0755 |
|
matchpathcon | File | 15.14 KB | 0755 |
|
mii-diag | File | 24.2 KB | 0755 |
|
mii-tool | File | 27.78 KB | 0755 |
|
mkdict | File | 255 B | 0755 |
|
mkdumprd | File | 12.17 KB | 0755 |
|
mke2fs | File | 132.53 KB | 0755 |
|
mkfs | File | 15.36 KB | 0755 |
|
mkfs.cramfs | File | 35.57 KB | 0755 |
|
mkfs.ext2 | File | 132.53 KB | 0755 |
|
mkfs.ext3 | File | 132.53 KB | 0755 |
|
mkfs.ext4 | File | 132.53 KB | 0755 |
|
mkfs.minix | File | 43.75 KB | 0755 |
|
mkfs.xfs | File | 450.98 KB | 0755 |
|
mkhomedir_helper | File | 23.38 KB | 0755 |
|
mklost+found | File | 15.12 KB | 0755 |
|
mksquashfs | File | 197.62 KB | 0755 |
|
mkswap | File | 47.7 KB | 0755 |
|
modinfo | File | 165.76 KB | 0755 |
|
modprobe | File | 165.76 KB | 0755 |
|
modsec-sdbm-util | File | 33.56 KB | 0750 |
|
mount.fuse | File | 15.36 KB | 0755 |
|
mount.nfs | File | 98.45 KB | 4755 |
|
mount.nfs4 | File | 98.45 KB | 4755 |
|
mountstats | File | 42.19 KB | 0755 |
|
mysqld | File | 26.23 MB | 0755 |
|
named | File | 545.2 KB | 0755 |
|
named-checkconf | File | 39.59 KB | 0755 |
|
named-checkzone | File | 39.55 KB | 0755 |
|
named-compilezone | File | 39.55 KB | 0755 |
|
named-journalprint | File | 15.34 KB | 0755 |
|
named-nzd2nzf | File | 15.3 KB | 0755 |
|
nameif | File | 15.58 KB | 0755 |
|
newusers | File | 88.86 KB | 0755 |
|
nfsconf | File | 40.05 KB | 0755 |
|
nfsdcld | File | 56.05 KB | 0755 |
|
nfsdclddb | File | 9.99 KB | 0755 |
|
nfsdclnts | File | 9.05 KB | 0755 |
|
nfsdcltrack | File | 40.11 KB | 0755 |
|
nfsidmap | File | 23.48 KB | 0755 |
|
nfsiostat | File | 24.41 KB | 0755 |
|
nfsref | File | 43.71 KB | 0755 |
|
nfsstat | File | 38.46 KB | 0755 |
|
nft | File | 27.38 KB | 0755 |
|
nologin | File | 15.36 KB | 0755 |
|
nscd | File | 163.36 KB | 0755 |
|
nsec3hash | File | 15.38 KB | 0755 |
|
nstat | File | 31.43 KB | 0755 |
|
packer | File | 15.7 KB | 0755 |
|
pam_console_apply | File | 43.69 KB | 0755 |
|
pam_namespace_helper | File | 471 B | 0755 |
|
pam_timestamp_check | File | 15.3 KB | 0755 |
|
paperconfig | File | 4.08 KB | 0755 |
|
parted | File | 97.31 KB | 0755 |
|
partprobe | File | 16.19 KB | 0755 |
|
partx | File | 59.96 KB | 0755 |
|
pdns_server | File | 5.89 MB | 0755 |
|
pidof | File | 23.33 KB | 0755 |
|
ping | File | 76.66 KB | 0755 |
|
ping6 | File | 76.66 KB | 0755 |
|
pivot_root | File | 15.35 KB | 0755 |
|
plipconfig | File | 15.35 KB | 0755 |
|
poweroff | File | 298.59 KB | 0755 |
|
pwck | File | 55.77 KB | 0755 |
|
pwconv | File | 47.62 KB | 0755 |
|
pwhistory_helper | File | 19.37 KB | 0755 |
|
pwunconv | File | 47.58 KB | 0755 |
|
quotacheck | File | 93.63 KB | 0755 |
|
quotaoff | File | 56.69 KB | 0755 |
|
quotaon | File | 56.69 KB | 0755 |
|
quotastats | File | 15.37 KB | 0755 |
|
File | 0 B | 0 |
|
|
rdisc | File | 31.54 KB | 0755 |
|
rdma | File | 105.01 KB | 0755 |
|
readprofile | File | 23.45 KB | 0755 |
|
reboot | File | 298.59 KB | 0755 |
|
repquota | File | 77.58 KB | 0755 |
|
request-key | File | 27.29 KB | 0755 |
|
resize2fs | File | 67.62 KB | 0755 |
|
resizepart | File | 23.59 KB | 0755 |
|
restorecon | File | 23.3 KB | 0755 |
|
restorecon_xattr | File | 15.25 KB | 0755 |
|
rfkill | File | 31.55 KB | 0755 |
|
rmmod | File | 165.76 KB | 0755 |
|
rndc | File | 43.45 KB | 0755 |
|
rndc-confgen | File | 23.45 KB | 0755 |
|
rotatelogs | File | 38.13 KB | 0755 |
|
route | File | 65.77 KB | 0755 |
|
rpc.gssd | File | 88.33 KB | 0755 |
|
rpc.idmapd | File | 47.94 KB | 0755 |
|
rpc.mountd | File | 132.68 KB | 0755 |
|
rpc.nfsd | File | 40.2 KB | 0755 |
|
rpc.statd | File | 80.98 KB | 0755 |
|
rpcbind | File | 59.89 KB | 0755 |
|
rpcctl | File | 9.42 KB | 0755 |
|
rpcdebug | File | 18.8 KB | 0755 |
|
rpcinfo | File | 35.58 KB | 0755 |
|
rsyslogd | File | 781.55 KB | 0755 |
|
rtacct | File | 25.43 KB | 0755 |
|
rtcwake | File | 35.45 KB | 0755 |
|
rtkitctl | File | 15.24 KB | 0755 |
|
rtmon | File | 124.03 KB | 0755 |
|
rtstat | File | 23.71 KB | 0755 |
|
runlevel | File | 298.59 KB | 0755 |
|
runq | File | 1.51 MB | 4755 |
|
runuser | File | 55.8 KB | 0755 |
|
sasldblistusers2 | File | 15.27 KB | 0755 |
|
saslpasswd2 | File | 15.24 KB | 0755 |
|
sefcontext_compile | File | 72.2 KB | 0755 |
|
selabel_digest | File | 15.14 KB | 0755 |
|
selabel_get_digests_all_partial_matches | File | 15.15 KB | 0755 |
|
selabel_lookup | File | 15.13 KB | 0755 |
|
selabel_lookup_best_match | File | 15.13 KB | 0755 |
|
selabel_partial_match | File | 15.13 KB | 0755 |
|
selinux_check_access | File | 15.14 KB | 0755 |
|
selinuxconlist | File | 15.13 KB | 0755 |
|
selinuxdefcon | File | 15.13 KB | 0755 |
|
selinuxenabled | File | 15.1 KB | 0755 |
|
selinuxexeccon | File | 15.12 KB | 0755 |
|
semanage | File | 40.64 KB | 0755 |
|
semodule | File | 32.16 KB | 0755 |
|
sendmail | File | 24.75 KB | 2755 |
|
service | File | 4.51 KB | 0755 |
|
sestatus | File | 23.25 KB | 0755 |
|
setcap | File | 15.13 KB | 0755 |
|
setenforce | File | 15.12 KB | 0755 |
|
setfiles | File | 23.3 KB | 0755 |
|
setquota | File | 81.6 KB | 0755 |
|
setsebool | File | 19.27 KB | 0755 |
|
sfdisk | File | 104.17 KB | 0755 |
|
showmount | File | 15.66 KB | 0755 |
|
shutdown | File | 298.59 KB | 0755 |
|
slattach | File | 37.57 KB | 0755 |
|
sm-notify | File | 51.95 KB | 0755 |
|
smartctl | File | 853.95 KB | 0755 |
|
smartd | File | 615.6 KB | 0755 |
|
ss | File | 127.35 KB | 0755 |
|
sshd | File | 946.23 KB | 0755 |
|
sss_cache | File | 35.42 KB | 0755 |
|
sssd | File | 71.8 KB | 0755 |
|
start-statd | File | 1 KB | 0755 |
|
start-stop-daemon | File | 48.83 KB | 0755 |
|
suexec | File | 37.6 KB | 4755 |
|
sulogin | File | 43.6 KB | 0755 |
|
sw-engine-fpm | File | 24.4 MB | 0755 |
|
swaplabel | File | 19.38 KB | 0755 |
|
swapoff | File | 23.45 KB | 0755 |
|
swapon | File | 43.51 KB | 0755 |
|
switch_root | File | 23.39 KB | 0755 |
|
sysctl | File | 31.49 KB | 0755 |
|
tc | File | 630.3 KB | 0755 |
|
telinit | File | 298.59 KB | 0755 |
|
tipc | File | 88.9 KB | 0755 |
|
tmpwatch | File | 36.03 KB | 0755 |
|
tracepath | File | 19.39 KB | 0755 |
|
tracepath6 | File | 19.39 KB | 0755 |
|
tsig-keygen | File | 27.45 KB | 0755 |
|
tune2fs | File | 104.46 KB | 0755 |
|
udevadm | File | 583.98 KB | 0755 |
|
umount.nfs | File | 98.45 KB | 4755 |
|
umount.nfs4 | File | 98.45 KB | 4755 |
|
unix_chkpwd | File | 23.45 KB | 0755 |
|
unix_update | File | 31.49 KB | 0700 |
|
unsquashfs | File | 113.8 KB | 0755 |
|
update-alternatives | File | 39.6 KB | 0755 |
|
update-smart-drivedb | File | 23.33 KB | 0755 |
|
useradd | File | 138.02 KB | 0755 |
|
userdel | File | 89 KB | 0755 |
|
usermod | File | 129.84 KB | 0755 |
|
validatetrans | File | 15.12 KB | 0755 |
|
vdpa | File | 35.95 KB | 0755 |
|
vigr | File | 58.33 KB | 0755 |
|
vipw | File | 58.33 KB | 0755 |
|
visudo | File | 220.85 KB | 0755 |
|
vmcore-dmesg | File | 27.47 KB | 0755 |
|
weak-modules | File | 33.55 KB | 0755 |
|
whmapi0 | File | 3.15 MB | 0755 |
|
whmapi1 | File | 3.15 MB | 0755 |
|
whmlogin | File | 2.33 KB | 0755 |
|
wipefs | File | 39.48 KB | 0755 |
|
xfs_admin | File | 2.13 KB | 0755 |
|
xfs_bmap | File | 699 B | 0755 |
|
xfs_copy | File | 92.82 KB | 0755 |
|
xfs_db | File | 708.3 KB | 0755 |
|
xfs_estimate | File | 15.36 KB | 0755 |
|
xfs_freeze | File | 804 B | 0755 |
|
xfs_fsr | File | 43.71 KB | 0755 |
|
xfs_growfs | File | 43.83 KB | 0755 |
|
xfs_info | File | 1.27 KB | 0755 |
|
xfs_io | File | 202.79 KB | 0755 |
|
xfs_logprint | File | 88.46 KB | 0755 |
|
xfs_mdrestore | File | 27.48 KB | 0755 |
|
xfs_metadump | File | 786 B | 0755 |
|
xfs_mkfile | File | 1.02 KB | 0755 |
|
xfs_ncheck | File | 689 B | 0755 |
|
xfs_quota | File | 92.29 KB | 0755 |
|
xfs_repair | File | 686.43 KB | 0755 |
|
xfs_rtcp | File | 19.34 KB | 0755 |
|
xfs_spaceman | File | 43.97 KB | 0755 |
|
xqmstats | File | 15.34 KB | 0755 |
|
xtables-monitor | File | 231.4 KB | 0755 |
|
xtables-nft-multi | File | 231.4 KB | 0755 |
|
zic | File | 59.81 KB | 0755 |
|
zramctl | File | 56.05 KB | 0755 |
|