1*2d543d20SAndroid Build Coastguard Worker# This file is part of systemd. 2*2d543d20SAndroid Build Coastguard Worker# 3*2d543d20SAndroid Build Coastguard Worker# Copyright 2012-2013 Dan Walsh 4*2d543d20SAndroid Build Coastguard Worker# 5*2d543d20SAndroid Build Coastguard Worker# systemd is free software; you can redistribute it and/or modify it 6*2d543d20SAndroid Build Coastguard Worker# under the terms of the GNU General Public License as published by 7*2d543d20SAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or 8*2d543d20SAndroid Build Coastguard Worker# (at your option) any later version. 9*2d543d20SAndroid Build Coastguard Worker# 10*2d543d20SAndroid Build Coastguard Worker# systemd is distributed in the hope that it will be useful, but 11*2d543d20SAndroid Build Coastguard Worker# WITHOUT ANY WARRANTY; without even the implied warranty of 12*2d543d20SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13*2d543d20SAndroid Build Coastguard Worker# General Public License for more details. 14*2d543d20SAndroid Build Coastguard Worker# 15*2d543d20SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 16*2d543d20SAndroid Build Coastguard Worker# along with systemd; If not, see <http://www.gnu.org/licenses/>. 17*2d543d20SAndroid Build Coastguard Worker 18*2d543d20SAndroid Build Coastguard Worker__contains_word () { 19*2d543d20SAndroid Build Coastguard Worker local word=$1; shift 20*2d543d20SAndroid Build Coastguard Worker for w in $*; do [[ $w = $word ]] && return 0; done 21*2d543d20SAndroid Build Coastguard Worker return 1 22*2d543d20SAndroid Build Coastguard Worker} 23*2d543d20SAndroid Build Coastguard Worker 24*2d543d20SAndroid Build Coastguard Worker__get_all_paths () { 25*2d543d20SAndroid Build Coastguard Worker dir -1 -F $* | grep '/' | cut -d'/' -f 1 26*2d543d20SAndroid Build Coastguard Worker} 27*2d543d20SAndroid Build Coastguard Worker__get_all_ftypes () { 28*2d543d20SAndroid Build Coastguard Worker echo '-- -d -c -b -s -l -p' 29*2d543d20SAndroid Build Coastguard Worker} 30*2d543d20SAndroid Build Coastguard Worker__get_all_networks () { 31*2d543d20SAndroid Build Coastguard Worker seinfo -u 2> /dev/null | tail -n +3 32*2d543d20SAndroid Build Coastguard Worker} 33*2d543d20SAndroid Build Coastguard Worker__get_all_booleans () { 34*2d543d20SAndroid Build Coastguard Worker getsebool -a 2> /dev/null 35*2d543d20SAndroid Build Coastguard Worker} 36*2d543d20SAndroid Build Coastguard Worker__get_all_types () { 37*2d543d20SAndroid Build Coastguard Worker seinfo -t 2> /dev/null | tail -n +3 38*2d543d20SAndroid Build Coastguard Worker} 39*2d543d20SAndroid Build Coastguard Worker__get_all_admin_interfaces () { 40*2d543d20SAndroid Build Coastguard Worker awk '/InterfaceVector.*_admin /{ print $2 }' /var/lib/sepolgen/interface_info | awk -F '_admin' '{ print $1 }' 41*2d543d20SAndroid Build Coastguard Worker} 42*2d543d20SAndroid Build Coastguard Worker__get_all_user_role_interfaces () { 43*2d543d20SAndroid Build Coastguard Worker awk '/InterfaceVector.*_role /{ print $2 }' /var/lib/sepolgen/interface_info | awk -F '_role' '{ print $1 }' 44*2d543d20SAndroid Build Coastguard Worker} 45*2d543d20SAndroid Build Coastguard Worker__get_all_user_domains () { 46*2d543d20SAndroid Build Coastguard Worker seinfo -auserdomain -x 2> /dev/null | tail -n +2 47*2d543d20SAndroid Build Coastguard Worker} 48*2d543d20SAndroid Build Coastguard Worker__get_all_users () { 49*2d543d20SAndroid Build Coastguard Worker seinfo -u 2> /dev/null | tail -n +2 50*2d543d20SAndroid Build Coastguard Worker} 51*2d543d20SAndroid Build Coastguard Worker__get_all_classes () { 52*2d543d20SAndroid Build Coastguard Worker seinfo -c 2> /dev/null | tail -n +2 53*2d543d20SAndroid Build Coastguard Worker} 54*2d543d20SAndroid Build Coastguard Worker__get_all_port_types () { 55*2d543d20SAndroid Build Coastguard Worker seinfo -aport_type -x 2> /dev/null | tail -n +2 56*2d543d20SAndroid Build Coastguard Worker} 57*2d543d20SAndroid Build Coastguard Worker__get_all_domain_types () { 58*2d543d20SAndroid Build Coastguard Worker seinfo -adomain -x 2> /dev/null | tail -n +2 59*2d543d20SAndroid Build Coastguard Worker} 60*2d543d20SAndroid Build Coastguard Worker__get_all_domains () { 61*2d543d20SAndroid Build Coastguard Worker seinfo -adomain -x 2>/dev/null | sed 's/_t$//g' 62*2d543d20SAndroid Build Coastguard Worker} 63*2d543d20SAndroid Build Coastguard Worker_sepolicy () { 64*2d543d20SAndroid Build Coastguard Worker local command=${COMP_WORDS[1]} 65*2d543d20SAndroid Build Coastguard Worker local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} 66*2d543d20SAndroid Build Coastguard Worker local verb comps 67*2d543d20SAndroid Build Coastguard Worker 68*2d543d20SAndroid Build Coastguard Worker local -A VERBS=( 69*2d543d20SAndroid Build Coastguard Worker [BOOLEANS]='booleans' 70*2d543d20SAndroid Build Coastguard Worker [COMMUNICATE]='communicate' 71*2d543d20SAndroid Build Coastguard Worker [GENERATE]='generate' 72*2d543d20SAndroid Build Coastguard Worker [GUI]='gui' 73*2d543d20SAndroid Build Coastguard Worker [INTERFACE]='interface' 74*2d543d20SAndroid Build Coastguard Worker [MANPAGE]='manpage' 75*2d543d20SAndroid Build Coastguard Worker [NETWORK]='network' 76*2d543d20SAndroid Build Coastguard Worker [TRANSITION]='transition' 77*2d543d20SAndroid Build Coastguard Worker ) 78*2d543d20SAndroid Build Coastguard Worker 79*2d543d20SAndroid Build Coastguard Worker COMMONOPTS='-P --policy -h --help' 80*2d543d20SAndroid Build Coastguard Worker local -A OPTS=( 81*2d543d20SAndroid Build Coastguard Worker [booleans]='-h --help -p --path -a -all -b --boolean' 82*2d543d20SAndroid Build Coastguard Worker [communicate]='-h --help -s --source -t --target -c --class -S --sourceaccess -T --targetaccess' 83*2d543d20SAndroid Build Coastguard Worker [generate]='-a --admin --admin_user --application --cgi --confined_admin --customize -d --domain --dbus --desktop_user -h --help --inetd --init -n --name --newtype -p --path --sandbox -T --test --term_user -u --user -w --writepath --x_user' 84*2d543d20SAndroid Build Coastguard Worker [gui]='-h --help' 85*2d543d20SAndroid Build Coastguard Worker [interface]='-h --help -a --list_admin -c --compile -i --interface -l --list -u --list_user -u --list_user -v --verbose' 86*2d543d20SAndroid Build Coastguard Worker [manpage]='-h --help -p --path -a -all -o --os -d --domain -w --web -r --root' 87*2d543d20SAndroid Build Coastguard Worker [network]='-h --help -d --domain -l --list -p --port -t --type ' 88*2d543d20SAndroid Build Coastguard Worker [transition]='-h --help -s --source -t --target' 89*2d543d20SAndroid Build Coastguard Worker ) 90*2d543d20SAndroid Build Coastguard Worker 91*2d543d20SAndroid Build Coastguard Worker for ((i=0; $i <= $COMP_CWORD; i++)); do 92*2d543d20SAndroid Build Coastguard Worker if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && 93*2d543d20SAndroid Build Coastguard Worker ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG}]}; then 94*2d543d20SAndroid Build Coastguard Worker verb=${COMP_WORDS[i]} 95*2d543d20SAndroid Build Coastguard Worker break 96*2d543d20SAndroid Build Coastguard Worker fi 97*2d543d20SAndroid Build Coastguard Worker done 98*2d543d20SAndroid Build Coastguard Worker 99*2d543d20SAndroid Build Coastguard Worker if [[ -z $verb ]]; then 100*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-P" -o "$prev" = "--policy" ]; then 101*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -f -- "$cur") ) 102*2d543d20SAndroid Build Coastguard Worker compopt -o filenames 103*2d543d20SAndroid Build Coastguard Worker return 0 104*2d543d20SAndroid Build Coastguard Worker else 105*2d543d20SAndroid Build Coastguard Worker comps="${VERBS[*]} ${COMMONOPTS}" 106*2d543d20SAndroid Build Coastguard Worker fi 107*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "booleans" ]; then 108*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-b" -o "$prev" = "--boolean" ]; then 109*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_booleans ) " -- "$cur") ) 110*2d543d20SAndroid Build Coastguard Worker return 0 111*2d543d20SAndroid Build Coastguard Worker fi 112*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 113*2d543d20SAndroid Build Coastguard Worker return 0 114*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "communicate" ]; then 115*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-s" -o "$prev" = "--source" -o "$prev" = "-t" -o "$prev" = "--target" ]; then 116*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_domain_types ) " -- "$cur") ) 117*2d543d20SAndroid Build Coastguard Worker return 0 118*2d543d20SAndroid Build Coastguard Worker elif [ "$prev" = "-c" -o "$prev" = "--class" ]; then 119*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_classes ) " -- "$cur") ) 120*2d543d20SAndroid Build Coastguard Worker return 0 121*2d543d20SAndroid Build Coastguard Worker fi 122*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 123*2d543d20SAndroid Build Coastguard Worker return 0 124*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "generate" ]; then 125*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "--name" -o "$prev" = "-n" ]; then 126*2d543d20SAndroid Build Coastguard Worker return 0 127*2d543d20SAndroid Build Coastguard Worker elif test "$prev" = "-p" || test "$prev" = "--path" ; then 128*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -d -- "$cur") ) 129*2d543d20SAndroid Build Coastguard Worker compopt -o filenames 130*2d543d20SAndroid Build Coastguard Worker return 0 131*2d543d20SAndroid Build Coastguard Worker elif test "$prev" = "-w" || test "$prev" = "--writepath" ; then 132*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -d -- "$cur") ) 133*2d543d20SAndroid Build Coastguard Worker compopt -o filenames 134*2d543d20SAndroid Build Coastguard Worker return 0 135*2d543d20SAndroid Build Coastguard Worker elif [ "$prev" = "--domain" -o "$prev" = "-d" ]; then 136*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_domain_types ) " -- "$cur") ) 137*2d543d20SAndroid Build Coastguard Worker return 0 138*2d543d20SAndroid Build Coastguard Worker elif [ "$prev" = "--newtype" ]; then 139*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "-n --name -t --type" -- "$cur") ) 140*2d543d20SAndroid Build Coastguard Worker return 0 141*2d543d20SAndroid Build Coastguard Worker elif [ "$prev" = "--admin" -o "$prev" = "-a" ]; then 142*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_admin_interfaces ) " -- "$cur") ) 143*2d543d20SAndroid Build Coastguard Worker return 0 144*2d543d20SAndroid Build Coastguard Worker elif [ "$prev" = "--user" -o "$prev" = "-u" ]; then 145*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_users )" -- "$cur") ) 146*2d543d20SAndroid Build Coastguard Worker return 0 147*2d543d20SAndroid Build Coastguard Worker elif [[ "$cur" == "$verb" || "$cur" == "" || "$cur" == -* ]]; then 148*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 149*2d543d20SAndroid Build Coastguard Worker return 0 150*2d543d20SAndroid Build Coastguard Worker fi 151*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -f -- "$cur") ) 152*2d543d20SAndroid Build Coastguard Worker compopt -o filenames 153*2d543d20SAndroid Build Coastguard Worker return 0 154*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "interface" ]; then 155*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 156*2d543d20SAndroid Build Coastguard Worker return 0 157*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "manpage" ]; then 158*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-d" -o "$prev" = "--domain" ]; then 159*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_domains ) " -- "$cur") ) 160*2d543d20SAndroid Build Coastguard Worker return 0 161*2d543d20SAndroid Build Coastguard Worker elif test "$prev" = "-r" || test "$prev" = "--root" ; then 162*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -d -- "$cur") ) 163*2d543d20SAndroid Build Coastguard Worker compopt -o filenames 164*2d543d20SAndroid Build Coastguard Worker return 0 165*2d543d20SAndroid Build Coastguard Worker elif [ "$prev" = "-o" -o "$prev" = "--os" ]; then 166*2d543d20SAndroid Build Coastguard Worker return 0 167*2d543d20SAndroid Build Coastguard Worker elif test "$prev" = "-p" || test "$prev" = "--path" ; then 168*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -d -- "$cur") ) 169*2d543d20SAndroid Build Coastguard Worker compopt -o filenames 170*2d543d20SAndroid Build Coastguard Worker return 0 171*2d543d20SAndroid Build Coastguard Worker fi 172*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 173*2d543d20SAndroid Build Coastguard Worker return 0 174*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "network" ]; then 175*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-t" -o "$prev" = "--type" ]; then 176*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_port_types )" -- "$cur") ) 177*2d543d20SAndroid Build Coastguard Worker return 0 178*2d543d20SAndroid Build Coastguard Worker fi 179*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-d" -o "$prev" = "--domain" ]; then 180*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_domain_types )" -- "$cur") ) 181*2d543d20SAndroid Build Coastguard Worker return 0 182*2d543d20SAndroid Build Coastguard Worker fi 183*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 184*2d543d20SAndroid Build Coastguard Worker return 0 185*2d543d20SAndroid Build Coastguard Worker elif [ "$verb" = "transition" ]; then 186*2d543d20SAndroid Build Coastguard Worker if [ "$prev" = "-s" -o "$prev" = "--source" -o "$prev" = "-t" -o "$prev" = "--target" ]; then 187*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$( __get_all_domain_types ) " -- "$cur") ) 188*2d543d20SAndroid Build Coastguard Worker return 0 189*2d543d20SAndroid Build Coastguard Worker fi 190*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") ) 191*2d543d20SAndroid Build Coastguard Worker return 0 192*2d543d20SAndroid Build Coastguard Worker fi 193*2d543d20SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$comps" -- "$cur") ) 194*2d543d20SAndroid Build Coastguard Worker return 0 195*2d543d20SAndroid Build Coastguard Worker} 196*2d543d20SAndroid Build Coastguard Workercomplete -F _sepolicy sepolicy 197