# Shell driver
`jumpstarter-driver-shell` provides functionality for shell command execution.
## Installation
```{code-block} console
:substitutions:
$ pip3 install --extra-index-url {{index_url}} jumpstarter-driver-shell
```
## Configuration
The shell driver supports two configuration formats for methods:
### Format 1: Simple String e.g. for self-descriptive short commands
```yaml
export:
shell:
type: jumpstarter_driver_shell.driver.Shell
config:
methods:
ls: "ls"
echo_hello: "echo 'Hello World'"
```
### Format 2: Unified Format with Descriptions
```yaml
export:
shell:
type: jumpstarter_driver_shell.driver.Shell
config:
methods:
ls:
command: "ls -la"
description: "List directory contents with details"
deploy:
command: "ansible-playbook deploy.yml"
description: "Deploy application using Ansible"
# Multi-line commands work too
setup:
command: |
echo 'Setting up environment'
export PATH=$PATH:/usr/local/bin
./setup.sh
description: "Set up the development environment"
# Description-only (uses default "echo Hello" command)
placeholder:
description: "Placeholder method for testing"
# Custom timeout for long-running operations
long_backup:
command: "tar -czf backup.tar.gz /data && rsync backup.tar.gz remote:/backups/"
description: "Create and sync backup (may take a while)"
timeout: 1800 # 30 minutes instead of default 5 minutes
# You can mix both formats
simple_echo: "echo 'simple'"
# optional parameters
cwd: "/tmp"
log_level: "INFO"
shell:
- "/bin/bash"
- "-c"
```
### Configuration Parameters
| Parameter | Description | Type | Required | Default |
|-----------|-------------|------|----------|---------|
| `methods` | Dictionary of methods. Values can be:
- String: just the command
- Dict: `{command: "...", description: "...", timeout: ...}` | `dict[str, str \| dict]` | Yes | - |
| `cwd` | Working directory for shell commands | `str` | No | `None` |
| `log_level` | Logging level | `str` | No | `"INFO"` |
| `shell` | Shell command to execute scripts | `list[str]` | No | `["bash", "-c"]` |
| `timeout` | Command timeout in seconds | `int` | No | `300` |
**Method Configuration Options:**
For the dict format, each method supports:
- `command`: The shell command to execute (optional, defaults to `"echo Hello"`)
- `description`: CLI help text (optional, defaults to `"Execute the {method_name} shell method"`)
- `timeout`: Command-specific timeout in seconds (optional, defaults to global `timeout` value)
**Note:** You can mix both formats in the same configuration - use string format for simple commands and dict format when you want custom descriptions or timeouts.
## API Reference
Assuming the exporter driver is configured as in the example above, the client
methods will be generated dynamically, and they will be available as follows:
```{eval-rst}
.. autoclass:: jumpstarter_driver_shell.client.ShellClient
:members:
.. function:: ls()
:noindex:
:returns: A tuple(stdout, stderr, return_code)
.. function:: method2()
:noindex:
:returns: A tuple(stdout, stderr, return_code)
.. function:: method3(arg1, arg2)
:noindex:
:returns: A tuple(stdout, stderr, return_code)
.. function:: env_var(arg1, arg2, ENV_VAR="value")
:noindex:
:returns: A tuple(stdout, stderr, return_code)
```
## CLI Usage
The shell driver also provides a CLI when using `jmp shell`. All configured methods become available as CLI commands, except for methods starting with `_` which are considered private and hidden from the end user.
### CLI Help Output
With unified format (custom descriptions):
```console
$ jmp shell --exporter shell-exporter
$ j shell
Usage: j shell [OPTIONS] COMMAND [ARGS]...
Shell command executor
Commands:
deploy Deploy application using Ansible
ls List directory contents with details
setup Set up the development environment
```
With simple string format (default descriptions):
```console
$ j shell
Usage: j shell [OPTIONS] COMMAND [ARGS]...
Shell command executor
Commands:
deploy Execute the deploy shell method
ls Execute the ls shell method
setup Execute the setup shell method
```
**Mixed format example:**
```yaml
methods:
deploy:
command: "ansible-playbook deploy.yml"
description: "Deploy using Ansible"
restart: "systemctl restart myapp" # Simple format
```
Results in:
```console
Commands:
deploy Deploy using Ansible
restart Execute the restart shell method
```
### CLI Command Usage
Each configured method becomes a CLI command with the following options:
```console
$ j shell ls --help
Usage: j shell ls [OPTIONS] [ARGS]...
Execute the ls shell method
Options:
-e, --env TEXT Environment variables in KEY=VALUE format
--help Show this message and exit.
```
### Examples
```console
# Execute simple commands
$ j shell ls
file1.txt file2.txt directory/
# Pass arguments to shell methods
$ j shell method3 "first arg" "second arg"
Hello World first arg
Hello World second arg
# Set environment variables
$ j shell env_var arg1 arg2 --env ENV_VAR=myvalue
arg1,arg2,myvalue
```