1e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# This file is part of systemd.
2e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh#
31886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh# Copyright 2011-2013 Dan Walsh
4e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh#
5e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# systemd is free software; you can redistribute it and/or modify it
6e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# under the terms of the GNU General Public License as published by
7e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# the Free Software Foundation; either version 2 of the License, or
8e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# (at your option) any later version.
9e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh#
10e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# systemd is distributed in the hope that it will be useful, but
11e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# WITHOUT ANY WARRANTY; without even the implied warranty of
12e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# General Public License for more details.
14e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh#
15e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# You should have received a copy of the GNU General Public License
16e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh# along with systemd; If not, see <http://www.gnu.org/licenses/>.
17e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh
18e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__contains_word () {
19e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        local word=$1; shift
20e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        for w in $*; do [[ $w = $word ]] && return 0; done
21e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        return 1
22e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
23e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh
24e5a81c715fa31147d5ef79cf1c116ce68744b02aDan WalshALL_OPTS='-l --list -S -o -n --noheading -h --help'
25e5a81c715fa31147d5ef79cf1c116ce68744b02aDan WalshMANAGED_OPTS='-a --add -m --modify -d --delete -D --deleteall -C --locallist '
26e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh
27e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_stores () {
28e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    dir -1 -F /etc/selinux/ | grep '/' | cut -d'/' -f 1
29e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
30e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_ftypes () {
31e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    echo '-- -d -c -b -s -l -p'
32e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
33e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_users () { 
34e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    seinfo -u 2> /dev/null | tail -n +3 
35e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
36e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_types () { 
37e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    seinfo -t 2> /dev/null | tail -n +3 
38e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
39e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_port_types () { 
40e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    seinfo -aport_type -x 2>/dev/null | tail -n +2 
41e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
42e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_domains () { 
43e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    seinfo -adomain -x 2>/dev/null | tail -n +2 
44e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
45e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_node_types () { 
46e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    seinfo -anode_type -x 2>/dev/null | tail -n +2 
47e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
48e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_file_types () { 
49e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    seinfo -afile_type -x 2>/dev/null | tail -n +2 
50e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
51e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_roles () { 
521886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh    seinfo -r 2> /dev/null | tail -n +3
53e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
54e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_all_stores () {
55e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh    dir -1 -F /etc/selinux/ | grep '/' | cut -d'/' -f 1
56e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
571886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh__get_import_opts () { echo '$ALL_OPTS --f --input_file' ; }
581886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh__get_export_opts () { echo '$ALL_OPTS --f --output_file' ; }
591886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh__get_boolean_opts () { echo '$ALL_OPTS --on -off -1 -0' ; }
601886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh__get_user_opts () { echo '$ALL_OPTS $MANAGED_OPTS -L --level -r --range -R --role '; }
611886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh__get_login_opts () { echo '$ALL_OPTS $MANAGED_OPTS -s --seuser -r --range'; }
62e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_port_opts () { echo '$ALL_OPTS $MANAGED_OPTS -t -type -r --range -p --proto'; }
63e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_interface_opts () { echo '$ALL_OPTS $MANAGED_OPTS -t --type '; }
64e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_node_opts () { echo '$ALL_OPTS $MANAGED_OPTS -t --type -M --mask -p --proto'; }
65e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_fcontext_opts () { echo '$ALL_OPTS $MANAGED_OPTS -t --type -e --equal -f --ftype '; }
66b68435fbead85c707aa736f052b1b9999dcf8b70Dan Walsh__get_module_opts () { echo '$ALL_OPTS $MANAGED_OPTS --enable --disable '; }
67e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_dontaudit_opts () { echo '-S on off' ; }
68e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh__get_permissive_opts () { echo '$ALL_OPTS -a --add -d --delete' ; }
69e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh
70e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh_semanage () {
71e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        local command=${COMP_WORDS[1]}
72e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
73e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        local verb comps
74e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        local -A VERBS=(
751886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [BOOLEAN]='boolean'
761886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [DONTAUDIT]='dontaudit'
771886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [EXPORT]='export'
781886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [FCONTEXT]='fcontext'
791886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [IMPORT]='import'
80e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	       [INTERFACE]='interface'
811886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [LOGIN]='login'
82e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	       [MODULE]='module'
83e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	       [NODE]='node'
84e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	       [PERMISSIVE]='permissive'
851886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [PORT]='port'
861886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	       [USER]='user'
87e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        )
88e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	if   [ "$prev" = "-a" -a "$command" = "permissive" ]; then
89e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_domains ) " -- "$cur") )
90e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
91e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	fi
92e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	if   [ "$verb" = "" -a "$prev" = "semanage" ]; then
93e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                comps="${VERBS[*]}"
94e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	elif [ "$verb" = "" -a "$prev" = "-S" -o "$prev" = "--store" ]; then
95e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_stores ) " -- "$cur") )
96e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
97e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	elif [ "$verb" = "" -a "$prev" = "-p" -o "$prev" = "--proto" ]; then
98e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "tcp udp" -- "$cur") )
99e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
1001886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	elif [ "$verb" = "" -a "$prev" = "-R" -o "$prev" = "-r" -o "$prev" = "--role" ]; then
1011886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	    if [ "$command" != "user" -o "$prev" != "-r" ]; then
102e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_roles ) " -- "$cur") )
103e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
1041886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	    else
1051886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh		return 0
1061886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh	    fi
107e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	elif [ "$verb" = "" -a "$prev" = "-s" -o "$prev" = "--seuser" ]; then
108e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_users ) " -- "$cur") )
109e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
110e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	elif [ "$verb" = "" -a "$prev" = "-f" -o "$prev" = "--ftype" ]; then
111e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_ftypes ) " -- "$cur") )
112e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
113e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	elif [ "$verb" = "" -a "$prev" = "-t" -o "$prev" = "--types" ]; then
114e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	    if [ "$command" = "port" ]; then
115e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_port_types ) " -- "$cur") )
116e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
117e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	    fi
118e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	    if [ "$command" = "fcontext" ]; then
119e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	        COMPREPLY=( $(compgen -W "$( __get_all_file_types ) " -- "$cur") )
120e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
121e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	    fi
122e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	    COMPREPLY=( $(compgen -W "$( __get_all_types ) " -- "$cur") )
123e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh	    return 0
124e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[LOGIN]} ; then
125e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_login_opts ) " -- "$cur") )
126e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
127e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[USER]} ; then
128e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_user_opts ) " -- "$cur") )
129e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
130e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[PORT]} ; then
131e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_port_opts ) " -- "$cur") )
132e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
133e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[INTERFACE]} ; then
134e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_interface_opts ) " -- "$cur") )
1351886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh		return 0
136e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[MODULE]} ; then
137e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_module_opts ) " -- "$cur") )
138e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
139e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[NODE]} ; then
140e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_node_opts ) " -- "$cur") )
141e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
142e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[FCONTEXT]} ; then
143e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_fcontext_opts ) " -- "$cur") )
144e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
145e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[BOOLEAN]} ; then
146e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_boolean_opts ) " -- "$cur") )
147e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
148e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[PERMISSIVE]} ; then
149e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_permissive_opts ) " -- "$cur") )
150e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
151e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        elif __contains_word "$command" ${VERBS[DONTAUDIT]} ; then
152e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh                COMPREPLY=( $(compgen -W "$( __get_dontaudit_opts ) " -- "$cur") )
153e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh		return 0
1541886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh        elif __contains_word "$command" ${VERBS[IMPORT]} ; then
1551886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh                COMPREPLY=( $(compgen -W "$( __get_import_opts ) " -- "$cur") )
1561886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh		return 0
1571886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh        elif __contains_word "$command" ${VERBS[EXPORT]} ; then
1581886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh                COMPREPLY=( $(compgen -W "$( __get_export_opts ) " -- "$cur") )
1591886d463c6e748fccf02f7384521354fa98bf9d9Dan Walsh		return 0
160e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        fi
161e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        COMPREPLY=( $(compgen -W "$comps" -- "$cur") )
162e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh        return 0
163e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walsh}
164e5a81c715fa31147d5ef79cf1c116ce68744b02aDan Walshcomplete -F _semanage semanage
165