Initial commit for subshell parallel mode

This commit is contained in:
tschettervictor
2025-05-04 12:11:16 -06:00
parent 22aa1b1e4e
commit 39ed1aaec6
18 changed files with 197 additions and 136 deletions

View File

@@ -91,6 +91,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
# Validate jail state
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
@@ -123,7 +125,12 @@ for _jail in ${JAILS}; do
RETURN=$(($RETURN+$ERROR_CODE))
fi
)
bastille_running_jobs "${bastille_process_limit}"
done
wait
# Check when a command is executed in all running jails. (bastille cmd ALL ...)
if [ "${COUNT}" -gt 1 ] && [ "${RETURN}" -gt 0 ]; then

View File

@@ -93,6 +93,23 @@ warn() {
echo -e "${COLOR_YELLOW}$*${COLOR_RESET}"
}
# Parallel mode, don't exceed process limit
bastille_running_jobs() {
_process_limit="${1}"
_running_jobs=$((_running_jobs + 1))
if [ "${_running_jobs}" -ge "${_process_limit}" ]; then
# Wait for at least one process to finish
wait -n 2>/dev/null || wait
_running_jobs=$((_running_jobs - 1))
fi
}
check_target_exists() {
local _TARGET="${1}"
local _jaillist="$(bastille list jails)"

View File

@@ -116,6 +116,8 @@ print_jail_conf() {
for _jail in ${JAILS}; do
(
# Handle Bastille specific properties
# Currently only 'depend' 'priority' and 'boot'
if [ "${PROPERTY}" = "priority" ] || [ "${PROPERTY}" = "prio" ]; then
@@ -290,7 +292,13 @@ for _jail in ${JAILS}; do
rm "${_tmpfile}"
fi
fi
)
bastille_running_jobs "${bastille_process_limit}"
done
wait
# Only display this message once at the end (not for every jail). -- cwells
if { [ "${ACTION}" = "set" ] || [ "${ACTION}" = "remove" ]; } && [ -z "${BASTILLE_PROPERTY}" ]; then

View File

@@ -89,6 +89,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
info "\n[${_jail}]:"
host_path="${HOST_PATH}"
@@ -97,5 +99,10 @@ for _jail in ${JAILS}; do
if ! cp "${OPTION}" "${host_path}" "${jail_path}"; then
error_continue "[ERROR]: CP failed: ${host_path} -> ${jail_path}"
fi
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -53,6 +53,8 @@ destroy_jail() {
for _jail in ${JAILS}; do
(
bastille_jail_base="${bastille_jailsdir}/${_jail}"
bastille_jail_log="${bastille_logsdir}/${_jail}_console.log"
@@ -117,8 +119,14 @@ destroy_jail() {
pfctl -a "rdr/${_jail}" -Fn
fi
fi
)
done
bastille_running_jobs "${bastille_process_limit}"
done
wait
}
destroy_rel() {

View File

@@ -91,6 +91,8 @@ set_target "${DEST_TARGET}" && DEST_TARGET="${JAILS}"
for _jail in ${DEST_TARGET}; do
(
if [ "${_jail}" = "${SOURCE_TARGET}" ]; then
continue
else
@@ -105,6 +107,10 @@ for _jail in ${DEST_TARGET}; do
fi
fi
done
echo
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -131,6 +131,8 @@ add_cpuset() {
for _jail in ${JAILS}; do
(
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
else
@@ -284,4 +286,10 @@ for _jail in ${JAILS}; do
;;
esac
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -139,6 +139,8 @@ fi
for _jail in ${JAILS}; do
(
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
else
@@ -196,4 +198,9 @@ for _jail in ${JAILS}; do
mount -F "${bastille_jailsdir}/${_jail}/fstab" -a || error_continue "Failed to mount volume: ${_fullpath}"
echo "Added: ${_fstab_entry}"
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -97,6 +97,8 @@ errors=0
for _jail in ${JAILS}; do
(
# Validate jail state
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
@@ -128,7 +130,12 @@ for _jail in ${JAILS}; do
fi
fi
)
bastille_running_jobs "${bastille_process_limit}"
done
wait
if [ $errors -ne 0 ]; then
error_exit "[ERROR]: Failed to apply on some jails, please check logs"

View File

@@ -88,6 +88,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
# Validate jail state
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
@@ -101,4 +103,9 @@ for _jail in ${JAILS}; do
jexec -l "${_jail}" /usr/sbin/service "$@"
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -104,6 +104,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
# Continue if '-b|--boot' is set and 'boot=off'
if [ "${BOOT}" -eq 1 ]; then
BOOT_ENABLED="$(sysrc -f ${bastille_jailsdir}/${_jail}/settings.conf -n boot)"
@@ -208,4 +210,9 @@ for _jail in ${JAILS}; do
# Delay between jail action
sleep "${DELAY_TIME}"
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -87,6 +87,8 @@ set_target "${TARGET}" "reverse"
for _jail in ${JAILS}; do
(
# Validate that all jails that 'depend' on this one are stopped
for _depend_jail in $(ls --color=never ${bastille_jailsdir} | sed -e 's/\n//g'); do
if ! grep -hoqsw "depend=" ${bastille_jailsdir}/${_depend_jail}/settings.conf; then
@@ -149,4 +151,9 @@ for _jail in ${JAILS}; do
done
fi
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -88,6 +88,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
# Validate jail state
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
@@ -101,4 +103,9 @@ for _jail in ${JAILS}; do
jexec -l "${_jail}" /usr/sbin/sysrc "$@"
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -77,6 +77,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
bastille_jail_tags="${bastille_jailsdir}/${_jail}/tags"
case ${ACTION} in
add)
@@ -118,4 +120,9 @@ for _jail in ${JAILS}; do
;;
esac
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -272,6 +272,8 @@ fi
for _jail in ${JAILS}; do
(
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
else
@@ -474,4 +476,9 @@ for _jail in ${JAILS}; do
info "\nTemplate applied: ${TEMPLATE}"
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -88,6 +88,8 @@ set_target "${TARGET}"
for _jail in ${JAILS}; do
(
# Validate jail state
check_target_is_running "${_jail}" || if [ "${AUTO}" -eq 1 ]; then
bastille start "${_jail}"
@@ -128,4 +130,9 @@ for _jail in ${JAILS}; do
echo "Unmounted: ${_jailpath}"
done
)
bastille_running_jobs "${bastille_process_limit}"
done
wait

View File

@@ -45,65 +45,25 @@ EOF
}
zfs_snapshot() {
for _jail in ${JAILS}; do
info "\n[${_jail}]:"
# shellcheck disable=SC2140
zfs snapshot -r "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"@"${TAG}"
done
# shellcheck disable=SC2140
zfs snapshot -r "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"@"${TAG}"
}
zfs_destroy_snapshot() {
for _jail in ${JAILS}; do
info "\n[${_jail}]:"
# shellcheck disable=SC2140
zfs destroy -r "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"@"${TAG}"
done
# shellcheck disable=SC2140
zfs destroy -r "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"@"${TAG}"
}
zfs_set_value() {
for _jail in ${JAILS}; do
info "\n[${_jail}]:"
zfs "${ATTRIBUTE}" "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"
done
zfs "${ATTRIBUTE}" "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"
}
zfs_get_value() {
for _jail in ${JAILS}; do
info "\n[${_jail}]:"
zfs get "${ATTRIBUTE}" "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"
done
zfs get "${ATTRIBUTE}" "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"
}
zfs_disk_usage() {
for _jail in ${JAILS}; do
info "\n[${_jail}]:"
zfs list -t all -o name,used,avail,refer,mountpoint,compress,ratio -r "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"
done
zfs list -t all -o name,used,avail,refer,mountpoint,compress,ratio -r "${bastille_zfs_zpool}/${bastille_zfs_prefix}/jails/${_jail}"
}
@@ -147,27 +107,40 @@ if [ -z "${bastille_zfs_zpool}" ]; then
error_exit "[ERROR]: ZFS zpool not defined."
fi
case "${ACTION}" in
set)
ATTRIBUTE="${3}"
zfs_set_value
;;
get)
ATTRIBUTE="${3}"
zfs_get_value
;;
snap|snapshot)
TAG="${3}"
zfs_snapshot
;;
destroy_snap|destroy_snapshot)
TAG="${3}"
zfs_destroy_snapshot
;;
df|usage)
zfs_disk_usage
;;
*)
usage
;;
esac
for _jail in ${JAILS}; do
(
info "\n[${_jail}]:"
case "${ACTION}" in
set)
ATTRIBUTE="${3}"
zfs_set_value
;;
get)
ATTRIBUTE="${3}"
zfs_get_value
;;
snap|snapshot)
TAG="${3}"
zfs_snapshot
;;
destroy_snap|destroy_snapshot)
TAG="${3}"
zfs_destroy_snapshot
;;
df|usage)
zfs_disk_usage
;;
*)
usage
;;
esac
)
bastille_running_jobs "${bastille_process_limit}"
done
wait