* [RFC nftables PATCH] nft: add bash completion script @ 2016-02-05 16:53 Giuseppe Longo 2016-02-06 7:56 ` AllKind ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Giuseppe Longo @ 2016-02-05 16:53 UTC (permalink / raw) To: netfilter-devel; +Cc: Giuseppe Longo The following patch adds a bash completion script which permits to complete nft commands. To install it: - cp files/nft-completion /etc/bash_completion.d/ - . /etc/bash_completion.d/nft-completion The following commands are supported: - nft add table <family> <name> - nft list table <family> <name> - nft list tables - nft list sets - nft list chains - nft list ruleset - nft list set <table> <name> - nft add set <table> <name> - nft add element <table> <set> - nft add map <table> - nft flush table <family> <table> Most probably this won't work with sudo, since there are some nft commands into the script. A second patch to add completion in interactive mode will come. This is only a draft, any feedback is appreciated. Signed-off-by: Giuseppe Longo <giuseppelng@gmail.com> --- files/nft-completion | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 files/nft-completion diff --git a/files/nft-completion b/files/nft-completion new file mode 100644 index 0000000..c138312 --- /dev/null +++ b/files/nft-completion @@ -0,0 +1,60 @@ +_nft() +{ + local cur prev + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + + local families="ip ip6 arp bridge inet netdev" + local sets=$(nft list sets | grep -i "set" | awk '{print $2 }' | tr -d ' ') + + if [ $COMP_CWORD -eq 1 ]; then + COMPREPLY=( $(compgen -W "add flush list" -- $cur) ) + elif [ $COMP_CWORD -eq 2 ]; then + case "$prev" in + "add") + command="${prev}" + COMPREPLY=( $(compgen -W "element map table set" -- $cur) ) + ;; + "list") + COMPREPLY=( $(compgen -W "chains ruleset set sets table tables" -- $cur) ) + ;; + "flush") + COMPREPLY=( $(compgen -W "table" -- $cur) ) + ;; + *) + ;; + esac + elif [ $COMP_CWORD -eq 3 ]; then + case "$prev" in + "table") + COMPREPLY=( $(compgen -W "${families}" -- $cur) ) + ;; + "set"|"element"|"map") + local tables=$(nft list tables | awk '{print $3 }' | tr -d ' ') + COMPREPLY=( $(compgen -W "${tables}" -- $cur) ) + ;; + *) + ;; + esac + elif [ $COMP_CWORD -eq 4 ]; then + local tables=$(nft list tables | awk '{print $3 }' | tr -d ' ') + if [[ "$families" =~ "$prev" ]]; then + local tables=$(nft list tables "${prev}" | awk '{print $3 }' | tr -d ' ') + COMPREPLY=( $(compgen -W "${tables}" -- $cur) ) + fi + + if [ "${COMP_WORDS[1]}" != "add" ] && [[ "$tables" =~ "$prev" ]]; then + COMPREPLY=( $(compgen -W "${sets}" -- $cur) ) + fi + + if [ "${COMP_WORDS[1]}" == "add" ] && [ "${COMP_WORDS[2]}" == "element" ] && [[ "$tables" =~ "$prev" ]]; then + COMPREPLY=( $(compgen -W "${sets}" -- $cur) ) + fi + fi + + return 0; +} + +complete -F _nft nft + -- 2.5.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC nftables PATCH] nft: add bash completion script 2016-02-05 16:53 [RFC nftables PATCH] nft: add bash completion script Giuseppe Longo @ 2016-02-06 7:56 ` AllKind 2016-02-06 20:13 ` AllKind 2016-02-15 19:56 ` Pablo Neira Ayuso 2 siblings, 0 replies; 6+ messages in thread From: AllKind @ 2016-02-06 7:56 UTC (permalink / raw) To: Giuseppe Longo; +Cc: netfilter-devel On 05.02.2016 17:53, Giuseppe Longo wrote: > The following patch adds a bash completion script > which permits to complete nft commands. Hello, ok you've been quicker than me. Now that I'm quite done with the iptables completion: https://sourceforge.net/projects/ipt-bashcompl https://github.com/AllKind/iptables-bash_completion I wanted to start with nft... But well, you might find one or the other piece of code useful to reuse i.e. retrieving interface names. > > To install it: > - cp files/nft-completion /etc/bash_completion.d/ > - . /etc/bash_completion.d/nft-completion > > The following commands are supported: > - nft add table <family> <name> > - nft list table <family> <name> > - nft list tables > - nft list sets > - nft list chains > - nft list ruleset > - nft list set <table> <name> > - nft add set <table> <name> > - nft add element <table> <set> > - nft add map <table> > - nft flush table <family> <table> > > Most probably this won't work with sudo, since there > are some nft commands into the script. Untested, but from what I read in the bash_completion package (2.1), it's capable of loading the completion for the command after sudo (using the function _command_offset() ). > > A second patch to add completion in interactive mode > will come. > > This is only a draft, > any feedback is appreciated. > > Signed-off-by: Giuseppe Longo <giuseppelng@gmail.com> > --- > files/nft-completion | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 60 insertions(+) > create mode 100644 files/nft-completion > > diff --git a/files/nft-completion b/files/nft-completion > new file mode 100644 > index 0000000..c138312 > --- /dev/null > +++ b/files/nft-completion > @@ -0,0 +1,60 @@ > +_nft() > +{ > + local cur prev > + COMPREPLY=() > + cur="${COMP_WORDS[COMP_CWORD]}" > + prev="${COMP_WORDS[COMP_CWORD-1]}" > + Are you planing to make use of the functionality of the bash_completion package? As it may contain some useful stuff. > + local families="ip ip6 arp bridge inet netdev" > + local sets=$(nft list sets | grep -i "set" | awk '{print $2 }' | tr -d ' ') > + > + if [ $COMP_CWORD -eq 1 ]; then > + COMPREPLY=( $(compgen -W "add flush list" -- $cur) ) > + elif [ $COMP_CWORD -eq 2 ]; then > + case "$prev" in > + "add") > + command="${prev}" > + COMPREPLY=( $(compgen -W "element map table set" -- $cur) ) > + ;; > + "list") > + COMPREPLY=( $(compgen -W "chains ruleset set sets table tables" -- $cur) ) > + ;; > + "flush") > + COMPREPLY=( $(compgen -W "table" -- $cur) ) > + ;; > + *) > + ;; > + esac Using `case' statements makes it harder to debug, as bash does not show which case it matched. Using `if' `elif' improves this. Also this is one of the coding style guidelines of bash_completion, in case you ever want it to go there. > + elif [ $COMP_CWORD -eq 3 ]; then > + case "$prev" in > + "table") > + COMPREPLY=( $(compgen -W "${families}" -- $cur) ) > + ;; > + "set"|"element"|"map") > + local tables=$(nft list tables | awk '{print $3 }' | tr -d ' ') > + COMPREPLY=( $(compgen -W "${tables}" -- $cur) ) > + ;; > + *) > + ;; > + esac > + elif [ $COMP_CWORD -eq 4 ]; then > + local tables=$(nft list tables | awk '{print $3 }' | tr -d ' ') > + if [[ "$families" =~ "$prev" ]]; then > + local tables=$(nft list tables "${prev}" | awk '{print $3 }' | tr -d ' ') > + COMPREPLY=( $(compgen -W "${tables}" -- $cur) ) > + fi > + > + if [ "${COMP_WORDS[1]}" != "add" ] && [[ "$tables" =~ "$prev" ]]; then Probably you can save some typing with: [[ a != b && x =~ y ]] > + COMPREPLY=( $(compgen -W "${sets}" -- $cur) ) > + fi > + > + if [ "${COMP_WORDS[1]}" == "add" ] && [ "${COMP_WORDS[2]}" == "element" ] && [[ "$tables" =~ "$prev" ]]; then > + COMPREPLY=( $(compgen -W "${sets}" -- $cur) ) > + fi > + fi > + > + return 0; > +} > + > +complete -F _nft nft > + > Good day, AllKind ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC nftables PATCH] nft: add bash completion script 2016-02-05 16:53 [RFC nftables PATCH] nft: add bash completion script Giuseppe Longo 2016-02-06 7:56 ` AllKind @ 2016-02-06 20:13 ` AllKind 2016-02-15 19:56 ` Pablo Neira Ayuso 2 siblings, 0 replies; 6+ messages in thread From: AllKind @ 2016-02-06 20:13 UTC (permalink / raw) To: Giuseppe Longo; +Cc: netfilter-devel On 05.02.2016 17:53, Giuseppe Longo wrote: > The following patch adds a bash completion script > which permits to complete nft commands. > > To install it: > - cp files/nft-completion /etc/bash_completion.d/ > - . /etc/bash_completion.d/nft-completion [...] Another thing - reading the README of bash completion 2.1, this behavior is deprecated and just kept for backwards compatibility. Since 2.0 dynamic loading of completion is supported and quoting the readme it should be done like this: Q. I author/maintain package X and would like to maintain my own completion code for this package. Where should I put it to be sure that interactive bash shells will find it and source it? Install it in one of the directories pointed to by bash-completion's pkgconfig file variables. There are two alternatives: the recommended one is 'completionsdir' (get it with "pkg-config --variable=completionsdir bash-completion") from which completions are loaded on demand based on invoked commands' names, so be sure to name your completion file accordingly, and to include for example symbolic links in case the file provides completions for more than one command. The other one which is present for backwards compatibility reasons is 'compatdir' (get it with "pkg-config --variable=compatdir bash-completion") from which files are loaded when bash_completion is loaded. For packages using GNU autotools the installation can be handled for example like this in configure.ac: PKG_CHECK_VAR(bashcompdir, [bash-completion], [completionsdir], , bashcompdir="${sysconfdir}/bash_completion.d") AC_SUBST(bashcompdir) ...accompanied by this in Makefile.am: bashcompdir = @bashcompdir@ dist_bashcomp_DATA = # completion files go here For cmake we ship the bash-completion-config.cmake and bash-completion-config-version.cmake files. Example usage: find_package(bash-completion) if(BASH_COMPLETION_FOUND) message(STATUS "Using bash completion dir ${BASH_COMPLETION_COMPLETIONSDIR}") else() set (BASH_COMPLETION_COMPLETIONSDIR "/etc/bash_completion.d") message (STATUS "Using fallback bash completion dir ${BASH_COMPLETION_COMPLETIONSDIR}") endif() install(FILES your-completion-file DESTINATION ${BASH_COMPLETION_COMPLETIONSDIR}) Best regards, AllKind ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC nftables PATCH] nft: add bash completion script 2016-02-05 16:53 [RFC nftables PATCH] nft: add bash completion script Giuseppe Longo 2016-02-06 7:56 ` AllKind 2016-02-06 20:13 ` AllKind @ 2016-02-15 19:56 ` Pablo Neira Ayuso 2016-02-16 13:00 ` Giuseppe Longo 2 siblings, 1 reply; 6+ messages in thread From: Pablo Neira Ayuso @ 2016-02-15 19:56 UTC (permalink / raw) To: Giuseppe Longo; +Cc: netfilter-devel Hi Giuseppe, On Fri, Feb 05, 2016 at 05:53:02PM +0100, Giuseppe Longo wrote: > The following patch adds a bash completion script > which permits to complete nft commands. > > To install it: > - cp files/nft-completion /etc/bash_completion.d/ > - . /etc/bash_completion.d/nft-completion > > The following commands are supported: > - nft add table <family> <name> > - nft list table <family> <name> > - nft list tables > - nft list sets > - nft list chains > - nft list ruleset > - nft list set <table> <name> > - nft add set <table> <name> > - nft add element <table> <set> > - nft add map <table> > - nft flush table <family> <table> > > Most probably this won't work with sudo, since there > are some nft commands into the script. > > A second patch to add completion in interactive mode > will come. > > This is only a draft, > any feedback is appreciated. Could you explore adding code to inquire the parser on the next possible tokens ahead? That would greatly simplify the shell script for bash autocompletion. We should be able to reuse this from libreadline too. I know what I'm asking is a bit more difficult, but it would help us reduce the amount of code duplication and will reduce the maintainance burden. Let us know, thanks! ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC nftables PATCH] nft: add bash completion script 2016-02-15 19:56 ` Pablo Neira Ayuso @ 2016-02-16 13:00 ` Giuseppe Longo 2016-02-16 16:26 ` Pablo Neira Ayuso 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Longo @ 2016-02-16 13:00 UTC (permalink / raw) To: Pablo Neira Ayuso; +Cc: netfilter-devel@vger.kernel.org Hi Pablo, 2016-02-15 20:56 GMT+01:00 Pablo Neira Ayuso <pablo@netfilter.org>: > Hi Giuseppe, > > On Fri, Feb 05, 2016 at 05:53:02PM +0100, Giuseppe Longo wrote: >> The following patch adds a bash completion script >> which permits to complete nft commands. >> >> To install it: >> - cp files/nft-completion /etc/bash_completion.d/ >> - . /etc/bash_completion.d/nft-completion >> >> The following commands are supported: >> - nft add table <family> <name> >> - nft list table <family> <name> >> - nft list tables >> - nft list sets >> - nft list chains >> - nft list ruleset >> - nft list set <table> <name> >> - nft add set <table> <name> >> - nft add element <table> <set> >> - nft add map <table> >> - nft flush table <family> <table> >> >> Most probably this won't work with sudo, since there >> are some nft commands into the script. >> >> A second patch to add completion in interactive mode >> will come. >> >> This is only a draft, >> any feedback is appreciated. > > Could you explore adding code to inquire the parser on the next > possible tokens ahead? That would greatly simplify the shell script > for bash autocompletion. We should be able to reuse this from > libreadline too. > > I know what I'm asking is a bit more difficult, but it would help us > reduce the amount of code duplication and will reduce the maintainance > burden. > > Let us know, thanks! Sure, I've looked quickly at bison doc and thought the following idea: We can add a new nft command like "nft complete" to inquire the parser, which will print all the possible word since we have a parse tree. in that way, the bash script will be able to complete the command. Also, do you confirm that we will skip objects like tables name, chain name, and so on? Thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC nftables PATCH] nft: add bash completion script 2016-02-16 13:00 ` Giuseppe Longo @ 2016-02-16 16:26 ` Pablo Neira Ayuso 0 siblings, 0 replies; 6+ messages in thread From: Pablo Neira Ayuso @ 2016-02-16 16:26 UTC (permalink / raw) To: Giuseppe Longo; +Cc: netfilter-devel@vger.kernel.org On Tue, Feb 16, 2016 at 02:00:17PM +0100, Giuseppe Longo wrote: > Hi Pablo, > > 2016-02-15 20:56 GMT+01:00 Pablo Neira Ayuso <pablo@netfilter.org>: > > Hi Giuseppe, > > > > On Fri, Feb 05, 2016 at 05:53:02PM +0100, Giuseppe Longo wrote: > >> The following patch adds a bash completion script > >> which permits to complete nft commands. > >> > >> To install it: > >> - cp files/nft-completion /etc/bash_completion.d/ > >> - . /etc/bash_completion.d/nft-completion > >> > >> The following commands are supported: > >> - nft add table <family> <name> > >> - nft list table <family> <name> > >> - nft list tables > >> - nft list sets > >> - nft list chains > >> - nft list ruleset > >> - nft list set <table> <name> > >> - nft add set <table> <name> > >> - nft add element <table> <set> > >> - nft add map <table> > >> - nft flush table <family> <table> > >> > >> Most probably this won't work with sudo, since there > >> are some nft commands into the script. > >> > >> A second patch to add completion in interactive mode > >> will come. > >> > >> This is only a draft, > >> any feedback is appreciated. > > > > Could you explore adding code to inquire the parser on the next > > possible tokens ahead? That would greatly simplify the shell script > > for bash autocompletion. We should be able to reuse this from > > libreadline too. > > > > I know what I'm asking is a bit more difficult, but it would help us > > reduce the amount of code duplication and will reduce the maintainance > > burden. > > > > Let us know, thanks! > > Sure, I've looked quickly at bison doc and thought the following idea: > We can add a new nft command like "nft complete" to inquire the parser, > which will print all the possible word since we have a parse tree. Sounds reasonable. Let me see if I can come up with a better command name, but this naming detail should not stop you at this stage. > in that way, the bash script will be able to complete the command. > > Also, do you confirm that we will skip objects like tables name, chain > name, and so on? Yes, let's focus on keyword autocompletion by now. Thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-02-16 16:26 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-02-05 16:53 [RFC nftables PATCH] nft: add bash completion script Giuseppe Longo 2016-02-06 7:56 ` AllKind 2016-02-06 20:13 ` AllKind 2016-02-15 19:56 ` Pablo Neira Ayuso 2016-02-16 13:00 ` Giuseppe Longo 2016-02-16 16:26 ` Pablo Neira Ayuso
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).