From 4019e0d3745dffeb195532bc334cb1b51bfb6099 Mon Sep 17 00:00:00 2001 From: Jose Date: Wed, 13 May 2020 22:58:11 -0400 Subject: [PATCH] Include missing bits, disable vnet on versions below 12 --- CHANGELOG | 1 + bastille-init | 31 ++- conf/system/include/12.1/jib | 418 ++++++++++++++++++++++++++++++++ conf/system/include/12.1/setfib | Bin 0 -> 15496 bytes conf/system/include/12.1/sum | Bin 0 -> 19880 bytes version | 2 +- 6 files changed, 450 insertions(+), 2 deletions(-) create mode 100755 conf/system/include/12.1/jib create mode 100755 conf/system/include/12.1/setfib create mode 100755 conf/system/include/12.1/sum diff --git a/CHANGELOG b/CHANGELOG index 543928d..1ef743d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ ====================== Version Description +1.0.60......Include missing bits, disable vnet on versions below 12. 1.0.59......Add a skip link to the initial help banner. 1.0.58......Add Spanish translation thanks to raul fernandez garcia. 1.0.57......Display bastille bootstrap output after base release fetch. diff --git a/bastille-init b/bastille-init index cd0d62d..68ab75b 100755 --- a/bastille-init +++ b/bastille-init @@ -67,7 +67,9 @@ BASTILLEPATH="${USRLOCAL}/bin" BASTILLECONF="${USRLOCAL}/etc/${APPNAME}/${APPNAME}.conf" BASTILLECONFLINK="/var/etc/bastille_conf" BASTILLECONF_EXT="${CWDIR}/conf/bastille.conf.ext" -FREEBSD_UPDATE="${CWDIR}/conf/system/freebsd-update/${HOSTVERSION}" +INCLUDE_PATH="${CWDIR}/conf/system" +FREEBSD_UPDATE="${INCLUDE_PATH}/freebsd-update/${HOSTVERSION}" +SYSTEM_INCLUDE="${INCLUDE_PATH}/include/${HOSTVERSION}" INSTALLPATH="${CWDIR}/${FULLAPPNAME}" BRANCH="master" #BATSILLE_URL="https://github.com/BastilleBSD/${APPNAME}/archive/${BRANCH}.zip" # Official Bastille Repository) @@ -287,11 +289,13 @@ platform_check() ext_initial_download bastille_initial_download sys_symlinkdir + include_files elif [ "${PRDPLATFORM}" = "x64-full" ]; then create_addon_env ext_initial_download bastille_initial_download sys_symlinkdir + include_files fi } @@ -359,6 +363,31 @@ sys_symlinkdir() fi } +include_files() +{ + if [ "$(freebsd-version | cut -d '.' -f1)" -ge 12 ]; then + sysrc -f ${CWDIR}${EXTCONF} VNET_ENABLE="YES" >/dev/null 2>&1 + # Include missing files. + if [ ! -f "/usr/local/bin/jib" ]; then + if [ -f "${SYSTEM_INCLUDE}/jib" ]; then + install -m 0544 ${SYSTEM_INCLUDE}/jib /usr/local/bin/jib + fi + fi + if [ ! -f "/usr/sbin/setfib" ]; then + if [ -f "${SYSTEM_INCLUDE}/setfib" ]; then + install -m 0555 ${SYSTEM_INCLUDE}/setfib /usr/sbin/setfib + fi + fi + if [ ! -f "/usr/bin/sum" ]; then + if [ -f "${SYSTEM_INCLUDE}/sum" ]; then + install -m 0555 ${SYSTEM_INCLUDE}/sum /usr/bin/sum + fi + fi + else + sysrc -f ${CWDIR}${EXTCONF} VNET_ENABLE="NO" >/dev/null 2>&1 + fi +} + postinit_cmd() { # Check and generate temporary php script for postinit command. diff --git a/conf/system/include/12.1/jib b/conf/system/include/12.1/jib new file mode 100755 index 0000000..818065a --- /dev/null +++ b/conf/system/include/12.1/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.1/setfib b/conf/system/include/12.1/setfib new file mode 100755 index 0000000000000000000000000000000000000000..de7f0f969608f656d90662449c2b64e99cd52d87 GIT binary patch literal 15496 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 bwH1VNeqC%n*LO?Z@6?*YCl(Bg`S$+>jI-U3 literal 0 HcmV?d00001 diff --git a/conf/system/include/12.1/sum b/conf/system/include/12.1/sum new file mode 100755 index 0000000000000000000000000000000000000000..a6035b1145d3943fc1d0ff731f21621e278fde32 GIT binary patch literal 19880 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 Nocu#08dh7%{~yX=o~Zx; literal 0 HcmV?d00001 diff --git a/version b/version index c3ccccf..4bf1778 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.0.59 +1.0.60