#!/bin/sh USED_RELEASE="13.2-RELEASE" ZFS_MOUNTPOINT_JAILS="/srv/jails" ZFS_DATASET="zroot" ZFS_DATASET_JAILS="${ZFS_DATASET}/jails" ZFS_DATASET_RELEASES="${ZFS_DATASET_JAILS}/releases" ZFS_DATASET_TEMPLATES="${ZFS_DATASET_JAILS}/templates" ZFS_USED_RELEASE="${ZFS_DATASET_RELEASES}/${USED_RELEASE}" # Variables para habilitar o deshabilitar la descarga y extracción de lib32 y ports lib32="N" # Cambiar a "N" si no se desea descargar y extraer lib32 ports="N" # Cambiar a "N" si no se desea descargar y extraer ports # Crear dataset si no existe create_dataset_if_not_exists() { local dataset=$1 local mountpoint=$2 if ! zfs list "${dataset}" >/dev/null 2>&1; then echo "Creating ${dataset} dataset" zfs create -o mountpoint="${mountpoint}" "${dataset}" else echo "Dataset ${dataset} already exists" fi } # Descargar y extraer un archivo download_and_extract_file() { local url=$1 local destination=$2 fetch "${url}" -o /tmp/file.tar.gz tar -xvf /tmp/file.tar.gz -C "${destination}" } # Copiar archivos move_files() { local source=$1 local destination=$2 mv "${source}" "${destination}" } # Crear snapshot create_snapshot() { local snapshot=$1 zfs snapshot "${snapshot}" } # Crear clon de snapshot create_clone() { local snapshot=$1 local clone=$2 zfs clone "${snapshot}" "${clone}" } # Crear enlace simbólico create_symlink() { local source=$1 local target=$2 ln -s "${source}" "${target}" } # Actualizar sistema base update_base_system() { local release=$1 env UNAME_r="${release}" freebsd-update -b "${ZFS_MOUNTPOINT_JAILS}/releases/${release}" fetch install } # Configurar resolv.conf y localtime configure_files() { local release=$1 cp /etc/resolv.conf "${ZFS_MOUNTPOINT_JAILS}/releases/${release}/etc/resolv.conf" cp /etc/localtime "${ZFS_MOUNTPOINT_JAILS}/releases/${release}/etc/localtime" } # Ejecutar acciones de postinstalación post_installation() { # Detener servicios de jail service jail stop db # Modificar base por la nueva release en /usr/local/jails/jail.fstab.d/ # Iniciar servicios de jail service jail start db # Actualizar paquetes en el jail pkg -j db update pkg -j db upgrade } # Crear datasets create_dataset_if_not_exists "${ZFS_DATASET_JAILS}" create_dataset_if_not_exists "${ZFS_DATASET_RELEASES}" "${ZFS_MOUNTPOINT_JAILS}/releases" create_dataset_if_not_exists "${ZFS_DATASET_TEMPLATES}" "${ZFS_MOUNTPOINT_JAILS}/templates" # Descargar y extraer archivos base, lib32 y ports if [ ! -d "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}" ]; then create_dataset_if_not_exists "${ZFS_USED_RELEASE}" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}" download_and_extract_file "ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${USED_RELEASE}/base.txz" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}" fi # Descargar y extraer lib32 si la variable lib32 es "Y" if [ "${lib32}" = "Y" ]; then download_and_extract_file "ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${USED_RELEASE}/lib32.txz" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}" fi # Descargar y extraer ports si la variable ports es "Y" if [ "${ports}" = "Y" ]; then download_and_extract_file "ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${USED_RELEASE}/ports.txz" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}" fi # Actualizar sistema base update_base_system "${USED_RELEASE}" # Configurar archivos configure_files "${USED_RELEASE}" # Crear snapshot create_snapshot "${ZFS_DATASET_RELEASES}/${USED_RELEASE}@p0" # Crear clon del snapshot como template base create_clone "${ZFS_DATASET_RELEASES}/${USED_RELEASE}@p0" "${ZFS_DATASET_TEMPLATES}/base-${USED_RELEASE}" # Crear dataset skeleton si no existe if ! zfs list "${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE}" >/dev/null 2>&1; then echo "Creating ${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE} dataset" zfs create "${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE}" else echo "Dataset ${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE} already exists" fi # Crear directorio skeleton y enlaces simbólicos if [ "${ports}" = "Y" ]; then mkdir -p "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/usr/ports/distfiles" fi mkdir -p "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/home" mkdir -p "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/portsbuild" move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/etc" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/etc" move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/tmp" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/tmp" chflags noschg ${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/var/empty move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/var" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/var" move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/root" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/root" move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/usr/local" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/usr/local" # Crear enlaces simbólicos cd ${ZFS_MOUNTPOINT_JAILS}/templates/base-$USED_RELEASE mkdir skeleton create_symlink "skeleton/etc" "etc" create_symlink "skeleton/home" "home" create_symlink "skeleton/root" "root" create_symlink "../skeleton/usr/local" "usr/local" if [ "${ports}" = "Y" ]; then create_symlink "skeleton/usr/ports/distfiles" "usr/ports/distfiles" fi create_symlink "skeleton/tmp" "tmp" create_symlink "skeleton/var" "var"