14 Commits

Author SHA1 Message Date
5bca1f498b set WORKING_DIRECTORY explicitly to PWD if . is passed 2023-06-05 15:34:46 +02:00
2d1f11fd74 replaced dc2c.hex with dc2c.bin 2023-06-05 15:07:05 +02:00
2d76b37e5d removed if-GIT_CLONE_EXECUTED branch 2023-05-30 16:42:03 +02:00
b5b3aa7e34 fixed wong shift of arguments for maintenance flag 2023-05-30 16:41:08 +02:00
e3403b2ddd removed typo and initialized variable 2023-05-30 16:40:25 +02:00
82d6dc643a Extended debug output 2023-05-30 16:39:42 +02:00
ef4d27eb91 Taken over some parts from update_psa:
cloning of customer_repository, some sanity checks, check for available
updates.
2023-05-26 15:07:40 +02:00
215b155f2d Moved main parts to update_psa_impl. 2023-05-26 15:07:13 +02:00
901fa4c319 Replaced CLONE_CUSTOMER_REPOSITORY by INITIAL_CLONE.
Added some sanity checks at end of read_config().
2023-05-26 15:05:25 +02:00
e356456fb5 added update_psa_clone_customer_repository().w 2023-05-26 15:04:52 +02:00
bcc96a388f Restructered clone_customer_repository() and cd_customer_repository().
Fixed cd_home() to return explicitly to the customer repository, not
only to -.
2023-05-26 15:01:48 +02:00
8f50f62a52 Moved changing to WORKING_DIRECTORY here 2023-05-24 17:29:15 +02:00
847c58afc8 Moved changing to WORKING_DIRECTORY into update_psa 2023-05-24 17:28:28 +02:00
2abdf963ac Added zone4 for szeged 2023-05-24 17:27:36 +02:00
7 changed files with 173 additions and 228 deletions

View File

