2018-11-07 10:36:54 -07:00
#!/bin/sh
#
2020-01-26 09:51:02 -07:00
# Copyright (c) 2018-2020, Christer Edwards <christer.edwards@gmail.com>
2018-11-07 10:36:54 -07:00
# 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/colors.pre.sh
. /usr/local/etc/bastille/bastille.conf
usage( ) {
2020-02-02 06:50:58 -04:00
echo -e " ${ COLOR_RED } Usage: bastille destroy [option] | [container|release] ${ COLOR_RESET } "
2018-11-07 10:36:54 -07:00
exit 1
}
destroy_jail( ) {
2020-02-02 02:42:22 -04:00
bastille_jail_base = " ${ bastille_jailsdir } / ${ TARGET } " ## dir
bastille_jail_log = " ${ bastille_logsdir } / ${ TARGET } _console.log " ## file
2018-11-07 10:36:54 -07:00
2020-02-02 02:42:22 -04:00
if [ " $( jls name | awk " /^ ${ TARGET } $/ " ) " ] ; then
2020-02-02 19:55:18 -04:00
if [ " ${ FORCE } " = "1" ] ; then
2020-02-20 18:06:31 -04:00
bastille stop " ${ TARGET } "
2020-02-02 06:50:58 -04:00
else
echo -e " ${ COLOR_RED } Jail running. ${ COLOR_RESET } "
echo -e " ${ COLOR_RED } See 'bastille stop ${ TARGET } '. ${ COLOR_RESET } "
exit 1
fi
2018-11-07 10:36:54 -07:00
fi
if [ ! -d " ${ bastille_jail_base } " ] ; then
echo -e " ${ COLOR_RED } Jail not found. ${ COLOR_RESET } "
exit 1
fi
if [ -d " ${ bastille_jail_base } " ] ; then
2020-02-02 02:42:22 -04:00
echo -e " ${ COLOR_GREEN } Deleting Jail: ${ TARGET } . ${ COLOR_RESET } "
2019-06-22 09:28:42 -06:00
if [ " ${ bastille_zfs_enable } " = "YES" ] ; then
2020-02-20 18:06:31 -04:00
if [ -n " ${ bastille_zfs_zpool } " ] ; then
if [ -n " ${ TARGET } " ] ; then
2019-11-18 03:51:06 -04:00
## remove jail zfs dataset recursively
2020-02-20 18:06:31 -04:00
zfs destroy -r " ${ bastille_zfs_zpool } / ${ bastille_zfs_prefix } /jails/ ${ TARGET } "
2019-11-18 03:51:06 -04:00
fi
2019-06-22 09:28:42 -06:00
fi
fi
2019-10-24 17:02:50 -04:00
if [ -d " ${ bastille_jail_base } " ] ; then
## removing all flags
2020-02-20 18:06:31 -04:00
chflags -R noschg " ${ bastille_jail_base } "
2019-06-22 09:28:42 -06:00
2019-10-24 17:02:50 -04:00
## remove jail base
2020-02-20 18:06:31 -04:00
rm -rf " ${ bastille_jail_base } "
2019-10-24 17:02:50 -04:00
fi
2019-06-22 09:28:42 -06:00
## archive jail log
if [ -f " ${ bastille_jail_log } " ] ; then
2020-02-20 18:06:31 -04:00
mv " ${ bastille_jail_log } " " ${ bastille_jail_log } " -" $( date +%F) "
2019-06-22 09:28:42 -06:00
echo -e " ${ COLOR_GREEN } Note: jail console logs archived. ${ COLOR_RESET } "
echo -e " ${ COLOR_GREEN } ${ bastille_jail_log } - $( date +%F) ${ COLOR_RESET } "
fi
2020-03-30 22:33:32 +02:00
## clear any active rdr rules
if [ ! -z " $( pfctl -a " rdr/ ${ TARGET } " -Psn 2>/dev/null) " ] ; then
echo -e " ${ COLOR_GREEN } Clearing RDR rules: ${ COLOR_RESET } "
pfctl -a " rdr/ ${ TARGET } " -Fn
fi
2018-11-07 10:36:54 -07:00
echo
fi
}
2019-10-24 17:02:50 -04:00
destroy_rel( ) {
2020-02-02 02:42:22 -04:00
## check release name match before destroy
if [ -n " ${ NAME_VERIFY } " ] ; then
TARGET = " ${ NAME_VERIFY } "
else
usage
fi
bastille_rel_base = " ${ bastille_releasesdir } / ${ TARGET } " ## dir
2019-11-03 00:15:02 -04:00
2019-11-02 16:05:49 -04:00
## check if this release have containers child
2019-11-03 00:15:02 -04:00
BASE_HASCHILD = "0"
2019-12-08 17:46:15 -04:00
if [ -d " ${ bastille_jailsdir } " ] ; then
2019-11-03 00:15:02 -04:00
JAIL_LIST = $( ls " ${ bastille_jailsdir } " | sed "s/\n//g" )
for _jail in ${ JAIL_LIST } ; do
2020-02-20 18:06:31 -04:00
if grep -qwo " ${ TARGET } " " ${ bastille_jailsdir } / ${ _jail } /fstab " 2>/dev/null; then
2020-02-02 02:42:22 -04:00
echo -e " ${ COLOR_RED } Notice: ( ${ _jail } ) depends on ${ TARGET } base. ${ COLOR_RESET } "
2019-11-03 00:15:02 -04:00
BASE_HASCHILD = "1"
fi
done
2019-11-02 16:05:49 -04:00
fi
2019-10-24 17:02:50 -04:00
if [ ! -d " ${ bastille_rel_base } " ] ; then
echo -e " ${ COLOR_RED } Release base not found. ${ COLOR_RESET } "
exit 1
2019-11-03 00:15:02 -04:00
else
if [ " ${ BASE_HASCHILD } " -eq "0" ] ; then
2020-02-02 02:42:22 -04:00
echo -e " ${ COLOR_GREEN } Deleting base: ${ TARGET } . ${ COLOR_RESET } "
2019-11-03 00:15:02 -04:00
if [ " ${ bastille_zfs_enable } " = "YES" ] ; then
2020-02-20 18:06:31 -04:00
if [ -n " ${ bastille_zfs_zpool } " ] ; then
zfs destroy " ${ bastille_zfs_zpool } / ${ bastille_zfs_prefix } /releases/ ${ TARGET } "
2020-02-02 19:55:18 -04:00
if [ " ${ FORCE } " = "1" ] ; then
if [ -d " ${ bastille_cachedir } / ${ TARGET } " ] ; then
2020-02-20 18:06:31 -04:00
zfs destroy " ${ bastille_zfs_zpool } / ${ bastille_zfs_prefix } /cache/ ${ TARGET } "
2020-02-02 19:55:18 -04:00
fi
fi
2019-11-03 00:15:02 -04:00
fi
2019-10-24 17:02:50 -04:00
fi
2019-11-03 00:15:02 -04:00
if [ -d " ${ bastille_rel_base } " ] ; then
## removing all flags
2020-02-20 18:06:31 -04:00
chflags -R noschg " ${ bastille_rel_base } "
2019-10-24 17:02:50 -04:00
2019-11-03 00:15:02 -04:00
## remove jail base
2020-02-20 18:06:31 -04:00
rm -rf " ${ bastille_rel_base } "
2019-11-03 00:15:02 -04:00
fi
2020-02-02 19:55:18 -04:00
if [ " ${ FORCE } " = "1" ] ; then
## remove cache on force
if [ -d " ${ bastille_cachedir } / ${ TARGET } " ] ; then
rm -rf " ${ bastille_cachedir } / ${ TARGET } "
fi
fi
2019-11-03 00:15:02 -04:00
echo
else
echo -e " ${ COLOR_RED } Cannot destroy base with containers child. ${ COLOR_RESET } "
2019-10-24 17:02:50 -04:00
fi
fi
}
2018-11-07 10:36:54 -07:00
# Handle special-case commands first.
case " $1 " in
help| -h| --help)
usage
; ;
esac
2020-02-20 10:41:41 -04:00
## reset this options
FORCE = ""
2018-11-07 10:36:54 -07:00
2020-02-02 06:50:58 -04:00
## handle additional options
2020-02-20 10:41:41 -04:00
case " ${ 1 } " in
-f| --force| force)
FORCE = "1"
shift
; ;
-*)
echo -e " ${ COLOR_RED } Unknown Option. ${ COLOR_RESET } "
2020-02-02 06:50:58 -04:00
usage
2020-02-20 10:41:41 -04:00
; ;
2020-02-02 06:50:58 -04:00
esac
2018-11-07 10:36:54 -07:00
2020-02-20 10:41:41 -04:00
TARGET = " ${ 1 } "
if [ $# -gt 1 ] || [ $# -lt 1 ] ; then
usage
fi
2019-10-24 17:02:50 -04:00
## check what should we clean
2020-02-02 02:42:22 -04:00
case " ${ TARGET } " in
2019-11-08 02:37:45 -04:00
*-RELEASE| *-release| *-RC1| *-rc1| *-RC2| *-rc2)
2019-11-22 22:02:34 -07:00
## check for FreeBSD releases name
2020-02-02 02:42:22 -04:00
NAME_VERIFY = $( echo " ${ TARGET } " | grep -iwE '^([1-9]{2,2})\.[0-9](-RELEASE|-RC[1-2])$' | tr '[:lower:]' '[:upper:]' )
destroy_rel
2019-11-08 02:37:45 -04:00
; ;
*-stable-LAST| *-STABLE-last| *-stable-last| *-STABLE-LAST)
2019-11-22 22:02:34 -07:00
## check for HardenedBSD releases name
2020-02-08 09:10:17 -04:00
NAME_VERIFY = $( echo " ${ TARGET } " | grep -iwE '^([1-9]{2,2})(-stable-last)$' | sed 's/STABLE/stable/g' | sed 's/last/LAST/g' )
2020-02-02 02:42:22 -04:00
destroy_rel
2019-11-08 02:37:45 -04:00
; ;
2020-02-02 02:42:22 -04:00
*-stable-build-[ 0-9] *| *-STABLE-BUILD-[ 0-9] *)
## check for HardenedBSD(specific stable build releases)
2020-02-08 09:10:17 -04:00
NAME_VERIFY = $( echo " ${ TARGET } " | grep -iwE '([0-9]{1,2})(-stable-build)-([0-9]{1,3})$' | sed 's/BUILD/build/g' | sed 's/STABLE/stable/g' )
2020-02-02 02:42:22 -04:00
destroy_rel
; ;
2020-02-10 15:39:14 -04:00
*-stable-build-latest| *-stable-BUILD-LATEST| *-STABLE-BUILD-LATEST)
2020-02-02 02:42:22 -04:00
## check for HardenedBSD(latest stable build release)
2020-02-08 09:10:17 -04:00
NAME_VERIFY = $( echo " ${ TARGET } " | grep -iwE '([0-9]{1,2})(-stable-build-latest)$' | sed 's/STABLE/stable/g' | sed 's/build/BUILD/g' | sed 's/latest/LATEST/g' )
2020-02-02 02:42:22 -04:00
destroy_rel
; ;
2020-02-02 04:08:24 -04:00
current-build-[ 0-9] *| CURRENT-BUILD-[ 0-9] *)
2020-02-02 02:42:22 -04:00
## check for HardenedBSD(specific current build releases)
2020-02-08 09:10:17 -04:00
NAME_VERIFY = $( echo " ${ TARGET } " | grep -iwE '(current-build)-([0-9]{1,3})' | sed 's/BUILD/build/g' | sed 's/CURRENT/current/g' )
2020-02-02 02:42:22 -04:00
destroy_rel
; ;
2020-02-10 15:39:14 -04:00
current-build-latest| current-BUILD-LATEST| CURRENT-BUILD-LATEST)
2020-02-02 02:42:22 -04:00
## check for HardenedBSD(latest current build release)
2020-02-08 09:10:17 -04:00
NAME_VERIFY = $( echo " ${ TARGET } " | grep -iwE '(current-build-latest)$' | sed 's/CURRENT/current/g' | sed 's/build/BUILD/g' | sed 's/latest/LATEST/g' )
2020-02-02 02:42:22 -04:00
destroy_rel
2019-12-02 03:10:45 -04:00
; ;
2019-11-08 02:37:45 -04:00
*)
## just destroy a jail
destroy_jail
; ;
esac