mirror of
https://github.com/aclist/dztui.git
synced 2024-12-29 13:52:03 +01:00
Add scmd helper
This commit is contained in:
parent
b623396341
commit
69a9a9c40d
1 changed files with 296 additions and 0 deletions
296
helpers/scmd.sh
Normal file
296
helpers/scmd.sh
Normal file
|
@ -0,0 +1,296 @@
|
|||
#!/bin/bash
|
||||
|
||||
conf=$HOME/.config/dztui/dztuirc
|
||||
source $conf
|
||||
[[ -z $staging_dir ]] && staging_dir="/tmp"
|
||||
aid=221100
|
||||
steamcmd_user=steam
|
||||
workshop_dir="$steam_path/steamapps/workshop/content/$aid"
|
||||
|
||||
log(){
|
||||
printf "$(tput setaf 3)[INFO]$(tput sgr0) %s\n" "$1"
|
||||
}
|
||||
pass(){
|
||||
printf "$(tput setaf 2)[PASS]$(tput sgr0) %s\n" "$1"
|
||||
}
|
||||
fail(){
|
||||
printf "$(tput setaf 1)[FAIL]$(tput sgr0) %s\n" "$1"
|
||||
}
|
||||
steamcmd_modlist(){
|
||||
for i in "${ids[@]}"; do
|
||||
printf "+workshop_download_item %s %s validate " $aid $i
|
||||
done
|
||||
}
|
||||
move_files(){
|
||||
printf "\n"
|
||||
log "Moving mods from $staging_dir to $workshop_dir"
|
||||
if [[ $dist == "steamos" ]]; then
|
||||
chown -R $USER:$gid "$staging_dir"/steamapps
|
||||
else
|
||||
sudo chown -R $USER:$gid "$staging_dir"/steamapps
|
||||
fi
|
||||
cp -R "$staging_dir"/steamapps/workshop/content/$aid/* "$workshop_dir"
|
||||
rm -r "$staging_dir"/steamapps
|
||||
}
|
||||
auto_mod_download(){
|
||||
while true; do
|
||||
read -p 'Enter Steam username: ' steam_username
|
||||
[[ -z $steam_username ]] && { fail "Username can't be empty\n"; continue; }
|
||||
[[ -n $steam_username ]] && break
|
||||
done
|
||||
if [[ -d "$staging_dir/steamapps" ]]; then
|
||||
log "Sanitizing $staging_dir"
|
||||
if [[ $dist == "steamos" ]]; then
|
||||
chown -R $USER:$gid "$staging_dir"/steamapps
|
||||
else
|
||||
sudo chown -R $USER:$gid "$staging_dir"/steamapps
|
||||
fi
|
||||
rm -r "$staging_dir"/steamapps
|
||||
fi
|
||||
tput civis
|
||||
[[ ${#ids[@]} -gt 1 ]] && s=s
|
||||
log "Preparing to download ${#ids[@]} mod$s. This may take some time. Abort with Ctrl+c."
|
||||
for((i=3;i>0;i--)); do
|
||||
printf "[INFO] Launching steamcmd in %i\r" "$i"
|
||||
sleep 1s
|
||||
done
|
||||
tput cnorm
|
||||
if [[ $dist == "steamos" ]]; then
|
||||
bash -c "$steamcmd_path +force_install_dir $staging_dir +login $steam_username $(steamcmd_modlist) +quit"
|
||||
else
|
||||
sudo -iu $steamcmd_user bash -c "$steamcmd_path +force_install_dir $staging_dir +login $steam_username $(steamcmd_modlist) +quit"
|
||||
fi
|
||||
rc=$?
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
move_files
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
find_steam_cmd(){
|
||||
for i in "/home/steam" "/usr/bin" "/usr/local/bin" "/usr/games"; do
|
||||
if [[ -f "$i/steamcmd" ]]; then
|
||||
steamcmd_path="$i/steamcmd"
|
||||
pass "Found steamcmd: $steamcmd_path"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
fail "Failed to find steamcmd"
|
||||
return 1
|
||||
}
|
||||
create_user(){
|
||||
log "Creating steamcmd user"
|
||||
sudo useradd -m steam
|
||||
rc=$?
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
log "Set a password for the headless steamcmd user"
|
||||
sudo passwd steam
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
check_user(){
|
||||
id $steamcmd_user &>/dev/null
|
||||
rc=$?
|
||||
if [[ $rc -eq 1 ]]; then
|
||||
fail "steamcmd user missing"
|
||||
create_user
|
||||
rc=$?
|
||||
[[ $rc -eq 1 ]] && return 1
|
||||
else
|
||||
pass "Found user: $steamcmd_user"
|
||||
fi
|
||||
while true; do
|
||||
local stat=$(sudo passwd $steamcmd_user --status | awk '{print $2}')
|
||||
if
|
||||
[[ $stat == "L" ]] || [[ $stat == "NP" ]]; then
|
||||
fail "steamcmd user has a locked or empty password"
|
||||
sudo passwd $steamcmd_user
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
}
|
||||
generic_install(){
|
||||
fail "Unrecognized OS: $distro. Please report this upstream for whitelisting."
|
||||
}
|
||||
fedora_install(){
|
||||
#TODO
|
||||
:
|
||||
}
|
||||
#ubuntu related
|
||||
# dep: debconf
|
||||
# Debian configuration management system
|
||||
#
|
||||
# dep: debconf (>= 0.5)
|
||||
# Debian configuration management system
|
||||
# or debconf-2.0
|
||||
# virtual package provided by cdebconf, cdebconf-udeb, debconf
|
||||
#
|
||||
# dep: libc6 (>= 2.12)
|
||||
# GNU C Library: Shared libraries
|
||||
# also a virtual package provided by libc6-udeb
|
||||
#
|
||||
# dep: libstdc++6
|
||||
# GNU Standard C++ Library v3
|
||||
#
|
||||
# sug: steam
|
||||
# Valve's Steam digital software delivery system
|
||||
#
|
||||
deb_install(){
|
||||
check_user
|
||||
rc=$?
|
||||
[[ $rc -eq 1 ]] && return 1
|
||||
find_steam_cmd
|
||||
rc=$?
|
||||
if [[ $rc -eq 1 ]]; then
|
||||
log "Installing distribution steamcmd packages"
|
||||
sudo add-apt-repository -y multiverse
|
||||
sudo apt install -y software-properties-common
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt update
|
||||
sudo apt install -y steamcmd
|
||||
find_steam_cmd
|
||||
fi
|
||||
dpkg -s lib32gcc-s1 1>/dev/null
|
||||
rc=$?
|
||||
if [[ $rc -eq 1 ]]; then
|
||||
fail "Missing deps: lib32-gcc-libs"
|
||||
sudo apt install -y lib32gcc-s1
|
||||
else
|
||||
pass "Found deps: lib32-gcc-libs"
|
||||
fi
|
||||
|
||||
}
|
||||
deck_install(){
|
||||
#TODO: konsole input in game mode
|
||||
pacman -Qi lib32-gcc-libs 2>/dev/null 1>&2
|
||||
rc=$?
|
||||
[[ ! $rc -eq 0 ]] && return 1
|
||||
if [[ ! -f $HOME/.local/share/dzgui/helpers/steamcmd ]]; then
|
||||
local tarball="steamcmd_linux.tar.gz"
|
||||
mkdir -p $HOME/.local/share/dzgui/helpers/steamcmd
|
||||
curl -Ls "https://steamcdn-a.akamaihd.net/client/installer/$tarball" > $HOME/.local/share/dzgui/helpers/steamcmd/$tarball
|
||||
$(cd $HOME/.local/share/dzgui/helpers/steamcmd; tar xvf $tarball)
|
||||
fi
|
||||
steamcmd_path="$HOME/.local/share/dzgui/helpers/steamcmd/steamcmd.sh"
|
||||
}
|
||||
arch_install(){
|
||||
check_user
|
||||
rc=$?
|
||||
[[ $rc -eq 1 ]] && return 1
|
||||
find_steam_cmd
|
||||
rc=$?
|
||||
if [[ $rc -eq 1 ]]; then
|
||||
log "Checking prerequisites"
|
||||
for i in makepkg git; do
|
||||
if [[ ! $(command -v $i) ]]; then
|
||||
fail "Missing package: $i"
|
||||
info "Script will fetch build tools now. Partial upgrades on Arch Linux are discouraged, so triggering a full update.\n
|
||||
Type any key to proceed."
|
||||
read -n1 key
|
||||
case $key in
|
||||
*) sudo pacman -Syu base-devel git lib32-gcc-libs --noconfirm
|
||||
esac
|
||||
break
|
||||
else
|
||||
pass "Found deps: $i"
|
||||
fi
|
||||
done
|
||||
log "Installing steamcmd from distribution"
|
||||
[[ -d /tmp/steamcmd ]] && rm -rf /tmp/steamcmd
|
||||
git clone https://aur.archlinux.org/steamcmd.git /tmp/steamcmd
|
||||
cd /tmp/steamcmd && makepkg -si --noconfirm && cd $OLDPWD
|
||||
log "Symlinking steamcmd"
|
||||
sudo ln -s /usr/bin/steamcmd /home/steam/steamcmd
|
||||
rm -rf /tmp/steamcmd
|
||||
find_steam_cmd
|
||||
fi
|
||||
sudo pacman -Qi lib32-gcc-libs 2>/dev/null 1>&2
|
||||
rc=$?
|
||||
if [[ $rc -eq 1 ]]; then
|
||||
fail "Missing deps: lib32-gcc-libs"
|
||||
info "Script will fetch build tools now. Partial upgrades on Arch Linux are discouraged, so triggering a full update.\n
|
||||
Type any key to proceed."
|
||||
read -n1 key
|
||||
case $key in
|
||||
*) sudo pacman -Syu lib32-gcc-libs --noconfirm
|
||||
esac
|
||||
else
|
||||
pass "Found deps: lib32-gcc-libs"
|
||||
fi
|
||||
}
|
||||
check_dist(){
|
||||
os=/etc/os-release
|
||||
dist=$(awk -F= '/^ID=/ {print $2}' $os)
|
||||
pass "Found OS: $dist"
|
||||
case $dist in
|
||||
ubuntu|linuxmint|pop|debian) deb_install ;;
|
||||
arch|antergos|manjaro) arch_install ;;
|
||||
steamos) deck_install ;;
|
||||
fedora) generic_install ;;
|
||||
*) generic_install ;;
|
||||
esac
|
||||
}
|
||||
return_to_dzg(){
|
||||
if [[ $ret -eq 1 ]]; then
|
||||
fail "Errors occurred. Type any key to return to DZGUI and kick off manual install."
|
||||
else
|
||||
pass "Mods installed successfully. Type any key to return to DZGUI."
|
||||
fi
|
||||
read -n1 key
|
||||
case $key in
|
||||
*) exit 1 ;;
|
||||
esac
|
||||
}
|
||||
cleanup(){
|
||||
tput cnorm
|
||||
exit
|
||||
}
|
||||
abort(){
|
||||
tput cnorm
|
||||
printf "\n"
|
||||
log "Keyboard interrupt"
|
||||
exit
|
||||
}
|
||||
check_disks(){
|
||||
disksize=$(df $staging_dir --output=avail | tail -n1)
|
||||
disk_bytewise=$((disksize * 1024))
|
||||
hr=$(echo $(numfmt --to=iec --format "%.2f" $totalmodsize $disk_bytewise) | sed 's/ /\//')
|
||||
[[ ${#ids[@]} -gt 1 ]] && s=s
|
||||
if [[ $disk_bytewise -lt $totalmodsize ]]; then
|
||||
fail "Required/actual: $hr. Installation will quit after /tmp reaches capacity."
|
||||
else
|
||||
pass "Required/actual: $hr"
|
||||
fi
|
||||
}
|
||||
[[ -f $PWD/SCMD.log ]] && rm SCMD.log
|
||||
if [[ -z $1 ]] || [[ -z $2 ]]; then
|
||||
fail "Missing mod arguments"
|
||||
ret=1
|
||||
return_to_dzg
|
||||
fi
|
||||
totalmodsize="$1"
|
||||
shift
|
||||
for i in $@; do
|
||||
ids+=("$i")
|
||||
done
|
||||
sudo -v
|
||||
main(){
|
||||
echo ""
|
||||
echo "────────DZGUI automod helper────────"
|
||||
log "Preparing environment"
|
||||
check_disks
|
||||
check_dist
|
||||
if [[ $? -eq 1 ]]; then
|
||||
ret=1
|
||||
return_to_dzg
|
||||
else
|
||||
pass "All OK. Starting mod auto install process"
|
||||
auto_mod_download
|
||||
return_to_dzg
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
trap abort SIGINT
|
||||
main | tee -a SCMD.log
|
Loading…
Reference in a new issue