267 lines
5.6 KiB
Bash
Executable File
267 lines
5.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
|
|
|
|
# --- utility functions ---
|
|
|
|
p_echo()
|
|
{
|
|
echo "$@" >&2
|
|
}
|
|
|
|
write() {
|
|
|
|
local filename="$1"
|
|
|
|
local directory=`dirname "$filename"`
|
|
mkdirectory "$directory"
|
|
if [ "x$?" != "x0" ] ; then
|
|
ERROR=$?
|
|
p_echo "Can not create directory $directory"
|
|
return $ERROR
|
|
fi
|
|
|
|
# Check target file can be replaced
|
|
if [ -f "$filename" ] ; then
|
|
if [ ! -w "$filename" -o ! -r "$filename" ] ; then
|
|
p_echo "Can not read/write to $filename"
|
|
return 100
|
|
fi
|
|
fi
|
|
|
|
# Put new content into temporary file
|
|
local tmpfile
|
|
tmpfile=`mktemp "$filename".XXXXXX`
|
|
if [ "x$?" != "x0" -o ! -w "$tmpfile" ] ; then
|
|
p_echo "Can not create temporary file $tmpfile"
|
|
return 101
|
|
fi
|
|
|
|
# Correct owner & permissions
|
|
chown "$FILE_OWNERGROUP" "$tmpfile" && chmod "$FILE_PERMS" "$tmpfile"
|
|
|
|
cat > "$tmpfile"
|
|
if [ "x$?" != "x0" ] ; then
|
|
p_echo "Error writing to $tmpfile"
|
|
rm -f "$tmpfile"
|
|
return 101
|
|
fi
|
|
|
|
# Check that new file is not empty
|
|
if [ ! -s "$tmpfile" ] ; then
|
|
p_echo "No or empty input supplied on utility's standard input stream!"
|
|
rm -f "$tmpfile"
|
|
return 101
|
|
fi
|
|
|
|
# Commit changes to target file (disable interactivity in mv)
|
|
mv -f "$tmpfile" "$filename"
|
|
if [ "x$?" != "x0" ] ; then
|
|
ERROR=$?
|
|
rm -f "$tmpfile"
|
|
return $ERROR
|
|
fi
|
|
|
|
return $?
|
|
}
|
|
|
|
mklink() {
|
|
if ! echo "$1" | grep -q ':' 2>/dev/null; then
|
|
p_echo "Invalid format for mklink: wait source:destinstation, got $1"
|
|
return 102
|
|
fi
|
|
|
|
local filename="${1%%:*}"
|
|
local destination="${1#*:}"
|
|
local directory=`dirname "$filename"`
|
|
local destination_directory=`dirname "$destination"`
|
|
|
|
if ! [ -d "$directory" -a -f "$filename" ]; then
|
|
p_echo "Path $filename doesn't exist"
|
|
return 100
|
|
fi
|
|
|
|
if [ ! -d "$destination_directory" ]; then
|
|
p_echo "Destination directory '$destination_directory' not exist"
|
|
return 100
|
|
fi
|
|
|
|
if [ -f "$destination" -a ! -L "$destination" ]; then
|
|
p_echo "Refusing to create symlink '$destination': file with the same name already exists"
|
|
return 101
|
|
fi
|
|
|
|
local fname=`basename "$filename"`
|
|
local lnkname="last_${fname#*_}"
|
|
# Create convenience symlink to last written config
|
|
pushd "$directory"
|
|
if [ ! -f "$lnkname" -o -L "$lnkname" ] ; then
|
|
ln -snfT "$fname" "$lnkname"
|
|
else
|
|
p_echo "Refusing to create symlink '$directory/$lnkname': file with the same name already exists"
|
|
ERROR=101
|
|
fi
|
|
popd
|
|
# Create symlink for argument
|
|
ln -snfT "$filename" "$destination"
|
|
local tmp_err="$?"
|
|
[ "$tmp_err" = "0" ] || ERROR="$tmp_err"
|
|
|
|
return $ERROR
|
|
}
|
|
|
|
mkdirectory() {
|
|
|
|
local path="$1"
|
|
|
|
if [ -d "$path" ] ; then
|
|
return 0
|
|
fi
|
|
|
|
if [ -e "$path" ] ; then
|
|
p_echo "File $path already exists"
|
|
return 100
|
|
fi
|
|
|
|
mkdir "$path"
|
|
if [ "x$?" != "x0" ] ; then
|
|
ERROR=$?
|
|
return $ERROR
|
|
fi
|
|
|
|
chmod "$DIR_PERMS" "$path"
|
|
if [ "x$?" != "x0" ] ; then
|
|
ERROR=$?
|
|
return $ERROR
|
|
fi
|
|
chown "$DIR_OWNERGROUP" "$path"
|
|
if [ "x$?" != "x0" ] ; then
|
|
ERROR=$?
|
|
return $ERROR
|
|
fi
|
|
|
|
return $?
|
|
}
|
|
|
|
check() {
|
|
local id file
|
|
while read data; do
|
|
if [ "x$data" != "x" ]; then
|
|
id=${data%%:*};
|
|
file=${data#*:};
|
|
if [ ! -f $file ]; then
|
|
echo "$id:File '$file' not found";
|
|
fi
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
backup_file() {
|
|
|
|
local filename="$1"
|
|
|
|
[ ! -f "$filename" ] && return 0
|
|
|
|
cp -f "$filename" "$filename.bak"
|
|
chown "$FILE_OWNERGROUP" "$filename.bak" && chmod "$FILE_PERMS" "$filename.bak"
|
|
|
|
return $?
|
|
}
|
|
|
|
restore_file() {
|
|
|
|
local filename="$1"
|
|
|
|
[ ! -f "$filename.bak" ] && return 0
|
|
|
|
cp -f "$filename.bak" "$filename"
|
|
chown "$FILE_OWNERGROUP" "$filename" && chmod "$FILE_PERMS" "$filename"
|
|
|
|
return $?
|
|
}
|
|
#!/usr/bin/env bash
|
|
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
|
|
|
|
usage() {
|
|
cat << EOH
|
|
|
|
Usage: $0 [options]
|
|
|
|
Helper utility to manage Apache configuration files
|
|
|
|
OPTIONS:
|
|
-t - Test current configuration of web server.
|
|
-d dir - Create directory.
|
|
-w file - Write content from stdin to the specified file.
|
|
-b file - Create backup copy of specified file.
|
|
-r file - Restore backup copy of specified file if present.
|
|
-l file:destination - Switch or create symlink to the specified file
|
|
and switch or create 'last_*' symlink
|
|
-c - Read configuration files list from stdin and check their
|
|
their presence. Each line should be like '<id>:<filepath>'.
|
|
|
|
EOH
|
|
}
|
|
|
|
set_params()
|
|
{
|
|
DIR_OWNERGROUP="www-data":"psacln"
|
|
DIR_PERMS=770
|
|
FILE_OWNERGROUP="root":"www-data"
|
|
FILE_PERMS=600
|
|
}
|
|
|
|
# --- script ---
|
|
|
|
if [ $# -eq 0 ] ; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
getopts "td:w:l:cb:r:" OPTION
|
|
|
|
set_params
|
|
|
|
ERROR=0
|
|
case $OPTION in
|
|
t)
|
|
[ ! -e "/etc/apache2/envvars" ] || source /etc/apache2/envvars
|
|
/usr/sbin/apache2ctl -t
|
|
ERROR=$?
|
|
;;
|
|
d)
|
|
mkdirectory "$OPTARG"
|
|
ERROR=$?
|
|
;;
|
|
w)
|
|
write "$OPTARG"
|
|
ERROR=$?
|
|
;;
|
|
l)
|
|
mklink "$OPTARG"
|
|
ERROR=$?
|
|
;;
|
|
c)
|
|
check
|
|
ERROR=$?
|
|
;;
|
|
b)
|
|
backup_file "$OPTARG"
|
|
ERROR=$?
|
|
;;
|
|
r)
|
|
restore_file "$OPTARG"
|
|
ERROR=$?
|
|
;;
|
|
*)
|
|
usage
|
|
ERROR=1
|
|
;;
|
|
esac
|
|
|
|
exit $ERROR
|
|
|
|
#
|
|
# Helper utility for file operations with Apache's configuration files.
|
|
#
|