From 01ff202b2331f27473f1a00c90cb1142173a6f66 Mon Sep 17 00:00:00 2001 From: Jose Date: Wed, 20 Jan 2021 08:10:18 -0400 Subject: [PATCH] Don't set template for empty jails, include files for 12.2 release --- CHANGELOG | 1 + bastille-init | 2 +- conf/bastille.conf.ext | 2 +- conf/system/include/12.2/jib | 418 ++++++++++++++++++++++++++++++++ conf/system/include/12.2/setfib | Bin 0 -> 7944 bytes conf/system/include/12.2/sum | Bin 0 -> 12672 bytes version | 2 +- 7 files changed, 422 insertions(+), 3 deletions(-) create mode 100755 conf/system/include/12.2/jib create mode 100755 conf/system/include/12.2/setfib create mode 100755 conf/system/include/12.2/sum diff --git a/CHANGELOG b/CHANGELOG index 59082b3..5725dd2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ ====================== Version Description +1.0.79......Don't set template for empty jails, include files for 12.2 release. 1.0.78......Fix for proper bastille config update. 1.0.77......Enable 12.2 RELEASE downloads through the GUI. 1.0.76......Minor code changes. diff --git a/bastille-init b/bastille-init index ea05e56..f24d606 100755 --- a/bastille-init +++ b/bastille-init @@ -1049,7 +1049,7 @@ update_config() sysrc -f ${BASTILLECONF} bastille_template_base="default/base" fi if ! grep -qw 'bastille_template_empty=' ${BASTILLECONF}; then - sysrc -f ${BASTILLECONF} bastille_template_empty="default/empty" + sysrc -f ${BASTILLECONF} bastille_template_empty="" fi if ! grep -qw 'bastille_template_thick=' ${BASTILLECONF}; then sysrc -f ${BASTILLECONF} bastille_template_thick="default/thick" diff --git a/conf/bastille.conf.ext b/conf/bastille.conf.ext index 8f0c419..e6e2293 100644 --- a/conf/bastille.conf.ext +++ b/conf/bastille.conf.ext @@ -21,7 +21,7 @@ bastille_network_loopback="" bastille_network_shared="" bastille_network_gateway="" bastille_template_base="default/base" -bastille_template_empty="default/empty" +bastille_template_empty="" bastille_template_thick="default/thick" bastille_template_thin="default/thin" bastille_template_vnet="default/vnet" diff --git a/conf/system/include/12.2/jib b/conf/system/include/12.2/jib new file mode 100755 index 0000000..818065a --- /dev/null +++ b/conf/system/include/12.2/jib @@ -0,0 +1,418 @@ +#!/bin/sh +#- +# Copyright (c) 2016 Devin Teske +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. +# +# $FreeBSD: releng/12.1/share/examples/jails/jib 339977 2018-10-31 23:07:47Z dteske $ +# +############################################################ IDENT(1) +# +# $Title: if_bridge(4) management script for vnet jails $ +# +############################################################ INFORMATION +# +# Use this tool with jail.conf(5) (or rc.conf(5) ``legacy'' configuration) to +# manage `vnet' interfaces for jails. Designed to automate the creation of vnet +# interface(s) during jail `prestart' and destroy said interface(s) during jail +# `poststop'. +# +# In jail.conf(5) format: +# +# ### BEGIN EXCERPT ### +# +# xxx { +# host.hostname = "xxx.yyy"; +# path = "/vm/xxx"; +# +# # +# # NB: Below 2-lines required +# # NB: The number of eNb_xxx interfaces should match the number of +# # arguments given to `jib addm xxx' in exec.prestart value. +# # +# vnet; +# vnet.interface = e0b_xxx, e1b_xxx, ...; +# +# exec.clean; +# exec.system_user = "root"; +# exec.jail_user = "root"; +# +# # +# # NB: Below 2-lines required +# # NB: The number of arguments after `jib addm xxx' should match +# # the number of eNb_xxx arguments in vnet.interface value. +# # +# exec.prestart += "jib addm xxx em0 em1 ..."; +# exec.poststop += "jib destroy xxx"; +# +# # Standard recipe +# exec.start += "/bin/sh /etc/rc"; +# exec.stop = "/bin/sh /etc/rc.shutdown"; +# exec.consolelog = "/var/log/jail_xxx_console.log"; +# mount.devfs; +# +# # Optional (default off) +# #allow.mount; +# #allow.set_hostname = 1; +# #allow.sysvipc = 1; +# #devfs_ruleset = "11"; # rule to unhide bpf for DHCP +# } +# +# ### END EXCERPT ### +# +# In rc.conf(5) ``legacy'' format (used when /etc/jail.conf does not exist): +# +# ### BEGIN EXCERPT ### +# +# jail_enable="YES" +# jail_list="xxx" +# +# # +# # Global presets for all jails +# # +# jail_devfs_enable="YES" # mount devfs +# +# # +# # Global options (default off) +# # +# #jail_mount_enable="YES" # mount /etc/fstab.{name} +# #jail_set_hostname_allow="YES" # Allow hostname to change +# #jail_sysvipc_allow="YES" # Allow SysV Interprocess Comm. +# +# # xxx +# jail_xxx_hostname="xxx.shxd.cx" # hostname +# jail_xxx_rootdir="/vm/xxx" # root directory +# jail_xxx_vnet_interfaces="e0b_xxx e1bxxx ..." # vnet interface(s) +# jail_xxx_exec_prestart0="jib addm xxx em0 em1 ..." # bridge interface(s) +# jail_xxx_exec_poststop0="jib destroy xxx" # destroy interface(s) +# #jail_xxx_mount_enable="YES" # mount /etc/fstab.xxx +# #jail_xxx_devfs_ruleset="11" # rule to unhide bpf for DHCP +# +# ### END EXCERPT ### +# +# Note that the legacy rc.conf(5) format is converted to +# /var/run/jail.{name}.conf by /etc/rc.d/jail if jail.conf(5) is missing. +# +# ASIDE: dhclient(8) inside a vnet jail... +# +# To allow dhclient(8) to work inside a vnet jail, make sure the following +# appears in /etc/devfs.rules (which should be created if it doesn't exist): +# +# [devfsrules_jail=11] +# add include $devfsrules_hide_all +# add include $devfsrules_unhide_basic +# add include $devfsrules_unhide_login +# add path 'bpf*' unhide +# +# And set ether devfs.ruleset="11" (jail.conf(5)) or +# jail_{name}_devfs_ruleset="11" (rc.conf(5)). +# +# NB: While this tool can't create every type of desirable topology, it should +# handle most setups, minus some which considered exotic or purpose-built. +# +############################################################ GLOBALS + +pgm="${0##*/}" # Program basename + +# +# Global exit status +# +SUCCESS=0 +FAILURE=1 + +############################################################ FUNCTIONS + +usage() +{ + local action usage descr + exec >&2 + echo "Usage: $pgm action [arguments]" + echo "Actions:" + for action in \ + addm \ + show \ + show1 \ + destroy \ + ; do + eval usage=\"\$jib_${action}_usage\" + [ "$usage" ] || continue + eval descr=\"\$jib_${action}_descr\" + printf "\t%s\n\t\t%s\n" "$usage" "$descr" + done + exit $FAILURE +} + +action_usage() +{ + local usage descr action="$1" + eval usage=\"\$jib_${action}_usage\" + echo "Usage: $pgm $usage" >&2 + eval descr=\"\$jib_${action}_descr\" + printf "\t%s\n" "$descr" + exit $FAILURE +} + +derive_mac() +{ + local OPTIND=1 OPTARG __flag + local __mac_num= __make_pair= + while getopts 2n: __flag; do + case "$__flag" in + 2) __make_pair=1 ;; + n) __mac_num=${OPTARG%%[^0-9]*} ;; + esac + done + shift $(( $OPTIND - 1 )) + + if [ ! "$__mac_num" ]; then + eval __mac_num=\${_${iface}_num:--1} + __mac_num=$(( $__mac_num + 1 )) + eval _${iface}_num=\$__mac_num + fi + + local __iface="$1" __name="$2" __var_to_set="$3" __var_to_set_b="$4" + local __iface_devid __new_devid __num __new_devid_b + # + # Calculate MAC address derived from given iface. + # + # The formula I'm using is ``NP:SS:SS:II:II:II'' where: + # + N denotes 4 bits used as a counter to support branching + # each parent interface up to 15 times under the same jail + # name (see S below). + # + P denotes the special nibble whose value, if one of + # 2, 6, A, or E (but usually 2) denotes a privately + # administered MAC address (while remaining routable). + # + S denotes 16 bits, the sum(1) value of the jail name. + # + I denotes bits that are inherited from parent interface. + # + # The S bits are a CRC-16 checksum of NAME, allowing the jail + # to change link numbers in ng_bridge(4) without affecting the + # MAC address. Meanwhile, if... + # + the jail NAME changes (e.g., it was duplicated and given + # a new name with no other changes) + # + the underlying network interface changes + # + the jail is moved to another host + # the MAC address will be recalculated to a new, similarly + # unique value preventing conflict. + # + __iface_devid=$( ifconfig $__iface ether | awk '/ether/,$0=$2' ) + # ??:??:??:II:II:II + __new_devid=${__iface_devid#??:??:??} # => :II:II:II + # => :SS:SS:II:II:II + __num=$( set -- `echo -n "$__name" | sum` && echo $1 ) + __new_devid=$( printf :%02x:%02x \ + $(( $__num >> 8 & 255 )) $(( $__num & 255 )) )$__new_devid + # => P:SS:SS:II:II:II + case "$__iface_devid" in + ?2:*) __new_devid=a$__new_devid __new_devid_b=e$__new_devid ;; + ?[Ee]:*) __new_devid=2$__new_devid __new_devid_b=6$__new_devid ;; + *) __new_devid=2$__new_devid __new_devid_b=e$__new_devid + esac + # => NP:SS:SS:II:II:II + __new_devid=$( printf %x $(( $__mac_num & 15 )) )$__new_devid + __new_devid_b=$( printf %x $(( $__mac_num & 15 )) )$__new_devid_b + + # + # Return derivative MAC address(es) + # + if [ "$__make_pair" ]; then + if [ "$__var_to_set" -a "$__var_to_set_b" ]; then + eval $__var_to_set=\$__new_devid + eval $__var_to_set_b=\$__new_devid_b + else + echo $__new_devid $__new_devid_b + fi + else + if [ "$__var_to_set" ]; then + eval $__var_to_set=\$__new_devid + else + echo $__new_devid + fi + fi +} + +mustberoot_to_continue() +{ + if [ "$( id -u )" -ne 0 ]; then + echo "Must run as root!" >&2 + exit $FAILURE + fi +} + +jib_addm_usage="addm [-b BRIDGE_NAME] NAME [!]iface0 [[!]iface1 ...]" +jib_addm_descr="Creates e0b_NAME [e1b_NAME ...]" +jib_addm() +{ + local OPTIND=1 OPTARG flag bridge=bridge + while getopts b: flag; do + case "$flag" in + b) bridge="${OPTARG:-bridge}" ;; + *) action_usage addm # NOTREACHED + esac + done + shift $(( $OPTIND - 1 )) + + local name="$1" + [ "${name:-x}" = "${name#*[!0-9a-zA-Z_]}" -a $# -gt 1 ] || + action_usage addm # NOTREACHED + shift 1 # name + + mustberoot_to_continue + + local iface eiface_devid_a eiface_devid_b + local new no_derive num quad i=0 + for iface in $*; do + + no_derive= + case "$iface" in + !*) iface=${iface#!} no_derive=1 ;; + esac + + # Make sure the interface doesn't exist already + if ifconfig "e${i}a_$name" > /dev/null 2>&1; then + i=$(( $i + 1 )) + continue + fi + + # Bring the interface up + ifconfig $iface up || return + + # Make sure the interface has been bridged + if ! ifconfig "$iface$bridge" > /dev/null 2>&1; then + new=$( ifconfig bridge create ) || return + ifconfig $new addm $iface || return + ifconfig $new name "$iface$bridge" || return + ifconfig "$iface$bridge" up || return + fi + + # Create a new interface to the bridge + new=$( ifconfig epair create ) || return + ifconfig "$iface$bridge" addm $new || return + + # Rename the new interface + ifconfig $new name "e${i}a_$name" || return + ifconfig ${new%a}b name "e${i}b_$name" || return + ifconfig "e${i}a_$name" up || return + ifconfig "e${i}b_$name" up || return + + # + # Set the MAC address of the new interface using a sensible + # algorithm to prevent conflicts on the network. + # + eiface_devid_a= eiface_devid_b= + [ "$no_derive" ] || derive_mac -2 $iface "$name" \ + eiface_devid_a eiface_devid_b + if [ "$eiface_devid_a" -a "$eiface_devid_b" ]; then + ifconfig "e${i}a_$name" ether $eiface_devid_a + ifconfig "e${i}b_$name" ether $eiface_devid_b + fi > /dev/null 2>&1 + + i=$(( $i + 1 )) + done # for iface +} + +jib_show_usage="show" +jib_show_descr="List possible NAME values for \`show NAME'" +jib_show1_usage="show NAME" +jib_show1_descr="Lists e0b_NAME [e1b_NAME ...]" +jib_show2_usage="show [NAME]" +jib_show() +{ + local OPTIND=1 OPTARG flag + while getopts "" flag; do + case "$flag" in + *) action_usage show2 # NOTREACHED + esac + done + shift $(( $OPTIND - 1 )) + if [ $# -eq 0 ]; then + ifconfig | awk ' + /^[^:[:space:]]+:/ { + iface = $1 + sub(/:.*/, "", iface) + next + } + $1 == "groups:" { + for (n = split($0, group); n > 1; n--) { + if (group[n] != "bridge") continue + print iface + next + } + }' | + xargs -rn1 ifconfig | + awk '$1 == "member:" && + sub(/^e[[:digit:]]+a_/, "", $2), $0 = $2' | + sort -u + return + fi + ifconfig | awk -v name="$1" ' + match($0, /^e[[:digit:]]+a_/) && sub(/:.*/, "") && + substr($1, RSTART + RLENGTH) == name + ' | sort +} + +jib_destroy_usage="destroy NAME" +jib_destroy_descr="Destroy e0b_NAME [e1b_NAME ...]" +jib_destroy() +{ + local OPTIND=1 OPTARG flag + while getopts "" flag; do + case "$flag" in + *) action_usage destroy # NOTREACHED + esac + done + shift $(( $OPTIND -1 )) + local name="$1" + [ "${name:-x}" = "${name#*[!0-9a-zA-Z_]}" -a $# -eq 1 ] || + action_usage destroy # NOTREACHED + mustberoot_to_continue + jib_show "$name" | xargs -rn1 -I eiface ifconfig eiface destroy +} + +############################################################ MAIN + +# +# Command-line arguments +# +action="$1" +[ "$action" ] || usage # NOTREACHED + +# +# Validate action argument +# +if [ "$BASH_VERSION" ]; then + type="$( type -t "jib_$action" )" || usage # NOTREACHED +else + type="$( type "jib_$action" 2> /dev/null )" || usage # NOTREACHED +fi +case "$type" in +*function) + shift 1 # action + eval "jib_$action" \"\$@\" + ;; +*) usage # NOTREACHED +esac + +################################################################################ +# END +################################################################################ diff --git a/conf/system/include/12.2/setfib b/conf/system/include/12.2/setfib new file mode 100755 index 0000000000000000000000000000000000000000..f4b74ea3f1203eb70d21c02530fa006c747769d3 GIT binary patch literal 7944 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 BAD{pL literal 0 HcmV?d00001 diff --git a/conf/system/include/12.2/sum b/conf/system/include/12.2/sum new file mode 100755 index 0000000000000000000000000000000000000000..83b0e90775881e0c30ab456b75b204b292168f90 GIT binary patch literal 12672 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 K2zAmfA^#6#i9Ue< literal 0 HcmV?d00001 diff --git a/version b/version index f9ef507..ac329bf 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.0.78 +1.0.79