@@ -82,92 +82,104 @@ git_customer_branch () {
#
clone_customer_repository () {
local func="${FUNCNAME[0]}"
if [ "$PWD" = "$WORKING_DIRECTORY" ]; then
mkdir -p "./$WORKSPACE_DIR"
# check if the directory is empty. If so, clone the
# customer repository
if ! find ./$WORKSPACE_DIR -mindepth 1 -maxdepth 1 | read; then
log_debug "$func:${LINENO} cloning ${1} ..."
if cd "./$WORKSPACE_DIR"
then
exec_git_command git clone "$1"
if [ $? -eq 0 ]; then
log_debug "$func:${LINENO} cloning ${1} done"
GIT_CLONE_EXECUTED=1
# after cloning, cd into repository, and re-initialize,
# setting the work-tree as "/". This has the effect that
# a "git pull" will automatically fetched files in the
# corresponding sytem-folders.
if cd ${CUSTOMER_ID_BASE_DIR}; then
# configure hooks directory
exec_git_command git config core.hooksPath .githooks
exec_git_command git checkout "$LOCAL_BRANCH"
if [[ $? -eq 0 ]]; then
log_debug "$func:${LINENO} checked out local branch $LOCAL_BRANCH"
exec_git_command git config core.worktree "/"
if [[ $? -eq 0 ]]; then
log_debug "$func:${LINENO} configured worktree"
exec_git_command git fetch --all
if [[ $? -eq 0 ]]; then
log_debug "$func:${LINENO} fetch repository"
exec_git_command git reset --hard "$LOCAL_BRANCH"
if [[ $? -eq 0 ]]; then
log_debug "$func:${LINENO} reset --hard $LOCAL_BRANCH"
CLONE_CUSTOMER_REPOSITORY=true
log_debug "$func:${LINENO} re-init of ${1} done"
cd_home; return 0
fi
fi
fi
fi
fi
fi
cd_home; return 1
fi
else
# the directory is not empty, so we assume the
# customer-repository has been cloned already
if ! [[ -d "./${WORKSPACE_DIR}/$CUSTOMER_ID" ]]; then
log_fatal "$func:${LINENO} $PWD $WORKSPACE_DIR/$CUSTOMER_ID"\
"wrong repository: $(ls -d './${WORKSPACE_DIR}/*')"
else
local __m="./${WORKSPACE_DIR}/$CUSTOMER_ID exists"
log_debug "$func:${LINENO} $__m"
return 0
fi
if [ "$PWD" != "$WORKING_DIRECTORY" ]; then
log_fatal "$func:${LINENO} PD != WD ($PWD != $WORKING_DIRECTORY)"
fi
mkdir -p "./$WORKSPACE_DIR"
# check if the directory is empty. If so, clone the
# customer repository
if ! find ./$WORKSPACE_DIR -mindepth 1 -maxdepth 1 | read; then
log_info "$func:${LINENO} cloning ${1} into ${PWD}/${WORKSPACE_DIR}..."
if ! cd "./$WORKSPACE_DIR"; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not change to $WORKSPACE_DIR"
fi
if ! exec_git_command git clone "$1"; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not clone $1"
fi
########################## CLONING DONE ############################
log_debug "$func:${LINENO} cloning ${1} done"
# after cloning, cd into repository, and re-initialize,
# setting the work-tree as "/". This has the effect that
# a "git pull" will automatically fetched files in the
# corresponding sytem-folders.
####################### CD INTO REPOSITORY ##########################
if ! cd ${CUSTOMER_ID_BASE_DIR}; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not change to $CUSTOMER_ID_BASE_DIR"
fi
log_debug "$func:${LINENO} cd into $CUSTOMER_ID_BASE_DIR"
##################### CONFIGURE HOOKS DIRECTORY ######################
if ! exec_git_command git config core.hooksPath .githooks; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not configure hooks directory"
fi
###################### CHECKOUT LOCAL BRANCH #########################
if ! exec_git_command git checkout "$LOCAL_BRANCH"; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not checkout $LOCAL_BRANCH"
fi
log_debug "$func:${LINENO} checked out local branch $LOCAL_BRANCH"
######################## CONFIGURE WORKTREE ##########################
if ! exec_git_command git config core.worktree "/"; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not configure worktree '/'"
fi
log_debug "$func:${LINENO} configured worktree '/'"
########################### FETCH ALL #################################
if ! exec_git_command git fetch --all; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} can not fetch --all for $LOCAL_BRANCH"
fi
log_debug "$func:${LINENO} fetch repository"
########################## RE-INIT REPOSITORY ########################
if ! exec_git_command git reset --hard "$LOCAL_BRANCH"; then
update_psa_clone_error # message to ISMAS
log_fatal "$func:${LINENO} re-init of $LOCAL_BRANCH failed"
fi
log_debug "$func:${LINENO} reset --hard $LOCAL_BRANCH"
INITIAL_CLONE=true
log_debug "$func:${LINENO} re-init of ${1} done"
update_psa_clone_customer_repository
else
# the directory is not empty, so we assume the
# customer-repository has been cloned already
if ! [[ -d "./${WORKSPACE_DIR}/$CUSTOMER_ID" ]]; then
log_fatal "$func:${LINENO} $PWD $WORKSPACE_DIR/$CUSTOMER_ID"\
"wrong repository: $(ls -d './${WORKSPACE_DIR}/*')"
fi
local __m="./${WORKSPACE_DIR}/$CUSTOMER_ID exists"
log_info "$func:${LINENO} $__m, no clone necessary"
fi
update_psa_clone_error # message to ISMAS
return $?
cd_home
}
# clone_customer_repository ->
# https://git.mimbach49.de/GerhardHoffmann/customer_281.git
cd_customer_repository () {
local func="${FUNCNAME[0]}"
# has to be called in WORKING_DIRECTORY
cd "$WORKING_DIRECTORY"
if [ "$PWD" = "${WORKING_DIRECTORY}" ]; then
repository_dir="./$WORKSPACE_DIR/$CUSTOMER_ID"
if ! [[ -d "$repository_dir" ]]; then
log_crit "$func:${LINENO}: $repository_dir does not exist!"
return 1
fi
if ! { cd $repository_dir; } ; then
log_crit "$func:${LINENO}: cannot cd to $repository_dir!"
return 1
fi
log_debug "$func:${LINENO}: cd to $repository_dir!"
return 0
if [ "$PWD" != "$WORKING_DIRECTORY" ]; then
log_fatal "$func:${LINENO} PD != WD ($PWD != $WORKING_DIRECTORY)"
fi
return 1
if ! [[ -d "$CUSTOMER_ID_BASE_DIR" ]]; then
log_fatal "$func:${LINENO}: $CUSTOMER_ID_BASE_DIR does not exist!"
fi
if ! cd "$CUSTOMER_ID_BASE_DIR"; then
log_fatal "$func:${LINENO}: cannot cd to $CUSTOMER_ID_BASE_DIR !!!"
fi
log_debug "$func:${LINENO}: cd to $CUSTOMER_ID_BASE_DIR"
return 0
}
cd_home () {
if cd - &>/dev/null ; then
if cd "$WORKING_DIRECTORY" &>/dev/null ; then
return 0
fi
return 1
@@ -187,8 +199,7 @@ pull_customer_repository () {
# changed files or opkg-commands to execute.
# If 'git pull' has fetched new data, then there are lines starting with
# DOWNLOAD or EXECUTE.
grep -E -q "^[[:space:]]*(DOWNLOAD|EXECUTE)" "$GIT_UPDATE_LOG"
if [ $? -eq 0 ]; then
if grep -qE "^[[:space:]]*(DOWNLOAD|EXECUTE)" "$GIT_UPDATE_LOG"; then
log_info "$func:${LINENO}: new data fetched from repository"
cd_home; return 0
fi

View File

@@ -2,7 +2,8 @@
source ./log_helpers
if [ ${news_to_ismas_sourced:-1} = "1" ]; then # include only once
if [ "${news_from_ismas_sourced:-1}" = "1" ]; then # include only once
readonly news_from_ismas_sourced=${BASH_SOURCE[0]}
readonly APISM_DIRECT_PORT=7778
updates_available () {

View File

@@ -2,7 +2,8 @@
source ./log_helpers
if [ ${news_to_ismas_sourced:-1} = "1" ]; then # include only once
if [ "${news_to_ismas_sourced:-1}" = "1" ]; then # include only once
readonly news_to_ismas_sourced=${BASH_SOURCE[0]}
readonly APISM_DB_PORT=7777
readonly UPDATE_ISMAS_PROGRESS="U0010"
@@ -69,6 +70,18 @@ if [ ${news_to_ismas_sourced:-1} = "1" ]; then # include only once
###########################################################################
###########################################################################
update_psa_clone_customer_repository () {
PERCENT=10
local params=("U0010" # event
$PERCENT # percent
$RC_SUCCESS # resultcode
"clone_customer_repository" # step
"git cloned $CUSTOMER_REPOSITORY_PATH" # step_result
"") # version
news_to_ismas ${params[*]}
return $?
}
update_psa_pull_customer_repository () {
PERCENT=10
@@ -382,8 +395,8 @@ if [ ${news_to_ismas_sourced:-1} = "1" ]; then # include only once
\"CREATED\":\"$(date +%Y-%m-%dT%T)\",
\"HASH\":\"$(compute_hash)\"
},
\"TARIFF\": {
$(<$TC_PSA_TC_FILE)
\"TARIFF\" : {
$(<$TC_PSA_TC_FILE)
},
\"HARDWARE\" : {
\"DEVICES\" : [

View File

@@ -30,16 +30,13 @@ if [ ${read_config_sourced:-1} = "1" ]; then # include only once
readonly WORKSPACE_DIR=workspace
EXITCODE=$RC_SUCCESS
CLONE_CUSTOMER_REPOSITORY=false
GIT_CLONE_EXECUTED=0
INITIAL_CLONE=false
APISM_RUNNING=0
# read config file (JSON syntax)
read_config() {
local func="${FUNCNAME[0]}"
WORKING_DIRECTORY=${PWD}
CONFIGFILENAME=${CONFIGFILENAME:-'update_psa.conf'}
if ! [ -f "$CONFIGFILENAME" ]; then
@@ -51,13 +48,6 @@ if [ ${read_config_sourced:-1} = "1" ]; then # include only once
local readonly cf="$CONFIGFILENAME"
### TODO: wieso wird hier in das verzeichnis gewechselt
if cd $WORKING_DIRECTORY ; then
log_debug "$func:${LINENO}: cd to $WORKING_DIRECTORY"
else
log_fatal "$func:${LINENO}: cannot cd to $WORKING_DIRECTORY"
fi
readonly GIT_SSL_NO_VERIFY="$(cat "$cf" | jq -r .GIT_SSL_NO_VERIFY)"
assert_s GIT_SSL_NO_VERIFY
@@ -98,10 +88,23 @@ if [ ${read_config_sourced:-1} = "1" ]; then # include only once
# Zone aus /etc/zone_nr auslesen
#
readonly ZONE_GROUP=1
readonly ZONE=1
local __zone=1
readonly ZONE_FILE="$(cat "$cf" | jq -r .zone)"
if [ -f "$ZONE_FILE" ]; then
__zone=$(cat "$ZONE_FILE")
__zone=$((__zone))
fi
readonly ZONE=$__zone
readonly LOCAL_BRANCH="$(cat "$cf" | jq -r .local_branches[$ZONE])"
if [ -z "$WORKING_DIRECTORY" ]; then
log_fatal "${func}:${LINENO}: empty WORKING_DIRECTORY"
fi
if ! cd "$WORKING_DIRECTORY"; then
log_fatal "${func}:${LINENO}: cannot cd to $WORKING_DIRECTORY"
fi
log_debug "${func}:${LINENO}: cd to $WORKING_DIRECTORY"
return 0
}
###############################################################################
@@ -129,6 +132,10 @@ if [ ${read_config_sourced:-1} = "1" ]; then # include only once
check_sanity_of_repository () {
local func="${FUNCNAME[0]}"
if [ "$PWD" != "$WORKING_DIRECTORY" ]; then
log_fatal "$func:${LINENO} PD != WD ($PWD != $WORKING_DIRECTORY)"
fi
assert_d CUSTOMER_ID_BASE_DIR
@@ -196,7 +203,7 @@ if [ ${read_config_sourced:-1} = "1" ]; then # include only once
readonly SYSCONF_INI="sysconfig.ini"
readonly SYSCTRL_INI="SystemControl.ini"
readonly TARIFF_CURRENT="tariff.current"
readonly DC="dc2c.hex"
readonly DC="dc2c.bin"
readonly TARIFF_SUMMER="summer_tariff.json"
readonly TARIFF_WINTER="winter_tariff.json"
@@ -215,7 +222,7 @@ if [ ${read_config_sourced:-1} = "1" ]; then # include only once
readonly SYSCTRL_ETC_SYS_INI_FILE="${ETC_SYS_DIR}/$SYSCTRL_INI"
readonly SYSCTRL_ATB_SYS_INI_FILE="${ATB_SYS_DIR}/$SYSCTRL_INI"
readonly SYSCTRL_SCF_SYS_INI_FILE="${SYSCONFIG_SYS_DIR}/$SYSCTRL_INI"
readonly ZONE_FILE="$ETC_SYS_DIR/zone_nr"
# readonly ZONE_FILE="$ETC_SYS_DIR/zone_nr"
readonly CUST_ID_FILE="$ETC_SYS_DIR/cust_nr"
readonly TC_SYS_TC_FILE="${ATBAPP_SYS_DIR}/$TARIFF_CURRENT"
readonly OPKG_CMDS_SYS_FILE="${OPKG_SYS_DIR}/opkg_commands"

View File

@@ -25,12 +25,12 @@ if [ -z $IFS ]; then
fi
MAINTENANCE="NO"
WORKING_DIRECTORY=${PWD}
# parse commandline parameters
while test $# -gt 0; do
case $1 in
--maintenance | -m )
shift
MAINTENANCE="YES"
;;
--file | --fil | --fi | --f | -file | -fil | -fi | -f )
@@ -43,7 +43,11 @@ while test $# -gt 0; do
;;
--wdir | --wdi | --wd | --w | -wdir | -wdi | -wd | -w )
shift
WORKING_DIRECTORY="$1"
if [ "$1" = "." ]; then
WORKING_DIRECTORY="$PWD"
else
WORKING_DIRECTORY="$1"
fi
;;
--help | -hel | --he | --h | '--?' | -help | -hel | -he | -h | '-?' )
usage_and_exit 0
@@ -66,42 +70,12 @@ while test $# -gt 0; do
esac
shift
done
source ./update_psa_impl
if cd "$WORKING_DIRECTORY"; then
source ./update_psa_impl
if read_config
then
check_default_route
check_route_to_repository "185.191.219.134" # git.mimbach.de
check_for_running_apism
if clone_customer_repository ${CUSTOMER_REPOSITORY_PATH}
then
check_sanity_of_repository
if [ "$MAINTENANCE" = "NO" ]; then
log_info "update_psa:${LINENO}: MAINTENANCE OFF. Checking for updates..."
# someone must have activated the WAIT-button in ISMAS.
# Request the status of this button in updates_available().
if ! updates_available; then
update_psa_false_alarm "update requested, but no WAIT state detected !!!"
log_fatal "update_psa:${LINENO}: update requested, but no WAIT state detected !!!"
fi
else
# simulate an activated WAIT-button
set_updates_available
while :
do
sleep 5
updates_available && break
done
fi
# updates available
update_psa
fi
fi
if read_config; then
update_psa
exit 0
fi
exit -1
exit 1
###############################################################################

