Skip to content

Instantly share code, notes, and snippets.

@tonyyoyo
Last active May 5, 2022 23:38
Show Gist options
  • Save tonyyoyo/537b250b7d95fd1c8a86bb065885a48d to your computer and use it in GitHub Desktop.
Save tonyyoyo/537b250b7d95fd1c8a86bb065885a48d to your computer and use it in GitHub Desktop.
#!/bin/bash
#v0.0.4
server_ip=192.168.1.135
server_port=8000
server_folder=/mnt/drive2/torrents/gg/serve
playstation_ip=192.168.1.126
sort_packages=date #or alphabetical
curl_timeout=5
progress_interval=0.5
webfs_config=/etc/webfsd.conf
shopt -s extglob
error_and_exit() {
[[ -z $1 ]] || echo "$1" 1>&2
remove_symbolic_links
exit 1
}
remove_symbolic_links() {
if [[ ${#symbolic_links[@]} -gt 0 ]]; then
for i in "${symbolic_links[@]}"; do
[[ -L $i ]] && rm "$i"
done
fi
}
print_error() {
echo "$1" 1>&2
}
convert_seconds() {
[[ $1 -gt 10000000 ]] && return 1
totalseconds=$1
seconds=$((totalseconds%60))
minutes=$((totalseconds/60%60))
hours=$((totalseconds/60/60%24))
days=$((totalseconds/60/60/24))
[[ $days -gt 0 ]] && printf '%dd ' $days
[[ $hours -gt 0 ]] && printf '%dh ' $hours
[[ $minutes -gt 0 ]] && printf '%dm ' $minutes
printf '%ds\n' $seconds
}
select_array() {
number_check() {
for n in "$@"; do
[ $n -gt ${#selections[@]} ] && { print_error "$n is too high."; return 1; }
[ $n -eq 0 ] && { print_error "0 is too low."; return 1; }
[[ $n = 0* ]] && { print_error "No need to add zeros to begining of number."; return 1; }
done
return 0
}
selections=("$@")
pad_number=$(echo -n ${#selections[@]} | wc -c)
for i in ${!selections[@]}; do
printf "%0${pad_number}d %s\n" "$((i + 1))" "${selections[$i]}"
done | tac 1>&2
until [ ! ${#numbers[@]} = 0 ]; do
echo -n '> ' 1>&2
read range
set -- $range
for i in $@; do
case $i in
+([0-9])-+([0-9]) )
startx=$(echo $i | cut -d- -f1)
stopx=$(echo $i | cut -d- -f2)
if [ $startx -gt $stopx ]; then
start=$stopx; stop=$startx
else
start=$startx; stop=$stopx
fi
number_check $start $stop || { unset numbers; continue 2; }
start=$((start - 1))
stop=$((stop - 1))
while [ $start -le $stop ]; do
numbers+=("$start")
start=$((start + 1))
done
;;
+([0-9]) )
number_check $i || { unset numbers; continue 2; }
numbers+=($((i - 1)))
;;
* ) print_error "$i is not a number."; unset numbers; continue 2
esac
done
done
for i in "${numbers[@]}"; do echo "${selections[$i]}"; done
}
case $1 in
-i ) for i in curl webfs; do
version=$(apt-cache policy $i | sed -n 's/^ Installed: \(.*\).*/\1/p')
[[ -z $version ]] || [[ $version = "(none)" ]] && { echo "Installing $i."; sudo apt-get -y install $i; }
done
[[ -f $webfs_config ]] || error_and_exit "$webfs_config is not found."
new=("$server_folder" "$server_port")
old=("web_root" "web_port")
for i in ${!old[@]}; do
grep -oq "^${old[$i]}=" "$webfs_config" || error_and_exit "${old[$i]} is not found in configuration."
eval ${old[$i]}=$(grep "^${old[$i]}=" "$webfs_config" | cut -d= -f2 | sed -e 's/^"//' -e 's/"$//')
[[ ${!old[$i]} = ${new[$i]} ]] || { echo "Changing ${old[$i]} to ${new[$i]}."; sudo sed -i 's|^'${old[$i]}'=.*|'${old[$i]}'="'${new[$i]}'"|' "$webfs_config"; }
done
sudo systemctl restart webfs &> /dev/null
sudo systemctl enable webfs &> /dev/null
echo Finished.
;;
* ) [[ -d $server_folder ]] && cd "$server_folder" || error_and_exit "$server_folder not found."
readarray -t packages < <(ls $sort_packages *.pkg 2> /dev/null)
[[ ${#packages[@]} = 0 ]] && error_and_exit "$server_folder has no files."
readarray -t select_packages < <(select_array "${packages[@]}")
case $sort_packages in
date ) sort_packages='-t1' ;;
alphabetical ) sort_packages='-1'
esac
for i in "${!select_packages[@]}"; do
[[ -f ${select_packages[$i]} ]] || error_and_exit "$i is not a file."
if [[ ${select_packages[$i]} = *[[:space:]]* ]]; then
ln -s "${select_packages[$i]}" "${select_packages[$i]//[[:space:]]/_}" || error_and_exit
select_packages[$i]="${select_packages[$i]//[[:space:]]/_}"
symbolic_links+=("${select_packages[$i]//[[:space:]]/_}")
fi
done
for i in "${select_packages[@]}"; do
result=$(echo -n "{\"type\":\"direct\",\"packages\":[\"http://${server_ip}:${server_port}/${i}\"]}" | curl -s --max-time $curl_timeout "http://${playstation_ip}:12800/api/install" --data @-)
[[ -z $result ]] && error_and_exit "Curl timed out."
result_status=$(echo "$result" | sed -n 's/.*"status": "\([^"]*\).*/\1/p')
if [[ ! $result_status = success ]]; then
error_code=$(echo "$result" | sed -n 's/.*"error_code": \([^ ]*\).*/\1/p')
[[ $error_code = 0x80990015 ]] && { echo "$i: already installed"; continue; } || error_and_exit "$results"
fi
title=$(echo "$result" | sed -n 's/.*"title": "\([^"]*\).*/\1/p')
task_id=$(echo "$result" | sed -n 's/.*"task_id": \([^,]*\).*/\1/p')
progress_status=success
length_total=0
transferred_total=1
while [[ $progress_status = success ]] && [[ ! ${length_total/0x0/error} = $transferred_total ]]; do
sleep $progress_interval
progress=$(echo -n "{\"task_id\":$task_id}" | curl -s --max-time $curl_timeout "http://${playstation_ip}:12800/api/get_task_progress" --data @-)
[[ -z $progress ]] && { echo; error_and_exit "Curl timed out."; }
progress_status=$(echo "$progress" | sed -n 's/.*"status": "\([^"]*\).*/\1/p')
length_total=$(echo "$progress" | sed -n 's/.*"length_total": \([^,]*\).*/\1/p')
transferred_total=$(echo "$progress" | sed -n 's/.*"transferred_total": \([^,]*\).*/\1/p')
hr_length_total=$(printf "%d\n" "$length_total" | numfmt --to=iec --format="%.2f")
hr_transferred_total=$(printf "%d\n" "$transferred_total" | numfmt --to=iec --format="%.2f")
seconds=$(echo "$progress" | sed -n 's/.*"rest_sec": \([^,]*\).*/\1/p')
hr_seconds=$(convert_seconds "$seconds")
echo -ne "$title: $hr_transferred_total/$hr_length_total (${hr_seconds:-N/A})\033[0K\r"
done
echo
done
esac
remove_symbolic_links
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment