lmn-client/roles/lmn_vm/files/vmimage-torrent
2023-05-03 17:24:27 +02:00

213 lines
5.4 KiB
Bash
Executable file

#!/bin/bash
#
# starts tmux sessions for each valid torrent in LINBODIR
# thomas@linuxmuster.net
# 20221103
#
# read environment
#. /usr/share/linuxmuster/defaults.sh || exit 1
#THELPER=$LINBOSHAREDIR/linbo-torrenthelper.sh
THELPER=linbo-torrenthelper.sh
#. $LINBOSHAREDIR/helperfunctions.sh || exit 1
LINBOIMGEXT="qcow2 qdiff"
LINBOIMGDIR="/var/lib/libvirt/images"
serverip="10.190.1.1"
# start of functions
# help message
usage(){
echo
echo "Info: vmimage-torrent manages the torrent tmux sessions of linbo images."
echo
echo "Usage:"
echo " vmimage-torrent <start|stop|restart|reload|status|create|check> [image_name]"
echo " vmimage-torrent attach <image_name|session_name>"
echo
echo "Note:"
echo " * Only qcow2 & qdiff image files located below $LINBOIMGDIR are processed."
echo " * The commands \"start\", \"stop\" and \"restart\" may have optionally an image"
echo " filename as parameter. In this case the commands are only applied to the tmux"
echo " session of the certain file. Without an explicit image filename the commands"
echo " were applied to all image file sessions currently running."
echo " * An image filename parameter is mandatory with the commands \"check\", \"create\""
echo " and \"attach\"."
echo " * \"check\" checks if the image file matches to the correspondig torrent."
echo " * \"create\" creates/recreates the torrent of a certain image file."
echo " * \"status\" shows a list of currently running torrent tmux sessions."
echo " * \"attach\" attaches a torrent tmux session of a certain image. An image or"
echo " session name must be given as parameter."
echo " Press [CTRL+B]+[D] to detach the session again."
echo " * \"reload\" is the identical to \"restart\" and is there for backwards compatibility."
echo
exit 1
}
# check torrent
check(){
local image="$(basename "$IMGLIST")"
local torrent="$image.torrent"
local tdir="$(dirname "$IMGLIST")"
cd "$tdir"
echo "Checking $torrent ..."
if ctorrent -c "$torrent"; then
echo "Ok!"
else
echo "Failed!"
exit 1
fi
}
# creates torrent files
create(){
local image="$(basename "$IMGLIST")"
local tdir="$(dirname "$IMGLIST")"
local torrent="${image}.torrent"
local session="${torrent//./_}"
# stop torrent service
vmimage-torrent status | grep -q ^"$session" && vmimage-torrent stop "$IMGLIST"
# skip already running torrents
echo "Creating $torrent ..."
cd "$tdir"
rm -f "$torrent"
if ctorrent -t -u "http://$serverip:6969/announce" -s "$torrent" "$image" ; then
[ "$START" = "no" ] || vmimage-torrent start "$IMGLIST"
else
echo "Failed!"
exit 1
fi
}
# starts torrent tmux sessions
start(){
local item
local torrent
local image
local tdir
local session
for item in $IMGLIST; do
image="$(basename "$item")"
torrent="${image}.torrent"
tdir="$(dirname "$item")"
session="${torrent//./_}"
cd "$tdir"
if [ ! -s "$image" ]; then
echo "Image $image does not exist! Skipping this torrent."
continue
fi
# skip already running torrents
if vmimage-torrent status | grep -qw ^"$session"; then
echo "tmux session $session is already running."
continue
fi
# create torrent file if there is none
if [ ! -e "$torrent" ]; then
START="no" vmimage-torrent create "$item" || continue
fi
echo -n "Starting tmux session $session ... "
tmux new -ds "$session" "$THELPER $torrent ; exec $SHELL"
sleep 1
if vmimage-torrent status | grep -qw ^"$session"; then
echo "Ok!"
else
echo "Failed!"
fi
done
}
stop(){
if [ -n "$SESSION" ]; then
vmimage-torrent status | grep -qw ^"$SESSION" || return
tmux kill-session -t "$SESSION"
else
local item
vmimage-torrent status | awk -F\: '{print $1}' | while read item; do
tmux kill-session -t "$item"
done
fi
}
attach(){
if ! tmux list-sessions | grep -qw "$SESSION"; then
echo "There is no session $SESSION."
exit 1
fi
echo "Hint: Detach tmux session with [CTRL+B]+[D]."
sleep 3
tmux attach -t "$SESSION"
}
status(){
tmux list-sessions | grep _torrent
}
find_images(){
local search="$(basename "$1")"
if [ -n "$search" ]; then
find "$LINBOIMGDIR" -maxdepth 2 -name "$search"
return
fi
local IMGLIST
for search in $LINBOIMGEXT; do
IMGLIST="$IMGLIST $(find "$LINBOIMGDIR" -maxdepth 2 -name \*.$search)"
done
# trim leading and trailing spaces
echo $IMGLIST | awk '{$1=$1};1'
}
# end of functions
# check parameters
if [ -n "$2" ] ; then
# trap torrent parameter
image="${2/.torrent/}"
case "$image" in
*.qcow2|*.qdiff)
if [ -e "$image" ]; then
IMGLIST="$image"
else
IMGLIST="$(find_images "$image")"
fi
if [ ! -e "$IMGLIST" ]; then
echo "Image file $(basename $image) not found."
usage
fi
filename="$(basename "$IMGLIST")"
SESSION="${filename//./_}_torrent"
;;
*_torrent)
if [ "$1" = "attach" ]; then
SESSION="$image"
else
usage
fi
;;
*) usage ;;
esac
else
case "$1" in
stop|status) ;;
attach|check|create) usage ;;
*)
IMGLIST="$(find_images)"
if [ -z "$IMGLIST" ]; then
echo "No linbo images found."
exit 0
fi
;;
esac
fi
case "$1" in
start) start ;;
stop) stop ;;
restart|reload) stop ; start ;;
status) status ;;
create) create ;;
check) check ;;
attach) attach ;;
*) usage ;;
esac
exit 0