View File

@@ -13,7 +13,7 @@
"" : "local branches",
"local_branches" : ["master",
"zg1/zone1", "zg1/zone2", "zg1/zone3"],
"zg1/zone1", "zg1/zone2", "zg1/zone3", "zg1/zone4"],
"" : "customer number of PSA",
"customer_id_" : "/etc/cust_nr",
@@ -26,7 +26,7 @@
"" : "0-index used as size of following array",
"" : ".zg[0]: #n of zones_groups",
"" : ".zg[1].z[0]: #n of zones in zg[1]",
"zg" : [ 1, { "z" : [ 3, 1, 2, 3] } ],
"zg" : [ 1, { "z" : [ 4, 1, 2, 4] } ],
"" : "url of customer repository",
"cust_repository_path" : "https://git.mimbach49.de/GerhardHoffmann/customer_281.git"

View File

@@ -32,110 +32,49 @@ collect_current_configuration () {
update_psa() {
update_psa_activated # message to ISMAS
local func="${FUNCNAME[0]}"
check_default_route
check_route_to_repository "185.191.219.134" # git.mimbach.de
# even for a git clone a running APISM is needed
check_for_running_apism
# an initial clone of the customer-repository (e.g. customer_281) is
# always possible, even without a ISMAS-WAIT-button
clone_customer_repository ${CUSTOMER_REPOSITORY_PATH}
check_sanity_of_repository
$INITIAL_CLONE && return 0
if [ "$MAINTENANCE" = "NO" ]; then
log_info "update_psa:${LINENO}: MAINTENANCE OFF. Checking for updates..."
# someone must have activated the WAIT-button in ISMAS.
# Request the status of this button in updates_available().
if ! updates_available; then
update_psa_false_alarm "update requested, but no WAIT state detected !!!"
log_fatal "update_psa:${LINENO}: update requested, but no WAIT state detected !!!"
fi
else
# simulate an activated WAIT-button
set_updates_available
while :
do
sleep 5
updates_available && break
done
fi
log_debug "$func:${LINENO}: fetch/merge updates..."
# Fetch new updates (using git). but only when repository has already been
# cloned.
if [ $GIT_CLONE_EXECUTED -eq 0 ]; then
if ! fetch_customer_updates; then
log_error "$func:${LINENO}: fetch no data for $customer_id"\
"-> no files to update -> no psa update"
update_psa_false_alarm \
"update request, but no change in $CUSTOMER_REPOSITORY_PATH"
# TODO
fi
if ! fetch_customer_updates; then
log_error "$func:${LINENO}: fetch no data for $customer_id"\
"-> no files to update -> no psa update"
update_psa_false_alarm \
"update request, but no change in $CUSTOMER_REPOSITORY_PATH"
# TODO
fi
update_psa_pull_customer_repository # message to ISMAS
# no backup necessary as saved in git-repo
# local changed_files=$(changed_file_names)
if [[ -f "$GIT_PULL_TMP" ]]; then
# TODO
if ! check_hardware_compatibility "$files_to_copy" ; then
local __r=$?
log_error "$func:${LINENO}: json/ini-files not fit for PSA"
revert_customer_repository
exit $__r
fi
fi
if [[ -f "$OPKG_CMDS_TMP" ]]; then
local commands="$(cat ${OPKG_CMDS_TMP} | tr '\n' '; ')"
log_info "$func:${LINENO}: executed opkg commands"
update_psa_install_opkg_packages $UPDATE_ISMAS_PROGRESS \
$RC_SUCCESS "$commands"
else
log_info "$func:${LINENO}: no opkg commands to execute"
update_psa_install_opkg_packages $UPDATE_ISMAS_PROGRESS \
$RC_SUCCESS "no opkg commands to execute"
fi
# check if the opkg-command-file has been changed during 'git pull'
#if grep -qE ".*opkg_commands.*?" <<< $changed_files; then
# # read opkg_cmds: each line respresents an opkg-command
# readarray opkg_commands < <(cat $OPKG_CMDS_PSA_FILE)
# for opkg_c in "${opkg_commands[@]}"; do
# if grep -qE "^\s*[#]+.*$" <<< $opkg_c; then
# continue # found comment line
# fi
# # package manipulation commands without package:
# local cwp="update|upgrade|clean"
# # informational commands without package:
# cwp="${cwp}|list|list-installed|list-upgradable"
# if grep -qE "^.*\s+($cwp)\s+.*$" <<< $opkg_c; then
# local p=$(printf '%s' "$opkg_c" | awk '{ print $NF }')
# local opkg_output=()
# if ! exec_opkg_info "$p" opkg_output; then
# log_error "$func:${LINENO}: opkg info $opkg_c failed"
# revert_customer_repository ; exit 1
# fi
# if ! check_md5_for_opkg_packages opkg_output; then
# log_error "$func:${LINENO}: "\
# "wrong md5sum for opkg packages"
# revert_customer_repository ; exit 1
# fi
# fi
#
# # perform a dry-run and check if everything might work as expected.
# if ! exec_opkg_noaction $opkg_c; then
# log_error "$func:${LINENO}: "\
# "opkg --noaction $opkg_c failed"
# fi
# # Actually execute the opkg command
# if ! exec_opkg $opkg_c; then
# log_error "$func:${LINENO}: exec_opkg $opkg_c failed"
# fallback_to_previous_version
# revert_customer_repository ; exit 1
# fi
# done
#else
# log_info "$func:${LINENO}: no opkg commands to execute"
# update_psa_install_opkg_packages $UPDATE_ISMAS_PROGRESS \
# $RC_SUCCESS "no opkg commands to execute"
#fi
# Cleanup.
#if ! cleanup_previous_version; then
# log_error "$func:${LINENO}: cleanup_previous_version failed"
#fi
# compute version string for current (i.e. new) version
compute_version
update_psa_cleanup $UPDATE_ISMAS_PROGRESS \
$RC_SUCCESS "cleanup after psa update"
# TODO
exit 0
}