Custom Dockerfile-based build for an Ignition Edge gateway with pre-baked base gwbk, module registration, and admin password provisioning, backed by MariaDB.
126 lines
4.7 KiB
Bash
Executable File
126 lines
4.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
shopt -s inherit_errexit
|
|
|
|
###############################################################################
|
|
# Performs auto-acceptance of EULA and import of certificates for third-party modules
|
|
###############################################################################
|
|
function main() {
|
|
if [ ! -f "${MODULE_LOCATION}" ]; then
|
|
echo ""
|
|
return 0 # Silently exit if there is no /modules path
|
|
elif [ ! -f "${DB_LOCATION}" ]; then
|
|
echo "WARNING: ${DB_FILE} not found, skipping module registration"
|
|
return 0
|
|
fi
|
|
|
|
register_module
|
|
}
|
|
|
|
###############################################################################
|
|
# Register the module with the target Config DB
|
|
###############################################################################
|
|
function register_module() {
|
|
local SQLITE3=( sqlite3 "${DB_LOCATION}" )
|
|
|
|
# Tie into db
|
|
local keytool module_sourcepath
|
|
module_basename=$(basename "${MODULE_LOCATION}")
|
|
module_sourcepath=${MODULE_LOCATION}
|
|
keytool=$(which keytool)
|
|
|
|
echo "Processing Module: ${module_basename}"
|
|
|
|
# Populate CERTIFICATES table
|
|
local cert_info subject_name thumbprint next_certificates_id thumbprint_already_exists
|
|
cert_info=$( unzip -qq -c "${module_sourcepath}" certificates.p7b | $keytool -printcert -v | head -n 9 )
|
|
thumbprint=$( echo "${cert_info}" | grep -A 2 "Certificate fingerprints" | grep SHA1 | cut -d : -f 2- | sed -e 's/\://g' | awk '{$1=$1;print tolower($0)}' )
|
|
subject_name=$( echo "${cert_info}" | grep -m 1 -Po '^Owner: CN=\K(.+?)(?=, (OU|O|L|ST|C)=)' | sed -e 's/"//g' )
|
|
echo " Thumbprint: ${thumbprint}"
|
|
echo " Subject Name: ${subject_name}"
|
|
next_certificates_id=$( "${SQLITE3[@]}" "SELECT COALESCE(MAX(CERTIFICATES_ID)+1,1) FROM CERTIFICATES" )
|
|
thumbprint_already_exists=$( "${SQLITE3[@]}" "SELECT 1 FROM CERTIFICATES WHERE lower(hex(THUMBPRINT)) = '${thumbprint}'" )
|
|
if [ "${thumbprint_already_exists}" != "1" ]; then
|
|
echo " Accepting Certificate as CERTIFICATES_ID=${next_certificates_id}"
|
|
"${SQLITE3[@]}" "INSERT INTO CERTIFICATES (CERTIFICATES_ID, THUMBPRINT, SUBJECTNAME) VALUES (${next_certificates_id}, x'${thumbprint}', '${subject_name}'); UPDATE SEQUENCES SET val=${next_certificates_id} WHERE name='CERTIFICATES_SEQ'"
|
|
else
|
|
echo " Thumbprint already found in CERTIFICATES table, skipping INSERT"
|
|
fi
|
|
|
|
# Populate EULAS table
|
|
local next_eulas_id license_crc32 module_id
|
|
local -i module_id_check
|
|
next_eulas_id=$( "${SQLITE3[@]}" "SELECT COALESCE(MAX(EULAS_ID)+1,1) FROM EULAS" )
|
|
license_filename=$( unzip -qq -c "${module_sourcepath}" module.xml | grep -oP '(?<=<license>).*(?=</license)' )
|
|
license_crc32=$( unzip -qq -c "${module_sourcepath}" "${license_filename}" | gzip -c | tail -c8 | od -t u4 -N 4 -A n | cut -c 2- )
|
|
module_id=$( unzip -qq -c "${module_sourcepath}" module.xml | grep -oP '(?<=<id>).*(?=</id)' )
|
|
module_id_check=$( "${SQLITE3[@]}" "SELECT CASE WHEN CRC=${license_crc32} THEN -1 ELSE 1 END FROM EULAS WHERE MODULEID='${module_id}'" )
|
|
if (( module_id_check == 1 )); then
|
|
echo " Removing previous EULAS entries for MODULEID='${module_id}'"
|
|
"${SQLITE3[@]}" "DELETE FROM EULAS WHERE MODULEID='${module_id}'"
|
|
fi
|
|
if (( module_id_check >= 0 )); then
|
|
echo " Accepting License on your behalf as EULAS_ID=${next_eulas_id}"
|
|
"${SQLITE3[@]}" "INSERT INTO EULAS (EULAS_ID, MODULEID, CRC) VALUES (${next_eulas_id}, '${module_id}', ${license_crc32}); UPDATE SEQUENCES SET val=${next_eulas_id} WHERE name='EULAS_SEQ'"
|
|
else
|
|
echo " License EULA already found in EULAS table, skipping INSERT"
|
|
fi
|
|
}
|
|
|
|
###############################################################################
|
|
# Outputs to stderr
|
|
###############################################################################
|
|
function debug() {
|
|
# shellcheck disable=SC2236
|
|
if [ ! -z ${verbose+x} ]; then
|
|
>&2 echo " DEBUG: $*"
|
|
fi
|
|
}
|
|
|
|
###############################################################################
|
|
# Print usage information
|
|
###############################################################################
|
|
function usage() {
|
|
>&2 echo "Usage: $0 -f <path/to/module> -d <path/to/db>"
|
|
}
|
|
|
|
# Argument Processing
|
|
while getopts ":hvf:d:" opt; do
|
|
case "$opt" in
|
|
v)
|
|
verbose=1
|
|
;;
|
|
f)
|
|
MODULE_LOCATION="${OPTARG}"
|
|
;;
|
|
d)
|
|
DB_LOCATION="${OPTARG}"
|
|
DB_FILE=$(basename "${DB_LOCATION}")
|
|
;;
|
|
h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
\?)
|
|
usage
|
|
echo "Invalid option: -${OPTARG}" >&2
|
|
exit 1
|
|
;;
|
|
:)
|
|
usage
|
|
echo "Invalid option: -${OPTARG} requires an argument" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# shift positional args based on number consumed by getopts
|
|
shift $((OPTIND-1))
|
|
|
|
if [ -z "${MODULE_LOCATION:-}" ] || [ -z "${DB_LOCATION:-}" ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
main
|