# frozen_string_literal: true # Note this file includes very few 'requires' because it expects to be used from the CLI. require 'optparse' module Bolt class BoltOptionParser < OptionParser OPTIONS = { inventory: %w[targets query rerun description], authentication: %w[user password password-prompt private-key host-key-check ssl ssl-verify], escalation: %w[run-as sudo-password sudo-password-prompt sudo-executable], run_context: %w[concurrency inventoryfile save-rerun cleanup], global_config_setters: %w[modulepath boltdir configfile], transports: %w[transport connect-timeout tty ssh-command copy-command], display: %w[format color verbose trace], global: %w[help version debug] }.freeze ACTION_OPTS = OPTIONS.values.flatten.freeze def get_help_text(subcommand, action = nil) case subcommand when 'apply' { flags: ACTION_OPTS + %w[noop execute compile-concurrency hiera-config], banner: APPLY_HELP } when 'command' case action when 'run' { flags: ACTION_OPTS, banner: COMMAND_RUN_HELP } else { flags: OPTIONS[:global], banner: COMMAND_HELP } end when 'file' case action when 'upload' { flags: ACTION_OPTS + %w[tmpdir], banner: FILE_UPLOAD_HELP } else { flags: OPTIONS[:global], banner: FILE_HELP } end when 'inventory' case action when 'show' { flags: OPTIONS[:inventory] + OPTIONS[:global] + %w[format inventoryfile boltdir configfile detail], banner: INVENTORY_SHOW_HELP } else { flags: OPTIONS[:global], banner: INVENTORY_HELP } end when 'group' case action when 'show' { flags: OPTIONS[:global] + %w[format inventoryfile boltdir configfile], banner: GROUP_SHOW_HELP } else { flags: OPTIONS[:global], banner: GROUP_HELP } end when 'plan' case action when 'convert' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters], banner: PLAN_CONVERT_HELP } when 'run' { flags: ACTION_OPTS + %w[params compile-concurrency tmpdir hiera-config], banner: PLAN_RUN_HELP } when 'show' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters] + %w[filter format], banner: PLAN_SHOW_HELP } else { flags: OPTIONS[:global], banner: PLAN_HELP } end when 'project' case action when 'init' { flags: OPTIONS[:global] + %w[modules], banner: PROJECT_INIT_HELP } when 'migrate' { flags: OPTIONS[:global] + %w[inventoryfile boltdir configfile], banner: PROJECT_MIGRATE_HELP } else { flags: OPTIONS[:global], banner: PROJECT_HELP } end when 'puppetfile' case action when 'install' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters] + %w[puppetfile], banner: PUPPETFILE_INSTALL_HELP } when 'show-modules' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters], banner: PUPPETFILE_SHOWMODULES_HELP } when 'generate-types' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters], banner: PUPPETFILE_GENERATETYPES_HELP } else { flags: OPTIONS[:global], banner: PUPPETFILE_HELP } end when 'script' case action when 'run' { flags: ACTION_OPTS + %w[tmpdir], banner: SCRIPT_RUN_HELP } else { flags: OPTIONS[:global], banner: SCRIPT_HELP } end when 'secret' case action when 'createkeys' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters] + %w[plugin force], banner: SECRET_CREATEKEYS_HELP } when 'decrypt' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters] + %w[plugin], banner: SECRET_DECRYPT_HELP } when 'encrypt' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters] + %w[plugin], banner: SECRET_ENCRYPT_HELP } else { flags: OPTIONS[:global], banner: SECRET_HELP } end when 'task' case action when 'run' { flags: ACTION_OPTS + %w[params tmpdir noop], banner: TASK_RUN_HELP } when 'show' { flags: OPTIONS[:global] + OPTIONS[:global_config_setters] + %w[filter format], banner: TASK_SHOW_HELP } else { flags: OPTIONS[:global], banner: TASK_HELP } end else { flags: OPTIONS[:global], banner: BANNER } end end BANNER = <<~HELP NAME bolt USAGE bolt [action] [options] DESCRIPTION Bolt is an orchestration tool that automates the manual work it takes to maintain your infrastructure. SUBCOMMANDS apply Apply Puppet manifest code command Run a command remotely file Upload a local file or directory group Show the list of groups in the inventory inventory Show the list of targets an action would run on plan Convert, show, and run Bolt plans project Create and migrate Bolt projects puppetfile Install and list modules and generate type references script Upload a local script and run it remotely secret Create encryption keys and encrypt and decrypt values task Show and run Bolt tasks HELP APPLY_HELP = <<~HELP NAME apply USAGE bolt apply [manifest.pp] [options] DESCRIPTION Apply Puppet manifest code on the specified targets. EXAMPLES bolt apply manifest.pp -t target bolt apply -e "file { '/etc/puppetlabs': ensure => present }" -t target HELP COMMAND_HELP = <<~HELP NAME command USAGE bolt command [options] DESCRIPTION Run a command on the specified targets. ACTIONS run Run a command on the specified targets. HELP COMMAND_RUN_HELP = <<~HELP NAME run USAGE bolt command run [options] DESCRIPTION Run a command on the specified targets. EXAMPLES bolt command run 'uptime' -t target1,target2 HELP FILE_HELP = <<~HELP NAME file USAGE bolt file [options] DESCRIPTION Upload a local file or directory ACTIONS upload Upload a local file or directory HELP FILE_UPLOAD_HELP = <<~HELP NAME upload USAGE bolt file upload [options] DESCRIPTION Upload a local file or directory. EXAMPLES bolt file upload /tmp/source /etc/profile.d/login.sh -t target1 HELP GROUP_HELP = <<~HELP NAME group USAGE bolt group [options] DESCRIPTION Show the list of groups in the inventory. ACTIONS show Show the list of groups in the inventory HELP GROUP_SHOW_HELP = <<~HELP NAME show USAGE bolt group show [options] DESCRIPTION Show the list of groups in the inventory. HELP INVENTORY_HELP = <<~HELP NAME inventory USAGE bolt inventory [options] DESCRIPTION Show the list of targets an action would run on. ACTIONS show Show the list of targets an action would run on HELP INVENTORY_SHOW_HELP = <<~HELP NAME show USAGE bolt inventory show [options] DESCRIPTION Show the list of targets an action would run on. HELP PLAN_HELP = <<~HELP NAME plan USAGE bolt plan [parameters] [options] DESCRIPTION Convert, show, and run Bolt plans. ACTIONS convert Convert a YAML plan to a Bolt plan run Run a plan on the specified targets show Show available plans and plan documentation HELP PLAN_CONVERT_HELP = <<~HELP NAME convert USAGE bolt plan convert [options] DESCRIPTION Convert a YAML plan to a Bolt plan. Converting a YAML plan may result in a plan that is syntactically correct but has different behavior. Always verify a converted plan's functionality. EXAMPLES bolt plan convert path/to/plan/myplan.yaml HELP PLAN_RUN_HELP = <<~HELP NAME run USAGE bolt plan run [parameters] [options] DESCRIPTION Run a plan on the specified targets. EXAMPLES bolt plan run canary --targets target1,target2 command=hostname HELP PLAN_SHOW_HELP = <<~HELP NAME show USAGE bolt plan show [plan] [options] DESCRIPTION Show available plans and plan documentation. Omitting the name of a plan will display a list of plans available in the Bolt project. Providing the name of a plan will display detailed documentation for the plan, including a list of available parameters. EXAMPLES Display a list of available tasks bolt plan show Display documentation for the canary task bolt plan show aggregate::count HELP PROJECT_HELP = <<~HELP NAME project USAGE bolt project [options] DESCRIPTION Create and migrate Bolt projects ACTIONS init Create a new Bolt project migrate Migrate a Bolt project to the latest version HELP PROJECT_INIT_HELP = <<~HELP NAME init USAGE bolt project init [directory] [options] DESCRIPTION Create a new Bolt project. Specify a directory to create a Bolt project in. Defaults to the curent working directory. EXAMPLES Create a new Bolt project in the current working directory. bolt project init Create a new Bolt project at a specified path. bolt project init ~/path/to/project Create a new Bolt project with existing modules. bolt project init --modules puppetlabs-apt,puppetlabs-ntp HELP PROJECT_MIGRATE_HELP = <<~HELP NAME migrate USAGE bolt project migrate [options] DESCRIPTION Migrate a Bolt project to the latest version. Loads a Bolt project's inventory file and migrates it to the latest version. The inventory file is modified in place and will not preserve comments or formatting. HELP PUPPETFILE_HELP = <<~HELP NAME puppetfile USAGE bolt puppetfile [options] DESCRIPTION Install and list modules and generate type references ACTIONS generate-types Generate type references to register in plans install Install modules from a Puppetfile into a Boltdir show-modules List modules available to the Bolt project HELP PUPPETFILE_GENERATETYPES_HELP = <<~HELP NAME generate-types USAGE bolt puppetfile generate-types [options] DESCRIPTION Generate type references to register in plans. HELP PUPPETFILE_INSTALL_HELP = <<~HELP NAME install USAGE bolt puppetfile install [options] DESCRIPTION Install modules from a Puppetfile into a Boltdir HELP PUPPETFILE_SHOWMODULES_HELP = <<~HELP NAME show-modules USAGE bolt puppetfile show-modules [options] DESCRIPTION List modules available to the Bolt project. HELP SCRIPT_HELP = <<~HELP NAME script USAGE bolt script [options] DESCRIPTION Run a script on the specified targets. ACTIONS run Run a script on the specified targets. HELP SCRIPT_RUN_HELP = <<~HELP NAME run USAGE bolt script run