diff --git a/docs/chapters/subcommands/cmd.rst b/docs/chapters/subcommands/cmd.rst index 627418ca..fe2f9903 100644 --- a/docs/chapters/subcommands/cmd.rst +++ b/docs/chapters/subcommands/cmd.rst @@ -2,7 +2,7 @@ cmd === -To execute commands within the container you can use `bastille cmd`. +Execute commands inside targeted jail(s). .. code-block:: shell @@ -12,3 +12,12 @@ To execute commands within the container you can use `bastille cmd`. root 71464 0.0 0.0 14536 2000 - IsJ 4:52PM 0:00.00 /usr/sbin/syslogd -ss root 77447 0.0 0.0 16632 2140 - SsJ 4:52PM 0:00.00 /usr/sbin/cron -J 60 -s root 80591 0.0 0.0 18784 2340 1 R+J 4:53PM 0:00.00 ps -auxw + +.. code-block:: shell + + ishmael ~ # bastille cmd help + Usage: bastille cmd [option(s)] TARGET command" + Options: + + -a | --auto Auto mode. Start/stop jail(s) if required. + -x | --debug Enable debug mode. diff --git a/usr/local/bin/bastille b/usr/local/bin/bastille index a4fb6adf..db8761ab 100755 --- a/usr/local/bin/bastille +++ b/usr/local/bin/bastille @@ -165,10 +165,10 @@ version|-v|--version) help|-h|--help) usage ;; -bootstrap|clone|config|console|create|cp|destroy|edit|etcupdate|export|htop|import|jcp|list|mount|pkg|rcp|rdr|rename|restart|setup|start|stop|top|umount|update|upgrade|verify) +bootstrap|clone|cmd|config|console|create|cp|destroy|edit|etcupdate|export|htop|import|jcp|list|mount|pkg|rcp|rdr|rename|restart|setup|start|stop|top|umount|update|upgrade|verify) # Nothing "extra" to do for these commands. -- cwells ;; -cmd|convert|limits|service|sysrc|tags|template|zfs) +convert|limits|service|sysrc|tags|template|zfs) # Parse the target and ensure it exists. -- cwells if [ $# -eq 0 ]; then # No target was given, so show the command's help. -- cwells PARAMS='help' diff --git a/usr/local/share/bastille/cmd.sh b/usr/local/share/bastille/cmd.sh index 277791d1..0d958973 100644 --- a/usr/local/share/bastille/cmd.sh +++ b/usr/local/share/bastille/cmd.sh @@ -34,15 +34,47 @@ . /usr/local/etc/bastille/bastille.conf usage() { - error_exit "Usage: bastille cmd TARGET command" + error_notify "Usage: bastille cmd [option(s)] TARGET command" + cat << EOF + Options: + + -a | --auto Auto mode. Start/stop jail(s) if required. + -x | --debug Enable debug mode. + +EOF + exit 1 } -# Handle special-case commands first. -case "$1" in -help|-h|--help) - usage - ;; -esac +# Handle options. +AUTO=0 +while [ "$#" -gt 0 ]; do + case "${1}" in + -h|--help|help) + usage + ;; + -a|--auto) + AUTO=1 + shift + ;; + -x|--debug) + enable_debug + shift + ;; + -*) + for _opt in $(echo ${1} | sed 's/-//g' | fold -w1); do + case ${_opt} in + a) AUTO=1 ;; + x) enable_debug ;; + *) error_exit "Unknown Option: \"${1}\"" ;; + esac + done + shift + ;; + *) + break + ;; + esac +done if [ $# -eq 0 ]; then usage @@ -50,30 +82,40 @@ fi bastille_root_check +TARGET="${1}" +shift 1 COUNT=0 RETURN=0 +set_target "${TARGET}" + for _jail in ${JAILS}; do - COUNT=$(($COUNT+1)) + info "[${_jail}]:" + check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then + bastille start "${_jail}" + else + error_notify "Jail is not running." + error_continue "Use [-a|--auto] to auto-start the jail." + fi + + COUNT=$(($COUNT+1)) if grep -qw "linsysfs" "${bastille_jailsdir}/${_jail}/fstab"; then # Allow executing commands on Linux jails. jexec -l -u root "${_jail}" "$@" else jexec -l -U root "${_jail}" "$@" fi - ERROR_CODE=$? - info "[${_jail}]: ${ERROR_CODE}" - + if [ "${ERROR_CODE}" -ne 0 ]; then + warn "[${_jail}]: ${ERROR_CODE}" + fi if [ "$COUNT" -eq 1 ]; then RETURN=${ERROR_CODE} else RETURN=$(($RETURN+$ERROR_CODE)) fi - - echo done # Check when a command is executed in all running jails. (bastille cmd ALL ...)