ProShell v2.0
Dashboard
Server Info
Server: 127.0.0.80
PHP: 8.3.31
home
clients
08ce2314c3c7e396ea36e41d2a860c5e
sites
filmerletravail.org
wp-content
mu-plugins
2026-08-13 20:38:43
Editing: tc
Cancel
Save Changes
# tc(8) completion -*- shell-script -*- # Copyright 2016 6WIND S.A. # Copyright 2016 Quentin Monnet <quentin.monnet@6wind.com> QDISC_KIND=' choke codel bfifo pfifo pfifo_head_drop fq fq_codel gred hhf \ mqprio multiq netem pfifo_fast pie fq_pie red rr sfb sfq tbf atm \ cbq drr dsmark hfsc htb prio qfq ' FILTER_KIND=' basic bpf cgroup flow flower fw route rsvp tcindex u32 matchall ' ACTION_KIND=' gact mirred bpf sample ' # Takes a list of words in argument; each one of them is added to COMPREPLY if # it is not already present on the command line. Returns no value. _tc_once_attr() { local w subcword found for w in $*; do found=0 for (( subcword=3; subcword < ${#words[@]}-1; subcword++ )); do if [[ $w == ${words[subcword]} ]]; then found=1 break fi done [[ $found -eq 0 ]] && \ COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) ) done } # Takes a list of words in argument; each one of them is added to COMPREPLY if # it is not already present on the command line from the provided index. Returns # no value. _tc_once_attr_from() { local w subcword found from=$1 shift for w in $*; do found=0 for (( subcword=$from; subcword < ${#words[@]}-1; subcword++ )); do if [[ $w == ${words[subcword]} ]]; then found=1 break fi done [[ $found -eq 0 ]] && \ COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) ) done } # Takes a list of words in argument; adds them all to COMPREPLY if none of them # is already present on the command line. Returns no value. _tc_one_of_list() { local w subcword for w in $*; do for (( subcword=3; subcword < ${#words[@]}-1; subcword++ )); do [[ $w == ${words[subcword]} ]] && return 1 done done COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) ) } # Takes a list of words in argument; adds them all to COMPREPLY if none of them # is already present on the command line from the provided index. Returns no # value. _tc_one_of_list_from() { local w subcword from=$1 shift for w in $*; do for (( subcword=$from; subcword < ${#words[@]}-1; subcword++ )); do [[ $w == ${words[subcword]} ]] && return 1 done done COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) ) } # Returns "$cur ${cur}arg1 ${cur}arg2 ..." _tc_expand_units() { [[ $cur =~ ^[0-9]+ ]] || return 1 local value=${cur%%[^0-9]*} [[ $cur == $value ]] && echo $cur echo ${@/#/$value} } # Complete based on given word, usually $prev (or possibly the word before), # for when an argument or an option name has but a few possible arguments (so # tc does not take particular commands into account here). # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_direct_complete() { case $1 in # Command options dev) _available_interfaces return 0 ;; classid) return 0 ;; estimator) local list=$( _tc_expand_units 'secs' 'msecs' 'usecs' ) COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) return 0 ;; handle) return 0 ;; parent|flowid) local i iface ids cmd for (( i=3; i < ${#words[@]}-2; i++ )); do [[ ${words[i]} == dev ]] && iface=${words[i+1]} break done for cmd in qdisc class; do if [[ -n $iface ]]; then ids+=$( tc $cmd show dev $iface 2>/dev/null | \ cut -d\ -f 3 )" " else ids+=$( tc $cmd show 2>/dev/null | cut -d\ -f 3 ) fi done [[ $ids != " " ]] && \ COMPREPLY+=( $( compgen -W "$ids" -- "$cur" ) ) return 0 ;; protocol) # list comes from lib/ll_proto.c COMPREPLY+=( $( compgen -W ' 802.1Q 802.1ad 802_2 802_3 LLDP aarp \ all aoe arp atalk atmfate atmmpoa ax25 bpq can control cust \ ddcmp dec diag dna_dl dna_rc dna_rt econet ieeepup ieeepupat \ ip ipv4 ipv6 ipx irda lat localtalk loop mobitex ppp_disc \ ppp_mp ppp_ses ppptalk pup pupat rarp sca snap tipc tr_802_2 \ wan_ppp x25' -- "$cur" ) ) return 0 ;; prio) return 0 ;; stab) COMPREPLY+=( $( compgen -W 'mtu tsize mpu overhead linklayer' -- "$cur" ) ) ;; # Qdiscs and classes options alpha|bands|beta|buckets|corrupt|debug|decrement|default|\ default_index|depth|direct_qlen|divisor|duplicate|ewma|flow_limit|\ flows|hh_limit|increment|indices|linklayer|non_hh_weight|num_tc|\ penalty_burst|penalty_rate|prio|priomap|probability|queues|r2q|\ reorder|vq|vqs) return 0 ;; setup) COMPREPLY+=( $( compgen -W 'vqs' -- "$cur" ) ) return 0 ;; hw) COMPREPLY+=( $( compgen -W '1 0' -- "$cur" ) ) return 0 ;; distribution) COMPREPLY+=( $( compgen -W 'uniform normal pareto paretonormal' -- "$cur" ) ) return 0 ;; loss) COMPREPLY+=( $( compgen -W 'random state gmodel' -- "$cur" ) ) return 0 ;; # Qdiscs and classes options options gap|gmodel|state) return 0 ;; # Filters options map) COMPREPLY+=( $( compgen -W 'key' -- "$cur" ) ) return 0 ;; hash) COMPREPLY+=( $( compgen -W 'keys' -- "$cur" ) ) return 0 ;; indev) _available_interfaces return 0 ;; eth_type) COMPREPLY+=( $( compgen -W 'ipv4 ipv6' -- "$cur" ) ) return 0 ;; ip_proto) COMPREPLY+=( $( compgen -W 'tcp udp' -- "$cur" ) ) return 0 ;; # Filters options options key|keys) [[ ${words[@]} =~ graft ]] && return 1 COMPREPLY+=( $( compgen -W 'src dst proto proto-src proto-dst iif \ priority mark nfct nfct-src nfct-dst nfct-proto-src \ nfct-proto-dst rt-classid sk-uid sk-gid vlan-tag rxhash' -- \ "$cur" ) ) return 0 ;; # BPF options - used for filters, actions, and exec export|bytecode|bytecode-file|object-file) _filedir return 0 ;; object-pinned|graft) # Pinned object is probably under /sys/fs/bpf/ [[ -n "$cur" ]] && _filedir && return 0 COMPREPLY=( $( compgen -G "/sys/fs/bpf/*" -- "$cur" ) ) || _filedir compopt -o nospace return 0 ;; section) if (type objdump > /dev/null 2>&1) ; then local fword objfile section_list for (( fword=3; fword < ${#words[@]}-3; fword++ )); do if [[ ${words[fword]} == object-file ]]; then objfile=${words[fword+1]} break fi done section_list=$( objdump -h $objfile 2>/dev/null | \ sed -n 's/^ *[0-9]\+ \([^ ]*\) *.*/\1/p' ) COMPREPLY+=( $( compgen -W "$section_list" -- "$cur" ) ) fi return 0 ;; import|run) _filedir return 0 ;; type) COMPREPLY+=( $( compgen -W 'cls act' -- "$cur" ) ) return 0 ;; # Actions options random) _tc_one_of_list 'netrand determ' return 0 ;; # Units for option arguments bandwidth|maxrate|peakrate|rate) local list=$( _tc_expand_units 'bit' \ 'kbit' 'kibit' 'kbps' 'kibps' \ 'mbit' 'mibit' 'mbps' 'mibps' \ 'gbit' 'gibit' 'gbps' 'gibps' \ 'tbit' 'tibit' 'tbps' 'tibps' ) COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) ;; admit_bytes|avpkt|burst|cell|initial_quantum|limit|max|min|mtu|mpu|\ overhead|quantum|redflowlist) local list=$( _tc_expand_units \ 'b' 'kbit' 'k' 'mbit' 'm' 'gbit' 'g' ) COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) ;; db|delay|evict_timeout|interval|latency|perturb|rehash|reset_timeout|\ target|tupdate) local list=$( _tc_expand_units 'secs' 'msecs' 'usecs' ) COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) ;; esac return 1 } # Complete with options names for qdiscs. Each qdisc has its own set of options # and it seems we cannot really parse it from anywhere, so we add it manually # in this function. # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_qdisc_options() { case $1 in choke) _tc_once_attr 'limit bandwidth ecn min max burst' return 0 ;; codel) _tc_once_attr 'limit target interval' _tc_one_of_list 'ecn noecn' return 0 ;; bfifo|pfifo|pfifo_head_drop) _tc_once_attr 'limit' return 0 ;; fq) _tc_once_attr 'limit flow_limit quantum initial_quantum maxrate \ buckets' _tc_one_of_list 'pacing nopacing' return 0 ;; fq_codel) _tc_once_attr 'limit flows target interval quantum' _tc_one_of_list 'ecn noecn' return 0 ;; gred) _tc_once_attr 'setup vqs default grio vq prio limit min max avpkt \ burst probability bandwidth ecn harddrop' return 0 ;; hhf) _tc_once_attr 'limit quantum hh_limit reset_timeout admit_bytes \ evict_timeout non_hh_weight' return 0 ;; mqprio) _tc_once_attr 'num_tc map queues hw' return 0 ;; netem) _tc_once_attr 'delay distribution corrupt duplicate loss ecn \ reorder rate' return 0 ;; pie) _tc_once_attr 'limit target tupdate alpha beta' _tc_one_of_list 'bytemode nobytemode' _tc_one_of_list 'ecn noecn' _tc_one_of_list 'dq_rate_estimator no_dq_rate_estimator' return 0 ;; fq_pie) _tc_once_attr 'limit flows target tupdate \ alpha beta quantum memory_limit ecn_prob' _tc_one_of_list 'ecn noecn' _tc_one_of_list 'bytemode nobytemode' _tc_one_of_list 'dq_rate_estimator no_dq_rate_estimator' return 0 ;; red) _tc_once_attr 'limit min max avpkt burst adaptive probability \ bandwidth ecn harddrop' return 0 ;; rr|prio) _tc_once_attr 'bands priomap multiqueue' return 0 ;; sfb) _tc_once_attr 'rehash db limit max target increment decrement \ penalty_rate penalty_burst' return 0 ;; sfq) _tc_once_attr 'limit perturb quantum divisor flows depth headdrop \ redflowlimit min max avpkt burst probability ecn harddrop' return 0 ;; tbf) _tc_once_attr 'limit burst rate mtu peakrate latency overhead \ linklayer' return 0 ;; cbq) _tc_once_attr 'bandwidth avpkt mpu cell ewma' return 0 ;; dsmark) _tc_once_attr 'indices default_index set_tc_index' return 0 ;; hfsc) _tc_once_attr 'default' return 0 ;; htb) _tc_once_attr 'default r2q direct_qlen debug' return 0 ;; multiq|pfifo_fast|atm|drr|qfq) return 0 ;; esac return 1 } # Complete with options names for BPF filters or actions. # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_bpf_options() { [[ ${words[${#words[@]}-3]} == object-file ]] && \ _tc_once_attr 'section export' [[ ${words[${#words[@]}-5]} == object-file ]] && \ [[ ${words[${#words[@]}-3]} =~ (section|export) ]] && \ _tc_once_attr 'section export' _tc_one_of_list 'bytecode bytecode-file object-file object-pinned' _tc_once_attr 'verbose index direct-action action classid' return 0 } # Complete with options names for filter actions. # This function is recursive, thus allowing multiple actions statement to be # parsed. # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_filter_action_options() { for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); do if [[ action == ${words[acwd]} ]]; then _tc_filter_action_options $((acwd+1)) && return 0 fi done local action acwd for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); do if [[ $ACTION_KIND =~ ' '${words[acwd]}' ' ]]; then _tc_one_of_list_from $acwd action _tc_action_options $acwd && return 0 fi done _tc_one_of_list_from $acwd $ACTION_KIND return 0 } # Complete with options names for filters. # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_filter_options() { for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); do if [[ action == ${words[acwd]} ]]; then _tc_filter_action_options $((acwd+1)) && return 0 fi done filter=${words[$1]} case $filter in basic) _tc_once_attr 'match action classid' return 0 ;; bpf) _tc_bpf_options return 0 ;; cgroup) _tc_once_attr 'match action' return 0 ;; flow) local i for (( i=5; i < ${#words[@]}-1; i++ )); do if [[ ${words[i]} =~ ^keys?$ ]]; then _tc_direct_complete 'key' COMPREPLY+=( $( compgen -W 'or and xor rshift addend' -- \ "$cur" ) ) break fi done _tc_once_attr 'map hash divisor baseclass match action' return 0 ;; matchall) _tc_once_attr 'action classid skip_sw skip_hw' return 0 ;; flower) _tc_once_attr 'action classid indev dst_mac src_mac eth_type \ ip_proto dst_ip src_ip dst_port src_port' return 0 ;; fw) _tc_once_attr 'action classid' return 0 ;; route) _tc_one_of_list 'from fromif' _tc_once_attr 'to classid action' return 0 ;; rsvp) _tc_once_attr 'ipproto session sender classid action tunnelid \ tunnel flowlabel spi/ah spi/esp u8 u16 u32' [[ ${words[${#words[@]}-3]} == tunnel ]] && \ COMPREPLY+=( $( compgen -W 'skip' -- "$cur" ) ) [[ ${words[${#words[@]}-3]} =~ u(8|16|32) ]] && \ COMPREPLY+=( $( compgen -W 'mask' -- "$cur" ) ) [[ ${words[${#words[@]}-3]} == mask ]] && \ COMPREPLY+=( $( compgen -W 'at' -- "$cur" ) ) return 0 ;; tcindex) _tc_once_attr 'hash mask shift classid action' _tc_one_of_list 'pass_on fall_through' return 0 ;; u32) _tc_once_attr 'match link classid action offset ht hashkey sample' COMPREPLY+=( $( compgen -W 'ip ip6 udp tcp icmp u8 u16 u32 mark \ divisor' -- "$cur" ) ) return 0 ;; esac return 1 } # Complete with options names for actions. # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_action_options() { local from=$1 local action=${words[from]} case $action in bpf) _tc_bpf_options return 0 ;; mirred) _tc_one_of_list_from $from 'ingress egress' _tc_one_of_list_from $from 'mirror redirect' _tc_once_attr_from $from 'index dev' return 0 ;; sample) _tc_once_attr_from $from 'rate' _tc_once_attr_from $from 'trunc' _tc_once_attr_from $from 'group' return 0 ;; gact) _tc_one_of_list_from $from 'reclassify drop continue pass' _tc_once_attr_from $from 'random' return 0 ;; esac return 1 } # Complete with options names for exec. # Returns 0 is completion should stop after running this function, 1 otherwise. _tc_exec_options() { case $1 in import) [[ ${words[${#words[@]}-3]} == import ]] && \ _tc_once_attr 'run' return 0 ;; graft) COMPREPLY+=( $( compgen -W 'key type' -- "$cur" ) ) [[ ${words[${#words[@]}-3]} == object-file ]] && \ _tc_once_attr 'type' _tc_bpf_options return 0 ;; esac return 1 } # Main completion function # Logic is as follows: # 1. Check if previous word is a global option; if so, propose arguments. # 2. Check if current word is a global option; if so, propose completion. # 3. Check for the presence of a main command (qdisc|class|filter|...). If # there is one, first call _tc_direct_complete to see if previous word is # waiting for a particular completion. If so, propose completion and exit. # 4. Extract main command and -- if available -- its subcommand # (add|delete|show|...). # 5. Propose completion based on main and sub- command in use. Additional # functions may be called for qdiscs, classes or filter options. _tc() { local cur prev words cword _init_completion || return case $prev in -V|-Version) return 0 ;; -b|-batch|-cf|-conf) _filedir return 0 ;; -force) COMPREPLY=( $( compgen -W '-batch' -- "$cur" ) ) return 0 ;; -nm|name) [[ -r /etc/iproute2/tc_cls ]] || \ COMPREPLY=( $( compgen -W '-conf' -- "$cur" ) ) return 0 ;; -n|-net|-netns) local nslist=$( ip netns list 2>/dev/null ) COMPREPLY+=( $( compgen -W "$nslist" -- "$cur" ) ) return 0 ;; -tshort) _tc_once_attr '-statistics' COMPREPLY+=( $( compgen -W 'monitor' -- "$cur" ) ) return 0 ;; -timestamp) _tc_once_attr '-statistics -tshort' COMPREPLY+=( $( compgen -W 'monitor' -- "$cur" ) ) return 0 ;; esac # Search for main commands local subcword cmd subcmd for (( subcword=1; subcword < ${#words[@]}-1; subcword++ )); do [[ ${words[subcword]} == -b?(atch) ]] && return 0 [[ -n $cmd ]] && subcmd=${words[subcword]} && break [[ ${words[subcword]} != -* && \ ${words[subcword-1]} != -@(n?(et?(ns))|c?(on)f) ]] && \ cmd=${words[subcword]} done if [[ -z $cmd ]]; then case $cur in -*) local c='-Version -statistics -details -raw -pretty \ -iec -graphe -batch -name -netns -timestamp' [[ $cword -eq 1 ]] && c+=' -force' COMPREPLY=( $( compgen -W "$c" -- "$cur" ) ) return 0 ;; *) COMPREPLY=( $( compgen -W "help $( tc help 2>&1 | \ command sed \ -e '/OBJECT := /!d' \ -e 's/.*{//' \ -e 's/}.*//' \ -e \ 's/|//g' )" -- "$cur" ) ) return 0 ;; esac fi [[ $subcmd == help ]] && return 0 # For this set of commands we may create COMPREPLY just by analysing the # previous word, if it expects for a specific list of options or values. if [[ $cmd =~ (qdisc|class|filter|action|exec) ]]; then _tc_direct_complete $prev && return 0 if [[ ${words[${#words[@]}-3]} == estimator ]]; then local list=$( _tc_expand_units 'secs' 'msecs' 'usecs' ) COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) && return 0 fi fi # Completion depends on main command and subcommand in use. case $cmd in qdisc) case $subcmd in add|change|replace|link|del|delete) if [[ $(($cword-$subcword)) -eq 1 ]]; then COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) return 0 fi local qdisc qdwd for ((qdwd=$subcword; qdwd < ${#words[@]}-1; qdwd++)); do if [[ $QDISC_KIND =~ ' '${words[qdwd]}' ' ]]; then qdisc=${words[qdwd]} _tc_qdisc_options $qdisc && return 0 fi done _tc_one_of_list $QDISC_KIND _tc_one_of_list 'root ingress parent clsact' _tc_once_attr 'handle estimator stab' ;; show) _tc_once_attr 'dev' _tc_one_of_list 'ingress clsact' _tc_once_attr '-statistics -details -raw -pretty -iec \ -graph -name' ;; help) return 0 ;; *) [[ $cword -eq $subcword ]] && \ COMPREPLY=( $( compgen -W 'help add delete change \ replace link show' -- "$cur" ) ) ;; esac ;; class) case $subcmd in add|change|replace|del|delete) if [[ $(($cword-$subcword)) -eq 1 ]]; then COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) return 0 fi local qdisc qdwd for ((qdwd=$subcword; qdwd < ${#words[@]}-1; qdwd++)); do if [[ $QDISC_KIND =~ ' '${words[qdwd]}' ' ]]; then qdisc=${words[qdwd]} _tc_qdisc_options $qdisc && return 0 fi done _tc_one_of_list $QDISC_KIND _tc_one_of_list 'root parent' _tc_once_attr 'classid' ;; show) _tc_once_attr 'dev' _tc_one_of_list 'root parent' _tc_once_attr '-statistics -details -raw -pretty -iec \ -graph -name' ;; help) return 0 ;; *) [[ $cword -eq $subcword ]] && \ COMPREPLY=( $( compgen -W 'help add delete change \ replace show' -- "$cur" ) ) ;; esac ;; filter) case $subcmd in add|change|replace|del|delete) if [[ $(($cword-$subcword)) -eq 1 ]]; then COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) return 0 fi local filter fltwd for ((fltwd=$subcword; fltwd < ${#words[@]}-1; fltwd++)); do if [[ $FILTER_KIND =~ ' '${words[fltwd]}' ' ]]; then _tc_filter_options $fltwd && return 0 fi done _tc_one_of_list $FILTER_KIND _tc_one_of_list 'root ingress egress parent' _tc_once_attr 'handle estimator pref protocol' ;; show) _tc_once_attr 'dev' _tc_one_of_list 'root ingress egress parent' _tc_once_attr '-statistics -details -raw -pretty -iec \ -graph -name' ;; help) return 0 ;; *) [[ $cword -eq $subcword ]] && \ COMPREPLY=( $( compgen -W 'help add delete change \ replace show' -- "$cur" ) ) ;; esac ;; action) case $subcmd in add|change|replace) local action acwd for ((acwd=$subcword; acwd < ${#words[@]}-1; acwd++)); do if [[ $ACTION_KIND =~ ' '${words[acwd]}' ' ]]; then _tc_action_options $acwd && return 0 fi done _tc_one_of_list $ACTION_KIND ;; get|del|delete) _tc_once_attr 'index' ;; lst|list|flush|show) _tc_one_of_list $ACTION_KIND ;; *) [[ $cword -eq $subcword ]] && \ COMPREPLY=( $( compgen -W 'help add delete change \ replace show list flush action' -- "$cur" ) ) ;; esac ;; monitor) COMPREPLY=( $( compgen -W 'help' -- "$cur" ) ) ;; exec) case $subcmd in bpf) local excmd exwd EXEC_KIND=' import debug graft ' for ((exwd=$subcword; exwd < ${#words[@]}-1; exwd++)); do if [[ $EXEC_KIND =~ ' '${words[exwd]}' ' ]]; then excmd=${words[exwd]} _tc_exec_options $excmd && return 0 fi done _tc_one_of_list $EXEC_KIND ;; *) [[ $cword -eq $subcword ]] && \ COMPREPLY=( $( compgen -W 'bpf' -- "$cur" ) ) ;; esac ;; esac } && complete -F _tc tc # ex: ts=4 sw=4 et filetype=sh
Upload Files
Cancel
Upload
Create New
Cancel
Create
Change Permissions
Cancel
Save
Change Date
Cancel
Save
Rename Item
Cancel
Save
Confirm Delete
Are you sure you want to delete the selected items?
Cancel
Delete