X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c797b629ddb0cf2808123a1b86d31b0153f1aca0..13f6d45704efc68ca8419e8917376aa44fdee1be:/cmd/arvados-package/cmd.go diff --git a/cmd/arvados-package/cmd.go b/cmd/arvados-package/cmd.go index 54f0809d64..db3d63f277 100644 --- a/cmd/arvados-package/cmd.go +++ b/cmd/arvados-package/cmd.go @@ -33,7 +33,7 @@ var ( func main() { if len(os.Args) < 2 || strings.HasPrefix(os.Args[1], "-") { - parseFlags([]string{"-help"}) + parseFlags(os.Args[0], []string{"-help"}, os.Stderr) os.Exit(2) } os.Exit(handler.RunCommand(os.Args[0], os.Args[1:], os.Stdin, os.Stdout, os.Stderr)) @@ -44,12 +44,11 @@ type cmdFunc func(ctx context.Context, opts opts, stdin io.Reader, stdout, stder func (cf cmdFunc) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int { logger := ctxlog.New(stderr, "text", "info") ctx := ctxlog.Context(context.Background(), logger) - opts, err := parseFlags(args) - if err != nil { - logger.WithError(err).Error("error parsing command line flags") - return 1 + opts, ok, code := parseFlags(prog, args, stderr) + if !ok { + return code } - err = cf(ctx, opts, stdin, stdout, stderr) + err := cf(ctx, opts, stdin, stdout, stderr) if err != nil { logger.WithError(err).Error("failed") return 1 @@ -66,9 +65,10 @@ type opts struct { TargetOS string Maintainer string Vendor string + Live string } -func parseFlags(args []string) (opts, error) { +func parseFlags(prog string, args []string, stderr io.Writer) (_ opts, ok bool, exitCode int) { opts := opts{ SourceDir: ".", TargetOS: "debian:10", @@ -77,12 +77,13 @@ func parseFlags(args []string) (opts, error) { } flags := flag.NewFlagSet("", flag.ContinueOnError) flags.StringVar(&opts.PackageVersion, "package-version", opts.PackageVersion, "package version to build/test, like \"1.2.3\"") - flags.StringVar(&opts.SourceDir, "source", opts.SourceDir, "arvados source tree location") - flags.StringVar(&opts.PackageDir, "package-dir", opts.PackageDir, "destination directory for new package (default is cwd)") - flags.StringVar(&opts.PackageChown, "package-chown", opts.PackageChown, "desired uid:gid for new package (default is current user:group)") + flags.StringVar(&opts.SourceDir, "source", opts.SourceDir, "arvados source tree `directory`") + flags.StringVar(&opts.PackageDir, "package-dir", opts.PackageDir, "destination `directory` for new package (default is cwd)") + flags.StringVar(&opts.PackageChown, "package-chown", opts.PackageChown, "desired `uid:gid` for new package (default is current user:group)") flags.StringVar(&opts.TargetOS, "target-os", opts.TargetOS, "target operating system vendor:version") flags.StringVar(&opts.Maintainer, "package-maintainer", opts.Maintainer, "maintainer to be listed in package metadata") flags.StringVar(&opts.Vendor, "package-vendor", opts.Vendor, "vendor to be listed in package metadata") + flags.StringVar(&opts.Live, "live", opts.Live, "(for testinstall) advertise external URLs like https://`example.com`:44xx, use the host's /var/lib/acme/live certificates, listen on the host's external interfaces, and wait for ^C before shutting down") flags.BoolVar(&opts.RebuildImage, "rebuild-image", opts.RebuildImage, "rebuild docker image(s) instead of using existing") flags.Usage = func() { fmt.Fprint(flags.Output(), `Usage: arvados-package [options] @@ -93,7 +94,11 @@ Subcommands: out version of the arvados source tree testinstall use a docker container to install a package and confirm - the resulting installation is functional + the resulting installation is functional; optionally, + expose the test cluster's services using the host's + interfaces and ACME certificates, and leave it up to + facilitate interactive testing (see -live option + below) version show program version @@ -120,24 +125,23 @@ Options: `) flags.PrintDefaults() } - err := flags.Parse(args) - if err != nil { - return opts, err - } - if len(flags.Args()) > 0 { - return opts, fmt.Errorf("unrecognized command line arguments: %v", flags.Args()) + if ok, code := cmd.ParseFlags(flags, prog, args, "", stderr); !ok { + return opts, false, code } if opts.SourceDir == "" { d, err := os.Getwd() if err != nil { - return opts, fmt.Errorf("Getwd: %w", err) + fmt.Fprintf(stderr, "error getting current working directory: %s\n", err) + return opts, false, 1 } opts.SourceDir = d } opts.PackageDir = filepath.Clean(opts.PackageDir) - opts.SourceDir, err = filepath.Abs(opts.SourceDir) + abs, err := filepath.Abs(opts.SourceDir) if err != nil { - return opts, err + fmt.Fprintf(stderr, "error resolving source dir %q: %s\n", opts.SourceDir, err) + return opts, false, 1 } - return opts, nil + opts.SourceDir = abs + return opts, true, 0 }