You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.8 KiB
161 lines
4.8 KiB
#!/bin/sh -e
|
|
|
|
# A script to check for satellite updates.
|
|
# It just downloads the documents which should be updated when the software has an update.
|
|
# It's a shitty method, but it kinda works... Other than having a lot of false-positives.
|
|
|
|
_show_help() {
|
|
echo "This program will help keep your satellites fresh and up to date.
|
|
Usage: $0 <[\$dir_satellites] [\$_dir_fresh]|ignore <diff> <ignorediff>>
|
|
|
|
\$dir_satellites = The directory where all the satellites are you want to update.
|
|
\$_dir_fresh = The directory that will be used to keep all the files for checking.
|
|
ignore = Use this option to generate an ignorediff.
|
|
diff = A diff file. Generated without -u or any other fancy options.
|
|
ignorediff = A file containing the differences to be ignored (this file will be appended to).
|
|
|
|
The variables (starting with \$) can also be set from a configuration file."
|
|
}
|
|
|
|
get_variable() {
|
|
printf "
|
|
download() { :; }
|
|
extract() { :; }
|
|
getfile() { :; }
|
|
extrafile() { :; }
|
|
dlextract() { :; }
|
|
dlfile() { :; }
|
|
header_end() { echo \$$1; exit; }
|
|
. %s
|
|
" $2 | sh
|
|
}
|
|
|
|
download() {
|
|
$(echo "$cmd_download" | sed -e 's@{dst}@'"$2"'@g' -e 's@{src}@'"$1"'@g') 2> /dev/null
|
|
}
|
|
|
|
diff_extractlines() {
|
|
# Extract all the line numbers from a diff.
|
|
|
|
stage=0
|
|
for line in $(echo "$1" | awk '{print $1}'); do
|
|
if [ "$stage" = 0 ]; then
|
|
if [ "$line" != ">" -a "$line" != "<" ]; then
|
|
echo "$line"
|
|
stage=1
|
|
fi
|
|
elif [ "$stage" = 1 ]; then
|
|
if [ "$line" != ">" -a "$line" != "<" ]; then
|
|
if [ "$line" = "---" ]; then
|
|
stage=0
|
|
else
|
|
echo "$line"
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
apply_ignorediff() {
|
|
# Filter a diff, only return the differences that shouldn't be ignored.
|
|
# TODO: This function is slow, due to the usage of awk on every line. A solution for this problem would be great.
|
|
|
|
stage=0
|
|
ignore=0
|
|
echo "$1" | while read line; do
|
|
first="$(echo "$line" | awk '{print $1}')"
|
|
if [ "$stage" = 0 ]; then
|
|
if [ "$first" != ">" -a "$first" != "<" ]; then
|
|
stage=1
|
|
ignore=0
|
|
if grep -e "^$line\$" "$2" > /dev/null; then
|
|
ignore=1
|
|
fi
|
|
fi
|
|
elif [ "$stage" = 1 ]; then
|
|
if [ "$first" != ">" -a "$first" != "<" ]; then
|
|
if [ "$line" = "---" ]; then
|
|
stage=0
|
|
else
|
|
ignore=0
|
|
if grep -e "^$line\$" "$2" > /dev/null; then
|
|
ingore=1
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ "$ignore" = 0 ]; then
|
|
echo "$line"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Do something completely different when this option is provided.
|
|
if [ "$1" = "ignore" ]; then
|
|
if [ $# -lt 3 ]; then
|
|
_show_help
|
|
exit 1
|
|
fi
|
|
|
|
diff_extractlines "$(cat "$2")" >> "$3"
|
|
|
|
# Don't do anything else
|
|
exit
|
|
fi
|
|
|
|
# Load the config
|
|
cmd_download="curl -L -o {dst} {src}" # Command to execute to download files
|
|
[ -f /etc/astronaut.conf ] && . /etc/astronaut.conf
|
|
[ -f "$HOME/.astronaut.conf" ] && . "$HOME/.astronaut.conf"
|
|
|
|
# Override config with command-line parameters.
|
|
[ "$1" ] && dir_satellites="$1"
|
|
[ "$2" ] && _dir_fresh="$2"
|
|
|
|
if [ ! "$dir_satellites" -o ! "$_dir_fresh" ]; then
|
|
_show_help
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$_dir_fresh"
|
|
|
|
for sat in "$dir_satellites"/*.sat; do
|
|
update_url="$(get_variable update_url "$sat")"
|
|
name="$(basename "$sat" .sat)"
|
|
|
|
if [ "$update_url" ]; then
|
|
printf "Checking: $name..."
|
|
cols="$(expr $(tput cols) - $(printf "Checking: $name..." | wc -c))"
|
|
|
|
download "$update_url" "$_dir_fresh/$name.fresh"
|
|
|
|
if [ -f "$_dir_fresh/$name" ]; then
|
|
check="$(diff "$_dir_fresh/$name" "$_dir_fresh/$name.fresh" || true)"
|
|
|
|
if [ -f "$_dir_fresh/$name.ignorediff" ]; then
|
|
check="$(apply_ignorediff "$check" "$_dir_fresh/$name.ignorediff")"
|
|
fi
|
|
|
|
if [ "$check" ]; then
|
|
printf "%${cols}s\n" "Update detected"
|
|
echo "$check" >> "$_dir_fresh/$name-$(date +%Y%m%d%H%M%S).diff"
|
|
else
|
|
printf "\n"
|
|
fi
|
|
else
|
|
printf "%${cols}s\n" "First update check, creating new file"
|
|
download "$update_url" "$_dir_fresh/$name.checkfresh"
|
|
check="$(diff "$_dir_fresh/$name.fresh" "$_dir_fresh/$name.checkfresh" || true)"
|
|
|
|
if [ "$check" ]; then
|
|
echo "$(diff_extractlines "$check")" >> "$_dir_fresh/$name.ignorediff"
|
|
echo "> Created ignorediff"
|
|
fi
|
|
|
|
rm "$_dir_fresh/$name.checkfresh"
|
|
fi
|
|
|
|
mv "$_dir_fresh/$name.fresh" "$_dir_fresh/$name"
|
|
fi
|
|
done
|
|
|