Refactored 'archive_system' function
- function now explicitly identifies which require compressing.
- symbolic links are removed from the list(s) due to causing issues
during the decompression stage when restoring the system. Symlinks
are then stored in a record with the symlink name followed by the
target. Both prefixed with paths to location and ':' delimited,
respectfully.
- system is then compressed using tar gzip compression, overwriting
any previously generated archive generated.
Refactored 'restore_system' function
- changed 'backup_file' to no longer require the final sed command
similar what's found in 'archive_function' - unnecessary
processing.
- fixed tar statement to correctly output the contents of the
decompression to the root of the system ("/").
- added function to recreate the symlink files. It's unlikely that
symlink files need replacing due to their behaviour; however, for
clarity, the identified symlink files during archiving are recreated
to their original location and linked to their target location.
Removed trailing whitespaces.
112 lines
6.4 KiB
Bash
Executable File
112 lines
6.4 KiB
Bash
Executable File
#!/bin/bash
|
|
#########################################################################
|
|
# common - Utility file with common functions for updater #
|
|
# #
|
|
# Dependencies: #
|
|
# tar #
|
|
# #
|
|
# #
|
|
# Author: Ethan Smith-Coss #
|
|
# Version: 0.1.4 #
|
|
# Created: 2021-05-20T16:47+0100 #
|
|
# Last Modified: 2021-06-21T15:06+0100 #
|
|
# #
|
|
# #################################### #
|
|
# #
|
|
# common - Utility file with common functions for updater #
|
|
# Copyright ©️ 2021 Ethan Smith-Coss #
|
|
# #
|
|
# This program is free software: you can redistribute it and/or modify #
|
|
# it under the terms of the GNU General Public License as published by #
|
|
# the Free Software Foundation, either version 3 of the License, or #
|
|
# (at your option) any later version. #
|
|
# #
|
|
# This program 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 General Public License for more details. #
|
|
# #
|
|
# You should have received a copy of the GNU General Public License #
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
|
|
# #
|
|
#########################################################################
|
|
|
|
function log {
|
|
local log_out=$(realpath "${0%/*}/.log.1")
|
|
[[ $# -eq 0 ]] && log "ERROR" "Log function was called without any arguments. Returning 1." "$log_out" && return 1
|
|
[[ ! $# -eq 3 ]] && log "ERROR" "Log function expected at least 3 arguments, recieved $#. Returning 1." "$log_out" && return 1
|
|
$(echo "$(date -Iseconds) ($1): $2" >> "$3") >/dev/null 2>&1
|
|
[[ ! $? -eq 0 ]] && log "ERROR" "Log function encountered an issue writing to \"$3\". Returning 1." "$log_out" && return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
function archive_system {
|
|
local log_out=$(realpath "${0%/*}/.log.1")
|
|
[[ -e $1 ]] && log "ERROR" "Archive function was called without any arguments." "$log_out"
|
|
|
|
local archive_output="/tmp/microsoft-edge-autoupdater/$(echo $1 | sed 's/\//_/').tar.gz"
|
|
[[ -f "$archive_output" ]] && return 0
|
|
|
|
usr_files="$(grep -E '^usr/.*beta.*$' "/tmp/microsoft-edge-autoupdater/Contents-amd64" | awk '{print "/" $1}')"
|
|
opt_files="$(ls -1 "/opt/$1/" | sed -E "s/^(.*)$/\/opt\/"$(echo $1 | sed 's/\//\\\//')"\/\1/g")"
|
|
## :@Ethan: we need to identify all the symlinked files and store them in a record. When we decompress we reinstate the symlinks.
|
|
## This file is included in the archive and tar will dereference symlink files.
|
|
symlink_record="/tmp/microsoft-edge-autoupdater/symlink-record"
|
|
ls -l $opt_files $usr_files | grep -Eo ':.*->.*$' | sed 's/\s->\s/:/g' | cut -d' ' -f2- > "$symlink_record"
|
|
|
|
## remove identified symlink files from lists
|
|
while read -r record ; do
|
|
record=$(echo "$record" | cut -d: -f1)
|
|
[[ "$record" =~ \/usr\/ ]] && record=$(echo $record | sed 's/\//\\\//g') && usr_files=$(echo "$usr_files" | sed "s/^"$record"$//") && continue
|
|
[[ "$record" =~ \/opt\/ ]] && record=$(echo $record | sed 's/\//\\\//g') && opt_files=$(echo "$opt_files" | sed "s/^"$record"$//")
|
|
done < <(cat $symlink_record)
|
|
|
|
tar --overwrite -czf "$archive_output" $opt_files $usr_files > "/tmp/microsoft-edge-autoupdater/tar_dump.log" 2>>"$log_out"
|
|
exit_code=$?
|
|
[[ ! $exit_code -eq 0 ]] && { log "ERROR" "(Archive) There was an issue creating the archive file of system. Returning...(10)" "$log_out" ; return 10 ; }
|
|
|
|
return 0
|
|
}
|
|
|
|
function restore_files {
|
|
local log_out=$(realpath "${0%/*}/.log.1")
|
|
[[ -e $1 ]] && log "ERROR" "Restore function was called without any arguments." "$log_out"
|
|
local backup_file="/tmp/microsoft-edge-autoupdater/$1.tar.gz"
|
|
[[ ! -f "$backup_file" ]] && { log "ERROR" "There is no backup of Microsoft Edge (Beta) identified. Restoration not possible." "$log_out" ; return 12 ; }
|
|
|
|
tar --overwrite -xzf "$backup_file" -C "/" > "/tmp/microsoft-edge-autoupdater/tar_dump.log" 2>>"$log_out"
|
|
exit_code=$?
|
|
[[ ! $exit_code -eq 0 ]] && { log "ERROR" "There was an issue restoring pervious files to system." \
|
|
"The backup created will not be removed to allow for manual restoration. Returning...(12)" ; return 12 ; }
|
|
|
|
log "DEBUG" "Re-establishing symlinks..." "$log_out"
|
|
symlink_record="/tmp/microsoft-edge-autoupdater/symlink-record"
|
|
while read -r record ; do
|
|
symlink="$(echo $record | cut -d':' -f1)"
|
|
symlink_to="$(echo $record | cut -d':' -f2)"
|
|
## :NOTE: symlinks may already exist from new update and theoretically could be different in a newer version. Remove them first
|
|
rm "$symlink"
|
|
## create new sylinks based on the restored files
|
|
ln -s "$symlink_to" "$symlink" >/dev/null 2>>"$log_out"
|
|
exit_code=$?
|
|
[[ ! $exit_code -eq 0 ]] && { log "ERROR" "There was an issue trying to create a symlink to "$symlink_to"" "$log_out" ; continue ; }
|
|
log "DEBUG" "Successfully created symlink: "$symlink" -> "$symlink_to"" "$log_out"
|
|
done < <(cat $symlink_record)
|
|
log "DEBUG" "Symlinks re-established." "$log_out"
|
|
|
|
return 0
|
|
}
|
|
|
|
function notify {
|
|
## :@TODO: implement notification system.
|
|
local log_out=$(realpath "${0%/*}/.log.1")
|
|
[[ $# -eq 0 ]] && log "ERROR" "Notify function was called without any arguments. Returning 1." "$log_out" && return 1
|
|
[[ ! $# -eq 2 ]] && log "ERROR" "Notify function expected at least 2 arguments, recieved $#. Returning 1." "$log_out" && return 1
|
|
notify-send "$1" "$2" >>"$log_out" 2>&1 && tput bel
|
|
exit_code=$?
|
|
[[ ! $exit_code -eq 0 ]] && log "ERROR" "There was an issue send a notification to the system." "$log_out"
|
|
|
|
return 0
|
|
}
|