mirror of
https://github.com/etlegacy/wolfadmin.git
synced 2025-02-19 18:30:56 +00:00
Deploy script update, added notice on startup (fixes #73)
This commit is contained in:
parent
1549f950e0
commit
45002153c9
1 changed files with 311 additions and 130 deletions
441
deploy.sh
441
deploy.sh
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# WolfAdmin module for Wolfenstein: Enemy Territory servers.
|
||||
# Copyright (C) 2015-2018 Timo 'Timothy' Smit
|
||||
# Copyright (C) 2015-2019 Timo 'Timothy' Smit
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -16,191 +16,365 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
VERSION="1.2.0-dev"
|
||||
curr_version="1.2.0-dev"
|
||||
|
||||
read_config() {
|
||||
db_type=$(grep -oP '(?<=type = ")(sqlite3|mysql)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
|
||||
if [ $db_type == 'sqlite3' ]; then
|
||||
db_file=$(grep -oP '(?<=file = ")([a-zA-Z0-9_]+\.db)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
elif [ $db_type == 'mysql' ]; then
|
||||
db_hostname=$(grep -oP '(?<=hostname = ")([a-zA-Z0-9]+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
db_port=$(grep -oP '(?<=port = ")([0-9]{0,5})(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
db_database=$(grep -oP '(?<=database = ")([a-zA-Z0-9_]+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
db_username=$(grep -oP '(?<=username = ")([a-zA-Z0-9_]+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
db_password=$(grep -oP '(?<=password = ")(.+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
|
||||
fi
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
install_lualibs() {
|
||||
echo -n 'copying lualibs...'
|
||||
cp -r -u lualibs/ $fs_basepath/$fs_game/
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install_luascripts() {
|
||||
echo -n 'copying luascripts...'
|
||||
cp -r -u luascripts/ $fs_basepath/$fs_game/
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install_configs() {
|
||||
echo -n 'copying configs...'
|
||||
cp -n config/* $fs_homepath/$fs_homedir/$fs_game/
|
||||
|
||||
if [ $db_type == 'sqlite' ]; then
|
||||
sed -i -e "s/type = \"sqlite3\"/type = \"$db_type\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/file = \"wolfadmin.db\"/file = \"$db_file\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
elif [ $db_type == 'mysql' ]; then
|
||||
sed -i -e "s/type = \"sqlite3\"/type = \"$db_type\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/file = \"wolfadmin.db\"/# file = \"wolfadmin.db\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/# hostname = \"localhost\"/hostname = \"$db_hostname\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/# port = 3306/port = \"$db_port\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/# database = \"wolfadmin\"/database = \"$db_database\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/# username = \"wolfadmin\"/username = \"$db_username\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
sed -i -e "s/# password = \"suchasecret\"/password = \"$db_password\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml
|
||||
fi
|
||||
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install_db_sqlite() {
|
||||
echo "$fs_homepath/$fs_homedir/$fs_game/$db_file"
|
||||
|
||||
echo -n 'initializing database...';
|
||||
sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file < database/new/sqlite.sql
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install_db_mysql() {
|
||||
echo -n 'initializing database...';
|
||||
mysql -h $db_hostname -D $db_database -u $db_username -p$db_password < database/new/mysql.sql
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install_pk3() {
|
||||
echo -n 'zipping pk3...';
|
||||
zip -r -q wolfadmin-$curr_version.pk3 pk3
|
||||
echo 'done.'
|
||||
echo -n 'copying pk3...';
|
||||
cp wolfadmin-$curr_version.pk3 $fs_basepath/$fs_game
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install() {
|
||||
echo
|
||||
|
||||
if [[ ! -d $fs_basepath/$fs_game ]]; then
|
||||
while true; do
|
||||
read -p "$fs_basepath/$fs_game does not exist, continue? (y/n) " yn
|
||||
case $yn in
|
||||
[Yy]* ) mkdir $fs_basepath/$fs_game; echo "created $fs_basepath/$fs_game"; break;;
|
||||
[Nn]* ) echo 'exited without making changes'; exit;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
if [ -d $fs_basepath/$fs_game/luascripts/wolfadmin ]; then
|
||||
echo 'WolfAdmin has already been installed'
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ ! -d $fs_homepath/$fs_homedir/$fs_game ]]; then
|
||||
while true; do
|
||||
read -p "$fs_homepath/$fs_homedir/$fs_game does not exist, continue? (y/n) " yn
|
||||
case $yn in
|
||||
[Yy]* ) mkdir $fs_homepath/$fs_homedir/$fs_game; echo "created $fs_homepath/$fs_homedir/$fs_game"; break;;
|
||||
[Nn]* ) echo 'exited without making changes'; exit;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
install_lualibs
|
||||
install_luascripts
|
||||
|
||||
read -p 'db_type (sqlite3/mysql): ' db_type
|
||||
|
||||
if [ -z $db_type ]; then
|
||||
echo 'db_type cannot be empty'
|
||||
exit
|
||||
elif [ $db_type != 'sqlite3' ] && [ $db_type != 'mysql' ]; then
|
||||
echo 'unknown db_type'
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ -d $fs_basepath/$fs_game/luamods/wolfadmin ]]; then
|
||||
while true; do
|
||||
read -p "$fs_basepath/$fs_game/luamods/wolfadmin already exists, continue? (y/n) " yn
|
||||
case $yn in
|
||||
[Yy]* ) rm -r $fs_basepath/$fs_game/luamods/wolfadmin; echo 'removed old WolfAdmin luamod'; break;;
|
||||
[Nn]* ) echo 'exited without making changes'; exit;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
if [ $db_type == 'sqlite3' ]; then
|
||||
read -p 'db_file (wolfadmin.db): ' db_file
|
||||
|
||||
if [ -z $db_file ]; then
|
||||
db_file='wolfadmin.db'
|
||||
elif [[ $db_file != *.db ]]; then
|
||||
echo 'db_file should end with .db'
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ -e $fs_homepath/$fs_homedir/$fs_game/$db_file ]; then
|
||||
while true; do
|
||||
read -p 'database already exists, append? (y/n) ' yn
|
||||
case $yn in
|
||||
[Yy]* ) install_db_sqlite; break;;
|
||||
[Nn]* ) echo 'database not created'; break;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
else
|
||||
install_db_sqlite
|
||||
fi
|
||||
elif [ $db_type == 'mysql' ]; then
|
||||
read -p 'db_hostname (localhost): ' db_hostname
|
||||
|
||||
if [ -z $db_hostname ]; then
|
||||
db_hostname='localhost'
|
||||
fi
|
||||
|
||||
read -p 'db_port (3306): ' db_port
|
||||
|
||||
if [ -z $db_port ]; then
|
||||
db_port=3306
|
||||
fi
|
||||
|
||||
read -p 'db_database (wolfadmin): ' db_database
|
||||
|
||||
if [ -z $db_database ]; then
|
||||
db_database='wolfadmin'
|
||||
fi
|
||||
|
||||
read -p 'db_username (wolfadmin): ' db_username
|
||||
|
||||
if [ -z $db_username ]; then
|
||||
echo 'db_username cannot be empty'
|
||||
exit
|
||||
fi
|
||||
|
||||
read -s -p 'db_password: ' db_password
|
||||
|
||||
if [ -z $db_password ]; then
|
||||
echo 'db_password cannot be empty'
|
||||
exit
|
||||
fi
|
||||
|
||||
echo
|
||||
|
||||
install_db_mysql
|
||||
fi
|
||||
|
||||
echo
|
||||
install_configs
|
||||
|
||||
echo -n 'copying lualibs...'
|
||||
cp -r lualibs/* $fs_basepath/$fs_game/lualibs
|
||||
echo 'done.'
|
||||
|
||||
echo -n 'copying luamods...'
|
||||
cp -r luamods/* $fs_basepath/$fs_game/luamods
|
||||
echo 'done.'
|
||||
|
||||
echo -n 'copying configs...'
|
||||
cp -n config/* $fs_homepath/$fs_homedir/$fs_game
|
||||
echo 'done.'
|
||||
|
||||
if [ -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 ]; then
|
||||
rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3
|
||||
echo 'removed old pk3'
|
||||
install_pk3
|
||||
else
|
||||
while true; do
|
||||
read -p 'install pk3? (y/n) ' yn
|
||||
case $yn in
|
||||
[Yy]* ) install_pk3; break;;
|
||||
[Nn]* ) echo 'pk3 not installed'; break;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ! -x "$(command -v sqlite3)" ]; then
|
||||
echo 'sqlite3 executable does not exist, cannot create database'
|
||||
elif [[ -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db ]]; then
|
||||
while true; do
|
||||
read -p 'database already exists, overwrite? (y/n) ' yn
|
||||
case $yn in
|
||||
[Yy]* ) rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db; echo 'removed old database'; install_db; break;;
|
||||
[Nn]* ) echo 'database not created'; break;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
else
|
||||
install_db
|
||||
fi
|
||||
while true; do
|
||||
read -p 'install pk3 (y/n) ' yn
|
||||
case $yn in
|
||||
[Yy]* ) install_pk3; break;;
|
||||
[Nn]* ) echo 'pk3 not installed'; break;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
|
||||
echo
|
||||
|
||||
echo 'install process finished.'
|
||||
}
|
||||
|
||||
install_pk3() {
|
||||
echo -n 'zipping pk3...';
|
||||
zip -r -q wolfadmin-$VERSION.pk3 pk3
|
||||
update_lualibs() {
|
||||
install_lualibs
|
||||
}
|
||||
|
||||
update_luascripts() {
|
||||
echo -n 'removing old luascripts...'
|
||||
rm -r $fs_basepath/$fs_game/luascripts/wolfadmin/
|
||||
echo 'done.'
|
||||
echo -n 'copying pk3...';
|
||||
cp wolfadmin-$VERSION.pk3 $fs_basepath/$fs_game
|
||||
|
||||
install_luascripts
|
||||
}
|
||||
|
||||
update_configs() {
|
||||
install_configs
|
||||
}
|
||||
|
||||
update_db_sqlite() {
|
||||
echo -n 'updating database...'
|
||||
sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file < database/upgrade/$prev_version/sqlite.sql
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
install_db() {
|
||||
echo -n 'initializing database...';
|
||||
sqlite3 $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db < database/new/sqlite.sql;
|
||||
update_db_mysql() {
|
||||
echo -n 'updating database...'
|
||||
mysql -h $db_hostname -D $db_database -u $db_username -p$db_password < database/upgrade/$prev_version/mysql.sql
|
||||
echo 'done.'
|
||||
}
|
||||
|
||||
update_pk3() {
|
||||
if [ ! -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 ]; then
|
||||
while true; do
|
||||
read -p 'install pk3? (y/n) ' yn
|
||||
case $yn in
|
||||
[Yy]* ) break;;
|
||||
[Nn]* ) echo 'pk3 not updated'; return;; # break;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
else
|
||||
rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3
|
||||
echo 'removed old pk3'
|
||||
fi
|
||||
|
||||
install_pk3
|
||||
}
|
||||
|
||||
update() {
|
||||
echo
|
||||
|
||||
if [[ ! -d $fs_basepath/$fs_game ]]; then
|
||||
echo "$fs_basepath/$fs_game dir does not exist, cannot update"
|
||||
exit
|
||||
elif [[ ! -d $fs_homepath/$fs_homedir/$fs_game ]]; then
|
||||
echo "$fs_homepath/$fs_game dir does not exist, cannot update"
|
||||
exit
|
||||
elif [[ -d $fs_basepath/$fs_game/luamods/wolfadmin ]]; then
|
||||
echo "$fs_basepath/$fs_game/luamods/wolfadmin does not exist, cannot update"
|
||||
if [ ! -d $fs_basepath/$fs_game/luascripts/wolfadmin ]; then
|
||||
echo 'WolfAdmin has not been installed'
|
||||
exit
|
||||
fi
|
||||
|
||||
echo -n 'removing old WolfAdmin luamod...'
|
||||
rm -r $fs_basepath/$fs_game/luamods/wolfadmin
|
||||
echo 'done.'
|
||||
read_config
|
||||
|
||||
echo -n 'copying lualibs...'
|
||||
cp -r lualibs/* $fs_basepath/$fs_game/lualibs
|
||||
echo 'done.'
|
||||
read -p 'Have you backupped any changes/additions to WolfAdmin sources? (y/n) ' yn
|
||||
|
||||
echo -n 'copying luamods...'
|
||||
cp -r luamods/* $fs_basepath/$fs_game/luamods
|
||||
echo 'done.'
|
||||
|
||||
echo -n 'copying configs...'
|
||||
cp -n config/* $fs_homepath/$fs_homedir/$fs_game
|
||||
echo 'done.'
|
||||
|
||||
if [ -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 ]; then
|
||||
rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3
|
||||
echo 'removed old pk3'
|
||||
install_pk3
|
||||
else
|
||||
while true; do
|
||||
read -p 'install pk3? (y/n) ' yn
|
||||
case $yn in
|
||||
[Yy]* ) install_pk3; break;;
|
||||
[Nn]* ) echo 'pk3 not installed'; break;;
|
||||
* ) echo 'please answer yes or no.';;
|
||||
esac
|
||||
done
|
||||
if [ $yn != 'y' ]; then
|
||||
echo 'Please backup any modifications to WolfAdmin.'
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ ! -x "$(command -v sqlite3)" ]; then
|
||||
echo 'sqlite3 executable does not exist, cannot update database'
|
||||
elif [[ ! -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db ]]; then
|
||||
echo 'wolfadmin.db does not exist, cannot update database'
|
||||
else
|
||||
echo -n 'updating database...'
|
||||
sqlite3 $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db < database/update/$prev_version/sqlite.sql
|
||||
echo 'done.'
|
||||
if [ $db_type == 'sqlite3' ]; then
|
||||
table_check=$(sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file "SELECT 1 FROM player" 2>/dev/null)
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
echo 'Database does not exist'
|
||||
exit
|
||||
fi
|
||||
|
||||
prev_version=$(sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file "SELECT value FROM config WHERE id='schema_version'" 2>/dev/null)
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
echo 'Database version unknown'
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ ! -x database/upgrade/$prev_version/sqlite.sql ]; then
|
||||
echo "Cannot update from version $prev_version to version $curr_version; no database scripts available."
|
||||
exit
|
||||
fi
|
||||
elif [ $db_type == 'mysql' ]; then
|
||||
table_check=$(mysql -h $db_hostname -D $db_database -u $db_username -p$db_password -e "SELECT 1 FROM player" 2>/dev/null)
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
echo 'Database does not exist'
|
||||
exit
|
||||
fi
|
||||
|
||||
prev_version=$(mysql -h $db_hostname -D $db_database -u $db_username -p$db_password -e "SELECT value FROM config WHERE id='schema_version'" 2>/dev/null)
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
echo 'Database version unknown'
|
||||
fi
|
||||
|
||||
if [ ! -x database/upgrade/$prev_version/mysql.sql ]; then
|
||||
echo "Cannot update from version $prev_version to version $curr_version; no database scripts available."
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
|
||||
update_lualibs
|
||||
update_luascripts
|
||||
|
||||
if [ $db_type == 'sqlite3' ]; then
|
||||
update_db_sqlite
|
||||
elif [ $db_type == 'mysql' ]; then
|
||||
update_db_mysql
|
||||
fi
|
||||
|
||||
update_pk3
|
||||
update_configs
|
||||
|
||||
echo
|
||||
|
||||
echo 'update process finished.'
|
||||
}
|
||||
|
||||
echo "WolfAdmin $VERSION deployment script"
|
||||
echo "WolfAdmin $curr_version deployment script"
|
||||
|
||||
echo
|
||||
|
||||
echo "This script is HIGHLY experimental. You cannot use this script for \
|
||||
WolfAdmin versions pre-1.1.0. Make sure you have backupped your database. I am \
|
||||
not responsible for any data loss."
|
||||
|
||||
echo
|
||||
|
||||
echo -n 'Checking package integrity...'
|
||||
if [ ! -d 'lualibs' ]; then
|
||||
echo
|
||||
echo 'lualibs dir does not exist'
|
||||
exit
|
||||
elif [ ! -d 'luascripts' ]; then
|
||||
echo
|
||||
echo 'luascripts dir does not exist'
|
||||
exit
|
||||
elif [ ! -d 'config' ]; then
|
||||
echo
|
||||
echo 'config dir does not exist'
|
||||
exit
|
||||
elif [ ! -d 'database' ] || [ ! -d 'database/new' ] || \
|
||||
[ ! -e 'database/new/sqlite.sql' ] || [ ! -e 'database/new/mysql.sql' ] || \
|
||||
[ ! -d 'database/upgrade' ]; then
|
||||
echo
|
||||
echo 'database dir does not exist or is incomplete'
|
||||
exit
|
||||
elif [ ! -d 'pk3' ]; then
|
||||
echo
|
||||
echo 'pk3 dir does not exist'
|
||||
exit
|
||||
fi
|
||||
echo 'OK'
|
||||
|
||||
echo -n 'Checking dependencies...'
|
||||
if [ ! -x "$(command -v sqlite3)" ]; then
|
||||
echo
|
||||
echo 'sqlite3 executable does not exist'
|
||||
fi
|
||||
if [ ! -x "$(command -v mysql)" ]; then
|
||||
echo
|
||||
echo 'mysql executable does not exist'
|
||||
fi
|
||||
echo 'OK'
|
||||
|
||||
read -p 'fs_basepath (install directory): ' fs_basepath
|
||||
fs_basepath=/home/timo/game/fsb
|
||||
|
||||
if [[ -z $fs_basepath ]]; then
|
||||
if [ -z $fs_basepath ]; then
|
||||
echo 'fs_basepath cannot be empty'
|
||||
exit
|
||||
elif [[ ! -d $fs_basepath ]]; then
|
||||
elif [ ! -d $fs_basepath ]; then
|
||||
echo 'fs_basepath does not exist'
|
||||
exit
|
||||
fi
|
||||
|
||||
read -p 'fs_homepath (user directory): ' fs_homepath
|
||||
fs_homepath=/home/timo/game/fsh
|
||||
|
||||
if [[ -z $fs_homepath ]]; then
|
||||
if [ -z $fs_homepath ]; then
|
||||
echo 'fs_homepath cannot be empty'
|
||||
exit
|
||||
elif [[ ! -d $fs_homepath ]]; then
|
||||
elif [ ! -d $fs_homepath ]; then
|
||||
echo 'fs_homepath does not exist'
|
||||
exit
|
||||
elif [[ -d $fs_homepath/.etlegacy ]]; then
|
||||
elif [ -d $fs_homepath/.etlegacy ]; then
|
||||
fs_homedir=.etlegacy
|
||||
elif [[ -d $fs_homepath/.wolfet ]]; then
|
||||
elif [ -d $fs_homepath/.wolfet ]; then
|
||||
fs_homedir=.wolfet
|
||||
else
|
||||
echo 'fs_homepath does not contain a .etlegacy or .wolfet directory'
|
||||
|
@ -208,10 +382,17 @@ else
|
|||
fi
|
||||
|
||||
read -p 'fs_game (e.g. legacy, nq): ' fs_game
|
||||
fs_game=mod
|
||||
|
||||
if [[ -z $fs_game ]]; then
|
||||
if [ -z $fs_game ]; then
|
||||
echo 'fs_game cannot be empty'
|
||||
exit
|
||||
elif [ ! -d $fs_basepath/$fs_game ]; then
|
||||
echo 'fs_basepath/fs_game does not exist'
|
||||
exit
|
||||
elif [ ! -d $fs_homepath/$fs_homedir/$fs_game ]; then
|
||||
echo 'fs_basepath/fs_homedir/fs_game does not exist'
|
||||
exit
|
||||
fi
|
||||
|
||||
echo
|
||||
|
|
Loading…
Reference in a new issue