summaryrefslogtreecommitdiffstats
path: root/server.sh
diff options
context:
space:
mode:
authorPeter2022-07-13 16:10:08 +0100
committerPeter2022-07-13 16:10:08 +0100
commit760a8ff079242312c2d02805f1a3fe279f3d33d7 (patch)
tree6dab2c6c9cb3c06d06b0c185a243a4505e36775a /server.sh
parentbe387dc63b21bfbb8d89e0d91de6076e12c63236 (diff)
downloaddockerfiles-760a8ff079242312c2d02805f1a3fe279f3d33d7.tar.gz
dockerfiles-760a8ff079242312c2d02805f1a3fe279f3d33d7.tar.bz2
dockerfiles-760a8ff079242312c2d02805f1a3fe279f3d33d7.zip
Rewrite htpasswd on every run
Why not use the password manager we're already calling
Diffstat (limited to 'server.sh')
-rw-r--r--server.sh511
1 files changed, 0 insertions, 511 deletions
diff --git a/server.sh b/server.sh
index c7c9a5a..158e745 100644
--- a/server.sh
+++ b/server.sh
@@ -1,511 +0,0 @@
-#!/bin/bash
-
-# functions
-function find_directory {
- find "$directory_home" -maxdepth 3 -mount -type d -name "$1" 2>/dev/null
-}
-function find_remote {
- rclone listremotes | awk -v remote="$1" '$0 ~ remote {print $0;exit}'
-}
-function check_root {
- if [ "$EUID" -ne 0 ]; then
- echo "Please run as root"
- exit 0
- fi
-}
-function check_not_root {
- if [ "$EUID" -eq 0 ]; then
- echo "Don't run this function as root"
- exit 0
- fi
-}
-function check_depends {
- dependencies=(aria2c awk bash docker docker-compose ffmpeg getmail git gnuplot journalctl logname media-sort mp3val mpack munpack opustags phockup pip3 python3 qpdf rbw rclone sed seq sort svgo uniq vnstat we-get yt-dlp)
- echo "Checking dependencies..."
- for i in "${dependencies[@]}"; do
- echo -n "$i: "
- if [[ $(command -v "$i") ]]; then
- echo -e "\e[32mpresent\e[39m"
- else
- echo -e "\e[31mmissing\e[39m"
- fi
- done
- exit 1
-}
-function umount_remote {
- if [ -z "$2" ]; then
- working_directory="$(find_directory "$1")"
- else
- working_directory="$(find_directory "$2")"
- fi
- umount "$working_directory"
- fusermount -uz "$working_directory" 2>/dev/null
- find "$working_directory" -maxdepth 1 -mount -type d -not -path "*/\.*" -empty -delete
-}
-function password_manager {
- case "$1" in
- addr) check_not_root && rbw get --full "$2" | awk '/URI:/ {print $2}' ;;
- full) check_not_root && rbw get --full "$2" ;;
- pass) check_not_root && rbw get "$2" ;;
- sync) check_not_root && rbw sync ;;
- user) check_not_root && rbw get --full "$2" | awk '/Username:/ {print $2}' ;;
- *) check_not_root && rbw get "$2" ;;
- esac
-}
-function duolingo_streak {
- # check api is installed
- [[ -d "$(find_directory config)/duolingo" ]] || git clone https://github.com/KartikTalwar/Duolingo.git "$(find_directory config)/duolingo"
- # cd to git dir to include module
- cd "$(find_directory config)/duolingo" || return
- # write script
- password_manager sync
- {
- printf "#!/usr/bin/env python3\\n\\n"
- printf "import duolingo\\n"
- printf "lingo = duolingo.Duolingo('%s', password='%s')\\n" "$(password_manager user duolingo)" "$(password_manager pass duolingo)"
- printf "lingo.buy_streak_freeze()"
- } >"streak-freeze.py"
- # run and remove script
- python "streak-freeze.py"
- rm "streak-freeze.py"
-}
-function blog_duolingo_rank {
- duo_username="$(awk -F'[/()]' '/Duolingo/ {print $5}' "$(find_directory blog."$domain")"/content/about.md)"
- rank_filename="$(find_directory blog."$domain")/content/posts/logging-duolingo-ranks-over-time.md"
- echo -n "Fetching data for $duo_username... "
- page_source="$(curl -s https://duome.eu/"$duo_username")"
- rank_lingot="$(printf %s "$page_source" | awk -F"[#><]" '/icon lingot/ {print $15}')"
- rank_streak="$(printf %s "$page_source" | awk -F"[#><]" '/icon streak/{getline;print $15}')'"
- echo -e "$i \e[32mdone\e[39m"
- echo -n "Appending ranks to page... "
- echo "| $(date +%F) | $(date +%H:%M) | $rank_streak | $rank_lingot |" | tr -d \' >>"$rank_filename"
- echo -e "$i \e[32mdone\e[39m"
- echo -n "Amending lastmod value... "
- mod_timestamp="$(date +%FT%H:%M:00)"
- sed -i "s/lastmod: .*/lastmod: $mod_timestamp/g" "$rank_filename"
- echo -e "$i \e[32mdone\e[39m"
-}
-function docker_build {
- cd "$directory_script" || exit
- # write env file, overwriting any existing
- password_manager sync
- {
- printf "DOMAIN=%s\\n" "$domain"
- printf "PUID=%s\\n" "$(id -u)"
- printf "PGID=%s\\n" "$(id -g)"
- printf "TZ=%s\\n" "$(cat /etc/timezone)"
- printf "CONFDIR=%s\\n" "$(find_directory config)"
- printf "SYNCDIR=%s\\n" "$(find_directory vault)"
- printf "RCLONE_REMOTE_MEDIA=%s\\n" "$(find_remote media)"
- printf "WG_WEBUI_PASS=%s\\n" "$(password_manager pass 'wireguard admin')"
- printf "WG_PRIVKEY=%s\\n" "$(password_manager pass 'wireguard private key')"
- printf "DBPASSWORD=%s\\n" "$(password_manager pass postgresql)"
- } >"$directory_script/.env"
- # make network, if not existing
- if ! printf "%s" "$(docker network ls)" | grep -q "proxy"; then
- echo Creating docker network
- docker network create proxy
- fi
- # start containers
- echo Starting docker containers
- case $HOSTNAME in
- "$name_vps") docker-compose -f docker-compose-vps.yml up -d --remove-orphans ;;
- "$name_nas") docker-compose -f docker-compose-nas.yml up -d --remove-orphans ;;
- *) echo "I'm unsure of which host you're running this on. Exiting" && rm "$directory_script/.env" && exit 0 ;;
- esac
- # delete temporary env file
- if [[ -f "$directory_script/.env" ]]; then
- echo Deleting detected env file
- rm "$directory_script/.env"
- fi
- # clean up existing stuff
- echo Cleaning up existing docker files
- for i in volume image system network; do
- docker "$i" prune -f
- done
- docker system prune -af
-}
-function media_logger {
- # specify directories
- git_directory="$(find_directory logger)"
- file_git_log="$git_directory/media.log"
- log_remote="$(find_remote media)"
- git_logger="git --git-dir=$git_directory/.git --work-tree=$git_directory"
- # git configuruation
- if [ ! -e "$git_directory" ]; then
- printf "Logger directory not found, quitting...\n"
- exit 1
- fi
- if [ ! -e "$git_directory/.git" ]; then
- printf "Initialising blank git repo...\n"
- $git_logger init
- fi
- if [ -e "$file_git_log.xz" ]; then
- printf "Decompressing existing xz archive...\n"
- xz -d "$file_git_log.xz"
- fi
- if [ -e "$file_git_log" ]; then
- printf "Removing existing log file...\n"
- rm "$file_git_log"
- fi
- printf "Creating log...\n"
- rclone ls "$log_remote" | sort -k2 >"$file_git_log"
- printf "Appending size information...\n"
- rclone size "$log_remote" >>"$file_git_log"
- printf "Commiting log file to repository...\n"
- $git_logger add "$file_git_log"
- $git_logger commit -m "Update: $(date +%F)"
- if [ -e "$file_git_log.xz" ]; then
- printf "Removing xz archive...\n"
- rm "$file_git_log.xz"
- fi
- printf "Compressing log file...\n"
- xz "$file_git_log"
- printf "Compressing repository...\n"
- $git_logger config pack.windowMemory 10m
- $git_logger config pack.packSizeLimit 20m
- $git_logger gc --aggressive --prune
- printf "Log complete!"
-}
-function parse_magnets {
- # sources and destinations
- cd "$(find_directory vault)" || exit
- rclone_remote="raw-seedbox:watch/"
- # check for aria
- if [ ! -x "$(command -v aria2c)" ]; then # not installed
- echo "Aria doesn't seem to be installed. Exiting" && exit
- fi
- # trackers
- trackers_list=(
- "udp://9.rarbg.to:2710/announce"
- "udp://denis.stalker.upeer.me:6969/announce"
- "udp://exodus.desync.com:6969/announce"
- "udp://ipv6.tracker.harry.lu:80/announce"
- "udp://open.demonii.si:1337/announce"
- "udp://open.stealth.si:80/announce"
- "udp://p4p.arenabg.com:1337/announce"
- "udp://retracker.lanta-net.ru:2710/announce"
- "udp://tracker.coppersurfer.tk:6969/announce"
- "udp://tracker.cyberia.is:6969/announce"
- "udp://tracker.leechers-paradise.org:6969/announce"
- "udp://tracker.open-internet.nl:6969/announce"
- "udp://tracker.opentrackr.org:1337/announce"
- "udp://tracker.pirateparty.gr:6969/announce"
- "udp://tracker.tiny-vps.com:6969/announce"
- "udp://tracker.torrent.eu.org:451/announce"
- )
- for i in "${trackers_list[@]}"; do
- trackers="$i,$trackers"
- done
- # magnet loop
- for j in *.magnet; do
- [ -f "$j" ] || break
- timeout 3m aria2c --bt-tracker="$trackers" --bt-metadata-only=true --bt-save-metadata=true "$(cat "$j")" && rm "$j"
- done
- # torrent loop, move to watch
- for k in *.torrent; do
- [ -f "$k" ] || break
- for i in *.torrent; do rclone move "$k" "$rclone_remote"; done
- done
-}
-function parse_payslips {
- # temporary directories
- directory_temp="$(mktemp -d)"
- cd "$directory_temp" || exit
- mkdir {cur,new,tmp}
- # write config file
- password_manager sync
- {
- printf "[retriever]\\n"
- printf "type = SimpleIMAPSSLRetriever\\n"
- printf "server = %s\\n" "$(password_manager full email | awk -F: '/Incoming/ {gsub(/ /,""); print $2}')"
- printf "username = %s\\n" "$(password_manager user email)"
- printf "port = 993\\n"
- printf "password = %s\\n\\n" "$(password_manager pass email)"
- printf "[destination]\\n"
- printf "type = Maildir\\n"
- printf "path = %s/\\n" "$directory_temp"
- } >getmailrc
- getmail --getmaildir "$directory_temp"
- cd new || exit
- grep "$(password_manager user payslip)" ./* | cut -f1 -d: | uniq | xargs munpack -f
- # decrypt payslip file
- for i in *.PDF; do
- fileProtected=0
- qpdf "$i" --check || fileProtected=1
- if [ $fileProtected == 1 ]; then
- parsed_name="$(printf "%s" "$i" | awk -FX '{print substr($3,5,4) "-" substr($3,3,2) "-" substr($3,1,2) ".pdf"}')"
- qpdf --password="$(password_manager pass payslip)" --decrypt "$i" "$parsed_name" && rm "$i"
- rclone move "$parsed_name" "$(find_remote paperwork)/personal/workplace/wages/"
- fi
- done
- # clean up afterwards
- rm -r "$directory_temp"
-}
-function sort_media {
- # check mounts
- mounts="seedbox media"
- for i in $mounts; do
- mount_remote mount "$i"
- done
- # main sorting process
- dir_import=$(find_directory seedbox)/
- if [[ -d "$dir_import" ]]; then
- dir_tv=$(find_directory media)/videos/television
- dir_mov=$(find_directory media)/videos/movies
- temp_tv="{{ .Name }}/{{ .Name }} S{{ printf \"%02d\" .Season }}E{{ printf \"%02d\" .Episode }}{{ if ne .ExtraEpisode -1 }}-{{ printf \"%02d\" .ExtraEpisode }}{{end}}.{{ .Ext }}"
- temp_mov="{{ .Name }} ({{ .Year }})/{{ .Name }}.{{ .Ext }}"
- media-sort --action copy --concurrency 1 --accuracy-threshold 90 --tv-dir "$dir_tv" --movie-dir "$dir_mov" --tv-template "$temp_tv" --movie-template "$temp_mov" --recursive --overwrite-if-larger "$dir_import"
- else
- printf "Import directory not found.\\n"
- exit 0
- fi
- for i in $mounts; do
- umount_remote "$i"
- done
-}
-function mount_remote {
- # check allow_other in fuse.conf
- if ! grep -q "^user_allow_other$" /etc/fuse.conf; then
- check_root
- printf "user_allow_other not found in fuse.conf.\\nAppending to file. Please restart the script.\\n"
- echo "user_allow_other" >>/etc/fuse.conf
- exit 0
- fi
- if [ -n "$2" ]; then
- printf "Mounting specified remote...\\n"
- rclone_mount_process "$2"
- else
- printf "Mounting all remotes...\\n"
- rclone_array="$(rclone listremotes | awk -F '[-:]' '/^drive/ && !/backups/ && !/saves/ {print $2}' | xargs)"
- for i in $rclone_array; do
- rclone_mount_process "$i"
- done
- fi
-}
-function rclone_mount_process {
- remote="$(find_remote "$1")"
- mount_point="$directory_home/$1"
- mkdir -p "$mount_point"
- if [[ -f "$mount_point/.mountcheck" || -n "$(find "$mount_point" -maxdepth 1 -mindepth 1 | head -n 1)" ]]; then
- printf "%s already mounted.\\n" "$1"
- else
- printf "%s not mounted.\\n" "$1"
- printf "Re-mounting... "
- fusermount -uz "$mount_point" 2>/dev/null && sleep 3
- rclone mount "$remote" "$mount_point" --allow-other --daemon --log-file "$(find_directory config)/logs/rclone-$1.log"
- printf "done\\n"
- fi
-}
-function blog_status {
- status_uptime=$(($(cut -f1 -d. </proc/uptime) / 86400))
- {
- printf -- "---\\ntitle: Status\\nlayout: single\\n---\\n\\n"
- printf "*Generated on %(%Y-%m-%d at %H:%M)T*\\n\\n" -1
- printf "* Uptime: %s Day%s\\n" "$status_uptime" "$(if (("$status_uptime" > 1)); then echo s; fi)"
- printf "* CPU Load: %s\\n" "$(cut -d" " -f1-3 </proc/loadavg)"
- printf "* Users: %s\\n" "$(uptime | grep -oP '.{3}user' | sed 's/\user//g' | xargs)"
- printf "* RAM Usage: %s%%\\n" "$(printf "%.0f" "$(free | awk '/Mem/ {print $3/$2 * 100.0}')")"
- printf "* Swap Usage: %s%%\\n" "$(printf "%.0f" "$(free | awk '/Swap/ {print $3/$2 * 100.0}')")"
- printf "* Root Usage: %s\\n" "$(df / | awk 'END{print $5}')"
- printf "* Cloud Usage: %s\\n" "$(git --git-dir="$(find_directory logger)/.git" show | awk 'END{print $3" "$4}')"
- printf "* [Dockers](https://github.com/breadcat/Dockerfiles): %s\\n" "$(docker ps -q | wc -l)/$(docker ps -aq | wc -l)"
- printf "* Packages: %s\\n" "$(dpkg -l | grep ^ii -c)"
- printf "* Monthly Data: %s\\n\\n" "$(vnstat -m --oneline | cut -f11 -d\;)"
- printf "Hardware specifications themselves are covered on the [hardware page](/hardware/#server).\\n"
- } >"$(find_directory blog."$domain")/content/status.md"
-}
-function blog_weight {
- if [ "$2" = "date" ]; then
- printf "Writing empty dates... "
- weight_filename="$(find_directory blog."$domain")/content/weight.md"
- page_source="$(head -n -1 "$weight_filename")"
- previous_date="$(printf %s "$page_source" | awk -F, 'END{print $1}')"
- sequence_count="$((($(date --date="$(date +%F)" +%s) - $(date --date="$previous_date" +%s)) / (60 * 60 * 24)))"
- {
- printf "%s\\n" "$page_source"
- printf "%s" "$(for i in $(seq $sequence_count); do printf "%s,\\n" "$(date -d "$previous_date+$i day" +%F)"; done)"
- printf "\\n</pre></details>"
- } >"$weight_filename"
- printf "done\\n"
- exit 0
- fi
- printf "Drawing graph... "
- weight_filename="$(find_directory blog."$domain")/content/weight.md"
- weight_rawdata="$(awk '/<pre>/{flag=1; next} /<\/pre>/{flag=0} flag' "$weight_filename" | sort -u)"
- weight_dateinit="$(awk '/date:/ {print $2}' "$weight_filename")"
- grep "^$(date +%Y)-" <<<"$weight_rawdata" >temp.dat
- gnuplot <<-EOF
- set grid
- set datafile separator comma
- set xlabel "Month"
- set xdata time
- set timefmt "%Y-%m-%d"
- set xtics format "%b"
- set ylabel "Weight (kg)"
- set key off
- set term svg font 'sans-serif,12'
- set sample 50
- set output "temp.svg"
- plot "temp.dat" using 1:2 smooth cspline with lines
- EOF
- printf "done\\nWriting page... "
- {
- printf -- "---\\ntitle: Weight\\nlayout: single\\ndate: %s\\nlastmod: %(%Y-%m-%dT%H:%M:00)T\\n---\\n\\n" "$weight_dateinit" -1
- printf "%s\\n\\n" "$(svgo -i "temp.svg" --multipass -o - -q -p 0)"
- printf "<details><summary>Raw data</summary>\\n<pre>\\n%s\\n</pre></details>" "$weight_rawdata"
-
- } >"$weight_filename"
- printf "done\\nCleaning up... "
- rm temp.{dat,svg}
- printf "done\\n"
-}
-function remotes_dedupe {
- dests=$(rclone listremotes | grep "gdrive" -c)
- for i in $(seq "$dests"); do
- remote=$(rclone listremotes | grep "gdrive.*$i")
- echo Deduplicating "$remote"
- rclone dedupe --dedupe-mode newest "$remote" --log-file "$(find_directory config)/logs/rclone-dupe-$(date +%F-%H%M).log"
- done
-}
-function remotes_tokens {
- echo "Refreshing rclone remote tokens"
- for i in $(rclone listremotes | awk -v remote="$backup_prefix" '$0 ~ remote {print $0}'); do
- if rclone lsd "$i" &>/dev/null; then
- echo -e "$i \e[32msuccess\e[39m"
- else
- echo -e "$i \e[31mfailed\e[39m"
- fi
- done
-}
-function remotes_sync {
- source=$(find_remote "gdrive")
- dests=$(rclone listremotes | grep "gdrive" -c)
- for i in $(seq 2 "$dests"); do
- dest=$(rclone listremotes | grep "gdrive.*$i")
- if rclone lsd "$dest" &>/dev/null; then
- if [ -n "$2" ]; then
- directory="$2"
- printf "Syncing %s directory to %s...\\n" "$directory" "$dest"
- rclone sync "$source/$directory" "$dest/$directory" --drive-server-side-across-configs --drive-stop-on-upload-limit --verbose --log-file "$(find_directory config)/logs/rclone-sync-$directory-$(date +%F-%H%M).log"
- else
- printf "Syncing %s to %s...\\n" "$source" "$dest"
- rclone sync "$source" "$dest" --drive-server-side-across-configs --drive-stop-on-upload-limit --verbose --log-file "$(find_directory config)/logs/rclone-sync-$(date +%F-%H%M).log"
- fi
- fi
- done
-}
-function parse_photos {
- source=$(find_directory DCIM)
- mount="pictures"
- mount_remote mount "$mount"
- destination=$(find_directory $mount)
- # main sorting process
- if [[ -d "$destination" ]]; then
- phockup "$source" "$destination/personal/photos/" -m
- find "$source" -maxdepth 3 -mount -type d -not -path "*/\.*" -empty -delete
- else
- printf "Import directory not found.\\n"
- exit 0
- fi
- umount_remote "$mount"
-}
-
-function clean_space {
- space_initial="$(df / | awk 'FNR==2{ print $4}')"
- log_file="$(find_directory config)/logs/clean-$(date +%F-%H%M).log"
- check_root
- # journals
- journalctl --vacuum-size=75M >>"$log_file"
- # docker
- for i in volume image; do
- docker "$i" prune -f >>"$log_file"
- done
- # apt
- apt-get clean >>"$log_file"
- # temp directory
- rm -rf /tmp/tmp.* >>"$log_file"
- space_after="$(df / | awk 'FNR==2{ print $4}')"
- printf "Bytes freed: %s\\n" "$(("$space_after" - "$space_initial"))"
-}
-function remote_sizes {
- dests=$(rclone listremotes | grep "gdrive" -c)
- for i in $(seq "$dests"); do
- remote=$(rclone listremotes | grep "gdrive.*$i")
- echo -n Calculating "$remote"...
- rclone size "$remote" | xargs
- done
-}
-function system_update {
- check_root
- if [[ $distro =~ "Debian" ]]; then
- # Update Debian
- export DEBIAN_FRONTEND=noninteractive
- apt-get update
- apt-get dist-upgrade -y
- apt-get autoremove --purge -y
- apt-get clean
- if [ -x "$(command -v yt-dlp)" ]; then
- yt-dlp -U
- fi
- if [ -x "$(command -v rclone)" ]; then
- curl --silent "https://rclone.org/install.sh" | bash
- fi
- elif [[ $distro =~ "Arch" ]]; then
- # Update Archlinux
- if [ -x "$(command -v paru)" ]; then
- paru -Syu --noconfirm
- else
- pacman -Syu --noconfirm
- fi
- else
- echo "Who knows what you're running"
- fi
- # Update remaining applications
- find "$(find_directory config)" -maxdepth 2 -name ".git" -type d | sed 's/\/.git//' | xargs -P10 -I{} git -C {} pull
- if [ -x "$(command -v we-get)" ]; then
- echo "Updating we-get..."
- pip3 install --upgrade git+https://github.com/rachmadaniHaryono/we-get
- fi
- if [ -x "$(command -v media-sort)" ]; then
- echo "Updating media-sort..."
- cd "/usr/local/bin" || return
- curl https://i.jpillora.com/media-sort | bash
- fi
-}
-function main {
- distro="$(awk -F'"' '/^NAME/ {print $2}' /etc/os-release)"
- username="$(logname)"
- directory_home="/home/$username"
- backup_prefix="backup-"
- domain="$(awk -F'"' '/domain/ {print $2}' "$(find_directory traefik)/traefik.toml")"
- directory_script="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
- name_vps="finland"
- name_nas="lilnas"
- case "$1" in
- bookmarks) grep -P "\t\t\t\<li\>" "$(find_directory startpage)/index.html" | sort -t\> -k3 >"$(find_directory startpage)/bookmarks.txt" ;;
- clean) clean_space ;;
- dedupe) remotes_dedupe ;;
- depends) check_depends ;;
- docker) docker_build ;;
- logger) media_logger ;;
- magnet) parse_magnets ;;
- mount) mount_remote "$@" ;;
- payslip) parse_payslips ;;
- permissions) check_root && chown "$username":"$username" "$directory_script/rclone.conf" ;;
- photos) parse_photos ;;
- rank) blog_duolingo_rank ;;
- refresh) remotes_tokens ;;
- size) remote_sizes ;;
- sort) sort_media ;;
- status) blog_status ;;
- streak) duolingo_streak ;;
- sync) remotes_sync "$@" ;;
- umount) umount_remote "$@" ;;
- update) system_update ;;
- weight) blog_weight "$@" ;;
- *) echo "$0" && awk '/^function main/,EOF' "$0" | awk '/case/{flag=1;next}/esac/{flag=0}flag' | awk -F"\t|)" '{print $2}' | tr -d "*" | sort | xargs ;;
- esac
-}
-
-main "$@"