Shell Driver¶
jumpstarter-driver-shell provides functionality for shell command execution.
Installation¶
$ pip3 install --extra-index-url https://pkg.jumpstarter.dev/simple jumpstarter-driver-shell
Configuration¶
The shell driver supports two configuration formats for methods:
Format 1: Simple String e.g. for self-descriptive short commands¶
export:
shell:
type: jumpstarter_driver_shell.driver.Shell
config:
methods:
ls: "ls"
echo_hello: "echo 'Hello World'"
Format 2: Unified Format with Descriptions¶
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 |
|---|---|---|---|---|
|
Dictionary of methods. Values can be: |
|
Yes |
- |
|
Working directory for shell commands |
|
No |
|
|
Logging level |
|
No |
|
|
Shell command to execute scripts |
|
No |
|
|
Command timeout in seconds |
|
No |
|
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 globaltimeoutvalue)
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.
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):
$ 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):
$ 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:
methods:
deploy:
command: "ansible-playbook deploy.yml"
description: "Deploy using Ansible"
restart: "systemctl restart myapp" # Simple format
Results in:
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:
$ 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¶
# 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
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:
- class jumpstarter_driver_shell.client.ShellClient(*, uuid: uuid.UUID = <factory>, labels: dict[str, str] = <factory>, stub: Any, log_level: 'str' = 'INFO', children: 'dict[str, DriverClient]' = <factory>, portal: 'BlockingPortal', stack: 'ExitStack', description: 'str | None' = None, methods_description: 'dict[str, str]' = <factory>)¶
- cli()¶
Create CLI interface for dynamically configured shell methods
- ls()
- Returns:
A tuple(stdout, stderr, return_code)
- method2()
- Returns:
A tuple(stdout, stderr, return_code)
- method3(arg1, arg2)
- Returns:
A tuple(stdout, stderr, return_code)
- env_var(arg1, arg2, ENV_VAR='value')
- Returns:
A tuple(stdout, stderr, return_code)