mirror of
https://gitea.publichub.eu/oscar.krause/fastapi-dls.git
synced 2024-10-31 19:48:49 +00:00
198 lines
7.6 KiB
Bash
198 lines
7.6 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
# This script automates the licensing of the vGPU guest driver
|
||
|
# on Unraid boot. Set the Schedule to: "At Startup of Array".
|
||
|
#
|
||
|
# Relies on FastAPI-DLS for the licensing.
|
||
|
# It assumes FeatureType=1 (vGPU), change it as you see fit in line <114>
|
||
|
#
|
||
|
# Requires `eflutils` to be installed in the system for `nvidia-gridd` to run
|
||
|
# To Install it:
|
||
|
# 1) You might find it here: https://packages.slackware.com/ (choose the 64bit version of Slackware)
|
||
|
# 2) Download the package and put it in /boot/extra to be installed on boot
|
||
|
# 3) a. Reboot to install it, OR
|
||
|
# b. Run `upgradepkg --install-new /boot/extra/elfutils*`
|
||
|
# [i]: Make sure to have only one version of elfutils, otherwise you might run into issues
|
||
|
|
||
|
# Sources and docs:
|
||
|
# https://docs.nvidia.com/grid/15.0/grid-vgpu-user-guide/index.html#configuring-nls-licensed-client-on-linux
|
||
|
#
|
||
|
|
||
|
################################################
|
||
|
# MAKE SURE YOU CHANGE THESE VARIABLES #
|
||
|
################################################
|
||
|
|
||
|
###### CHANGE ME!
|
||
|
# IP and PORT of FastAPI-DLS
|
||
|
DLS_IP=192.168.0.123
|
||
|
DLS_PORT=443
|
||
|
# Token folder, must be on a filesystem that supports
|
||
|
# linux filesystem permissions (eg: ext4,xfs,btrfs...)
|
||
|
TOKEN_PATH=/mnt/user/system/nvidia
|
||
|
PING=$(which ping)
|
||
|
|
||
|
# Check if the License is applied
|
||
|
if [[ "$(nvidia-smi -q | grep "Expiry")" == *Expiry* ]]; then
|
||
|
echo " [i] Your vGPU Guest drivers are already licensed."
|
||
|
echo " [i] $(nvidia-smi -q | grep "Expiry")"
|
||
|
echo " [<] Exiting..."
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
# Check if the FastAPI-DLS server is reachable
|
||
|
# Check if the License is applied
|
||
|
MAX_RETRIES=30
|
||
|
for i in $(seq 1 $MAX_RETRIES); do
|
||
|
echo -ne "\r [>] Attempt $i to connect to $DLS_IP."
|
||
|
if ping -c 1 $DLS_IP >/dev/null 2>&1; then
|
||
|
echo -e "\n [*] Connection successful."
|
||
|
break
|
||
|
fi
|
||
|
if [ $i -eq $MAX_RETRIES ]; then
|
||
|
echo -e "\n [!] Connection failed after $MAX_RETRIES attempts."
|
||
|
echo -e "\n [<] Exiting..."
|
||
|
exit 1
|
||
|
fi
|
||
|
sleep 1
|
||
|
done
|
||
|
|
||
|
# Check if the token folder exists
|
||
|
if [ -d "${TOKEN_PATH}" ]; then
|
||
|
echo " [*] Token Folder exists. Proceeding..."
|
||
|
else
|
||
|
echo " [!] Token Folder does not exists or not ready yet. Exiting."
|
||
|
echo " [!] Token Folder Specified: ${TOKEN_PATH}"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Check if elfutils are installed, otherwise nvidia-gridd service
|
||
|
# wont start
|
||
|
if [ "$(grep -R "elfutils" /var/log/packages/* | wc -l)" != 0 ]; then
|
||
|
echo " [*] Elfutils is installed, proceeding..."
|
||
|
else
|
||
|
echo " [!] Elfutils is not installed, downloading and installing..."
|
||
|
echo " [!] Downloading elfutils to /boot/extra"
|
||
|
echo " [i] This script will download elfutils from slackware64-15.0 repository."
|
||
|
echo " [i] If you have a different version of Unraid (6.11.5), you might want to"
|
||
|
echo " [i] download and install a suitable version manually from the slackware"
|
||
|
echo " [i] repository, and put it in /boot/extra to be install on boot."
|
||
|
echo " [i] You may also install it by running: "
|
||
|
echo " [i] upgradepkg --install-new /path/to/elfutils-*.txz"
|
||
|
echo ""
|
||
|
echo " [>] Downloading elfutils from slackware64-15.0 repository:"
|
||
|
wget -q -nc --show-progress --progress=bar:force:noscroll -P /boot/extra https://slackware.uk/slackware/slackware64-15.0/slackware64/l/elfutils-0.186-x86_64-1.txz 2>/dev/null \
|
||
|
|| { echo " [!] Error while downloading elfutils, please download it and install it manually."; exit 1; }
|
||
|
echo ""
|
||
|
if upgradepkg --install-new /boot/extra/elfutils-0.186-x86_64-1.txz
|
||
|
then
|
||
|
echo " [*] Elfutils installed and will be installed automatically on boot"
|
||
|
else
|
||
|
echo " [!] Error while installing, check logs..."
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
echo " [~] Sleeping for 60 seconds before continuing..."
|
||
|
echo " [i] The script is waiting until the boot process settles down."
|
||
|
|
||
|
for i in {60..1}; do
|
||
|
printf "\r [~] %d seconds remaining" "$i"
|
||
|
sleep 1
|
||
|
done
|
||
|
|
||
|
printf "\n"
|
||
|
|
||
|
create_token () {
|
||
|
echo " [>] Creating new token..."
|
||
|
if ${PING} -c1 ${DLS_IP} > /dev/null 2>&1
|
||
|
then
|
||
|
# curl --insecure -L -X GET https://${DLS_IP}:${DLS_PORT}/-/client-token -o ${TOKEN_PATH}/client_configuration_token_"$(date '+%d-%m-%Y-%H-%M-%S')".tok || { echo " [!] Could not get the token, please check the server."; exit 1;}
|
||
|
wget -q -nc -4c --no-check-certificate --show-progress --progress=bar:force:noscroll -O "${TOKEN_PATH}"/client_configuration_token_"$(date '+%d-%m-%Y-%H-%M-%S')".tok https://${DLS_IP}:${DLS_PORT}/-/client-token \
|
||
|
|| { echo " [!] Could not get the token, please check the server."; exit 1;}
|
||
|
chmod 744 "${TOKEN_PATH}"/*.tok || { echo " [!] Could not chmod the tokens."; exit 1; }
|
||
|
echo ""
|
||
|
echo " [*] Token downloaded and stored in ${TOKEN_PATH}."
|
||
|
else
|
||
|
echo " [!] Could not get token, DLS server unavailable ."
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
setup_run () {
|
||
|
echo " [>] Setting up gridd.conf"
|
||
|
cp /etc/nvidia/gridd.conf.template /etc/nvidia/gridd.conf || { echo " [!] Error configuring gridd.conf, did you install the drivers correctly?"; exit 1; }
|
||
|
sed -i 's/FeatureType=0/FeatureType=1/g' /etc/nvidia/gridd.conf
|
||
|
echo "ClientConfigTokenPath=${TOKEN_PATH}" >> /etc/nvidia/gridd.conf
|
||
|
echo " [>] Creating /var/lib/nvidia folder structure"
|
||
|
mkdir -p /var/lib/nvidia/GridLicensing
|
||
|
echo " [>] Starting nvidia-gridd"
|
||
|
if pgrep nvidia-gridd >/dev/null 2>&1; then
|
||
|
echo " [!] nvidia-gridd service is running. Closing."
|
||
|
sh /usr/lib/nvidia/sysv/nvidia-gridd stop
|
||
|
stop_exit_code=$?
|
||
|
if [ $stop_exit_code -eq 0 ]; then
|
||
|
echo " [*] nvidia-gridd service stopped successfully."
|
||
|
else
|
||
|
echo " [!] Error while stopping nvidia-gridd service."
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Kill the service if it does not close
|
||
|
if pgrep nvidia-gridd >/dev/null 2>&1; then
|
||
|
kill -9 "$(pgrep nvidia-gridd)" || {
|
||
|
echo " [!] Error while closing nvidia-gridd service"
|
||
|
exit 1
|
||
|
}
|
||
|
fi
|
||
|
|
||
|
echo " [*] Restarting nvidia-gridd service."
|
||
|
sh /usr/lib/nvidia/sysv/nvidia-gridd start
|
||
|
|
||
|
if pgrep nvidia-gridd >/dev/null 2>&1; then
|
||
|
echo " [*] Service started, PID: $(pgrep nvidia-gridd)"
|
||
|
else
|
||
|
echo -e " [!] Error while starting nvidia-gridd service. Use strace -f nvidia-gridd to debug.\n [i] Check if elfutils is installed.\n [i] strace is not installed by default."
|
||
|
exit 1
|
||
|
fi
|
||
|
else
|
||
|
sh /usr/lib/nvidia/sysv/nvidia-gridd start
|
||
|
|
||
|
if pgrep nvidia-gridd >/dev/null 2>&1; then
|
||
|
echo " [*] Service started, PID: $(pgrep nvidia-gridd)"
|
||
|
else
|
||
|
echo -e " [!] Error while starting nvidia-gridd service. Use strace -f nvidia-gridd to debug.\n [i] Check if elfutils is installed.\n [i] strace is not installed by default."
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
for token in "${TOKEN_PATH}"/*; do
|
||
|
if [ "${token: -4}" == ".tok" ]
|
||
|
then
|
||
|
echo " [*] Tokens found..."
|
||
|
setup_run
|
||
|
else
|
||
|
echo " [!] No Tokens found..."
|
||
|
create_token
|
||
|
setup_run
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
while true; do
|
||
|
if nvidia-smi -q | grep "Expiry" >/dev/null 2>&1; then
|
||
|
echo " [>] vGPU licensed!"
|
||
|
echo " [i] $(nvidia-smi -q | grep "Expiry")"
|
||
|
break
|
||
|
else
|
||
|
echo -ne " [>] vGPU not licensed yet... Checking again in 5 seconds\c"
|
||
|
for i in {1..5}; do
|
||
|
sleep 1
|
||
|
echo -ne ".\c"
|
||
|
done
|
||
|
echo -ne "\r\c"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
echo " [>] Done..."
|
||
|
exit 0
|