diff --git a/Makefile b/Makefile index e25436a7..3be25903 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ export GOPROXY # 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 man_page # set the go tools into the tools bin. setup_tools: $(GO_TOOLS_BIN) $(GOLANGCI_LINT) @@ -57,6 +57,11 @@ 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/ + install -d -m 0755 $(DESTDIR)/usr/share/man/man1 + ./bash_completion $(DESTDIR)/etc/bash_completion.d/warewulf + ./man_page $(DESTDIR)/usr/share/man/man1 + gzip $(DESTDIR)/usr/share/man/man1/wwctl*1 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/ @@ -89,6 +94,12 @@ 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 + +man_page: + cd cmd/man_page; go build -mod vendor -tags "$(WW_BUILD_GO_BUILD_TAGS)" -o ../../man_page + dist: vendor rm -rf _dist/warewulf-$(VERSION) mkdir -p _dist/warewulf-$(VERSION) @@ -102,6 +113,8 @@ clean: rm -f wwctl rm -rf _dist rm -f warewulf-$(VERSION).tar.gz + rm -f bash_completion + rm -f man_page install: files 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/man_page/man_page.go b/cmd/man_page/man_page.go new file mode 100644 index 00000000..45d42416 --- /dev/null +++ b/cmd/man_page/man_page.go @@ -0,0 +1,16 @@ +// usage: ./bash_completion +package main + +import ( + "fmt" + "os" + "github.com/hpcng/warewulf/internal/app/wwctl" +) + +func main() { + + if err := wwctl.GenManTree(os.Args[1]); 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..c6d9023c 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" @@ -12,6 +13,7 @@ import ( "github.com/hpcng/warewulf/internal/app/wwctl/server" "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" ) var ( @@ -59,3 +61,16 @@ func rootPersistentPreRunE(cmd *cobra.Command, args []string) error { } return nil } + +// GenBashCompletionFile +func GenBashCompletion(w io.Writer) error { + return rootCmd.GenBashCompletion(w) +} + +func GenManTree(fileName string) error{ + header := &doc.GenManHeader{ + Title: "MINE", + Section: "1", + } + return doc.GenManTree(rootCmd,header,fileName) +} 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 } }