2025-09-05 09:42:21 +02:00

236 lines
8.4 KiB
Bash
Executable File

#!/bin/bash
#set -x
set -o posix
#set -u
#set -e
#+
# ===============
# make_usp_tar.sh
# ===============
# ---------------
# Fetch and tar a unsupported configuration setup.
# This script is only needed when target systems do
# not have wget access to the internet. To configure
# unsupported conigurations on these systems it will
# first be necessary to run this script on a system that
# does have access. Then copy access the resulting tar file,
# unpack and run the enclosed set_local_uspcfg script in a
# bash shell to complete the process. That script redefines/
# defines wget as a bash function to perform local copies
# from this unpacked tarball. If you wish to create a new
# configuration based on this local copy of an unsupported
# configuration in future sessions then you may need to
# redefine wget again before running makenemo with the
# appropriate -u setting. A simple script: def_wget is included
# for such situations.
# ---------------
# SYNOPSIS
# ========
# $ make_usp_tar.sh uspcfg.txt target_conf target_dir
# Note target_dir.tar will be created
#
# DESCRIPTION
# ===========
# - Extract target configuration details from uspcfg.txt
# - Create target directory
# - Recursively use wget to retrieve remote configuration files
# into target directory
# - Copy uspcfg.txt into target directory and alter remote paths
# to local (relative) versions
# - tar target_directory and remove originals
#----------------------------------------------------------------
#
#----------------------------------------------------------------
# Check the correct number of arguments have been provided
#----------------------------------------------------------------
#
if [ "$#" != "3" ]; then
echo "Expected usage: make_usp_tar.sh uspcfg.txt target_conf target_dir"
exit
fi
#
#----------------------------------------------------------------
# Check the named uspcfg.txt file exists
#----------------------------------------------------------------
#
if [ ! -f $1 ]; then
echo "named uspcfg.txt file does not exist ($1); attempt abandoned"
exit
fi
#
#----------------------------------------------------------------
# Check the requested configuration is listed in the named uspcfg.txt file
#----------------------------------------------------------------
#
inthere=$( grep -c "$2" $1 )
if [ "$inthere" -lt 1 ]; then
echo "requested configuration is not in named uspcfg.txt file ($2); attempt abandoned"
exit
fi
#
#----------------------------------------------------------------
# Create the target directory if it does not already exist
# and cd into it
#----------------------------------------------------------------
#
if [ ! -d $3 ]; then
mkdir $3
else
echo "target directory already exists; attempt abandoned"
exit
fi
basedir=$(pwd)
#
cd ${3}
#
#----------------------------------------------------------------
# Copy named uspcfg.txt file into target directory
#----------------------------------------------------------------
#
cp $basedir/$1 .
#
#----------------------------------------------------------------
# Extract information on target configuration and
# retrieve full file list from remote server
#----------------------------------------------------------------
#
grep "$2 " $1 > ./cfg.tmp
#
LOCAL_REF=$(cat cfg.tmp | awk 'BEGIN {FS = "#" }{print $2}')
TAB=$(cat cfg.tmp | awk 'BEGIN {FS = "#" }{print $3}')
REMOTE_CTL=$(cat cfg.tmp | awk 'BEGIN {FS = "#" }{print $4}')
wget ${REMOTE_CTL} -O remote_file.list
#
#----------------------------------------------------------------
# Retrieve each remote file and create local directory structure
# At the same time prepare a local version of the control file
# by replacing http links with a string that will be replaced later
# with a local directory path
#----------------------------------------------------------------
#
if [ -f remote_file.list ] ; then
cat remote_file.list | grep -v '^#' |
while
read remfile locfile
do
if [ $remfile == 'create_directory' ] ;then
mkdir $locfile
echo $remfile " " $locfile >> local_template.ctl
else
wget $remfile -O $locfile
remfile=$(echo $remfile | sed -e "s;.*$locfile;SET_LOCAL_DIRECTORY_HERE/$locfile;")
echo $remfile " " $locfile >> local_template.ctl
fi
done
else
echo "Unable to find remote_file.list. Attempt abandoned"
echo "Files may be left in "$(pwd)
exit
fi
#
#----------------------------------------------------------------
# Construct a modified version of the named uspcfg.txt file
# First copy across all the other untouched configuration listed
#----------------------------------------------------------------
#
grep -v "$2 " $1 > uspcfg_local_template.txt
#
#----------------------------------------------------------------
# Now append the modified entry, replacing http links as before
#----------------------------------------------------------------
#
cat cfg.tmp | sed -e "s;http.*$;SET_LOCAL_DIRECTORY_HERE/local.ctl;" >> uspcfg_local_template.txt
#
#
#----------------------------------------------------------------
# Construct a script that can be used later to complete a local installation
#----------------------------------------------------------------
#
cat > set_local_uspcfg << EOF
#!/bin/bash
if [ "\$( echo $SHELL | grep -c bash )" -lt 1 ]; then
echo "WARNING: This is only going to be effective in a bash shell"
echo "since it redefines the wget command as a bash function."
echo "(ignore this comment if you are in a bash shell)"
fi
basedir=\$(pwd)
#
echo "Enter full path to the CONFIG directory on your target system: "
read confdir
#
# Edit the local.ctl file to set the local directory path
#
sed -e "s;SET_LOCAL_DIRECTORY_HERE;\$basedir;" local_template.ctl > local.ctl
#
# Edit the uspcfg_local.txt file to set the local directory path
#
sed -e "s;SET_LOCAL_DIRECTORY_HERE;\$basedir;" uspcfg_local_template.txt > uspcfg_local.txt
#
# Install local versions in the named CONFIG directory
#
if [ -f \$confdir/uspcfg.txt ] && [ ! -L \$confdir/uspcfg.txt ]; then
mv \$confdir/uspcfg.txt \$confdir/uspcfg_remote.txt
echo "\$confdir/uspcfg.txt moved to \$confdir/uspcfg_remote.txt"
fi
if [ -f \$confdir/uspcfg_local.txt ]; then
echo "Existing uspcfg_local.txt file found in \$confdir"
echo "This has been moved to: "\$confdir/uspcfg_local.txt\$\$
mv \$confdir/uspcfg_local.txt \$confdir/uspcfg_local.txt\$\$
fi
mv uspcfg_local.txt \$confdir/uspcfg_local.txt
ln -s \$confdir/uspcfg_local.txt \$confdir/uspcfg.txt
#
# define/redefine the wget command
#
function wget {
if [ "\$2" != "-O" ]; then
echo "Expected wget usage: wget src -O dest"
echo "-O not found. No action taken"
else
cp \$1 \$3
fi
}
export -f wget
EOF
#----------------------------------------------------------------
# Construct a script that can be used later to just redefine wget
# in bash shell sessions
#----------------------------------------------------------------
#
cat > def_wget << EOFC
#!/bin/bash
if [ "\$( echo $SHELL | grep -c bash )" -lt 1 ]; then
echo "WARNING: This is only going to be effective in a bash shell"
echo "since it redefines the wget command as a bash function."
echo "(ignore this comment if you are in a bash shell)"
fi
function wget {
if [ "\$2" != "-O" ]; then
echo "Expected wget usage: wget src -O dest"
echo "-O not found. No action taken"
else
cp \$1 \$3
fi
}
export -f wget
EOFC
#----------------------------------------------------------------
# Make sure these scripts have execute permission
#----------------------------------------------------------------
chmod 755 set_local_uspcfg
chmod 755 def_wget
#
#----------------------------------------------------------------
# Tidy up and tar the contents of the downloaded configuration
#----------------------------------------------------------------
rm cfg.tmp
cd $basedir
tar cvf ${3}.tar $3
echo ${3}.tar " file successfully created and prepared for local references. Move this"
echo "tar file to your target system, unpack and run the set_local_uspcfg script in a "
echo "bash shell to complete the process. This script redefines/defines wget as a bash"
echo "function to perform local copies from this unpacked tarball. If you wish to create"
echo "a new configuration based on this local copy of an unsupported configuration in "
echo "future sessions then you may need to rerun the def_wget script"
exit