diff --git a/README.md b/README.md index 21746469..1dcc5c7c 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Available Commands: config Get or set a config value for the targeted container(s). console Console into a running container. convert Convert a Thin container into a Thick container. - cp cp(1) files from host to targeted container(s). + cp cp(1) files from host or container to host or targeted container(s). create Create a new thin container or a thick container if -T|--thick option specified. destroy Destroy a stopped container or a FreeBSD release. edit Edit container configuration files (advanced). @@ -75,7 +75,6 @@ Available Commands: mount Mount a volume inside the targeted container(s). pkg Manipulate binary packages within targeted container(s). See pkg(8). rdr Redirect host port to container port. - rcp reverse cp(1) files from a single container to the host. rename Rename a container. restart Restart a running container. service Manage services within targeted container(s). diff --git a/docs/chapters/subcommands/rcp.rst b/docs/chapters/subcommands/rcp.rst deleted file mode 100644 index 7b9945d7..00000000 --- a/docs/chapters/subcommands/rcp.rst +++ /dev/null @@ -1,22 +0,0 @@ -=== -rcp -=== - -This command allows copying files from a single jail to the host. - -.. code-block:: shell - - ishmael ~ # bastille rcp bastion /tmp/myfile /temp - [bastion]: - /usr/local/bastille/jails/bastion/root/tmp/myfile -> /temp/myfile - -Unless you see errors reported in the output the `rcp` was successful. - -.. code-block:: shell - - ishmael ~ # bastille rcp help - Usage: bastille rcp [option(s)] TARGET JAIL_PATH HOST_PATH - Options: - - -q | --quiet Suppress output. - -x | --debug Enable debug mode. diff --git a/usr/local/bin/bastille b/usr/local/bin/bastille index c5442daf..3799429c 100755 --- a/usr/local/bin/bastille +++ b/usr/local/bin/bastille @@ -95,7 +95,7 @@ Available Commands: config Get or set a config value for the targeted container(s). console Console into a running container. convert Convert a Thin container into a Thick container. - cp cp(1) files from host to targeted container(s). + cp cp(1) files from host or container to host or targeted container(s). create Create a new thin container or a thick container if -T|--thick option specified. destroy Destroy a stopped container or a FreeBSD release. edit Edit container configuration files (advanced). @@ -107,7 +107,6 @@ Available Commands: list List containers (running). mount Mount a volume inside the targeted container(s). pkg Manipulate binary packages within targeted container(s). See pkg(8). - rcp reverse cp(1) files from a single container to the host. rdr Redirect host port to container port. rename Rename a container. restart Restart a running container. diff --git a/usr/local/share/bastille/cp.sh b/usr/local/share/bastille/cp.sh index a1dc0c15..b0141327 100644 --- a/usr/local/share/bastille/cp.sh +++ b/usr/local/share/bastille/cp.sh @@ -34,24 +34,37 @@ . /usr/local/etc/bastille/bastille.conf usage() { - error_notify "Usage: bastille cp [option(s)] TARGET HOST_PATH JAIL_PATH" + error_notify "Usage: bastille cp [option(s)] TARGET SOURCE DESTINATION" cat << EOF Options: - -q | --quiet Suppress output. - -x | --debug Enable debug mode. + -j | --jail Jail mode. Copy files from jail to jail(s). + Syntax is [-j jail:srcpath jail:dstpath] + -r | --reverse Reverse copy files from jail to host. + -q | --quiet Suppress output. + -x | --debug Enable debug mode. EOF exit 1 } # Handle options. +JAIL_MODE=0 OPTION="-av" +REVERSE_MODE=0 while [ "$#" -gt 0 ]; do case "${1}" in -h|--help|help) usage ;; + -j|--jail) + JAIL_MODE=1 + shift + ;; + -r|--reverse) + REVERSE_MODE=1 + shift + ;; -q|--quiet) OPTION="-a" shift @@ -63,6 +76,8 @@ while [ "$#" -gt 0 ]; do -*) for _opt in $(echo ${1} | sed 's/-//g' | fold -w1); do case ${_opt} in + j) JAIL_MODE=1 ;; + r) REVERSE_MODE=1 ;; q) OPTION="-a" ;; x) enable_debug ;; *) error_exit "Unknown Option: \"${1}\"" ;; @@ -76,22 +91,55 @@ while [ "$#" -gt 0 ]; do esac done -if [ "$#" -ne 3 ]; then +if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then usage fi +if [ "${JAIL_MODE}" -eq 1 ]; then + SOURCE_TARGET="$(echo ${1} | awk -F":" '{print $1}')" + SOURCE_PATH="$(echo ${1} | awk -F":" '{print $2}')" + DEST_TARGET="$(echo ${2} | awk -F":" '{print $1}')" + DEST_PATH="$(echo ${2} | awk -F":" '{print $2}')" + set_target_single "${SOURCE_TARGET}" && SOURCE_TARGET="${TARGET}" + set_target "${DEST_TARGET}" && DEST_TARGET="${JAILS}" + for _jail in ${DEST_TARGET}; do + if [ "${_jail}" = "${SOURCE_TARGET}" ]; then + continue + fi + info "[${_jail}]:" + source_path="$(echo ${bastille_jailsdir}/${SOURCE_TARGET}/root/${SOURCE_PATH} | sed 's#//#/#g')" + dest_path="$(echo ${bastille_jailsdir}/${_jail}/root/${DEST_PATH} | sed 's#//#/#g')" + if ! cp "${OPTION}" "${source_path}" "${dest_path}"; then + error_continue "CP failed: ${source_path} -> ${dest_path}" + fi + done + exit +fi + TARGET="${1}" -CPSOURCE="${2}" -CPDEST="${3}" +SOURCE="${2}" +DEST="${3}" bastille_root_check -set_target "${TARGET}" -for _jail in ${JAILS}; do - info "[${_jail}]:" - host_path="${CPSOURCE}" - jail_path="$(echo ${bastille_jailsdir}/${_jail}/root/${CPDEST} | sed 's#//#/#g')" - if ! cp "${OPTION}" "${host_path}" "${jail_path}"; then - error_continue "CP failed: ${host_path} -> ${jail_path}" - fi -done +if [ "${REVERSE_MODE}" -eq 1 ]; then + set_target_single "${TARGET}" + for _jail in ${JAILS}; do + info "[${_jail}]:" + host_path="${DEST}" + jail_path="$(echo ${bastille_jailsdir}/${_jail}/root/${SOURCE} | sed 's#//#/#g')" + if ! cp "${OPTION}" "${jail_path}" "${host_path}"; then + error_exit "RCP failed: ${jail_path} -> ${host_path}" + fi + done +else + set_target "${TARGET}" + for _jail in ${JAILS}; do + info "[${_jail}]:" + host_path="${SOURCE}" + jail_path="$(echo ${bastille_jailsdir}/${_jail}/root/${DEST} | sed 's#//#/#g')" + if ! cp "${OPTION}" "${host_path}" "${jail_path}"; then + error_continue "CP failed: ${host_path} -> ${jail_path}" + fi + done +fi \ No newline at end of file diff --git a/usr/local/share/bastille/rcp.sh b/usr/local/share/bastille/rcp.sh deleted file mode 100644 index ec1c5bd5..00000000 --- a/usr/local/share/bastille/rcp.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/sh -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2018-2025, Christer Edwards -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -. /usr/local/share/bastille/common.sh -. /usr/local/etc/bastille/bastille.conf - -usage() { - error_notify "Usage: bastille rcp [option(s)] TARGET JAIL_PATH HOST_PATH" - cat << EOF - Options: - - -q | --quiet Suppress output. - -x | --debug Enable debug mode. - -EOF - exit 1 -} - -# Handle options. -OPTION="-av" -while [ "$#" -gt 0 ]; do - case "${1}" in - -h|--help|help) - usage - ;; - -q|--quiet) - OPTION="-a" - shift - ;; - -x|--debug) - enable_debug - shift - ;; - -*) - for _opt in $(echo ${1} | sed 's/-//g' | fold -w1); do - case ${_opt} in - q) OPTION="-a" ;; - x) enable_debug ;; - *) error_exit "Unknown Option: \"${1}\"" ;; - esac - done - shift - ;; - *) - break - ;; - esac -done - -if [ "$#" -ne 3 ]; then - usage -fi - -TARGET="${1}" -CPSOURCE="${2}" -CPDEST="${3}" - -bastille_root_check -set_target_single "${TARGET}" - -for _jail in ${JAILS}; do - info "[${_jail}]:" - host_path="${CPDEST}" - jail_path="$(echo ${bastille_jailsdir}/${_jail}/root/${CPSOURCE} | sed 's#//#/#g')" - if ! cp "${OPTION}" "${jail_path}" "${host_path}"; then - error_continue "RCP failed: ${jail_path} -> ${host_path}" - fi -done