replaced by update_psa
This commit is contained in:
parent
3586951772
commit
40e8786391
@ -1,396 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -x
|
|
||||||
|
|
||||||
fifo=""
|
|
||||||
customer_id=""
|
|
||||||
customer_repository=""
|
|
||||||
customer_location=""
|
|
||||||
customer_base_dir=""
|
|
||||||
|
|
||||||
source ./log_helpers.sh
|
|
||||||
source ./update_helpers.sh
|
|
||||||
source ./git_helpers.sh
|
|
||||||
source ./opkg_helpers.sh
|
|
||||||
|
|
||||||
init_fifo () {
|
|
||||||
trap "rm -f $fifo" EXIT
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
# set trap
|
|
||||||
if [[ ! -p "$fifo" ]]; then
|
|
||||||
mkfifo "$fifo"
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
# fifo created
|
|
||||||
echo "created fifo=$fifo"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
read_config() {
|
|
||||||
local func="${FUNCNAME[0]}"
|
|
||||||
|
|
||||||
# check fifo settings
|
|
||||||
fifo_dir=$(cat "$1" | jq -r .fifo_dir)
|
|
||||||
if [ -z "$fifo_dir" ]; then
|
|
||||||
log_fatal "$func: fifo_dir not set in $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
fifo=$(cat "$1" | jq -r .fifo)
|
|
||||||
if [ -z "$fifo" ]; then
|
|
||||||
log_fatal "$func: fifo not set in $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
fifo="${fifo_dir}/$fifo"
|
|
||||||
log_debug "$func:${LINENO}: fifo is $fifo"
|
|
||||||
|
|
||||||
# check customer_id
|
|
||||||
customer_id="$(cat "$1" | jq -r .customer_id)"
|
|
||||||
if [ -z "$customer_id" ]; then
|
|
||||||
log_fatal "$func:${LINENO} customer_id not set in $1"
|
|
||||||
fi
|
|
||||||
customer_id="customer_$customer_id"
|
|
||||||
log_info "$func:${LINENO}: customer-id is $customer_id"
|
|
||||||
|
|
||||||
# check customer_repository
|
|
||||||
repository_path="$(cat "$1" | jq -r .repository_path)"
|
|
||||||
if [ -z "$repository_path" ]; then
|
|
||||||
log_fatal "$func:${LINENO}: repository path not set in $1"
|
|
||||||
fi
|
|
||||||
repository_path="${repository_path}/${customer_id}.git"
|
|
||||||
log_info "$func:${LINENO}: repository path is $repository_path"
|
|
||||||
|
|
||||||
# check zone_group
|
|
||||||
local zone_group="$(cat "$1" | jq -r .zone_group)"
|
|
||||||
if [ -z "$zone_group" ]; then
|
|
||||||
log_fatal "$func:${LINENO}: zone_group not set in $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check zone
|
|
||||||
local zone="$(cat "$1" | jq -r .zone)"
|
|
||||||
if [ -z "$zone" ]; then
|
|
||||||
log_fatal "$func:${LINENO}: zone not set in $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check customer_location
|
|
||||||
local customer_location="$(cat "$1" | jq -r .customer_location)"
|
|
||||||
if [ -z "$customer_location" ]; then
|
|
||||||
log_fatal "$func:${LINENO}: customer_location not set in $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
customer_base_dir="$PWD/workspace/${customer_id}/${customer_location}"
|
|
||||||
customer_base_dir="${customer_base_dir}/${zone_group}/${zone}"
|
|
||||||
|
|
||||||
log_info "$func:${LINENO}: customer-base-dir is $customer_base_dir"
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
wait_for_trigger() {
|
|
||||||
local func="${FUNCNAME[0]}"
|
|
||||||
if [[ "$1" -eq -1 ]]; then
|
|
||||||
# wait for external impulse
|
|
||||||
log_debug "$func:${LINENO}: waiting on $fifo"
|
|
||||||
if read line <$fifo; then
|
|
||||||
if [ "$line" = "quit" ] || [ "$line" = "update" ]; then
|
|
||||||
log_debug "$func:${LINENO}: received=$line"
|
|
||||||
printf "%s\n" $line
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
sleep $1
|
|
||||||
log_debug "$func:${LINENO}: sleep"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# APISM has al least two TCP-ports open: 7778 and 7779. To check for a running
|
|
||||||
# APISM it is therefore enough to check for the port 7778. netcat will return 0
|
|
||||||
# if the port 7778 is open.
|
|
||||||
check_for_apism() {
|
|
||||||
return 0
|
|
||||||
|
|
||||||
nc localhost 7778
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
######################### send_to_ismas.txt ###################################
|
|
||||||
# #M=GH_APP
|
|
||||||
# #C=REQ_ISMASParameter
|
|
||||||
# #J={}
|
|
||||||
# {
|
|
||||||
# "DEV_ID": {
|
|
||||||
# "Device_Type": "2020",
|
|
||||||
# "Custom_ID": 999,
|
|
||||||
# "Device_ID": 1
|
|
||||||
# },
|
|
||||||
# "REQ_ISMASParameter_#1": {}
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# APISM should respond with (something like this):
|
|
||||||
#
|
|
||||||
# {
|
|
||||||
# "REQ_ISMASPARAMETER#69553_Response": {
|
|
||||||
# "Aknoledge": "OK"
|
|
||||||
# },
|
|
||||||
# "Dev_ID": {
|
|
||||||
# "Device_Type": "ISMAS",
|
|
||||||
# "Custom_ID": 999,
|
|
||||||
# "Device_ID": 2
|
|
||||||
# },
|
|
||||||
# "Fileupload": [
|
|
||||||
# { "IPK": "BladiBlupp.Zip",
|
|
||||||
# "MD5": "01234567890123456789012345678901"}
|
|
||||||
# ],
|
|
||||||
# "Parameter": {
|
|
||||||
# "Location": "An der Bahn 11",
|
|
||||||
# "Group": "G1",
|
|
||||||
# "Zone": "Z1",
|
|
||||||
# "Name": "Bruno",
|
|
||||||
# "SecNumber": "0",
|
|
||||||
# "LastAcc": "1",
|
|
||||||
# "GPSLat": "49,6019",
|
|
||||||
# "GPSLon": "12,1258"
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# where the interesting part is contained in "FileUpload".
|
|
||||||
#
|
|
||||||
check_for_updates() {
|
|
||||||
# ismas_response=$(cat send_to_ismas.txt; sleep 1) | nc localhost 7778)
|
|
||||||
if ! pull_customer_repository customer_281; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
backup_previous_version() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch_updates() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
check_updates() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
revert_updates() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
lock_before_installing_updates() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
do_update_dry_run() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
do_update() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fallback_to_previous_version() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock_after_installing_updates() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup_previous_version() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
send_reboot_message_to_system_controller() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# UPDATE CONTROLLER
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
UpdateController() {
|
|
||||||
local trigger_reboot=false
|
|
||||||
local check_apism_count=0
|
|
||||||
local try_update_count=0
|
|
||||||
local try_lock_count=0
|
|
||||||
local try_unlock_count=0
|
|
||||||
local trigger_timeout=-1
|
|
||||||
local func="${FUNCNAME[0]}"
|
|
||||||
|
|
||||||
# read config parameters
|
|
||||||
# read_config
|
|
||||||
|
|
||||||
# By default (trigger_timeout==-1), UpdateController can only be triggered
|
|
||||||
# from some external source to perform an update.
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
trigger=$(wait_for_trigger $trigger_timeout)
|
|
||||||
echo "trigger=$trigger"
|
|
||||||
if [ "$trigger" = "quit" ]; then
|
|
||||||
$trigger_reboot = true
|
|
||||||
elif [ "$trigger" != "update" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if $trigger_reboot; then
|
|
||||||
log_crit "$func:${LINENO}: send message to reboot the PSA"
|
|
||||||
send_reboot_message_to_system_controller
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Is APISM running, listening on the correct ports etc. ?
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
if ! check_for_apism; then
|
|
||||||
var=$((var+1))
|
|
||||||
check_apism_count=$((check_apism_count+1))
|
|
||||||
if [[ "$check_apism_count" -eq 5 ]]; then
|
|
||||||
trigger_reboot=true
|
|
||||||
check_apism_count=0
|
|
||||||
log_crit "$func:${LINENO}: ERROR APISM not working"
|
|
||||||
continue 2
|
|
||||||
fi
|
|
||||||
log_debug "$func:${LINENO}: [$check_apism_count]: check APISM"
|
|
||||||
sleep 60s
|
|
||||||
else
|
|
||||||
# APISM up and working
|
|
||||||
check_apism_count=0
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
log_debug "$func:${LINENO}: checking for updates..."
|
|
||||||
# exit 1
|
|
||||||
|
|
||||||
# Are there new updates available ?
|
|
||||||
if ! check_for_updates; then
|
|
||||||
log_info "$func:${LINENO}: DEBUG no updates available"
|
|
||||||
extract_changed_files
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_debug "$func:${LINENO}: fetching updates..."
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
# Fetch new updates (using git)
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
if ! fetch_updates; then
|
|
||||||
try_updates_count=$((try_updates_count+1))
|
|
||||||
if [[ "$try_updates_count" -eq 5 ]]; then
|
|
||||||
trigger_reboot=true
|
|
||||||
echo "ERROR fetching updates"
|
|
||||||
continue 2
|
|
||||||
fi
|
|
||||||
sleep 60s
|
|
||||||
else
|
|
||||||
# Fetched updates successfully
|
|
||||||
try_updates_count=0
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check the updates for:
|
|
||||||
# * correct MD5
|
|
||||||
# * compatibility with PSA
|
|
||||||
# ...
|
|
||||||
if ! check_updates; then
|
|
||||||
echo "ERROR check_updates"
|
|
||||||
revert_updates
|
|
||||||
trigger_reboot=true
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# perform a dry-run and check if everything might work as expected.
|
|
||||||
if ! do_update_dry_run; then
|
|
||||||
echo "ERROR do_update_dry_run"
|
|
||||||
revert_updates
|
|
||||||
trigger_reboot=true
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Backup before any updates in case some previous test was wrong
|
|
||||||
if ! backup_previous_version; then
|
|
||||||
echo "ERROR backup_previous_version"
|
|
||||||
revert_updates
|
|
||||||
trigger_reboot=true
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Lock the PSA so all other tasks on the PSA are in sync with the update
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
if ! lock_before_installing_updates; then
|
|
||||||
try_lock_count=$((try_lock_count+1))
|
|
||||||
if [[ "$try_lock_count" -eq 5 ]]; then
|
|
||||||
revert_updates
|
|
||||||
fallback_to_previous_version
|
|
||||||
trigger_reboot=true
|
|
||||||
echo "ERROR locking PSA"
|
|
||||||
continue 2
|
|
||||||
fi
|
|
||||||
sleep 60s
|
|
||||||
else
|
|
||||||
# Locked PSA successfully
|
|
||||||
try_lock_count=0
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Actually do the update
|
|
||||||
if ! do_update; then
|
|
||||||
echo "ERROR do_update"
|
|
||||||
revert_updates
|
|
||||||
fallback_to_previous_version
|
|
||||||
trigger_reboot=true
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
# If all went well, the PSA can return to normal operation
|
|
||||||
if ! unlock_after_installing_updates; then
|
|
||||||
try_unlock_count=$((try_unlock_count+1))
|
|
||||||
if [[ "$try_unlock_count" -eq 5 ]]; then
|
|
||||||
revert_updates
|
|
||||||
fallback_to_previous_version
|
|
||||||
trigger_reboot=true
|
|
||||||
echo "ERROR unlocking PSA"
|
|
||||||
continue 2
|
|
||||||
fi
|
|
||||||
sleep 60s
|
|
||||||
else
|
|
||||||
# Unlocked PSA successfully
|
|
||||||
try_unlock_count=0
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Cleanup.
|
|
||||||
if ! cleanup_previous_version; then
|
|
||||||
echo "ERROR cleanup_previous_version"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
if [ $# -ne 1 ] ; then
|
|
||||||
echo "Usage: $0 filename"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
if read_config "$1" ; then
|
|
||||||
|
|
||||||
init_fifo
|
|
||||||
UpdateController
|
|
||||||
fi
|
|
||||||
fi
|
|
Loading…
Reference in New Issue
Block a user