From b60bc10537bb9a64e317ee476db1769660c1efa3 Mon Sep 17 00:00:00 2001 From: Nikos Chondros Date: Sat, 4 Mar 2023 12:34:09 +0200 Subject: [PATCH] Add rcp (reverse copy) command Allows to copy files from a single jail back to the host. Usuful when building jails ad-hoc, to get back to the host files you create directly inside the jail. --- usr/local/bin/bastille | 3 +- usr/local/share/bastille/rcp.sh | 77 +++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 usr/local/share/bastille/rcp.sh diff --git a/usr/local/bin/bastille b/usr/local/bin/bastille index 0542bed8..a1c8ecf5 100755 --- a/usr/local/bin/bastille +++ b/usr/local/bin/bastille @@ -102,6 +102,7 @@ Available Commands: list List containers (running and stopped). 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. @@ -141,7 +142,7 @@ help|-h|--help) bootstrap|create|destroy|export|import|list|rdr|restart|start|update|upgrade|verify) # Nothing "extra" to do for these commands. -- cwells ;; -clone|config|cmd|console|convert|cp|edit|htop|limits|mount|pkg|rename|service|stop|sysrc|template|top|umount|zfs) +clone|config|cmd|console|convert|cp|edit|htop|limits|mount|pkg|rcp|rename|service|stop|sysrc|template|top|umount|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/rcp.sh b/usr/local/share/bastille/rcp.sh new file mode 100644 index 00000000..09d1d2f8 --- /dev/null +++ b/usr/local/share/bastille/rcp.sh @@ -0,0 +1,77 @@ +#!/bin/sh +# +# Copyright (c) 2018-2022, 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_exit "Usage: bastille rcp [OPTION] TARGET CONTAINER_PATH HOST_PATH" +} + +CPSOURCE="${1}" +CPDEST="${2}" + +# Handle special-case commands first. +case "$1" in +help|-h|--help) + usage + ;; +-q|--quiet) + OPTION="${1}" + CPSOURCE="${2}" + CPDEST="${3}" + ;; +esac + +if [ $# -ne 2 ]; then + usage +fi + +if [ "${TARGET}" = "ALL" ]; then + usage +fi + +case "${OPTION}" in + -q|--quiet) + OPTION="-a" + ;; + *) + OPTION="-av" + ;; +esac + +for _jail in ${JAILS}; do + info "[${_jail}]:" + bastille_jail_path="${bastille_jailsdir}/${_jail}/root" + cp "${OPTION}" "${bastille_jail_path}/${CPSOURCE}" "${CPDEST}" + RETURN="$?" + echo + return "${RETURN}" +done