| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #!/bin/bash
- #
- # Copyright (c) 2019 Clementine Computing LLC.
- #
- # This file is part of PopuFare.
- #
- # PopuFare is free software: you can redistribute it and/or modify
- # it under the terms of the GNU Affero General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # PopuFare is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU Affero General Public License for more details.
- #
- # You should have received a copy of the GNU Affero General Public License
- # along with PopuFare. If not, see <https://www.gnu.org/licenses/>.
- #
- export BASEDIR="/home/bus"
- . $BASEDIR/bin/common_values.sh
- # Do this at startup, and again if we've gotten a dropfile flag telling us to do so...
- #
- generate_ssh_targets
- supervisor_pidfile="/tmp/client_supervisor.pid"
- supervisor_args="$BASEDIR/bin/ipc_server $BASEDIR/bin/billdb $BASEDIR/bin/piu_minder $BASEDIR/bin/diu_minder $BASEDIR/bin/passdb $BASEDIR/bin/avls $BASEDIR/bin/paddlemgr"
- eqnum_file="$EQUIP_NUM_FILE"
- checksum_path="$CHECKSUM_AND_VERSION_PATH"
- function spawn_supervisor
- {
- # If we have a client supervisor binary to run
- #
- if [ -f $BASEDIR/bin/client_supervisor ]; then
- # # If we also have a config file for the UI
- # #
- # if [ -f $BASEDIR/config/menu.xml ]; then
- # rm $supervisor_pidfile
- #
- # # then run the whole shebang...
- # #
- # $BASEDIR/bin/client_supervisor $supervisor_args &
- # echo $! > $supervisor_pidfile
- # echo Spawned client_supervisor. PID = `cat $supervisor_pidfile`
- #
- # # if we DON'T have one, we still need to download a config before we're viable...
- # #
- # else
- # rm -f config.tgz.*
- # $BASEDIR/bin/showmessage -b "Downloading Config..."
- # fi
-
- rm $supervisor_pidfile
- # then run the whole shebang...
- #
- $BASEDIR/bin/client_supervisor $supervisor_args &
- echo $! > $supervisor_pidfile
- echo Spawned client_supervisor. PID = `cat $supervisor_pidfile`
- # If we DON'T have one, we are either a new system or just badly broken so...
- #
- else
- # Go and remove all package records so we can start fresh...
- #
- rm -f $BASEDIR/config/*.tgz.*
- $BASEDIR/bin/showmessage -b "Wait (~ 15 min)"
- echo "..."
- fi
- }
- function check_update
- {
- if [ ! -f $TUNNEL_DROPFILE ]; then return 1; fi;
- (
- if [ -f "$eqnum_file" ]; then
- echo -en "`cat $eqnum_file`";
- else
- echo -en "0"
- fi
- for file in `ls $checksum_path/*.checksum`; do
- echo -en "\t`echo $file | sed -r 's/^.*\/(.*)\.checksum$/\1/'`=`cat $file`";
- done;
- echo;
- ) | nc localhost $UPDATE_DAEMON_PORT
- }
- while true; do
- echo "## heartbeat"
- #See if we need to spawn our client supervisor
- if [ ! -f $supervisor_pidfile ]; then
- spawn_supervisor;
- sleep $SLEEP_AFTER_SPAWN;
- else
- if [ ! -d /proc/`cat $supervisor_pidfile` ]; then
- spawn_supervisor;
- sleep $SLEEP_AFTER_SPAWN;
- fi
- fi
- if [ -f $TUNNEL_DROPFILE ]; then echo "Checking for updates..."; fi
- check_update |
- (
- while read client_file checksum file_size server_path file_version; do
- # If we've been asked to abort this update, do so before we start downloading if possible
- #
- if [ -f $UPDATE_ABORT_DROPFILE ]; then
- echo "Aborting update on request!";
- # generate new SSH target from dropfiles
- #
- generate_ssh_targets
- # clear the flag
- #
- rm -f $UPDATE_ABORT_DROPFILE
- # break out of the loop
- #
- break;
- fi
- # Generate dropfiles to tell the rest of the system what we're up to
- #
- echo "$file_size" > /tmp/$client_file.expected_size
- echo "$checksum" > /tmp/$client_file.expected_md5
- echo "$file_version" > /tmp/$client_file.expected_version
- echo "Downloading $client_file version $file_version to /tmp ($file_size bytes)"
- # Initiate a secure download to fetch this package down from the server
- #
- scp -i $SSH_IDENTITY $SCP_OPTIONS -P $SSH_PORT $SSH_TARGET:$server_path /tmp/$client_file
- # If we've already downloaded when we get the abort message
- #
- if [ -f $UPDATE_ABORT_DROPFILE ]; then
- echo "Aborting update on request!";
- # Clean up after ourselves
- #
- rm -f /tmp/$client_file.expected_size /tmp/$client_file.expected_md5
- rm -f /tmp/$client_file.expected_version /install.sh /tmp/install.sh /tmp/$client_file
- # generate new SSH target from dropfiles
- #
- generate_ssh_targets
- # clear the flag
- #
- rm -f $UPDATE_ABORT_DROPFILE
- # break out of the loop
- #
- break;
- fi
- # If we indeed _got_ a file to begin with...
- #
- if [ -f /tmp/$client_file ]; then
- # Start a subshell in which we...
- #
- (
- # set our pwd to /tmp/ where we downloaded our package
- #
- cd /tmp/;
- # Execute our package installer script which will check the package checksum
- # and assuming that matches, it will extract the installer script embedded in the
- # package and execute it.
- #
- $BASEDIR/bin/apply_update.sh $client_file $checksum $file_size $server_path $file_version
- );
- fi
- # Clean up after ourselves (removing our during-update dropfiles)
- #
- rm -f /tmp/$client_file.expected_size /tmp/$client_file.expected_md5
- # as well as the update file itself
- #
- rm -f /tmp/$client_file.expected_version /install.sh /tmp/install.sh /tmp/$client_file
- done
- )
- echo "Sleeping..."
- sleep $SLEEP_BETWEEN_UPDATES;
- done
|