segfault/provision/update.sh
2022-11-29 10:26:12 +00:00

78 lines
2.1 KiB
Bash
Executable File

#! /bin/bash
# Admin Tool - Update /sf/bin and other directories
# Called when upgrading a version of segfault without going
# through a full reinstall and showing the difference
#
# make
# provison/update.sh
SFI_SRCDIR="$(cd "$(dirname "${0}")/.." || exit; pwd)"
# shellcheck disable=SC1091
source "${SFI_SRCDIR}/provision/system/funcs" || exit 255
NEED_ROOT
ENV_LOAD "${SFI_SRCDIR}/.env" add || ERREXIT 250 "Failed to load .env"
[[ -z $SF_BASEDIR ]] && ERREXIT 255 "SF_BASEDIR= not set"
[[ ! -d "$SF_BASEDIR" ]] && ERREXIT 255 "Directory not found (SF_BASEDIR=): $SF_BASEDIR"
# [mode] [file] [dest-file]
merge_file()
{
local mode
local sfn
local dfn
mode="$1"
sfn="$2"
dfn="$3"
[[ -d "${dfn}" ]] && ERREXIT 240 "Not a file: ${dfn}"
[[ -d "${sfn}" ]] && ERREXIT 240 "Not a file: ${sfn}"
(
IFS=""
[[ "${sfn}" -ef "${dfn}" ]] && return # Symlink
[[ -e "${dfn}" ]] && {
# Already installed
[[ $mode == "diff" ]] && {
res=$(diff --color=always -u "${dfn}" "${sfn}")
[[ $? -gt 1 ]] && ERREXIT 240 "diff failed"
[[ -z $res ]] && return
echo -e "${CDY}Please merge ${CY}${sfn}${CN} -> ${CY}${dfn}${CN}"
echo "$res"
return
}
[[ $mode == "force" ]] && {
# Return if identical (no update needed)
[[ $(MD5F "$sfn") == $(MD5F "${dfn}") ]] && return
}
}
echo -e "${CDG}Installing ${CG}${dfn}${CDG}...${CN}"
cp -a "${sfn}" "${dfn}" || ERREXIT
)
}
merge()
{
local mode
local sdir
local ddir
mode="$1"
sdir="$2"
ddir="$3"
cd "${sdir}" || ERREXIT 255
find . -type f | while read f; do
merge_file "${mode}" "${f}" "${ddir}/${f}"
done
}
merge_file force "${SFI_SRCDIR}/config/etc/sf/WARNING---SHARED-BETWEEN-ALL-SERVERS---README.txt" "${SF_BASEDIR}/config/etc/sf/WARNING---SHARED-BETWEEN-ALL-SERVERS---README.txt"
merge_file force "${SFI_SRCDIR}/config/etc/hosts" "${SF_BASEDIR}/config/etc/hosts"
merge_file force "${SFI_SRCDIR}/config/etc/resolv.conf" "${SF_BASEDIR}/config/etc/resolv.conf"
merge force "${SFI_SRCDIR}/sfbin" "${SF_BASEDIR}/sfbin"
merge diff "${SFI_SRCDIR}/config" "${SF_BASEDIR}/config"
merge_file diff "${SFI_SRCDIR}/provision/env.example" "${SFI_SRCDIR}/.env"