diff --git a/Makefile b/Makefile index 0ba63bb8..b041f180 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ GOLANGCI_LINT_VERSION := v1.31.0 # built tags needed for wwbuild binary WW_BUILD_GO_BUILD_TAGS := containers_image_openpgp containers_image_ostree -all: setup_tools vendor wwctl wwclient +all: setup_tools vendor wwctl wwclient bash_completion # set the go tools into the tools bin. setup_tools: $(GO_TOOLS_BIN) $(GOLANGCI_LINT) @@ -53,6 +53,8 @@ files: all install -d -m 0755 $(DESTDIR)/etc/warewulf/ install -d -m 0755 $(DESTDIR)/etc/warewulf/ipxe install -d -m 0755 $(DESTDIR)/var/lib/tftpboot/warewulf/ipxe/ + install -d -m 0755 $(DESTDIR)/etc/bash_completion.d/ + ./bash_completion $(DESTDIR)/etc/bash_completion.d/warewulf test -f $(DESTDIR)/etc/warewulf/warewulf.conf || install -m 644 etc/warewulf.conf $(DESTDIR)/etc/warewulf/ test -f $(DESTDIR)/etc/warewulf/hosts.tmpl || install -m 644 etc/hosts.tmpl $(DESTDIR)/etc/warewulf/ cp -r etc/dhcp $(DESTDIR)/etc/warewulf/ @@ -84,6 +86,9 @@ wwctl: wwclient: cd cmd/wwclient; CGO_ENABLED=0 GOOS=linux go build -mod vendor -a -ldflags '-extldflags -static' -o ../../wwclient +bash_completion: + cd cmd/bash_completion; go build -mod vendor -tags "$(WW_BUILD_GO_BUILD_TAGS)" -o ../../bash_completion + dist: vendor rm -rf _dist/warewulf-$(VERSION) mkdir -p _dist/warewulf-$(VERSION) diff --git a/cmd/bash_completion/bash_completion.go b/cmd/bash_completion/bash_completion.go new file mode 100644 index 00000000..2a300c87 --- /dev/null +++ b/cmd/bash_completion/bash_completion.go @@ -0,0 +1,23 @@ +// usage: ./bash_completion +package main + +import ( + "fmt" + "os" + "github.com/hpcng/warewulf/internal/app/wwctl" +) + +func main() { + fh, err := os.Create(os.Args[1]) + if err != nil { + fmt.Println(err) + return + } + + defer fh.Close() + + if err := wwctl.GenBashCompletion(fh); err != nil { + fmt.Println(err) + return + } +} diff --git a/cmd/wwctl/main.go b/cmd/wwctl/main.go index 0676131e..e1e0f479 100644 --- a/cmd/wwctl/main.go +++ b/cmd/wwctl/main.go @@ -9,3 +9,4 @@ func main() { root.Execute() } + diff --git a/internal/app/wwctl/root.go b/internal/app/wwctl/root.go index e355cd37..7e810b13 100644 --- a/internal/app/wwctl/root.go +++ b/internal/app/wwctl/root.go @@ -1,6 +1,7 @@ package wwctl import ( + "io" "github.com/hpcng/warewulf/internal/app/wwctl/configure" "github.com/hpcng/warewulf/internal/app/wwctl/container" "github.com/hpcng/warewulf/internal/app/wwctl/kernel" @@ -59,3 +60,10 @@ func rootPersistentPreRunE(cmd *cobra.Command, args []string) error { } return nil } + +// GenBashCompletionFile +func GenBashCompletion(w io.Writer) error { + return rootCmd.GenBashCompletion(w) +} + + diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index 406c656d..8d7527c9 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -101,7 +101,8 @@ func init() { c, err := os.OpenFile(ConfigFile, os.O_RDWR|os.O_CREATE, 0644) if err != nil { wwlog.Printf(wwlog.ERROR, "Could not create new configuration file: %s\n", err) - os.Exit(1) + // just return silently, as init is also called for bash_completion + return } fmt.Fprintf(c, "nodeprofiles:\n") diff --git a/internal/pkg/warewulfconf/datastructure.go b/internal/pkg/warewulfconf/datastructure.go index da2dc0ad..c47a08d8 100644 --- a/internal/pkg/warewulfconf/datastructure.go +++ b/internal/pkg/warewulfconf/datastructure.go @@ -1,7 +1,6 @@ package warewulfconf import ( - "os" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" @@ -52,6 +51,7 @@ func init() { //TODO: Check to make sure nodes.conf is found if util.IsFile(ConfigFile) == false { wwlog.Printf(wwlog.ERROR, "Configuration file not found: %s\n", ConfigFile) - os.Exit(1) + // fail silently as this also called by bash_completion + return } }