-
-
Save tonyyoyo/537b250b7d95fd1c8a86bb065885a48d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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