@ -18,21 +18,14 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# along with this program. If not, see <https://www.gnu.org/licenses/>.
source /etc/steamcmd/steamcmd.conf
source /etc/steamcmd/steamcmd.conf
source /etc/kf2-srv/kf2-srv.conf
ScriptFullname=$(readlink -e "$0")
ScriptFullname=$(readlink -e "$0")
ScriptName=$(echo "$ScriptFullname" | awk -F '/' '{print $NF;}')
ScriptName=$(echo "$ScriptFullname" | awk -F '/' '{print $NF;}')
ScriptVersion="0.8.0"
AppNum="232130"
AppServer Num="232130"
AppClientNum="232090"
StrangeConstUID="17825793"
StrangeConstUID="17825793"
InstallDir="/usr/games/kf2-srv"
ActiveBranch="$InstallDir/activebranch.txt"
AppBin="$InstallDir/Binaries/Win64/KFGameSteamServer.bin.x86_64"
DefaultConfigDir="$InstallDir/KFGame/Config"
CustomMapsDir="$InstallDir/KFGame/Cache"
InstanceConfigDir="/etc/kf2-srv/instances"
InstanceConfigLnk="$DefaultConfigDir/instances"
MainConfigTemplate="/etc/kf2-srv/main.conf.template"
DiffArray=('Normal' 'Hard' 'Suicide' 'Hell')
DiffArray=('Normal' 'Hard' 'Suicide' 'Hell')
WaveArray=('4' '7' '10')
WaveArray=('4' '7' '10')
@ -46,10 +39,11 @@ ModeArray['KFGameContent.KFGameInfo_VersusSurvival']='Versus'
function show_help ()
function show_help ()
{
{
# echo "TODO: English description"
# echo "TODO: English description"
echo "$ScriptName"
echo "$ScriptName v$ScriptVersion "
echo "Централизование управление серверами Killing Floor 2"
echo "Централизование управление серверами Killing Floor 2"
echo "Usage:"
echo "Usage:"
echo "$ScriptName OPTIONS "
echo "${ ScriptName} OPTIONS stable branch "
echo "${ScriptName}-beta OPTIONS beta branch"
echo ""
echo ""
echo "Mandatory arguments to long options are mandatory for short options too."
echo "Mandatory arguments to long options are mandatory for short options too."
echo " -n, --new INSTANCE создает новый ЭКЗЕМПЛЯР сервера"
echo " -n, --new INSTANCE создает новый ЭКЗЕМПЛЯР сервера"
@ -80,14 +74,14 @@ function show_help ()
echo " -di, --disable [INSTANCE] удаляет указанный ЭКЗЕМПЛЯР сервера из"
echo " -di, --disable [INSTANCE] удаляет указанный ЭКЗЕМПЛЯР сервера из"
echo " автозапуска; если ЭКЗЕМПЛЯР не указан,"
echo " автозапуска; если ЭКЗЕМПЛЯР не указан,"
echo " удаляет все экземпляры сервера из автозапуска"
echo " удаляет все экземпляры сервера из автозапуска"
echo " -m l, --ma p-list отображает список карт из SteamWorkshop"
echo " -w l, --worksho p-list отображает список ресурсов из SteamWorkshop"
echo " -ms , --map-sync синхронизирует списки сторонних карт в "
echo " -wa , --workshop-add [MAP_ID] добавляет р е с у р с из SteamWorkshop по URL или "
echo " WorkshopID"
echo " -wd, --workshop-del [MAP_ID] удаляет р е с у р с SteamWorkshop по URL или WorkshopID"
echo " -ws, --workshop-sync синхронизирует списки сторонних карт в"
echo " конфигурационных файлах с имеющимися файлами"
echo " конфигурационных файлах с имеющимися файлами"
echo " сторонних карт; синхронизирует списки карт из"
echo " сторонних карт; синхронизирует списки карт из"
echo " SteamWorkshop между всеми экземплярами серверов"
echo " SteamWorkshop между всеми экземплярами серверов"
echo " -ma, --map-add [MAP_ID] добавляет карту из SteamWorkshop по URL или"
echo " WorkshopID"
echo " -md, --map-del [MAP_ID] удаляет карту SteamWorkshop по URL или WorkshopID"
echo "-mrs, --map-rotate-save [INSTANCE] сохраняет текущий порядок карт для"
echo "-mrs, --map-rotate-save [INSTANCE] сохраняет текущий порядок карт для"
echo " указанного ЭКЗЕМПЛЯРА сервера; если ЭКЗЕМПЛЯР"
echo " указанного ЭКЗЕМПЛЯРА сервера; если ЭКЗЕМПЛЯР"
echo " не указан, сохраняет порядок для всех ЭКЗЕМПЛЯРОВ"
echo " не указан, сохраняет порядок для всех ЭКЗЕМПЛЯРОВ"
@ -110,8 +104,12 @@ function show_help ()
# Use this function with non-root user only!!!
# Use this function with non-root user only!!!
function run_as_root () # $*: Args
function run_as_root () # $*: Args
{
{
if [[ -n "$BetaPostfix" ]]; then
BetaPostfix="beta"
fi
if [[ -n $(groups "$USER" | grep -Fo 'wheel') ]]; then
if [[ -n $(groups "$USER" | grep -Fo 'wheel') ]]; then
sudo "$ScriptFullname" $*
sudo "$ScriptFullname" $BetaPostfix $*
else
else
echo "You must be root or sudo-user to run this command."
echo "You must be root or sudo-user to run this command."
return 1
return 1
@ -123,7 +121,7 @@ function service_name () # $*: Instance[s]
local Services=""
local Services=""
for Instance in $*
for Instance in $*
do
do
Services+=" kf2-srv@$Instance.service"
Services+=" kf2-srv$BetaPostfix @$Instance.service"
done
done
echo "$Services"
echo "$Services"
}
}
@ -156,7 +154,7 @@ function instance_exists () # $1: Instance
function server_exists ()
function server_exists ()
{
{
if [[ -n $(ls "$InstallDir") ]]; then
if [[ -x "$AppBin" ]]; then
return 0
return 0
else
else
return 1
return 1
@ -165,8 +163,22 @@ function server_exists ()
function updates_aviable ()
function updates_aviable ()
{
{
# TODO: implementation
return 0 # steamcmd does not show updates even if they are :(
# TODO: check updates correctly (but how?)
if [[ -n "$BetaPostfix" ]]; then
local BetaArg="-beta preview"
fi
if steamcmd +login anonymous \
+force_install_dir $InstallDir \
+app_info_update 1 \
+app_status $AppServerNum $BetaArg \
+quit | \
grep 'install state:' | \
grep -qiF 'Update Required'; then
return 0
return 0
else
return 1
fi
}
}
function new_instance () # $*: InstanceName[s]
function new_instance () # $*: InstanceName[s]
@ -202,20 +214,24 @@ function new_instance () # $*: InstanceName[s]
fi
fi
local InstanceDir="$InstanceConfigDir/$Instance"
local InstanceDir="$InstanceConfigDir/$Instance"
install -d -g "$SteamUser" -o "$SteamUser" -m 755 "$InstanceDir"
install -d -g "$SteamUser" -o "$SteamUser" -m 755 "$InstanceDir/LinuxServer"
cp -a "$MainConfigTemplate" "$InstanceDir/main.conf "
local DirMode="-d -g $SteamUser -o $SteamUser -m 775 "
cp -a "$DefaultConfigDir/KFAI.ini" "$InstanceDir "
local FileMode=" -g $SteamUser -o $SteamUser -m 664 "
cp -a "$DefaultConfigDir/KFWeb.ini" "$InstanceDir"
cp -a "$DefaultConfigDir/LinuxServer-KFEngine.ini" "$InstanceDir"
install $DirMode "$InstanceDir"
cp -a "$DefaultConfigDir/LinuxServer-KFGame.ini" "$InstanceDi r"
install $DirMode "$InstanceDir/LinuxServe r"
cp -a "$DefaultConfigDir/LinuxServer-KFInput.ini" "$InstanceDir"
cp -a "$DefaultConfigDir/LinuxServer-KFSystemSettings.ini" "$InstanceDir"
install $FileMode "$MainConfigTemplate" "$InstanceDir/main.conf "
cp -a "$DefaultConfigDir/LinuxServer/LinuxServerEngine.ini" "$InstanceDir/LinuxServe r"
install $FileMode "$DefaultConfigDir/KFAI.ini" "$InstanceDi r"
cp -a "$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" "$InstanceDir/LinuxServe r"
install $FileMode "$DefaultConfigDir/KFWeb.ini" "$InstanceDi r"
cp -a "$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" "$InstanceDir/LinuxServer "
install $FileMode "$DefaultConfigDir/LinuxServer-KFEngine.ini" "$InstanceDir"
cp -a "$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini" "$InstanceDir/LinuxServe r"
install $FileMode "$DefaultConfigDir/LinuxServer-KFGame.ini" "$InstanceDi r"
install $FileMode "$DefaultConfigDir/LinuxServer-KFInput.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/LinuxServer-KFSystemSettings.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/LinuxServer/LinuxServerEngine.ini" "$InstanceDir/LinuxServer"
install $FileMode "$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" "$InstanceDir/LinuxServer"
install $FileMode "$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" "$InstanceDir/LinuxServer"
install $FileMode "$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini" "$InstanceDir/LinuxServer"
((MaxGamePort++)); ((MaxQueryPort++)); ((MaxWebAdminPort++))
((MaxGamePort++)); ((MaxQueryPort++)); ((MaxWebAdminPort++))
@ -223,7 +239,7 @@ function new_instance () # $*: InstanceName[s]
sed -i -r --follow-symlinks "s/-queryport=[0-9]+/-queryport=$MaxQueryPort/g" "$InstanceDir/main.conf"
sed -i -r --follow-symlinks "s/-queryport=[0-9]+/-queryport=$MaxQueryPort/g" "$InstanceDir/main.conf"
sed -i -r --follow-symlinks "s/-webadminport=[0-9]+/-webadminport=$MaxWebAdminPort/g" "$InstanceDir/main.conf"
sed -i -r --follow-symlinks "s/-webadminport=[0-9]+/-webadminport=$MaxWebAdminPort/g" "$InstanceDir/main.conf"
echo "Instance $Instance created. See /etc/$ScriptName/instances/$Instance for edit configuration"
echo "Instance $Instance created. See /etc/$ScriptName/instances$BetaPostfix /$Instance for edit configuration"
done
done
}
}
@ -323,27 +339,49 @@ function show_status () # $*: [InstanceName[s]]
function validate ()
function validate ()
{
{
if [[ -n "$BranchName " ]]; then
if [[ -n "$BetaPostfix " ]]; then
local BetaArg="-beta $BranchName "
local BetaArg="-beta preview "
fi
fi
stop_instance
stop_instance
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppNum $BetaArg validate +exit
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServer Num $BetaArg validate +exit
echo "$BranchName" > "$ActiveBranch"
fix_steamclient_so
start_instance
start_instance
}
}
function link _default_instance ()
function make _default_instance ()
{
{
local Instance=" default"
local InstanceDir="$InstanceConfigDir/ default"
if instance_exists "$Instance"; then
echo "Instance $Instance already exists - skip"
chmod 664 \
else
"$DefaultConfigDir/KFAI.ini" \
local InstanceDir="$InstanceConfigDir/$Instance"
"$DefaultConfigDir/KFWeb.ini" \
install -d -g "$SteamUser" -o "$SteamUser" -m 755 "$InstanceDir"
"$DefaultConfigDir/LinuxServer-KFEngine.ini" \
install -d -g "$SteamUser" -o "$SteamUser" -m 755 "$InstanceDir/LinuxServer"
"$DefaultConfigDir/LinuxServer-KFGame.ini" \
cp -a "$MainConfigTemplate" "$InstanceDir/main.conf"
"$DefaultConfigDir/LinuxServer-KFInput.ini" \
"$DefaultConfigDir/LinuxServer-KFSystemSettings.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerEngine.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini"
dos2unix \
"$DefaultConfigDir/KFAI.ini" \
"$DefaultConfigDir/KFWeb.ini" \
"$DefaultConfigDir/LinuxServer-KFEngine.ini" \
"$DefaultConfigDir/LinuxServer-KFGame.ini" \
"$DefaultConfigDir/LinuxServer-KFInput.ini" \
"$DefaultConfigDir/LinuxServer-KFSystemSettings.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerEngine.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" \
"$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini"
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$InstanceDir"
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$InstanceDir/LinuxServer"
install -g "$SteamUser" -o "$SteamUser" -m 664 "$MainConfigTemplate" "$InstanceDir/main.conf"
ln -s "$DefaultConfigDir/KFAI.ini" "$InstanceDir/KFAI.ini"
ln -s "$DefaultConfigDir/KFAI.ini" "$InstanceDir/KFAI.ini"
ln -s "$DefaultConfigDir/KFWeb.ini" "$InstanceDir/KFWeb.ini"
ln -s "$DefaultConfigDir/KFWeb.ini" "$InstanceDir/KFWeb.ini"
ln -s "$DefaultConfigDir/KFWebAdmin.ini" "$InstanceDir/KFWebAdmin.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFEngine.ini" "$InstanceDir/LinuxServer-KFEngine.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFEngine.ini" "$InstanceDir/LinuxServer-KFEngine.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFGame.ini" "$InstanceDir/LinuxServer-KFGame.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFGame.ini" "$InstanceDir/LinuxServer-KFGame.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFInput.ini" "$InstanceDir/LinuxServer-KFInput.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFInput.ini" "$InstanceDir/LinuxServer-KFInput.ini"
@ -352,7 +390,6 @@ function link_default_instance ()
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" "$InstanceDir/LinuxServer/LinuxServerGame.ini"
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" "$InstanceDir/LinuxServer/LinuxServerGame.ini"
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" "$InstanceDir/LinuxServer/LinuxServerInput.ini"
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" "$InstanceDir/LinuxServer/LinuxServerInput.ini"
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini" "$InstanceDir/LinuxServer/LinuxServerSystemSettings.ini"
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini" "$InstanceDir/LinuxServer/LinuxServerSystemSettings.ini"
fi
}
}
function fix_steamclient_so ()
function fix_steamclient_so ()
@ -365,14 +402,44 @@ function fix_steamclient_so ()
ln -s "/usr/share/steamcmd/linux64/steamclient.so" "$InstallDir/Binaries/Win64/lib64/steamclient.so"
ln -s "/usr/share/steamcmd/linux64/steamclient.so" "$InstallDir/Binaries/Win64/lib64/steamclient.so"
}
}
function create_map_dirs ()
{
# space saving
local InstallDirOrig="/usr/games/kf2-srv"
local InstallDirBeta="/usr/games/kf2-srv-beta"
local DownloadDirOrig="$InstallDirOrig/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
local CacheDirOrig="$InstallDirOrig/KFGame/Cache"
local DownloadDirBeta="$InstallDirBeta/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
local CacheDirBeta="$InstallDirBeta/KFGame/Cache"
if [[ -z "$BetaPostfix" ]]; then # Orig
sudo -u "$SteamUser" install -d -m 775 "$DownloadDirOrig"
if [[ -d "$CacheDirBeta" ]]; then
ln -s "$CacheDirBeta" "$CacheDirOrig"
rm -rf "$DownloadDirOrig"
ln -s "$DownloadDirBeta" "$DownloadDirOrig"
else
sudo -u "$SteamUser" install -d -m 775 "$CacheDirOrig"
fi
else # Beta
sudo -u "$SteamUser" install -d -m 775 "$DownloadDirBeta"
if [[ -d "$CacheDirOrig" ]]; then
ln -s "$CacheDirOrig" "$CacheDirBeta"
rm -rf "$DownloadDirBeta"
ln -s "$DownloadDirOrig" "$DownloadDirBeta"
else
sudo -u "$SteamUser" install -d -m 775 "$CacheDirBeta"
fi
fi
}
function update_kf2 ()
function update_kf2 ()
{
{
if [[ -n "$BranchName " ]]; then
if [[ -n "$BetaPostfix " ]]; then
local BetaArg="-beta $BranchName "
local BetaArg="-beta preview "
fi
fi
if ! server_exists; then # First install
if ! server_exists; then # First install
echo "$BranchName" > "$ActiveBranch"
if ! steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg validate +exit; then
if ! steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppNum $BetaArg validate +exit; then
echo "Errors during installation - exit"
echo "Errors during installation - exit"
exit 1
exit 1
fi
fi
@ -394,21 +461,16 @@ function update_kf2 ()
sleep 2
sleep 2
done
done
killall -KILL KFGameSteamServer.bin.x86_64
killall -KILL KFGameSteamServer.bin.x86_64
#$InstallDir/Binaries/Win64/steamapps/workshop/content/232090/1078911795/BrewedPC/Maps/KF-HorzineArena-B2-v6.kfm
multini -s "$DefaultConfigDir/KFWeb.ini" "IpDrv.WebServer" "bEnabled" "true"
#$InstallDir/KFGame/Cache/1078911795/0/BrewedPC/Maps/KF-HorzineArena-B2-v6.kfm
create_map_dirs
install -d -g "$SteamUser" -o "$SteamUser" -m 755 "$CustomMapsDir"
fix_steamclient_so
fix_steamclient_so
ln -s "$InstanceConfigDir" "$InstanceConfigLnk"
ln -s "$InstanceConfigDir" "$InstanceConfigLnk"
link _default_instance
make _default_instance
echo "KF2 succesfully installed"
echo "KF2 succesfully installed"
elif updates_aviable; then # Update
elif updates_aviable; then # Update
if [[ "$BranchName" == $(cat "$ActiveBranch") ]]; then
stop_instance
stop_instance
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppNum $BetaArg +exit
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServer Num $BetaArg +exit
start_instance
start_instance
else
validate
fi
fi
fi
}
}
@ -548,34 +610,60 @@ function run ()
fi
fi
}
}
function map_list_ext () # $1: MaplistFile
function name_by_workshopID () # $1: WorkshopID
{
local WorkshopID="$1"
local Cache="$CacheDir/$WorkshopID"
local Result=""
if [[ -d "$Cache" ]]; then
Result=$(find "$Cache" -type f -name '*.kfm' -printf '%f\n' | head -n 1)
if [[ -z "$Result" ]]; then
Result=$(find "$Cache" -type f -name '*.u' -printf '%f\n' | head -n 1)
fi
fi
echo "$Result"
}
function workshop_list_body () # $1: WorkshopListFile
{
{
local Num=1
echo "NUM WORKSHOP_ID WORKSHOP_URL"
while read WorkshopID
while read WorkshopID
do
do
local Cache="$CacheDir/$WorkshopID"
local Downl="$DownloadDir/$WorkshopID"
local Url="https://steamcommunity.com/sharedfiles/filedetails/?id=$WorkshopID"
local Url="https://steamcommunity.com/sharedfiles/filedetails/?id=$WorkshopID"
echo "$Num $WorkshopID $Url"
local WsName=$(name_by_workshopID "$WorkshopID")
((Num++))
if [[ -n "$WsName" ]]; then
local WsSize=$(du -sch "$Downl" "$Cache" | tail -n 1 | grep -Po '^[^\s]+')
else
local WsSize="-"; WsName="-"
fi
echo "$WorkshopID $WsName $WsSize $Url"
done < "$1"
done < "$1"
}
}
function ma p_list () # $1: [--human-readab le]
function worksho p_list_full () # $1: WorkshoplistFi le
{
{
# TODO: Show map names (sizes?)
echo "WORKSHOP_ID NAME SIZE WORKSHOP_URL"
local MapList=$(mktemp)
workshop_list_body "$1" | sort -k 2
}
function workshop_list () # $1: [--human-readable]
{
local WsList=$(mktemp)
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
grep -P 'ServerSubscribedWorkshopItems=' "$Config" | sed -r 's/.+=([0-9]+)$/\1/' >> "$MapList"
if multini -gq "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems"; then
done
multini -g "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" >> "$WsList"
sort -u "$MapList" -o "$MapList"
if [[ -n "$1" ]]; then
map_list_ext "$MapList" | column -t
else
cat "$MapList"
fi
fi
rm -f "$MapList"
done
sort -u "$WsList" -o "$WsList"
if [[ -n "$1" ]]; then
workshop_list_full "$WsList" | column -t
else
cat "$WsList"
fi
rm -f "$WsList"
}
}
function any_to_workshopID () # $1: WorkshopID/URL
function any_to_workshopID () # $1: WorkshopID/URL
@ -588,79 +676,76 @@ function any_to_workshopID () # $1: WorkshopID/URL
echo "$WorkshopID"
echo "$WorkshopID"
}
}
function ma p_add () # $*: WorkshopID[s]
function worksho p_add () # $*: WorkshopID[s]
{
{
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
if ! grep -qF '[ OnlineSubsystemSteamworks.KFWorkshop Steamw orks]' "$Config"; then
multini -ar "$Config" "IpDrv.TcpNetDriver" "DownloadManagers" " OnlineSubsystemSteamworks.SteamW orkshopDownload"
echo -e '
[OnlineSubsystemSteamworks.KFWorkshopSteamworks]' >> "$Config"
fi
if ! grep -qF 'DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload' "$Config"; then
sed -i --follow-symlinks -r '0,/DownloadManagers=/ s/^(DownloadManagers=.+)$/DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload
\1/' "$Config"
fi
for Map in $*
for Map in $*
do
do
local WorkshopID=$(any_to_workshopID "$Map")
local WorkshopID=$(any_to_workshopID "$Map")
local MapStr= "ServerSubscribedWorkshopItems= $WorkshopID"
if ! multini -gq "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" " $WorkshopID"; then
if ! grep -qF "$MapStr" "$Config"; then
echo "Add workshop $WorkshopID to $Instance"
echo "Add map $WorkshopID to $Instance "
multini -ar "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" "$WorkshopID "
sed -i --follow-symlinks "/^\[OnlineSubsystemSteamworks\.KFWorkshopSteamworks\]/a $MapStr" "$Config"
fi
fi
done
done
done
done
}
}
function ma p_del () # $*: WorkshopID[s]
function worksho p_del () # $*: WorkshopID[s]
{
{
# TODO: Remove lines from LinuxServer-KFGame.ini, clear cache
for Map in $*
for Map in $*
do
do
local WorkshopID=$(any_to_workshopID "$Map")
local WorkshopID=$(any_to_workshopID "$Map")
local WsName=$(name_by_workshopID "$WorkshopID")
local Cache="$CacheDir/$WorkshopID"
local Downl="$DownloadDir/$WorkshopID"
echo -e "Clear cache:
$Cache
$Downl"
rm -rf "$Cache" "$Downl"
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
local ConfigEngine ="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
local MapStr= "ServerSubscribedWorkshopItems= $WorkshopID"
multini -d "$ConfigEngine" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" " $WorkshopID"
if grep -qF "$MapStr" "$Config" ; then
if echo "$WsName" | grep -qP '\.kfm$' ; then
echo "Remove map $WorkshopID from $Instance"
echo "Remove map $WorkshopID ($WsName) from $Instance"
sed -i --follow-symlinks "/$MapStr/d" "$Config"
local WsNameShort=$(echo "$WsName" | sed 's/\.kfm$//')
local ConfigGame="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
multini -d "$ConfigGame" "$WsNameShort KFMapSummary"
fi
fi
done
done
done
done
}
}
function ma p_sync ()
function worksho p_sync ()
{
{
#local InstanceList="$*"
workshop_add $(workshop_list)
#if [[ -z "$InstanceList" ]] ; then
# InstanceList=$(show_instances)
#fi
map_add $(map_list)
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
if instance_exists "$Instance"; then
if instance_exists "$Instance"; then
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
for MapFile in $(find "$CustomMaps Dir" -type f -name '*.kfm' -printf "%f\n")
for MapFile in $(find -L "$Cache Dir" -type f -name '*.kfm' -printf "%f\n")
do
do
MapName=$(echo "$MapFile" | sed -r 's|.kfm$||g ')
MapName=$(echo "$MapFile" | sed -r 's|.kfm$||')
if [[ ! -f "$Config" ]] ; then
if ! multini -gq "$Config" "$MapName KFMapSummary" ; then
echo "$Config does not exist! "
echo "Adding $MapName to $Instance. "
elif grep -qP "MapName=$MapName[ ]*$" "$Config"; then
multini -s "$Config" "$ MapName KFMapSummary" "MapName" "$MapName"
echo "$MapName is already in $Config. "
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInSurvival" "True "
else
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInWeekly" "True"
echo "Adding $MapName to $Config. "
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInVsSurvival" "True "
echo -e "
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInEndless" "True "
[$MapName KFMapSummary]
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInObjective" "False"
MapName=$MapName
fi
bPlayableInSurvival=Tru e
don e
bPlayableInWeekly=True
for MutFile in $(find -L "$CacheDir" -type f -name '*.u' -printf "%f\n")
bPlayableInVsSurvival=True
do
bPlayableInEndless=True
MutName=$(echo "$MutFile" | sed -r 's|.u$||')
bPlayableInObjective=False" >> "$Config"
if ! multini -gq "$Config" "$MutName KFMutatorSummary"; then
echo "Adding $MutName to $Instance."
multini -s "$Config" "$MutName KFMutatorSummary" "ClassName" ""
fi
fi
done
done
else
else
@ -752,7 +837,9 @@ function ban_list () # $1: [--human-readable]
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
grep -P 'BannedIDs=' "$Config" | sed -r 's/.+A=([0-9]+),.+/\1/' >> "$ BanList"
if multini -gq "$Config" "Engine.AccessControl" "BannedIDs"; then
multini -g "$Config" "Engine.AccessControl" "BannedIDs" | sed -r 's/.+A=([0-9]+),.+/\1/' >> "$BanList"
fi
done
done
sort -u "$BanList" -o "$BanList"
sort -u "$BanList" -o "$BanList"
if [[ -n "$1" ]]; then
if [[ -n "$1" ]]; then
@ -769,10 +856,10 @@ function ban_ID3 () # $1: ID3
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local BanStr="BannedIDs= (Uid=(A=$ID3,B=$StrangeConstUID))"
local BanStr="(Uid=(A=$ID3,B=$StrangeConstUID))"
if ! grep -qF "$BanStr" "$Config "; then
if ! multini -gq "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr "; then
echo "Add ban $ID3 to $Instance"
echo "Add ban $ID3 to $Instance"
sed -i --follow-symlinks "/^\[ Engine\ .AccessControl\]/a $BanStr" "$Config "
multini -a "$Config" " Engine.AccessControl" "BannedIDs" "$BanStr "
fi
fi
done
done
}
}
@ -783,10 +870,10 @@ function unban_ID3 () # $1: ID3
for Instance in $(show_instances)
for Instance in $(show_instances)
do
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local BanStr="BannedIDs= (Uid=(A=$ID3,B=$StrangeConstUID))"
local BanStr="(Uid=(A=$ID3,B=$StrangeConstUID))"
if grep -qF "$BanStr" "$Config "; then
if multini -gq "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr "; then
echo "Remove ban $ID3 from $Instance"
echo "Remove ban $ID3 from $Instance"
sed -i --follow-symlinks "/$BanStr/d" "$Config "
multini -d "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr "
fi
fi
done
done
}
}
@ -842,6 +929,19 @@ function ban_sync ()
done
done
}
}
if [[ "$1" == "beta" ]]; then
BetaPostfix="-beta"; shift
fi
InstallDir="/usr/games/kf2-srv$BetaPostfix"
AppBin="$InstallDir/Binaries/Win64/KFGameSteamServer.bin.x86_64"
DefaultConfigDir="$InstallDir/KFGame/Config"
DownloadDir="$InstallDir/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
CacheDir="$InstallDir/KFGame/Cache"
InstanceConfigDir="/etc/kf2-srv/instances$BetaPostfix"
InstanceConfigLnk="$DefaultConfigDir/instances"
MainConfigTemplate="/etc/kf2-srv/main.conf.template"
if [[ $# -eq 0 ]]; then show_help; exit 0; fi
if [[ $# -eq 0 ]]; then show_help; exit 0; fi
case $1 in
case $1 in
-h|--help ) show_help; ;;
-h|--help ) show_help; ;;
@ -856,10 +956,10 @@ case $1 in
-rs|--restart ) if [[ "$EUID" -eq 0 ]]; then shift; restart_instance $*; else run_as_root $*; fi ;;
-rs|--restart ) if [[ "$EUID" -eq 0 ]]; then shift; restart_instance $*; else run_as_root $*; fi ;;
-en|--enable ) if [[ "$EUID" -eq 0 ]]; then shift; enable_instance $*; else run_as_root $*; fi ;;
-en|--enable ) if [[ "$EUID" -eq 0 ]]; then shift; enable_instance $*; else run_as_root $*; fi ;;
-di|--disable ) if [[ "$EUID" -eq 0 ]]; then shift; disable_instance $*; else run_as_root $*; fi ;;
-di|--disable ) if [[ "$EUID" -eq 0 ]]; then shift; disable_instance $*; else run_as_root $*; fi ;;
-m l|--ma p-list ) if [[ "$EUID" -eq 0 ]]; then shift; ma p_list "-h" ; else run_as_root $*; fi ;;
-w l|--worksho p-list ) if [[ "$EUID" -eq 0 ]]; then shift; worksho p_list "-h" ; else run_as_root $*; fi ;;
-ms |--map-sync ) if [[ "$EUID" -eq 0 ]]; then shift; map_sync ; else run_as_root $*; fi ;;
-wa |--workshop-add ) if [[ "$EUID" -eq 0 ]]; then shift; workshop_add $* ; else run_as_root $*; fi ;;
-ma |--map-add ) if [[ "$EUID" -eq 0 ]]; then shift; map_add $*; else run_as_root $*; fi ;;
-wd |--workshop-del ) if [[ "$EUID" -eq 0 ]]; then shift; workshop_del $*; else run_as_root $*; fi ;;
-md |--map-del ) if [[ "$EUID" -eq 0 ]]; then shift; map_del $* ; else run_as_root $*; fi ;;
-ws |--workshop-sync ) if [[ "$EUID" -eq 0 ]]; then shift; workshop_sync ; else run_as_root $*; fi ;;
-mrs|--map-rotate-save ) if [[ "$EUID" -eq 0 ]]; then shift; map_rotate_save $*; else run_as_root $*; fi ;;
-mrs|--map-rotate-save ) if [[ "$EUID" -eq 0 ]]; then shift; map_rotate_save $*; else run_as_root $*; fi ;;
-mrl|--map-rotate-load ) if [[ "$EUID" -eq 0 ]]; then shift; map_rotate_load $*; else run_as_root $*; fi ;;
-mrl|--map-rotate-load ) if [[ "$EUID" -eq 0 ]]; then shift; map_rotate_load $*; else run_as_root $*; fi ;;
-bl|--ban-list ) if [[ "$EUID" -eq 0 ]]; then shift; ban_list "-h" ; else run_as_root $*; fi ;;
-bl|--ban-list ) if [[ "$EUID" -eq 0 ]]; then shift; ban_list "-h" ; else run_as_root $*; fi ;;