#!/bin/sh set -e TARGET_DIR="$1" FIREWALL_SERVICES_YANG="$2" FIREWALL_DAEMON_DIR="${TARGET_DIR}/usr/lib/firewalld" # Cleanup — remove unnecessary firewalld files and create required directories cleanup() { rm -rf "${TARGET_DIR}/etc/firewall"* rm -f "${TARGET_DIR}/usr/bin/firewall-applet" rm -rf "${TARGET_DIR}/usr/share/firewalld" # Keep only the three zones required by firewalld (core/fw.py) find "${FIREWALL_DAEMON_DIR}/zones" -type f \ ! -name block.xml \ ! -name drop.xml \ ! -name trusted.xml \ -delete mkdir -p "${TARGET_DIR}/etc/firewalld/zones" mkdir -p "${TARGET_DIR}/etc/firewalld/policies" mkdir -p "${TARGET_DIR}/etc/firewalld/services" touch "${TARGET_DIR}/etc/firewalld/firewalld.conf" mkdir -p "${FIREWALL_DAEMON_DIR}/services" } # Prune services — keep only those that match YANG enums prune_services() { if [ ! -f "${FIREWALL_SERVICES_YANG}" ]; then echo "ERROR: ${FIREWALL_SERVICES_YANG} not found" exit 1 fi # Extract enum values from YANG model ENUMS=$(grep 'enum "' "${FIREWALL_SERVICES_YANG}" | \ sed 's/.*enum "\([^"]*\)".*/\1/') # Validate that all YANG enums have corresponding .xml files MISSING=0 for service in ${ENUMS}; do if [ ! -f "${FIREWALL_DAEMON_DIR}/services/${service}.xml" ]; then echo "Service ${service} is not a known firewalld service" MISSING=1 fi done if [ ${MISSING} -eq 1 ]; then exit 1 fi # Remove .xml files that are not in YANG enums cd "${FIREWALL_DAEMON_DIR}/services/" for xmlfile in *.xml; do service="${xmlfile%.xml}" if ! echo "${ENUMS}" | grep -q "^${service}$"; then rm "${xmlfile}" fi done } # Mark built-in zones and policies as immutable mark_builtins() { FIREWALL_XML_FILES="${FIREWALL_DAEMON_DIR}/policies/*.xml ${FIREWALL_DAEMON_DIR}/zones/*.xml" for xmlfile in ${FIREWALL_XML_FILES}; do [ -f "${xmlfile}" ] || continue grep -q "(immutable)" "${xmlfile}" && continue if grep -q '' "${xmlfile}"; then sed -i 's|\(.*\)|\1 (immutable)|' \ "${xmlfile}" else if echo "${xmlfile}" | grep -q "/policies/"; then sed -i 's|(immutable)\n&|' \ "${xmlfile}" else sed -i 's|(immutable)\n&|' \ "${xmlfile}" fi fi done } cleanup prune_services mark_builtins