From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 396C229B0 for ; Mon, 28 Jul 2025 00:18:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.133 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753661884; cv=none; b=iKLdYqlReH+mwXHALbFQp1lOwThxeGP3BlvsuSKl1siF6TsCB/hTYLsKDkj2jJQjeKNnfnh99lO0GrrVm5bPHzorOsOl67M/4QMfvdAh3JuQlnFyNQ39v6DLZ5JYxwmDmfCleSdJt4jhFhefl4bGLvqV582WU1FK+O66FxIMBdA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753661884; c=relaxed/simple; bh=gKpmlitjblclPYlN/lTcqwofLll/8ljRm1SSoULerbU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m/ukF+DUh10fSHmA9GnZfkOLOA9gWIL6gCK/v89asbM8zL8PuKlimIgNL6gEHuq6aqHZe2nENd5+Rmhynr1kH3AFT+hZ0/PyJGJUnGVd4KPJaWYak178cQotezdjqTxmfzkuOnw8yD1ej1585JRJmo2bCn3+sC6ElwUcat4IpGE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=wo+Yx64q; arc=none smtp.client-ip=198.137.202.133 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="wo+Yx64q" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=U/FCXtmpxjpm/k30S6ANpFUWxvL8uOHK3lOqdcCuJbk=; b=wo+Yx64q0W3a6sLh+KdQyS2GxQ Y3lHD8A26HNQ7M0csQ4FcKXqClD0VkEO8n71/eHss8KpCfr6e8jcdEomJhkRfu+XfYrPzSf7aVWYn /AXhIOz1mCsxv+emeHBwKZX4wKtmBXO4moAzhZFoZPis+Vl7k8mIfr5ktmAP9Lsd9odowbypzKNOJ ZJB2VD1xuNJb+n29DCK6OZHIIfNgFN6ox+SMEHxsVLCstN5uNHD+tfxSf8kLSRxqbUNRkWoKXH3x7 duEqp2/Sv0cxj9HNVjDaRePtQ/Em2XqJT+vvQ19xzfqvwmnYEQE5kaUc/0lJzUDTOWUaw+FFGRw4u GFqkuijA==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1ugBZ3-0000000DNVX-3liO; Mon, 28 Jul 2025 00:18:01 +0000 From: Luis Chamberlain To: Chuck Lever , Daniel Gomez , kdevops@lists.linux.dev Cc: Luis Chamberlain Subject: [PATCH 03/40] scripts: remove Vagrant-specific scripts and Makefiles Date: Sun, 27 Jul 2025 17:17:22 -0700 Message-ID: <20250728001800.3188617-4-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250728001800.3188617-1-mcgrof@kernel.org> References: <20250728001800.3188617-1-mcgrof@kernel.org> Precedence: bulk X-Mailing-List: kdevops@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: Luis Chamberlain Remove all Vagrant-related scripts as Vagrant support has been removed: - vagrant.Makefile - Vagrant build targets - bringup_vagrant.sh - Vagrant VM bringup script - destroy_vagrant.sh - Vagrant VM cleanup script - prune_stale_vagrant.sh - Vagrant state cleanup script Generated-by: Claude AI Suggested-by: Chuck Lever Signed-off-by: Luis Chamberlain --- scripts/bringup_vagrant.sh | 101 -------------------- scripts/destroy_vagrant.sh | 30 ------ scripts/prune_stale_vagrant.sh | 164 --------------------------------- scripts/vagrant.Makefile | 109 ---------------------- 4 files changed, 404 deletions(-) delete mode 100755 scripts/bringup_vagrant.sh delete mode 100755 scripts/destroy_vagrant.sh delete mode 100755 scripts/prune_stale_vagrant.sh delete mode 100644 scripts/vagrant.Makefile diff --git a/scripts/bringup_vagrant.sh b/scripts/bringup_vagrant.sh deleted file mode 100755 index 4e163871..00000000 --- a/scripts/bringup_vagrant.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: copyleft-next-0.3.1 - -set -e - -source ${TOPDIR}/.config -source ${TOPDIR}/scripts/lib.sh - -# Convert the version string x.y.z to a canonical 5 or 6-digit form. -# Inspired by ld-version.sh on linux. This is the way. -get_canonical_version() -{ - IFS=. - set -- $1 - - # If the 2nd or 3rd field is missing, fill it with a zero. - # - # The 4th field, if present, is ignored. - # This occurs in development snapshots as in 2.35.1.20201116 - echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0})) -} - -_vagrant_lacks_parallel() -{ - PARALLEL_MISSING="0.7.0" - VAGRANT_LIBVIRT_VERSION="$(vagrant plugin list | sed -e 's|(| |g' | sed -e 's|,| |g' | awk '{print $2}')" - - OLD=$(get_canonical_version $PARALLEL_MISSING) - CURRENT=$(get_canonical_version $VAGRANT_LIBVIRT_VERSION) - if [[ "$CURRENT" -le "$OLD" ]]; then - return 1 - fi - return 0 -} - -vagrant_check_dups() -{ - NEW_POSSIBLE_INSTANCES=$(vagrant status --machine-readable | grep ",state," | awk -F"," '{print $2}') - EXISTING_USER_INSTANCES=$(vagrant global-status | grep -A 200 -e "-----" | grep -v -e "----" | grep -B 200 " " | awk '{print $2}') - for instance in $NEW_POSSIBLE_INSTANCES ; do - INSTANCE_STATE=$(vagrant status --machine-readable | grep ",state," | awk -F",${instance}," '{print $2}' |awk -F"," '{print $2}') - # We're dealing with a new local instance which is not created - # yet. Now we check to see if globally this user doesn't have - # an existing instance already created. - if [[ "$INSTANCE_STATE" == "not_created" ]]; then - INSTANCE_NEW="true" - for old_instance in $EXISTING_USER_INSTANCES; do - # An older instance already exists, complain - if [[ "$instance" == "$old_instance" ]]; then - INSTANCE_NEW="false" - break - fi - done - # At this point we're only dealing with not_created - # instances *and* we know one does not exist in another - # directory for this user. - - kdevops_pool_path="$CONFIG_LIBVIRT_STORAGE_POOL_PATH" - # For libvirt we can do one more global sanity check - if [[ "$CONFIG_LIBVIRT" == "y" ]]; then - possible_image="${kdevops_pool_path}/vagrant_${instance}.img" - if [[ -f $possible_image ]]; then - echo "Image for instance $instance already exists ($possible_image), skippin bringup wipe of spare drives ..." - continue - fi - fi - - # If we don't do this, old spare drives might be - # left over and we'd be using them up again. - spare_drive_instance_dir="${kdevops_pool_path}/kdevops/$instance" - if [[ -d ${spare_drive_instance_dir} ]]; then - echo "Wiping old instance spare drive directory ... $spare_drive_instance_dir" - rm -rf ${kdevops_pool_path}/kdevops/$instance - fi - fi - done -} - -# This is just a workaround for fedora since we have an old vagrant-libvirt -# plugin that doesn't work with parallel -ARG= -if ! _vagrant_lacks_parallel; then - ARG='--no-parallel' -fi -cd vagrant -if [[ "$CONFIG_VAGRANT_BOX_UPDATE_ON_BRINGUP" == "y" ]]; then - if [[ ! -f $(basename "$KDEVOPS_VAGRANT_PROVISIONED") ]]; then - vagrant box update - fi -fi -if [[ "$CONFIG_VAGRANT_VALIDATE_BEFORE_BRINGUP" == "y" ]]; then - vagrant validate - if [[ $? -ne 0 ]]; then - echo "kdevops: Failed to validate Vagrantfile, stopping here" - exit 1 - fi -fi - -vagrant_check_dups - -vagrant up $ARG diff --git a/scripts/destroy_vagrant.sh b/scripts/destroy_vagrant.sh deleted file mode 100755 index bd5e43d0..00000000 --- a/scripts/destroy_vagrant.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: copyleft-next-0.3.1 - -set -e - -source ${TOPDIR}/.config -source ${TOPDIR}/scripts/lib.sh - -cd vagrant -vagrant destroy -f -# Make sure the user can nuke this stuff -sudo chgrp $USER . .vagrant -sudo chmod g+rwx . .vagrant -rm -rf .vagrant - -# These are not initilized instances, our current directory possible -# instances. If you're running 'make destroy' you know what you are -# doing so we don't check for global dups or anything like that. -UNINIT_CURRENT_INSTANCES=$(vagrant status --machine-readable | grep ",state," | grep not_created | awk -F "," '{print $2}') -for i in $UNINIT_CURRENT_INSTANCES; do - UNINIT_INSTANCE_SPARE_DRIVE_DIR="${CONFIG_LIBVIRT_STORAGE_POOL_PATH}/kdevops/$i" - if [[ -d $UNINIT_INSTANCE_SPARE_DRIVE_DIR ]]; then - echo "Found unitialized (possibly old) instance spare drive directory, removing it ... $i" - rm -rf $UNINIT_INSTANCE_SPARE_DRIVE_DIR - fi -done - -if [[ -f $(basename "$KDEVOPS_VAGRANT_PROVISIONED") ]]; then - rm -f $(basename "$KDEVOPS_VAGRANT_PROVISIONED") ]]; -fi diff --git a/scripts/prune_stale_vagrant.sh b/scripts/prune_stale_vagrant.sh deleted file mode 100755 index 61ac0e86..00000000 --- a/scripts/prune_stale_vagrant.sh +++ /dev/null @@ -1,164 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: copyleft-next-0.3.1 - -set -e - -source .config -source scripts/lib.sh - -SUDO_REQ="sudo" -EVALUATE="false" -THIS_SCRIPT=$0 - -run_prune_path() -{ - EVAL_ARGS="" - if [[ "$1" == "true" ]]; then - EVAL_ARGS="--evaluate" - fi - POOLS=$($SUDO_REQ virsh pool-list | grep -A 2000 -e "---" | grep -v -e "---" | awk '{print $1}') - for p in $POOLS; do - POOL_PATH=$($SUDO_REQ virsh pool-dumpxml $p | grep path | sed -e 's|||' | sed -e 's|||' | awk '{print $1}') - echo "Evaluating pool $p with path $POOL_PATH ..." - $THIS_SCRIPT $EVAL_ARGS $POOL_PATH - if [[ $? -ne 0 ]]; then - echo "Inspect pool $p there is something odd with it or its empty and unused" - fi - done -} - -if [[ "$CONFIG_LIBVIRT_URI_SESSION" == "y" ]]; then - SUDO_REQ="" -fi - -if [[ "$CONFIG_LIBVIRT" != "y" ]]; then - echo "Only libvirt is supported at this time for this prune" - exit 1 -fi - -if [[ $# -eq 0 ]]; then - KDEVOPS_POOL_PATH="$CONFIG_LIBVIRT_STORAGE_POOL_PATH" -elif [[ $# -eq 1 ]]; then - if [[ "$1" == "--help" ]]; then - echo "Usage: $0" - echo " --evaluate -- evaluates how much savings you could on your configured pool" - echo " --evaluate -- evaluates how much savings you could on a specific pool path" - echo " --prune-eval-pools -- evaluates how much savings you could save if we tried to prune all kdevops pools" - echo " --prune-pools -- prunes all pools found for kdevops" - exit - elif [[ "$1" == "--prune-pools" ]]; then - echo unsupported - exit 1 - run_prune_path false - exit - elif [[ "$1" == "--prune-eval-pools" ]]; then - run_prune_path true - exit - else - KDEVOPS_POOL_PATH="$1" - fi -elif [[ $# -eq 2 ]]; then - if [[ "$1" == "--evaluate" ]]; then - EVALUATE="true" - KDEVOPS_POOL_PATH="$2" - else - echo "Usage: $0 --evaluate | $0 | $0 " - exit - fi -else - echo "Usage: $0 --evaluate | $0 | $0 " - exit -fi - -if [[ ! -d $KDEVOPS_POOL_PATH ]]; then - echo "$KDEVOPS_POOL_PATH does not exist, no need to prune, maybe destroy and undefine this pool" - echo "Consider running the following if this is a stale pool:" - echo "$SUDO_REQ virsh pool-destroy " - echo "$SUDO_REQ virsh pool-undefine " - exit 1 -fi - -HOMES=$(cat /etc/passwd| awk -F":" '{print $6}') -for i in $HOMES; do - if [[ "$KDEVOPS_POOL_PATH" == "$i" || "$KDEVOPS_POOL_PATH" == "$i/" ]]; then - echo "Skipping odd pool on a home directory $i" - exit 1 - fi -done - -EXISTING_USAGE=$(du -hs $KDEVOPS_POOL_PATH) -EXISTING_USAGE_BYTES=$(du -s --block-size=1 $KDEVOPS_POOL_PATH | awk '{print $1}') - -echo -e "Existing disk usage:\n$EXISTING_USAGE" - -ALL_LIBVIRT_INSTANCES=$($SUDO_REQ virsh list --all --title | grep -A 200 -e "----" | grep -v -e "---" | awk '{print $2}') - -BYTES_COULD_SAVE=0 - -# Scan the libvirt images with a vagrant prefix images not registered somehow -# to libvirt. This would be odd. We ignore libvirt images not related to -# vagrant. -for i in ${KDEVOPS_POOL_PATH}/vagrant_*.img; do - EXISTS="n" - IMAGE_INSTANCE=$(basename ${i%*.img}) - for INSTANCE in $ALL_LIBVIRT_INSTANCES; do - if [[ "$INSTANCE" == "$IMAGE_INSTANCE" ]]; then - EXISTS="y" - fi - done - if [[ "$EXISTS" == "n" ]]; then - echo "Instance $IMAGE_INSTANCE does not exist and is therefore stale" - if [[ "$EVALUATE" == "true" ]]; then - BYTES=$(du -s --block-size=1 $i | awk '{print $1}') - let BYTES_COULD_SAVE=$BYTES_COULD_SAVE+BYTES - else - rm -rf $i - fi - fi -done - -# Now scan only the spare kdevops drives. Since we're only looking -# at the kdevops directory we are ignoring non-kdevops instances -# data. -for i in ${KDEVOPS_POOL_PATH}/kdevops/*; do - EXISTS="n" - if [[ ! -d $i ]]; then - continue - fi - DIR=$(basename $i) - for INSTANCE in $ALL_LIBVIRT_INSTANCES; do - if [[ "vagrant_${DIR}" == "$INSTANCE" ]]; then - EXISTS="y" - fi - done - if [[ "$EXISTS" == "n" ]]; then - echo "Spare kdevops drive exists without any instance: $DIR" - if [[ "$EVALUATE" == "true" ]]; then - BYTES=$(du -s --block-size=1 $i | awk '{print $1}') - let BYTES_COULD_SAVE=$BYTES_COULD_SAVE+BYTES - else - rm -rf $i - fi - fi -done - - -if [[ "$EVALUATE" == "true" ]]; then - if [[ "$BYTES_COULD_SAVE" == "0" ]]; then - echo "Nothing to prune on $KDEVOPS_POOL_PATH" - else - echo "You could save $BYTES_COULD_SAVE bytes ( $((BYTES_COULD_SAVE/1024/1024)) MiB or $((BYTES_COULD_SAVE/1024/1024/1024)) GiB $((BYTES_COULD_SAVE/1024/1024/1024/1024)) TiB)" - fi -else - AFTER_USAGE_BYTES=$(du -s --block-size=1 $KDEVOPS_POOL_PATH | awk '{print $1}') - DELTA=0 - DELTA=$((EXISTING_USAGE_BYTES-AFTER_USAGE_BYTES)) - - AFTER_USAGE=$(du -hs $KDEVOPS_POOL_PATH) - echo -e "After prune disk usage:\n$AFTER_USAGE" - if [[ $DELTA == "0" ]]; then - echo "No disk savings after prune" - else - echo "Saved $DELTA bytes ( $((DELTA/1024/1024)) MiB or $((DELTA/1024/1024/1024)) GiB $((DELTA/1024/1024/1024/1024)) TiB)" - fi -fi diff --git a/scripts/vagrant.Makefile b/scripts/vagrant.Makefile deleted file mode 100644 index e43a21d3..00000000 --- a/scripts/vagrant.Makefile +++ /dev/null @@ -1,109 +0,0 @@ -# SPDX-License-Identifier: copyleft-next-0.3.1 - -VAGRANT_ARGS := - -KDEVOPS_NODES_TEMPLATE := $(KDEVOPS_NODES_ROLE_TEMPLATE_DIR)/kdevops_nodes_split_start.j2.yaml -KDEVOPS_NODES := vagrant/kdevops_nodes.yaml - -KDEVOPS_VAGRANT_TEMPLATE := $(KDEVOPS_NODES_ROLE_TEMPLATE_DIR)/Vagrantfile.j2 -KDEVOPS_VAGRANT_GENERATED:= vagrant/.Vagrantfile.generated -KDEVOPS_VAGRANT := vagrant/Vagrantfile - -export KDEVOPS_PROVISIONED_SSH := $(KDEVOPS_PROVISIONED_SSH_DEFAULT_GUARD) - -KDEVOPS_MRPROPER += $(KDEVOPS_VAGRANT_GENERATED) -KDEVOPS_MRPROPER += $(KDEVOPS_VAGRANT) - -VAGRANT_ARGS += kdevops_vagrant_template_full_path='$(TOPDIR_PATH)/$(KDEVOPS_VAGRANT_TEMPLATE)' - -VAGRANT_ARGS += kdevops_enable_vagrant=True -VAGRANT_ARGS += kdevops_vagrant='$(KDEVOPS_VAGRANT)' -VAGRANT_ARGS += kdevops_vagrant_generated='$(KDEVOPS_VAGRANT_GENERATED)' -VAGRANT_ARGS += kdevops_vagrant_template='$(KDEVOPS_VAGRANT_TEMPLATE)' - -VAGRANT_ARGS += data_user='vagrant' -VAGRANT_ARGS += data_vagrant='vagrant' - -ifeq (y,$(CONFIG_HAVE_VAGRANT_BOX_URL)) -VAGRANT_PRIVATE_BOX_DEPS := vagrant_private_box_install -else -VAGRANT_PRIVATE_BOX_DEPS := -endif - -ifeq (y,$(CONFIG_LIBVIRT)) -VAGRANT_ARGS += libvirt_provider=True - -QEMU_GROUP:=$(subst ",,$(CONFIG_LIBVIRT_QEMU_GROUP)) -VAGRANT_ARGS += kdevops_storage_pool_group='$(QEMU_GROUP)' -VAGRANT_ARGS += storage_pool_group='$(QEMU_GROUP)' -endif - -ifeq (y,$(CONFIG_VAGRANT_VIRTUALBOX)) -VAGRANT_ARGS += virtualbox_provider=True -endif - -VAGRANT_9P_HOST_CLONE := -ifeq (y,$(CONFIG_BOOTLINUX_9P)) -VAGRANT_9P_HOST_CLONE := vagrant_9p_linux_clone -endif - -LIBVIRT_PCIE_PASSTHROUGH := -ifeq (y,$(CONFIG_KDEVOPS_LIBVIRT_PCIE_PASSTHROUGH)) -LIBVIRT_PCIE_PASSTHROUGH := libvirt_pcie_passthrough_permissions -endif - -ifneq ($(strip $(CONFIG_RHEL_ORG_ID)),) -ifneq ($(strip $(CONFIG_RHEL_ACTIVATION_KEY)),) -RHEL_ORG_ID:=$(subst ",,$(CONFIG_RHEL_ORG_ID)) -RHEL_ACTIVATION_KEY:=$(subst ",,$(CONFIG_RHEL_ACTIVATION_KEY)) -VAGRANT_ARGS += rhel_org_id="$(RHEL_ORG_ID)" -VAGRANT_ARGS += rhel_activation_key="$(RHEL_ACTIVATION_KEY)" -endif -endif - -EXTRA_VAR_INPUTS += extend-extra-args-vagrant -ANSIBLE_EXTRA_ARGS += $(VAGRANT_ARGS) - -VAGRANT_BRINGUP_DEPS := -VAGRANT_BRINGUP_DEPS += $(VAGRANT_PRIVATE_BOX_DEPS) -VAGRANT_BRINGUP_DEPS += $(VAGRANT_9P_HOST_CLONE) -VAGRANT_BRINGUP_DEPS += $(LIBVIRT_PCIE_PASSTHROUGH) - -KDEVOPS_PROVISION_METHOD := bringup_vagrant -KDEVOPS_PROVISION_DESTROY_METHOD := destroy_vagrant - -extend-extra-args-vagrant: - @if [[ "$(CONFIG_HAVE_VAGRANT_BOX_URL)" == "y" ]]; then \ - echo "kdevops_install_vagrant_boxes: True" >> $(KDEVOPS_EXTRA_VARS) ;\ - echo "vagrant_boxes:" >> $(KDEVOPS_EXTRA_VARS) ;\ - echo " - { name: '$(CONFIG_VAGRANT_BOX)', box_url: '$(CONFIG_VAGRANT_BOX_URL)' }" >> $(KDEVOPS_EXTRA_VARS) ;\ - fi - -vagrant_private_box_install: - $(Q)ansible-playbook $(ANSIBLE_VERBOSE) -i \ - $(KDEVOPS_HOSTFILE) $(KDEVOPS_PLAYBOOKS_DIR)/install_vagrant_boxes.yml - -vagrant_9p_linux_clone: - $(Q)make linux-clone - -libvirt_pcie_passthrough_permissions: - $(Q)ansible-playbook $(ANSIBLE_VERBOSE) --connection=local \ - --inventory localhost, \ - playbooks/libvirt_pcie_passthrough.yml - -$(KDEVOPS_PROVISIONED_SSH): - $(Q)if [[ "$(CONFIG_KDEVOPS_SSH_CONFIG_UPDATE)" == "y" ]]; then \ - ansible-playbook $(ANSIBLE_VERBOSE) --connection=local \ - --inventory localhost, \ - playbooks/update_ssh_config_vagrant.yml - fi - $(Q)touch $(KDEVOPS_PROVISIONED_SSH) - -bringup_vagrant: $(VAGRANT_BRINGUP_DEPS) - $(Q)$(TOPDIR)/scripts/bringup_vagrant.sh -PHONY += bringup_vagrant - -destroy_vagrant: - $(Q)$(TOPDIR)/scripts/destroy_vagrant.sh - $(Q)rm -f $(KDEVOPS_PROVISIONED_SSH) - $(Q)rm -f $(KDEVOPS_PROVISIONED_SSH) $(KDEVOPS_PROVISIONED_DEVCONFIG) -- 2.47.2