// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This file was auto-generated via go generate.
// DO NOT UPDATE MANUALLY

/*
Command cluster_agent supports interactions with a cluster agent.

Usage:
   cluster_agent [flags] <command>

The cluster_agent commands are:
   new           Requests a new secret.
   forget        Forgets an existing secret and its associated blessings.
   seekblessings Retrieves all the blessings associated with a particular
                 secret.
   help          Display help for commands or topics

The cluster_agent flags are:
 -agent=
   The name or address of the cluster agent server.

The global flags are:
 -alsologtostderr=true
   log to standard error as well as files
 -log_backtrace_at=:0
   when logging hits line file:N, emit a stack trace
 -log_dir=
   if non-empty, write log files to this directory
 -logtostderr=false
   log to standard error instead of files
 -max_stack_buf_size=4292608
   max size in bytes of the buffer to use for logging stack traces
 -metadata=<just specify -metadata to activate>
   Displays metadata for the program and exits.
 -stderrthreshold=2
   logs at or above this threshold go to stderr
 -time=false
   Dump timing information to stderr before exiting the program.
 -v=0
   log level for V logs
 -v23.credentials=
   directory to use for storing security credentials
 -v23.i18n-catalogue=
   18n catalogue files to load, comma separated
 -v23.namespace.root=[/(dev.v.io:r:vprod:service:mounttabled)@ns.dev.v.io:8101]
   local namespace root; can be repeated to provided multiple roots
 -v23.proxy=
   object name of proxy service to use to export services across network
   boundaries
 -v23.tcp.address=
   address to listen on
 -v23.tcp.protocol=wsh
   protocol to listen with
 -v23.vtrace.cache-size=1024
   The number of vtrace traces to store in memory.
 -v23.vtrace.collect-regexp=
   Spans and annotations that match this regular expression will trigger trace
   collection.
 -v23.vtrace.dump-on-shutdown=true
   If true, dump all stored traces on runtime shutdown.
 -v23.vtrace.sample-rate=0
   Rate (from 0.0 to 1.0) to sample vtrace traces.
 -v23.vtrace.v=0
   The verbosity level of the log messages to be captured in traces
 -vmodule=
   comma-separated list of globpattern=N settings for filename-filtered logging
   (without the .go suffix).  E.g. foo/bar/baz.go is matched by patterns baz or
   *az or b* but not by bar/baz or baz.go or az or b.*
 -vpath=
   comma-separated list of regexppattern=N settings for file pathname-filtered
   logging (without the .go suffix).  E.g. foo/bar/baz.go is matched by patterns
   foo/bar/baz or fo.*az or oo/ba or b.z but not by foo/bar/baz.go or fo*az

Cluster_agent new

Requests a new secret.

Usage:
   cluster_agent new [flags] <extension>

<extension> is the blessing name extension to associate with the new secret.

The cluster_agent new flags are:
 -base64=false
   If true, the secret is base64-encoded

 -agent=
   The name or address of the cluster agent server.

Cluster_agent forget

Forgets an existing secret and its associated blessings.

Usage:
   cluster_agent forget [flags] <secret>

<secret> is the secret to forget.

The cluster_agent forget flags are:
 -agent=
   The name or address of the cluster agent server.

Cluster_agent seekblessings

Retrieves all the blessings associated with a particular secret.

The output is base64-encoded-vom-encoded blessings that are compatible with the
"principal set" command.

Usage:
   cluster_agent seekblessings [flags] <secret>

<secret> is the secret to use.

The cluster_agent seekblessings flags are:
 -agent=
   The name or address of the cluster agent server.

Cluster_agent help

Help with no args displays the usage of the parent command.

Help with args displays the usage of the specified sub-command or help topic.

"help ..." recursively displays help for all commands and topics.

Usage:
   cluster_agent help [flags] [command/topic ...]

[command/topic ...] optionally identifies a specific sub-command or help topic.

The cluster_agent help flags are:
 -style=compact
   The formatting style for help output:
      compact   - Good for compact cmdline output.
      full      - Good for cmdline output, shows all global flags.
      godoc     - Good for godoc processing.
      shortonly - Only output short description.
   Override the default by setting the CMDLINE_STYLE environment variable.
 -width=<terminal width>
   Format output to this target width in runes, or unlimited if width < 0.
   Defaults to the terminal width if available.  Override the default by setting
   the CMDLINE_WIDTH environment variable.
*/
package main
